This commit is contained in:
2026-05-15 00:06:14 +08:00
parent 83c2c26e89
commit b4c7697e8a
6 changed files with 174 additions and 45 deletions
+55 -28
View File
@@ -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;
}