diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-06-17 08:56:43 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-07-02 10:10:17 -0400 |
| commit | a13067602590f16484561b9ca23f15aa45089db8 (patch) | |
| tree | cda0cd0069642b4ef3b03f811be127934b8a7740 /src/modinfodialogimages.cpp | |
| parent | 9f1520c69e88113d9a1a06f91bbabe9cf5ddef9f (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.cpp | 122 |
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); } |
