diff --git a/include/core/tileset.h b/include/core/tileset.h index c25cbc62..0b273e83 100644 --- a/include/core/tileset.h +++ b/include/core/tileset.h @@ -36,8 +36,11 @@ public: static Tileset* getMetatileTileset(int, Tileset*, Tileset*); static Tileset* getTileTileset(int, Tileset*, Tileset*); static Metatile* getMetatile(int, Tileset*, Tileset*); - static QString getMetatileLabel(int, Tileset *, Tileset *, bool * isAlternateLabel = nullptr); + static Tileset* getMetatileLabelTileset(int, Tileset*, Tileset*, bool * isShared = nullptr); + static QString getMetatileLabel(int, Tileset *, Tileset *, bool * isShared = nullptr); static bool setMetatileLabel(int, QString, Tileset *, Tileset *); + QString getMetatileLabelPrefix(); + static QString getMetatileLabelPrefix(const QString &name); static QList> getBlockPalettes(Tileset*, Tileset*, bool useTruePalettes = false); static QList getPalette(int, Tileset*, Tileset*, bool useTruePalettes = false); static bool metatileIsValid(uint16_t metatileId, Tileset *, Tileset *); diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index 33ca9272..593991e3 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -93,26 +93,33 @@ Metatile* Tileset::getMetatile(int metatileId, Tileset *primaryTileset, Tileset // Metatile labels are stored per-tileset. When looking for a metatile label, first search in the tileset // that the metatile belongs to. If one isn't found, search in the other tileset. Labels coming from the -// tileset that the metatile does not belong to cannot be edited via Porymap. -QString Tileset::getMetatileLabel(int metatileId, Tileset *primaryTileset, Tileset *secondaryTileset, bool * isAlternateLabel) { +// tileset that the metatile does not belong to are shared and cannot be edited via Porymap. +Tileset* Tileset::getMetatileLabelTileset(int metatileId, Tileset *primaryTileset, Tileset *secondaryTileset, bool * isShared) { Tileset *mainTileset = nullptr; - Tileset *backupTileset = nullptr; - if (isAlternateLabel) *isAlternateLabel = false; + Tileset *alternateTileset = nullptr; + if (isShared) *isShared = false; if (metatileId < Project::getNumMetatilesPrimary()) { mainTileset = primaryTileset; - backupTileset = secondaryTileset; + alternateTileset = secondaryTileset; } else if (metatileId < Project::getNumMetatilesTotal()) { mainTileset = secondaryTileset; - backupTileset = primaryTileset; + alternateTileset = primaryTileset; } if (mainTileset && mainTileset->metatileLabels.contains(metatileId)) { - return mainTileset->metatileLabels.value(metatileId); - } else if (backupTileset && backupTileset->metatileLabels.contains(metatileId)) { - if (isAlternateLabel) *isAlternateLabel = true; - return backupTileset->metatileLabels.value(metatileId); + return mainTileset; + } else if (alternateTileset && alternateTileset->metatileLabels.contains(metatileId)) { + if (isShared) *isShared = true; + return alternateTileset; } - return QString(); + return nullptr; +} + +QString Tileset::getMetatileLabel(int metatileId, Tileset *primaryTileset, Tileset *secondaryTileset, bool * isShared) { + Tileset * tileset = Tileset::getMetatileLabelTileset(metatileId, primaryTileset, secondaryTileset, isShared); + if (!tileset) + return QString(); + return tileset->metatileLabels.value(metatileId); } bool Tileset::setMetatileLabel(int metatileId, QString label, Tileset *primaryTileset, Tileset *secondaryTileset) { @@ -130,6 +137,16 @@ bool Tileset::setMetatileLabel(int metatileId, QString label, Tileset *primaryTi return true; } +QString Tileset::getMetatileLabelPrefix() +{ + return Tileset::getMetatileLabelPrefix(this->name); +} + +QString Tileset::getMetatileLabelPrefix(const QString &name) +{ + return QString("METATILE_%1_").arg(QString(name).replace("gTileset_", "")); +} + bool Tileset::metatileIsValid(uint16_t metatileId, Tileset *primaryTileset, Tileset *secondaryTileset) { if (metatileId >= Project::getNumMetatilesTotal()) return false; diff --git a/src/project.cpp b/src/project.cpp index 23fce463..1ab726da 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -891,8 +891,8 @@ void Project::saveTilesets(Tileset *primaryTileset, Tileset *secondaryTileset) { } void Project::saveTilesetMetatileLabels(Tileset *primaryTileset, Tileset *secondaryTileset) { - QString primaryPrefix = QString("METATILE_%1_").arg(QString(primaryTileset->name).replace("gTileset_", "")); - QString secondaryPrefix = QString("METATILE_%1_").arg(QString(secondaryTileset->name).replace("gTileset_", "")); + QString primaryPrefix = primaryTileset->getMetatileLabelPrefix(); + QString secondaryPrefix = secondaryTileset->getMetatileLabelPrefix(); QMap defines; bool definesFileModified = false; @@ -1500,11 +1500,11 @@ bool Project::readTilesetMetatileLabels() { QMap labels = parser.readCDefines(metatileLabelsFilename, QStringList() << "METATILE_"); - for (QString label : this->tilesetLabelsOrdered) { - QString tilesetName = QString(label).replace("gTileset_", ""); + for (QString tilesetLabel : this->tilesetLabelsOrdered) { + QString metatileLabelPrefix = Tileset::getMetatileLabelPrefix(tilesetLabel); for (QString key : labels.keys()) { - if (key.contains(QString("METATILE_") + tilesetName + "_")) { - metatileLabelsMap[label][key] = labels[key]; + if (key.startsWith(metatileLabelPrefix)) { + metatileLabelsMap[tilesetLabel][key] = labels[key]; } } } @@ -1513,12 +1513,12 @@ bool Project::readTilesetMetatileLabels() { } void Project::loadTilesetMetatileLabels(Tileset* tileset) { - QString tilesetPrefix = QString("METATILE_%1_").arg(QString(tileset->name).replace("gTileset_", "")); + QString metatileLabelPrefix = tileset->getMetatileLabelPrefix(); // Reverse map for faster lookup by metatile id for (QString labelName : metatileLabelsMap[tileset->name].keys()) { int metatileId = metatileLabelsMap[tileset->name][labelName]; - tileset->metatileLabels[metatileId] = labelName.replace(tilesetPrefix, ""); + tileset->metatileLabels[metatileId] = labelName.replace(metatileLabelPrefix, ""); } } diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index a5352fd3..fcfe4266 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -380,10 +380,10 @@ void TilesetEditor::onSelectedMetatileChanged(uint16_t metatileId) { this->metatileLayersItem->draw(); this->ui->graphicsView_metatileLayers->setFixedSize(this->metatileLayersItem->pixmap().width() + 2, this->metatileLayersItem->pixmap().height() + 2); - bool isAlternateLabel = false; - QString label = Tileset::getMetatileLabel(metatileId, this->primaryTileset, this->secondaryTileset, &isAlternateLabel); + bool isShared = false; + QString label = Tileset::getMetatileLabel(metatileId, this->primaryTileset, this->secondaryTileset, &isShared); this->ui->lineEdit_metatileLabel->setText(label); - this->ui->lineEdit_metatileLabel->setReadOnly(isAlternateLabel); + this->ui->lineEdit_metatileLabel->setReadOnly(isShared); setComboValue(this->ui->comboBox_metatileBehaviors, this->metatile->behavior); setComboValue(this->ui->comboBox_layerType, this->metatile->layerType); @@ -918,9 +918,9 @@ void TilesetEditor::copyMetatile(bool cut) { // Don't try to copy the label unless it's a cut, these should be unique to each metatile this->copiedMetatileLabel = ""; if (cut) { - bool isAlternateLabel = false; - QString label = Tileset::getMetatileLabel(metatileId, this->primaryTileset, this->secondaryTileset, &isAlternateLabel); - if (!isAlternateLabel) + bool isShared = false; + QString label = Tileset::getMetatileLabel(metatileId, this->primaryTileset, this->secondaryTileset, &isShared); + if (!isShared) this->copiedMetatileLabel = label; } } @@ -1165,12 +1165,11 @@ void TilesetEditor::countTileUsage() { } void TilesetEditor::on_copyButton_metatileLabel_clicked() { - // TODO: Handle alternate labels QString label = this->ui->lineEdit_metatileLabel->text(); if (label.isEmpty()) return; - Tileset * tileset = Tileset::getMetatileTileset(this->getSelectedMetatileId(), this->primaryTileset, this->secondaryTileset); + Tileset * tileset = Tileset::getMetatileLabelTileset(this->getSelectedMetatileId(), this->primaryTileset, this->secondaryTileset); if (tileset) - label.prepend("METATILE_" + QString(tileset->name).replace("gTileset_", "") + "_"); + label.prepend(tileset->getMetatileLabelPrefix()); QGuiApplication::clipboard()->setText(label); QToolTip::showText(this->ui->copyButton_metatileLabel->mapToGlobal(QPoint(0, 0)), "Copied!"); }