Photoshop PSD import (Compositor 1.2.0, part one)

This commit is contained in:
雷电芽衣 committed 2026-09-27 04:41:08 -04:00
1 parent 3d56688ce4
commit 2cd0d1b86d
41 files changed
+3912 -31

No files matched your search

+89
View File
@@ -0,0 +1,89 @@
#include "UI/PSDConversionSheet.h"
#include <QHBoxLayout>
#include <QLabel>
#include <QProgressBar>
#include <QPushButton>
#include <QScrollArea>
#include <QVBoxLayout>
namespace {
QLabel *text(const QString &words, int pixels, QFont::Weight weight, QWidget *parent, bool secondary = false)
{
auto *label = new QLabel(words, parent);
label->setTextFormat(Qt::PlainText);
label->setWordWrap(true);
QFont font = label->font();
font.setPixelSize(pixels);
font.setWeight(weight);
label->setFont(font);
if (secondary)
label->setForegroundRole(QPalette::PlaceholderText);
return label;
}
// Swift's `List`: each layer's name over its note.
QWidget *list(const std::vector<PSDConversion> &conversions, QWidget *parent)
{
auto *scroll = new QScrollArea(parent);
scroll->setObjectName(QStringLiteral("conversionList"));
scroll->setWidgetResizable(true);
auto *rows = new QWidget(scroll);
auto *column = new QVBoxLayout(rows);
for (const PSDConversion &item : conversions) {
auto *row = new QVBoxLayout;
row->setSpacing(4);
row->setContentsMargins(8, 4, 8, 4);
row->addWidget(text(item.layerName, 13, QFont::Bold, rows));
row->addWidget(text(item.message, 13, QFont::Normal, rows));
column->addLayout(row);
}
column->addStretch();
scroll->setWidget(rows);
scroll->setMinimumHeight(180);
return scroll;
}
}
PSDConversionSheet::PSDConversionSheet(const PSDConversionRequest &request, std::function<void(bool)> finish, QWidget *parent) : QWidget(parent)
{
setMinimumSize(520, 360);
auto *layout = new QVBoxLayout(this);
layout->setContentsMargins(24, 24, 24, 24);
layout->setSpacing(16);
layout->addWidget(text(request.title, 17, QFont::Bold, this));
layout->addWidget(text(request.isReading ? QStringLiteral("Reading the file to see what needs converting.")
: QStringLiteral("OmaPhoto will convert these Photoshop features. Nothing is applied until you continue."),
13, QFont::Normal, this, true));
if (request.isReading) {
auto *reading = new QWidget(this);
reading->setMinimumHeight(180);
auto *row = new QHBoxLayout(reading);
row->setSpacing(10);
row->addStretch();
auto *spinner = new QProgressBar(reading);
spinner->setObjectName(QStringLiteral("conversionSpinner"));
spinner->setRange(0, 0);
spinner->setTextVisible(false);
spinner->setFixedWidth(16);
row->addWidget(spinner);
row->addWidget(text(QStringLiteral("Reading the Photoshop file…"), 13, QFont::Normal, reading, true));
row->addStretch();
layout->addWidget(reading, 1);
} else {
layout->addWidget(list(request.conversions, this), 1);
}
auto *buttons = new QHBoxLayout;
buttons->addStretch();
auto *cancel = new QPushButton(QStringLiteral("Cancel"), this);
cancel->setObjectName(QStringLiteral("conversionCancel"));
cancel->setAutoDefault(false);
auto *confirm = new QPushButton(request.confirmTitle, this);
confirm->setObjectName(QStringLiteral("conversionConfirm"));
confirm->setDefault(true);
confirm->setEnabled(!request.isReading);
connect(cancel, &QPushButton::clicked, this, [finish] { finish(false); });
connect(confirm, &QPushButton::clicked, this, [finish] { finish(true); });
buttons->addWidget(cancel);
buttons->addWidget(confirm);
layout->addLayout(buttons);
}
+20
View File
@@ -0,0 +1,20 @@
#pragma once
#include "IO/PSD/PSDTypes.h"
#include <QWidget>
#include <functional>
struct PSDConversionRequest {
QString title;
QString confirmTitle;
std::vector<PSDConversion> conversions;
// Still read: the sheet answers the click, reporting nothing.
bool isReading = false;
friend bool operator==(const PSDConversionRequest &, const PSDConversionRequest &) = default;
};
// What an import converts, confirmed before anything applies.
class PSDConversionSheet : public QWidget {
Q_OBJECT
public:
PSDConversionSheet(const PSDConversionRequest &request, std::function<void(bool)> finish, QWidget *parent = nullptr);
};