summaryrefslogtreecommitdiff
path: root/src/modinfodialogimages.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-17 08:56:43 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-07-02 10:10:17 -0400
commita13067602590f16484561b9ca23f15aa45089db8 (patch)
treecda0cd0069642b4ef3b03f811be127934b8a7740 /src/modinfodialogimages.cpp
parent9f1520c69e88113d9a1a06f91bbabe9cf5ddef9f (diff)
images list now vertical on the left
reworked scaling to respect aspect ratio and not exceed original size
Diffstat (limited to 'src/modinfodialogimages.cpp')
-rw-r--r--src/modinfodialogimages.cpp122
1 files changed, 89 insertions, 33 deletions
diff --git a/src/modinfodialogimages.cpp b/src/modinfodialogimages.cpp
index 4f2ee78c..fb2ad1fe 100644
--- a/src/modinfodialogimages.cpp
+++ b/src/modinfodialogimages.cpp
@@ -1,44 +1,109 @@
#include "modinfodialogimages.h"
#include "ui_modinfodialog.h"
-ThumbnailButton::ThumbnailButton(const QString& fullPath, QImage original)
- : m_original(std::move(original))
+ScalableImage::ScalableImage(QImage original)
+ : m_original(std::move(original)), m_border(1)
{
- const auto ratio = static_cast<double>(m_original.width()) / m_original.height();
+ auto sp = sizePolicy();
+ sp.setHeightForWidth(true);
+ setSizePolicy(sp);
+}
+
+void ScalableImage::setImage(QImage image)
+{
+ m_original = std::move(image);
+ m_scaled = {};
+
+ update();
+}
+
+const QImage& ScalableImage::image() const
+{
+ return m_original;
+}
+
+bool ScalableImage::hasHeightForWidth() const
+{
+ return true;
+}
+
+int ScalableImage::heightForWidth(int w) const
+{
+ return w;
+}
+
+void ScalableImage::paintEvent(QPaintEvent* e)
+{
+ if (m_original.isNull()) {
+ return;
+ }
+
+ const QRect widgetRect = rect();
+ const QRect imageRect = widgetRect.adjusted(
+ m_border, m_border, -m_border, -m_border);
+
+ const auto ratio = std::min({
+ 1.0,
+ static_cast<double>(imageRect.width()) / m_original.width(),
+ static_cast<double>(imageRect.height()) / m_original.height()});
+
+ const QSize scaledSize(
+ static_cast<int>(std::round(m_original.width() * ratio)),
+ static_cast<int>(std::round(m_original.height() * ratio)));
- QImage thumbnail;
- if (ratio > 1.34) {
- thumbnail = m_original.scaledToWidth(128);
- } else {
- thumbnail = m_original.scaledToHeight(96);
+ if (m_scaled.isNull() || m_scaled.size() != scaledSize) {
+ qDebug() << "scaled to " << scaledSize;
+
+ m_scaled = m_original.scaled(
+ scaledSize.width(), scaledSize.height(),
+ Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
- setIcon(QPixmap::fromImage(thumbnail));
- setIconSize(QSize(thumbnail.width(), thumbnail.height()));
+ const QRect drawBorderRect = widgetRect.adjusted(0, 0, -1, -1);
+
+ const QRect drawImageRect(
+ (imageRect.left()+imageRect.width()/2) - m_scaled.width()/2,
+ (imageRect.top()+imageRect.height()/2) - m_scaled.height()/2,
+ m_scaled.width(), m_scaled.height());
+
+
+ QPainter painter(this);
- connect(this, &QPushButton::clicked, [&]{ emit open(m_original); });
+ painter.setPen(QColor(Qt::black));
+ painter.drawRect(drawBorderRect);
+ painter.drawImage(drawImageRect, m_scaled);
}
-const QImage& ThumbnailButton::image() const
+void ScalableImage::mousePressEvent(QMouseEvent* e)
{
- return m_original;
+ if (e->button() == Qt::LeftButton) {
+ emit clicked(m_original);
+ }
}
ImagesTab::ImagesTab(Ui::ModInfoDialog* ui)
- : ui(ui)
+ : ui(ui), m_image(new ScalableImage)
{
+ ui->imagesImage->layout()->addWidget(m_image);
+ ui->imagesThumbnails->setLayout(new QVBoxLayout);
+
+ ui->tabImagesSplitter->setSizes({128, 1});
+ ui->tabImagesSplitter->setStretchFactor(0, 0);
+ ui->tabImagesSplitter->setStretchFactor(1, 1);
}
void ImagesTab::clear()
{
- ui->imageLabel->setPixmap({});
+ m_image->setImage({});
- while (ui->imageThumbnails->count() > 0) {
- auto* item = ui->imageThumbnails->takeAt(0);
+ while (ui->imagesThumbnails->layout()->count() > 0) {
+ auto* item = ui->imagesThumbnails->layout()->takeAt(0);
delete item->widget();
delete item;
}
+
+ static_cast<QVBoxLayout*>(ui->imagesThumbnails->layout())->addStretch(1);
}
bool ImagesTab::feedFile(const QString& rootPath, const QString& fullPath)
@@ -66,26 +131,17 @@ void ImagesTab::add(const QString& fullPath)
return;
}
- auto* button = new ThumbnailButton(fullPath, std::move(image));
+ auto* thumbnail = new ScalableImage(std::move(image));
QObject::connect(
- button, &ThumbnailButton::open,
- [&](const QImage& image){ onOpen(image); });
+ thumbnail, &ScalableImage::clicked,
+ [&](const QImage& image){ onClicked(image); });
- ui->imageThumbnails->addWidget(button);
+ static_cast<QVBoxLayout*>(ui->imagesThumbnails->layout())->insertWidget(
+ ui->imagesThumbnails->layout()->count() - 1, thumbnail);
}
-void ImagesTab::onOpen(const QImage& original)
+void ImagesTab::onClicked(const QImage& original)
{
- QImage image;
-
- const auto ratio = static_cast<double>(original.width()) / original.height();
-
- if (ratio > 1.34) {
- image = original.scaledToWidth(ui->imageLabel->geometry().width());
- } else {
- image = original.scaledToHeight(ui->imageLabel->geometry().height());
- }
-
- ui->imageLabel->setPixmap(QPixmap::fromImage(image));
+ m_image->setImage(original);
}