update
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
#include "dialogs/InpaintPreviewDialog.h"
|
||||
|
||||
#include <QDialogButtonBox>
|
||||
#include <QHBoxLayout>
|
||||
#include <QEvent>
|
||||
#include <QLabel>
|
||||
#include <QPixmap>
|
||||
#include <QScrollArea>
|
||||
#include <QResizeEvent>
|
||||
#include <QShowEvent>
|
||||
#include <QSplitter>
|
||||
#include <QTimer>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
static QLabel* makeImageLabel(QWidget* parent) {
|
||||
@@ -14,17 +16,10 @@ static QLabel* makeImageLabel(QWidget* parent) {
|
||||
lab->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
||||
lab->setScaledContents(false);
|
||||
lab->setAlignment(Qt::AlignCenter);
|
||||
lab->setMinimumSize(1, 1);
|
||||
return lab;
|
||||
}
|
||||
|
||||
static QScrollArea* wrapScroll(QWidget* child, QWidget* parent) {
|
||||
auto* sc = new QScrollArea(parent);
|
||||
sc->setWidget(child);
|
||||
sc->setWidgetResizable(false);
|
||||
sc->setBackgroundRole(QPalette::Dark);
|
||||
return sc;
|
||||
}
|
||||
|
||||
InpaintPreviewDialog::InpaintPreviewDialog(const QString& title, QWidget* parent)
|
||||
: QDialog(parent) {
|
||||
setModal(true);
|
||||
@@ -37,14 +32,12 @@ InpaintPreviewDialog::InpaintPreviewDialog(const QString& title, QWidget* parent
|
||||
|
||||
m_beforeLabel = makeImageLabel(this);
|
||||
m_afterLabel = makeImageLabel(this);
|
||||
m_beforeScroll = wrapScroll(m_beforeLabel, this);
|
||||
m_afterScroll = wrapScroll(m_afterLabel, this);
|
||||
m_beforeScroll->setMinimumHeight(200);
|
||||
m_afterScroll->setMinimumHeight(200);
|
||||
m_beforeLabel->installEventFilter(this);
|
||||
m_afterLabel->installEventFilter(this);
|
||||
|
||||
auto* splitter = new QSplitter(Qt::Horizontal, this);
|
||||
splitter->addWidget(m_beforeScroll);
|
||||
splitter->addWidget(m_afterScroll);
|
||||
splitter->addWidget(m_beforeLabel);
|
||||
splitter->addWidget(m_afterLabel);
|
||||
splitter->setStretchFactor(0, 1);
|
||||
splitter->setStretchFactor(1, 1);
|
||||
root->addWidget(splitter, 1);
|
||||
@@ -58,17 +51,51 @@ InpaintPreviewDialog::InpaintPreviewDialog(const QString& title, QWidget* parent
|
||||
}
|
||||
|
||||
void InpaintPreviewDialog::setImages(const QImage& before, const QImage& after) {
|
||||
if (m_beforeLabel) {
|
||||
const QPixmap pb = QPixmap::fromImage(before);
|
||||
m_beforeLabel->setPixmap(pb);
|
||||
m_beforeLabel->setMinimumSize(pb.size());
|
||||
m_beforeLabel->resize(pb.size());
|
||||
}
|
||||
if (m_afterLabel) {
|
||||
const QPixmap pa = QPixmap::fromImage(after);
|
||||
m_afterLabel->setPixmap(pa);
|
||||
m_afterLabel->setMinimumSize(pa.size());
|
||||
m_afterLabel->resize(pa.size());
|
||||
}
|
||||
m_beforeImg = before;
|
||||
m_afterImg = after;
|
||||
updateScaledPreviews();
|
||||
QTimer::singleShot(0, this, [this]() { updateScaledPreviews(); });
|
||||
}
|
||||
|
||||
void InpaintPreviewDialog::resizeEvent(QResizeEvent* e) {
|
||||
QDialog::resizeEvent(e);
|
||||
updateScaledPreviews();
|
||||
}
|
||||
|
||||
void InpaintPreviewDialog::showEvent(QShowEvent* e) {
|
||||
QDialog::showEvent(e);
|
||||
updateScaledPreviews();
|
||||
}
|
||||
|
||||
bool InpaintPreviewDialog::eventFilter(QObject* watched, QEvent* event) {
|
||||
if (!m_inUpdateScaledPreviews && event->type() == QEvent::Resize) {
|
||||
if (watched == m_beforeLabel || watched == m_afterLabel) {
|
||||
updateScaledPreviews();
|
||||
}
|
||||
}
|
||||
return QDialog::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
void InpaintPreviewDialog::updateScaledPreviews() {
|
||||
if (m_inUpdateScaledPreviews) {
|
||||
return;
|
||||
}
|
||||
m_inUpdateScaledPreviews = true;
|
||||
auto fit = [](QLabel* lab, const QImage& src) {
|
||||
if (!lab || src.isNull()) {
|
||||
if (lab) {
|
||||
lab->clear();
|
||||
}
|
||||
return;
|
||||
}
|
||||
const QSize cap = lab->size();
|
||||
if (cap.width() < 2 || cap.height() < 2) {
|
||||
return;
|
||||
}
|
||||
const QImage scaled = src.scaled(cap, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
lab->setPixmap(QPixmap::fromImage(scaled));
|
||||
};
|
||||
fit(m_beforeLabel, m_beforeImg);
|
||||
fit(m_afterLabel, m_afterImg);
|
||||
m_inUpdateScaledPreviews = false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user