Files
hfut-bishe/client/gui/dialogs/InpaintPreviewDialog.cpp
T
2026-05-15 00:06:14 +08:00

102 lines
3.1 KiB
C++

#include "dialogs/InpaintPreviewDialog.h"
#include <QDialogButtonBox>
#include <QEvent>
#include <QLabel>
#include <QPixmap>
#include <QResizeEvent>
#include <QShowEvent>
#include <QSplitter>
#include <QTimer>
#include <QVBoxLayout>
static QLabel* makeImageLabel(QWidget* parent) {
auto* lab = new QLabel(parent);
lab->setBackgroundRole(QPalette::Base);
lab->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
lab->setScaledContents(false);
lab->setAlignment(Qt::AlignCenter);
lab->setMinimumSize(1, 1);
return lab;
}
InpaintPreviewDialog::InpaintPreviewDialog(const QString& title, QWidget* parent)
: QDialog(parent) {
setModal(true);
setMinimumSize(880, 520);
setWindowTitle(title);
auto* root = new QVBoxLayout(this);
root->setContentsMargins(8, 8, 8, 8);
root->setSpacing(8);
m_beforeLabel = makeImageLabel(this);
m_afterLabel = makeImageLabel(this);
m_beforeLabel->installEventFilter(this);
m_afterLabel->installEventFilter(this);
auto* splitter = new QSplitter(Qt::Horizontal, this);
splitter->addWidget(m_beforeLabel);
splitter->addWidget(m_afterLabel);
splitter->setStretchFactor(0, 1);
splitter->setStretchFactor(1, 1);
root->addWidget(splitter, 1);
auto* btns = new QDialogButtonBox(this);
btns->addButton(QStringLiteral("取消"), QDialogButtonBox::RejectRole);
btns->addButton(QStringLiteral("写回"), QDialogButtonBox::AcceptRole);
connect(btns, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(btns, &QDialogButtonBox::rejected, this, &QDialog::reject);
root->addWidget(btns);
}
void InpaintPreviewDialog::setImages(const QImage& before, const QImage& after) {
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;
}