102 lines
3.1 KiB
C++
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;
|
|
}
|