Add Porytiles export shortcut

This commit is contained in:
GriffinR 2025-07-22 01:34:03 -04:00
parent 15b300f864
commit 26ad93f2ae
6 changed files with 195 additions and 85 deletions

View File

@ -11,7 +11,7 @@
</rect>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
<enum>Qt::FocusPolicy::ClickFocus</enum>
</property>
<property name="windowTitle">
<string>Tileset Editor</string>
@ -21,7 +21,7 @@
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="childrenCollapsible">
<bool>false</bool>
@ -34,10 +34,10 @@
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
<enum>QFrame::Shadow::Plain</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
@ -58,7 +58,7 @@
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop</set>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_Metatiles">
<property name="geometry">
@ -88,17 +88,17 @@
<item row="0" column="0">
<widget class="NoScrollGraphicsView" name="graphicsView_Metatiles">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -121,7 +121,7 @@
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@ -129,10 +129,10 @@
</widget>
<widget class="QFrame" name="frame_Editing">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
<enum>QFrame::Shadow::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
@ -162,14 +162,14 @@
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
<enum>QFrame::Shadow::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property>
<property name="leftMargin">
<number>0</number>
@ -255,7 +255,7 @@
</sizepolicy>
</property>
<property name="insertPolicy">
<enum>QComboBox::NoInsert</enum>
<enum>QComboBox::InsertPolicy::NoInsert</enum>
</property>
</widget>
</item>
@ -274,10 +274,10 @@
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
@ -290,17 +290,17 @@
</sizepolicy>
</property>
<property name="insertPolicy">
<enum>QComboBox::NoInsert</enum>
<enum>QComboBox::InsertPolicy::NoInsert</enum>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Maximum</enum>
<enum>QSizePolicy::Policy::Maximum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -319,7 +319,7 @@
</sizepolicy>
</property>
<property name="insertPolicy">
<enum>QComboBox::NoInsert</enum>
<enum>QComboBox::InsertPolicy::NoInsert</enum>
</property>
</widget>
</item>
@ -361,7 +361,7 @@
<item row="16" column="0">
<spacer name="verticalSpacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -412,7 +412,7 @@
<item row="1" column="1">
<widget class="QCheckBox" name="checkBox_xFlip">
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
<enum>Qt::LayoutDirection::LeftToRight</enum>
</property>
<property name="text">
<string/>
@ -436,10 +436,10 @@
<item row="3" column="0" colspan="2">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -464,10 +464,10 @@
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
<enum>QFrame::Shadow::Plain</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
@ -510,13 +510,13 @@
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
@ -526,7 +526,7 @@
<item row="6" column="0" colspan="2">
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -548,7 +548,7 @@
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop</set>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_Tiles">
<property name="geometry">
@ -575,17 +575,17 @@
<item row="0" column="0">
<widget class="NoScrollGraphicsView" name="graphicsView_Tiles">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -602,7 +602,7 @@
<item>
<widget class="QSlider" name="horizontalSlider_TilesZoom">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@ -646,6 +646,13 @@
<addaction name="actionImport_Primary_Tiles_Image"/>
<addaction name="actionImport_Secondary_Tiles_Image"/>
</widget>
<widget class="QMenu" name="menuExport_porytiles_Layer_Images">
<property name="title">
<string>Export Porytiles Layer Images...</string>
</property>
<addaction name="actionExport_Primary_Porytiles_Layer_Images"/>
<addaction name="actionExport_Secondary_Porytiles_Layer_Images"/>
</widget>
<addaction name="actionSave_Tileset"/>
<addaction name="separator"/>
<addaction name="menuImport_Tiles_Image"/>
@ -653,6 +660,7 @@
<addaction name="separator"/>
<addaction name="menuExport_Tiles_Image"/>
<addaction name="actionExport_Metatiles_Image"/>
<addaction name="menuExport_porytiles_Layer_Images"/>
</widget>
<widget class="QMenu" name="menuTools">
<property name="title">
@ -845,6 +853,16 @@
<string>Export Metatiles Image...</string>
</property>
</action>
<action name="actionExport_Primary_Porytiles_Layer_Images">
<property name="text">
<string>Primary...</string>
</property>
</action>
<action name="actionExport_Secondary_Porytiles_Layer_Images">
<property name="text">
<string>Secondary...</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@ -62,6 +62,12 @@ public:
explicit MetatileImageExporter(QWidget *parent, Tileset *primaryTileset, Tileset *secondaryTileset, Settings *savedSettings = nullptr);
~MetatileImageExporter();
bool saveImage(QString filepath = QString());
QImage getImage();
QString getDefaultFileName() const;
void applySettings(const Settings &settings);
void reset();
protected:
virtual void showEvent(QShowEvent *) override;
virtual void closeEvent(QCloseEvent *) override;
@ -80,11 +86,11 @@ private:
ProjectConfig m_savedConfig;
QList<QRadioButton*> m_transparencyButtons;
void applySettings(const Settings &settings);
void populate(const Settings &settings);
void updatePreview();
void tryUpdatePreview();
void queuePreviewUpdate();
void updateTilesetUI();
void tryEnforceMetatileRange();
void syncPixelWidth();
void syncMetatileWidth();
void validateMetatileStart();
@ -92,8 +98,6 @@ private:
void updateMetatileRange();
void copyRenderSettings();
void restoreRenderSettings();
void saveImage();
void reset();
};
#endif // METATILEIMAGEEXPORTER_H

View File

@ -115,6 +115,7 @@ private:
void importTilesetTiles(Tileset*);
void importAdvanceMapMetatiles(Tileset*);
void exportTilesImage(Tileset*);
void exportPorytilesLayerImages(Tileset*);
void exportMetatilesImage();
void refresh();
void commitMetatileLabel();

View File

@ -99,7 +99,7 @@ uint16_t Tileset::firstMetatileId() const {
}
uint16_t Tileset::lastMetatileId() const {
return firstMetatileId() + qMax(m_metatiles.length(), 1) - 1;
return qMax(1, firstMetatileId() + m_metatiles.length()) - 1;
}
int Tileset::maxMetatiles() const {

View File

@ -15,7 +15,6 @@ MetatileImageExporter::MetatileImageExporter(QWidget *parent, Tileset *primaryTi
m_secondaryTileset(secondaryTileset),
m_savedSettings(savedSettings)
{
setAttribute(Qt::WA_DeleteOnClose);
ui->setupUi(this);
m_transparencyButtons = {
ui->radioButton_TransparencyNormal,
@ -47,15 +46,15 @@ MetatileImageExporter::MetatileImageExporter(QWidget *parent, Tileset *primaryTi
}
if (m_savedSettings) {
applySettings(*m_savedSettings);
populate(*m_savedSettings);
} else {
applySettings({});
populate({});
}
connect(ui->listWidget_Layers, &ReorderableListWidget::itemChanged, this, &MetatileImageExporter::updatePreview);
connect(ui->listWidget_Layers, &ReorderableListWidget::reordered, this, &MetatileImageExporter::updatePreview);
connect(ui->pushButton_Save, &QPushButton::pressed, this, &MetatileImageExporter::saveImage);
connect(ui->pushButton_Save, &QPushButton::pressed, [this] { saveImage(); });
connect(ui->pushButton_Close, &QPushButton::pressed, this, &MetatileImageExporter::close);
connect(ui->pushButton_Reset, &QPushButton::pressed, this, &MetatileImageExporter::reset);
@ -82,9 +81,9 @@ MetatileImageExporter::MetatileImageExporter(QWidget *parent, Tileset *primaryTi
connect(ui->radioButton_TransparencyFirst, &QRadioButton::clicked, this, &MetatileImageExporter::updatePreview);
connect(ui->checkBox_Placeholders, &QCheckBox::toggled, this, &MetatileImageExporter::updatePreview);
connect(ui->checkBox_PrimaryTileset, &QCheckBox::toggled, this, &MetatileImageExporter::updateTilesetUI);
connect(ui->checkBox_PrimaryTileset, &QCheckBox::toggled, this, &MetatileImageExporter::tryEnforceMetatileRange);
connect(ui->checkBox_PrimaryTileset, &QCheckBox::toggled, this, &MetatileImageExporter::updatePreview);
connect(ui->checkBox_SecondaryTileset, &QCheckBox::toggled, this, &MetatileImageExporter::updateTilesetUI);
connect(ui->checkBox_SecondaryTileset, &QCheckBox::toggled, this, &MetatileImageExporter::tryEnforceMetatileRange);
connect(ui->checkBox_SecondaryTileset, &QCheckBox::toggled, this, &MetatileImageExporter::updatePreview);
ui->graphicsView_Preview->setFocus();
@ -128,19 +127,36 @@ void MetatileImageExporter::closeEvent(QCloseEvent *event) {
QDialog::closeEvent(event);
}
void MetatileImageExporter::applySettings(const Settings &settings) {
void MetatileImageExporter::populate(const Settings &settings) {
const QSignalBlocker b_MetatileStart(ui->spinBox_MetatileStart);
ui->spinBox_MetatileStart->setValue(settings.metatileStart);
const QSignalBlocker b_MetatileEnd(ui->spinBox_MetatileStart);
ui->spinBox_MetatileEnd->setValue(settings.metatileEnd);
const QSignalBlocker b_WidthMetatiles(ui->spinBox_MetatileStart);
ui->spinBox_WidthMetatiles->setValue(settings.numMetatilesWide);
const QSignalBlocker b_WidthPixels(ui->spinBox_MetatileStart);
ui->spinBox_WidthPixels->setValue(settings.numMetatilesWide * Metatile::pixelWidth());
const QSignalBlocker b_PrimaryTileset(ui->spinBox_MetatileStart);
ui->checkBox_PrimaryTileset->setChecked(settings.usePrimaryTileset);
const QSignalBlocker b_SecondaryTileset(ui->spinBox_MetatileStart);
ui->checkBox_SecondaryTileset->setChecked(settings.useSecondaryTileset);
const QSignalBlocker b_Placeholders(ui->spinBox_MetatileStart);
ui->checkBox_Placeholders->setChecked(settings.renderPlaceholders);
if (m_transparencyButtons.value(settings.transparencyMode)) {
m_transparencyButtons[settings.transparencyMode]->setChecked(true);
auto button = m_transparencyButtons[settings.transparencyMode];
const QSignalBlocker b_Transparency(button);
button->setChecked(true);
}
// Build layer list from settings
const QSignalBlocker b_Layers(ui->listWidget_Layers);
ui->listWidget_Layers->clear();
for (auto it = settings.layerOrder.cbegin(); it != settings.layerOrder.cend(); it++) {
int layerNum = it.key();
@ -155,45 +171,58 @@ void MetatileImageExporter::applySettings(const Settings &settings) {
// Don't give extra unnecessary space to the list
ui->listWidget_Layers->setFixedHeight(ui->listWidget_Layers->sizeHintForRow(0) * ui->listWidget_Layers->count() + 4);
updateTilesetUI();
tryEnforceMetatileRange();
}
void MetatileImageExporter::applySettings(const Settings &settings) {
populate(settings);
updatePreview();
}
void MetatileImageExporter::reset() {
applySettings({});
updatePreview();
}
void MetatileImageExporter::saveImage() {
// Ensure the image in the preview is up-to-date before exporting.
updatePreview();
QImage MetatileImageExporter::getImage() {
tryUpdatePreview();
return m_preview->pixmap().toImage();
}
QString defaultFilename;
bool MetatileImageExporter::saveImage(QString filepath) {
tryUpdatePreview();
if (filepath.isEmpty()) {
QString defaultFilepath = QString("%1/%2").arg(FileDialog::getDirectory()).arg(getDefaultFileName());
filepath = FileDialog::getSaveFileName(this, windowTitle(), defaultFilepath, QStringLiteral("Image Files (*.png *.jpg *.bmp)"));
if (filepath.isEmpty()) {
return false;
}
}
return m_preview->pixmap().save(filepath);
}
QString MetatileImageExporter::getDefaultFileName() const {
if (m_layerOrder.length() == 1) {
// Exporting a metatile layer image is an expected use case for Porytiles, which expects certain file names.
// We can make the process a little easier by setting the default file name to those expected file names.
static const QStringList layerFilenames = { "bottom", "middle", "top" };
defaultFilename = (layerFilenames.at(m_layerOrder.constFirst()));
} else {
if (ui->checkBox_PrimaryTileset->isChecked() && m_primaryTileset) {
defaultFilename.append(QString("%1_").arg(Tileset::stripPrefix(m_primaryTileset->name)));
}
if (ui->checkBox_SecondaryTileset->isChecked() && m_secondaryTileset) {
defaultFilename.append(QString("%1_").arg(Tileset::stripPrefix(m_secondaryTileset->name)));
}
if (!m_layerOrder.isEmpty() && m_layerOrder != QList<int>({0,1,2})) {
for (int i = m_layerOrder.length() - 1; i >= 0; i--) {
defaultFilename.append(Metatile::getLayerName(m_layerOrder.at(i)));
}
defaultFilename.append("_");
}
defaultFilename.append("Metatiles");
return layerFilenames.at(m_layerOrder.constFirst()) + ".png";
}
QString defaultFilepath = QString("%1/%2.png").arg(FileDialog::getDirectory()).arg(defaultFilename);
QString filepath = FileDialog::getSaveFileName(this, windowTitle(), defaultFilepath, QStringLiteral("Image Files (*.png *.jpg *.bmp)"));
if (!filepath.isEmpty()) {
m_preview->pixmap().save(filepath);
QString defaultFilename;
if (ui->checkBox_PrimaryTileset->isChecked() && m_primaryTileset) {
defaultFilename.append(QString("%1_").arg(Tileset::stripPrefix(m_primaryTileset->name)));
}
if (ui->checkBox_SecondaryTileset->isChecked() && m_secondaryTileset) {
defaultFilename.append(QString("%1_").arg(Tileset::stripPrefix(m_secondaryTileset->name)));
}
if (!m_layerOrder.isEmpty() && m_layerOrder != QList<int>({0,1,2})) {
for (int i = m_layerOrder.length() - 1; i >= 0; i--) {
defaultFilename.append(Metatile::getLayerName(m_layerOrder.at(i)));
}
defaultFilename.append("_");
}
defaultFilename.append("Metatiles.png");
return defaultFilename;
}
void MetatileImageExporter::queuePreviewUpdate() {
@ -256,22 +285,34 @@ void MetatileImageExporter::validateMetatileEnd() {
}
void MetatileImageExporter::updateMetatileRange() {
Tileset *tileset = nullptr;
if (ui->checkBox_PrimaryTileset->isChecked()) {
tileset = m_primaryTileset;
} else if (ui->checkBox_PrimaryTileset->isChecked()) {
tileset = m_secondaryTileset;
}
if (!tileset)
uint16_t min;
uint16_t max;
if (ui->checkBox_PrimaryTileset->isChecked() && m_primaryTileset) {
if (ui->checkBox_SecondaryTileset->isChecked() && m_secondaryTileset) {
// Both tilesets enforced
min = qMin(m_primaryTileset->firstMetatileId(), m_secondaryTileset->firstMetatileId());
max = qMax(m_primaryTileset->lastMetatileId(), m_secondaryTileset->lastMetatileId());
} else {
// Primary enforced
min = m_primaryTileset->firstMetatileId();
max = m_primaryTileset->lastMetatileId();
}
} else if (ui->checkBox_SecondaryTileset->isChecked() && m_secondaryTileset) {
// Secondary enforced
min = m_secondaryTileset->firstMetatileId();
max = m_secondaryTileset->lastMetatileId();
} else {
// No tilesets enforced
return;
}
const QSignalBlocker b_MetatileStart(ui->spinBox_MetatileStart);
const QSignalBlocker b_MetatileEnd(ui->spinBox_MetatileEnd);
ui->spinBox_MetatileStart->setValue(tileset->firstMetatileId());
ui->spinBox_MetatileEnd->setValue(tileset->lastMetatileId());
ui->spinBox_MetatileStart->setValue(min);
ui->spinBox_MetatileEnd->setValue(max);
}
void MetatileImageExporter::updateTilesetUI() {
void MetatileImageExporter::tryEnforceMetatileRange() {
// Users can either specify which tileset(s) to render, or specify a range of metatiles, but not both.
if (ui->checkBox_PrimaryTileset->isChecked() || ui->checkBox_SecondaryTileset->isChecked()) {
updateMetatileRange();

View File

@ -43,9 +43,12 @@ TilesetEditor::TilesetEditor(Project *project, Layout *layout, QWidget *parent)
connect(ui->actionImport_Primary_AdvanceMap_Metatiles, &QAction::triggered, [this] { importAdvanceMapMetatiles(this->primaryTileset); });
connect(ui->actionImport_Secondary_AdvanceMap_Metatiles, &QAction::triggered, [this] { importAdvanceMapMetatiles(this->secondaryTileset); });
connect(ui->actionExport_Primary_Tiles_Image, &QAction::triggered, [this] { exportTilesImage(this->primaryTileset); });
connect(ui->actionExport_Primary_Tiles_Image, &QAction::triggered, [this] { exportTilesImage(this->primaryTileset); });
connect(ui->actionExport_Secondary_Tiles_Image, &QAction::triggered, [this] { exportTilesImage(this->secondaryTileset); });
connect(ui->actionExport_Primary_Porytiles_Layer_Images, &QAction::triggered, [this] { exportPorytilesLayerImages(this->primaryTileset); });
connect(ui->actionExport_Secondary_Porytiles_Layer_Images, &QAction::triggered, [this] { exportPorytilesLayerImages(this->secondaryTileset); });
connect(ui->actionExport_Metatiles_Image, &QAction::triggered, [this] { exportMetatilesImage(); });
ui->actionShow_Tileset_Divider->setChecked(porymapConfig.showTilesetEditorDivider);
@ -1007,9 +1010,52 @@ void TilesetEditor::exportMetatilesImage() {
this->metatileImageExportSettings = new MetatileImageExporter::Settings;
}
auto dialog = new MetatileImageExporter(this, this->primaryTileset, this->secondaryTileset, this->metatileImageExportSettings);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->open();
}
void TilesetEditor::exportPorytilesLayerImages(Tileset *tileset) {
QString dir = FileDialog::getExistingDirectory(this, QStringLiteral("Choose Folder to Export Images"));
if (dir.isEmpty()) {
return;
}
MetatileImageExporter layerExporter(this, this->primaryTileset, this->secondaryTileset);
MetatileImageExporter::Settings settings = {};
settings.usePrimaryTileset = !tileset->is_secondary;
settings.useSecondaryTileset = tileset->is_secondary;
QMap<QString,QImage> images;
QStringList pathCollisions;
for (int i = 0; i < 3; i++) {
settings.layerOrder.clear();
settings.layerOrder[i] = true;
layerExporter.applySettings(settings);
QString filename = layerExporter.getDefaultFileName();
QString path = QString("%1/%2").arg(dir).arg(filename);
if (QFileInfo::exists(path)) {
pathCollisions.append(filename);
}
images[path] = layerExporter.getImage();
}
if (!pathCollisions.isEmpty()) {
QString message = QString("The following files will be overwritten, are you sure you want to export?\n\n%1").arg(pathCollisions.join("\n"));
auto reply = QuestionMessage::show(message, this);
if (reply != QMessageBox::Yes) {
return;
}
}
for (auto it = images.constBegin(); it != images.constEnd(); it++) {
QString path = it.key();
if (!it.value().save(path)) {
logError(QString("Failed to save Porytiles layer image '%1'.").arg(path));
}
}
}
void TilesetEditor::importAdvanceMapMetatiles(Tileset *tileset) {
bool primary = !tileset->is_secondary;
QString descriptorCaps = primary ? "Primary" : "Secondary";