From 8d38783833ba950c361c1a115d348b4d1f413f07 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Tue, 2 Oct 2018 19:01:15 -0500 Subject: [PATCH] Add ability to save tileset changes --- include/core/metatile.h | 1 + include/core/tileset.h | 2 ++ include/editor.h | 4 +-- include/mainwindow.h | 1 + include/project.h | 4 +-- include/ui/tileseteditor.h | 7 +++-- include/ui/tileseteditormetatileselector.h | 4 +-- src/core/map.cpp | 2 +- src/core/metatile.cpp | 11 +++++++ src/core/tileset.cpp | 32 ++++++++++++++++++++ src/editor.cpp | 11 +++---- src/mainwindow.cpp | 6 ++++ src/project.cpp | 18 ++++++++---- src/ui/tileseteditor.cpp | 34 +++++++++------------- 14 files changed, 97 insertions(+), 40 deletions(-) diff --git a/include/core/metatile.h b/include/core/metatile.h index 0a61f9fd..4f280608 100644 --- a/include/core/metatile.h +++ b/include/core/metatile.h @@ -13,6 +13,7 @@ public: uint8_t behavior; uint8_t layerType; + Metatile *copy(); static int getBlockIndex(int); }; diff --git a/include/core/tileset.h b/include/core/tileset.h index dea009eb..c3d55b1d 100644 --- a/include/core/tileset.h +++ b/include/core/tileset.h @@ -26,6 +26,8 @@ public: QList *metatiles = nullptr; QList> *palettes = nullptr; + Tileset* copy(); + static Tileset* getBlockTileset(int, Tileset*, Tileset*); static Metatile* getMetatile(int, Tileset*, Tileset*); static QList> getBlockPalettes(Tileset*, Tileset*); diff --git a/include/editor.h b/include/editor.h index 31f11586..ac95c761 100644 --- a/include/editor.h +++ b/include/editor.h @@ -68,8 +68,8 @@ public: void updateDiveMap(QString mapName); void updateEmergeMap(QString mapName); void setSelectedConnectionFromMap(QString mapName); - void updatePrimaryTileset(QString tilesetLabel); - void updateSecondaryTileset(QString tilesetLabel); + void updatePrimaryTileset(QString tilesetLabel, bool forceLoad = false); + void updateSecondaryTileset(QString tilesetLabel, bool forceLoad = false); void toggleBorderVisibility(bool visible); Tileset *getCurrentMapPrimaryTileset(); diff --git a/include/mainwindow.h b/include/mainwindow.h index 8178b625..a120644c 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -43,6 +43,7 @@ private slots: void onLoadMapRequested(QString, QString); void onMapChanged(Map *map); void onMapNeedsRedrawing(); + void onTilesetsSaved(QString, QString); void on_action_Save_triggered(); void on_tabWidget_2_currentChanged(int index); diff --git a/include/project.h b/include/project.h index 856e3562..4aa8d35e 100644 --- a/include/project.h +++ b/include/project.h @@ -48,8 +48,8 @@ public: Map* getMap(QString); QMap *tileset_cache = nullptr; - Tileset* loadTileset(QString); - Tileset* getTileset(QString); + Tileset* loadTileset(QString, Tileset *tileset = nullptr); + Tileset* getTileset(QString, bool forceLoad = false); Blockdata* readBlockdata(QString); void loadBlockdata(Map*); diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h index 9126985c..2bef6227 100644 --- a/include/ui/tileseteditor.h +++ b/include/ui/tileseteditor.h @@ -55,13 +55,16 @@ private: int paletteId; bool tileXFlip; bool tileYFlip; - QString primaryTilesetLabel; - QString secondaryTilesetLabel; + Tileset *primaryTileset; + Tileset *secondaryTileset; QGraphicsScene *metatilesScene = nullptr; QGraphicsScene *tilesScene = nullptr; QGraphicsScene *selectedTileScene = nullptr; QGraphicsPixmapItem *selectedTilePixmapItem = nullptr; QGraphicsScene *metatileLayersScene = nullptr; + +signals: + void tilesetsSaved(QString, QString); }; #endif // TILESETEDITOR_H diff --git a/include/ui/tileseteditormetatileselector.h b/include/ui/tileseteditormetatileselector.h index eb8d45fe..4b1a0d49 100644 --- a/include/ui/tileseteditormetatileselector.h +++ b/include/ui/tileseteditormetatileselector.h @@ -26,8 +26,8 @@ protected: void hoverLeaveEvent(QGraphicsSceneHoverEvent*); private: - Tileset *primaryTileset; - Tileset *secondaryTileset; + Tileset *primaryTileset = nullptr; + Tileset *secondaryTileset = nullptr; uint16_t selectedMetatile; int numMetatilesWide; void updateSelectedMetatile(); diff --git a/src/core/map.cpp b/src/core/map.cpp index 3954df06..185306e5 100644 --- a/src/core/map.cpp +++ b/src/core/map.cpp @@ -226,7 +226,7 @@ QPixmap Map::renderBorder() { } QPixmap Map::renderConnection(MapConnection connection) { - render(); + render(true); int x, y, w, h; if (connection.direction == "up") { x = 0; diff --git a/src/core/metatile.cpp b/src/core/metatile.cpp index 6dff9dc6..a44b4fa3 100644 --- a/src/core/metatile.cpp +++ b/src/core/metatile.cpp @@ -7,6 +7,17 @@ Metatile::Metatile() tiles = new QList; } +Metatile* Metatile::copy() { + Metatile *copy = new Metatile; + copy->behavior = this->behavior; + copy->layerType = this->layerType; + copy->tiles = new QList; + for (Tile tile : *this->tiles) { + copy->tiles->append(tile); + } + return copy; +} + int Metatile::getBlockIndex(int index) { if (index < Project::getNumMetatilesPrimary()) { return index; diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index 36187c02..5bb51e23 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -11,6 +11,38 @@ Tileset::Tileset() } +Tileset* Tileset::copy() { + Tileset *copy = new Tileset; + copy->name = this->name; + copy->is_compressed = this->is_compressed; + copy->is_secondary = this->is_secondary; + copy->padding = this->padding; + copy->tiles_label = this->tiles_label; + copy->palettes_label = this->palettes_label; + copy->metatiles_label = this->metatiles_label; + copy->metatiles_path = this->metatiles_path; + copy->callback_label = this->callback_label; + copy->metatile_attrs_label = this->metatile_attrs_label; + copy->metatile_attrs_path = this->metatile_attrs_path; + copy->tiles = new QList; + for (QImage tile : *this->tiles) { + copy->tiles->append(tile.copy()); + } + copy->metatiles = new QList; + for (Metatile *metatile : *this->metatiles) { + copy->metatiles->append(metatile->copy()); + } + copy->palettes = new QList>; + for (QList palette : *this->palettes) { + QList copyPalette; + for (QRgb color : palette) { + copyPalette.append(color); + } + copy->palettes->append(copyPalette); + } + return copy; +} + Tileset* Tileset::getBlockTileset(int metatile_index, Tileset *primaryTileset, Tileset *secondaryTileset) { if (metatile_index < Project::getNumMetatilesPrimary()) { return primaryTileset; diff --git a/src/editor.cpp b/src/editor.cpp index 6da57f69..878e4a70 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -961,22 +961,23 @@ void Editor::updateDiveEmergeMap(QString mapName, QString direction) { ui->label_NumConnections->setText(QString::number(map->connections.length())); } -void Editor::updatePrimaryTileset(QString tilesetLabel) +void Editor::updatePrimaryTileset(QString tilesetLabel, bool forceLoad) { - if (map->layout->tileset_primary_label != tilesetLabel) + if (map->layout->tileset_primary_label != tilesetLabel || forceLoad) { + qDebug() << "updatePrimaryTileset"; map->layout->tileset_primary_label = tilesetLabel; - map->layout->tileset_primary = project->getTileset(tilesetLabel); + map->layout->tileset_primary = project->getTileset(tilesetLabel, forceLoad); emit tilesetChanged(map->name); } } -void Editor::updateSecondaryTileset(QString tilesetLabel) +void Editor::updateSecondaryTileset(QString tilesetLabel, bool forceLoad) { if (map->layout->tileset_secondary_label != tilesetLabel) { map->layout->tileset_secondary_label = tilesetLabel; - map->layout->tileset_secondary = project->getTileset(tilesetLabel); + map->layout->tileset_secondary = project->getTileset(tilesetLabel, forceLoad); emit tilesetChanged(map->name); } } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index bba152a7..280e770c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1104,6 +1104,11 @@ void MainWindow::onMapNeedsRedrawing() { redrawMapScene(); } +void MainWindow::onTilesetsSaved(QString primaryTilesetLabel, QString secondaryTilesetLabel) { + this->editor->updatePrimaryTileset(primaryTilesetLabel, true); + this->editor->updateSecondaryTileset(secondaryTilesetLabel, true); +} + void MainWindow::on_action_Export_Map_Image_triggered() { QString defaultFilepath = QString("%1/%2.png").arg(editor->project->root).arg(editor->map->name); @@ -1233,6 +1238,7 @@ void MainWindow::on_actionTileset_Editor_triggered() { if (!this->tilesetEditor) { this->tilesetEditor = new TilesetEditor(this->editor->project, this->editor->map->layout->tileset_primary_label, this->editor->map->layout->tileset_secondary_label); + connect(this->tilesetEditor, SIGNAL(tilesetsSaved(QString, QString)), this, SLOT(onTilesetsSaved(QString, QString))); } if (!this->tilesetEditor->isVisible()) { diff --git a/src/project.cpp b/src/project.cpp index 5fcd5b71..2bc67c03 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -628,12 +628,14 @@ void Project::loadMapTilesets(Map* map) { map->layout->tileset_secondary = getTileset(map->layout->tileset_secondary_label); } -Tileset* Project::loadTileset(QString label) { +Tileset* Project::loadTileset(QString label, Tileset *tileset) { ParseUtil *parser = new ParseUtil; QString headers_text = readTextFile(root + "/data/tilesets/headers.inc"); QStringList *values = getLabelValues(parser->parseAsm(headers_text), label); - Tileset *tileset = new Tileset; + if (tileset == nullptr) { + tileset = new Tileset; + } tileset->name = label; tileset->is_compressed = values->value(0); tileset->is_secondary = values->value(1); @@ -793,7 +795,8 @@ void Project::loadTilesetAssets(Tileset* tileset) { if (tileset->name.isNull()) { return; } - QString dir_path = root + "/data/tilesets/" + category + "/" + tileset->name.replace("gTileset_", "").toLower(); + QString tilesetName = tileset->name; + QString dir_path = root + "/data/tilesets/" + category + "/" + tilesetName.replace("gTileset_", "").toLower(); QString graphics_text = readTextFile(root + "/data/tilesets/graphics.inc"); QList *graphics = parser->parseAsm(graphics_text); @@ -958,11 +961,16 @@ Map* Project::getMap(QString map_name) { } } -Tileset* Project::getTileset(QString label) { +Tileset* Project::getTileset(QString label, bool forceLoad) { + Tileset *existingTileset = nullptr; if (tileset_cache->contains(label)) { + existingTileset = tileset_cache->value(label); + } + + if (existingTileset && !forceLoad) { return tileset_cache->value(label); } else { - Tileset *tileset = loadTileset(label); + Tileset *tileset = loadTileset(label, existingTileset); return tileset; } } diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index 06a889eb..774e4a10 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -13,8 +13,11 @@ TilesetEditor::TilesetEditor(Project *project, QString primaryTilesetLabel, QStr this->tileXFlip = ui->checkBox_xFlip->isChecked(); this->tileYFlip = ui->checkBox_yFlip->isChecked(); this->paletteId = ui->spinBox_paletteSelector->value(); - this->primaryTilesetLabel = primaryTilesetLabel; - this->secondaryTilesetLabel = secondaryTilesetLabel; + + Tileset *primaryTileset = project->getTileset(primaryTilesetLabel); + Tileset *secondaryTileset = project->getTileset(secondaryTilesetLabel); + this->primaryTileset = primaryTileset->copy(); + this->secondaryTileset = secondaryTileset->copy(); QList sortedBehaviors; for (int num : project->metatileBehaviorMapInverse.keys()) { @@ -40,9 +43,7 @@ TilesetEditor::~TilesetEditor() void TilesetEditor::initMetatileSelector() { - Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel); - Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel); - this->metatileSelector = new TilesetEditorMetatileSelector(primaryTileset, secondaryTileset); + this->metatileSelector = new TilesetEditorMetatileSelector(this->primaryTileset, this->secondaryTileset); connect(this->metatileSelector, SIGNAL(hoveredMetatileChanged(uint16_t)), this, SLOT(onHoveredMetatileChanged(uint16_t))); connect(this->metatileSelector, SIGNAL(hoveredMetatileCleared()), @@ -60,9 +61,7 @@ void TilesetEditor::initMetatileSelector() void TilesetEditor::initTileSelector() { - Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel); - Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel); - this->tileSelector = new TilesetEditorTileSelector(primaryTileset, secondaryTileset); + this->tileSelector = new TilesetEditorTileSelector(this->primaryTileset, this->secondaryTileset); connect(this->tileSelector, SIGNAL(hoveredTileChanged(uint16_t)), this, SLOT(onHoveredTileChanged(uint16_t))); connect(this->tileSelector, SIGNAL(hoveredTileCleared()), @@ -91,19 +90,15 @@ void TilesetEditor::drawSelectedTile() { } this->selectedTileScene->clear(); - Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel); - Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel); - QImage tileImage = getColoredTileImage(this->tileSelector->getSelectedTile(), primaryTileset, secondaryTileset, this->paletteId) + QImage tileImage = getColoredTileImage(this->tileSelector->getSelectedTile(), this->primaryTileset, this->secondaryTileset, this->paletteId) .mirrored(this->tileXFlip, this->tileYFlip); this->selectedTilePixmapItem = new QGraphicsPixmapItem(QPixmap::fromImage(tileImage).scaled(32, 32)); this->selectedTileScene->addItem(this->selectedTilePixmapItem); } void TilesetEditor::initMetatileLayersItem() { - Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel); - Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel); - Metatile *metatile = Tileset::getMetatile(this->metatileSelector->getSelectedMetatile(), primaryTileset, secondaryTileset); - this->metatileLayersItem = new MetatileLayersItem(metatile, primaryTileset, secondaryTileset); + Metatile *metatile = Tileset::getMetatile(this->metatileSelector->getSelectedMetatile(), this->primaryTileset, this->secondaryTileset); + this->metatileLayersItem = new MetatileLayersItem(metatile, this->primaryTileset, this->secondaryTileset); connect(this->metatileLayersItem, SIGNAL(tileChanged(int)), this, SLOT(onMetatileLayerTileChanged(int))); @@ -123,9 +118,7 @@ void TilesetEditor::onHoveredMetatileCleared() { } void TilesetEditor::onSelectedMetatileChanged(uint16_t metatileId) { - Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel); - Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel); - this->metatile = Tileset::getMetatile(metatileId, primaryTileset, secondaryTileset); + this->metatile = Tileset::getMetatile(metatileId, this->primaryTileset, this->secondaryTileset); this->metatileLayersItem->setMetatile(metatile); this->metatileLayersItem->draw(); this->ui->comboBox_metatileBehaviors->setCurrentIndex(this->ui->comboBox_metatileBehaviors->findData(this->metatile->behavior)); @@ -193,7 +186,6 @@ void TilesetEditor::on_comboBox_layerType_currentIndexChanged(int layerType) void TilesetEditor::on_actionSave_Tileset_triggered() { - Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel); - Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel); - this->project->saveTilesets(primaryTileset, secondaryTileset); + this->project->saveTilesets(this->primaryTileset, this->secondaryTileset); + emit this->tilesetsSaved(this->primaryTileset->name, this->secondaryTileset->name); }