From a13067602590f16484561b9ca23f15aa45089db8 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Mon, 17 Jun 2019 08:56:43 -0400
Subject: images list now vertical on the left reworked scaling to respect
aspect ratio and not exceed original size
---
src/modinfodialog.ui | 100 +++++++++++++-----------------------
src/modinfodialogimages.cpp | 122 ++++++++++++++++++++++++++++++++------------
src/modinfodialogimages.h | 21 ++++++--
3 files changed, 141 insertions(+), 102 deletions(-)
(limited to 'src')
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index ba670ef3..c1dba1c7 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -150,68 +150,14 @@
Images
-
+
-
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 16777215
-
-
-
- Qt::LeftToRight
-
-
-
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 16777215
- 128
-
-
-
- true
+
+
+ Qt::Horizontal
-
-
-
- 0
- 0
- 746
- 126
-
-
-
- Images located in the mod.
-
-
- This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view.
-
-
-
- 0
-
+
+
0
@@ -225,14 +171,40 @@
0
-
-
-
- 0
+
+
+ true
-
+
+
+
+ 0
+ 0
+ 604
+ 436
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
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(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(imageRect.width()) / m_original.width(),
+ static_cast(imageRect.height()) / m_original.height()});
+
+ const QSize scaledSize(
+ static_cast(std::round(m_original.width() * ratio)),
+ static_cast(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(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(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(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);
}
diff --git a/src/modinfodialogimages.h b/src/modinfodialogimages.h
index 3c492e77..73fb5936 100644
--- a/src/modinfodialogimages.h
+++ b/src/modinfodialogimages.h
@@ -3,19 +3,29 @@
#include "modinfodialog.h"
-class ThumbnailButton : public QPushButton
+class ScalableImage : public QWidget
{
Q_OBJECT;
public:
- ThumbnailButton(const QString& fullPath, QImage image);
+ ScalableImage(QImage image={});
+
+ void setImage(QImage image);
const QImage& image() const;
+ bool hasHeightForWidth() const;
+ int heightForWidth(int w) const;
+
signals:
- void open(const QImage& image);
+ void clicked(const QImage& image);
+
+protected:
+ void paintEvent(QPaintEvent* e) override;
+ void mousePressEvent(QMouseEvent* e) override;
private:
- const QImage m_original;
+ QImage m_original, m_scaled;
+ int m_border;
};
@@ -29,9 +39,10 @@ public:
private:
Ui::ModInfoDialog* ui;
+ ScalableImage* m_image;
void add(const QString& fullPath);
- void onOpen(const QImage& image);
+ void onClicked(const QImage& image);
};
#endif // MODINFODIALOGIMAGES_H
--
cgit v1.3.1