mirror of
https://github.com/huderlem/porymap.git
synced 2026-04-25 07:18:02 -05:00
Add Porytiles export shortcut
This commit is contained in:
parent
15b300f864
commit
26ad93f2ae
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -115,6 +115,7 @@ private:
|
|||
void importTilesetTiles(Tileset*);
|
||||
void importAdvanceMapMetatiles(Tileset*);
|
||||
void exportTilesImage(Tileset*);
|
||||
void exportPorytilesLayerImages(Tileset*);
|
||||
void exportMetatilesImage();
|
||||
void refresh();
|
||||
void commitMetatileLabel();
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user