From e94fce0c8d78100492fc58c7ca11c9679aa49814 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 3 Apr 2025 13:24:50 -0400 Subject: [PATCH] Combine the 3 QMaps for MAPSEC data --- include/core/regionmap.h | 6 +-- include/core/regionmapeditcommands.h | 4 +- include/project.h | 17 +++++-- include/ui/regionmapeditor.h | 2 +- src/core/regionmapeditcommands.cpp | 2 +- src/project.cpp | 73 ++++++++++++++++------------ src/ui/regionmapeditor.cpp | 4 +- 7 files changed, 63 insertions(+), 45 deletions(-) diff --git a/include/core/regionmap.h b/include/core/regionmap.h index 18362663..c8afb1b2 100644 --- a/include/core/regionmap.h +++ b/include/core/regionmap.h @@ -56,8 +56,8 @@ public: bool loadLayout(poryjson::Json); bool loadEntries(); - void setEntries(QMap *entries) { this->region_map_entries = entries; } - void setEntries(const QMap &entries) { *(this->region_map_entries) = entries; } + void setEntries(QHash *entries) { this->region_map_entries = entries; } + void setEntries(const QHash &entries) { *(this->region_map_entries) = entries; } void clearEntries() { this->region_map_entries->clear(); } MapSectionEntry getEntry(QString section); void setEntry(QString section, MapSectionEntry entry); @@ -151,7 +151,7 @@ signals: void mapNeedsDisplaying(); private: - QMap *region_map_entries = nullptr; + QHash *region_map_entries = nullptr; QString alias = ""; diff --git a/include/core/regionmapeditcommands.h b/include/core/regionmapeditcommands.h index 05b12bc3..e47fdb7b 100644 --- a/include/core/regionmapeditcommands.h +++ b/include/core/regionmapeditcommands.h @@ -153,7 +153,7 @@ private: /// ClearEntries class ClearEntries : public QUndoCommand { public: - ClearEntries(RegionMap *map, QMap, QUndoCommand *parent = nullptr); + ClearEntries(RegionMap *map, QHash, QUndoCommand *parent = nullptr); void undo() override; void redo() override; @@ -163,7 +163,7 @@ public: private: RegionMap *map; - QMap entries; + QHash entries; }; #endif // REGIONMAPEDITCOMMANDS_H diff --git a/include/project.h b/include/project.h index 4ed95f06..44094aaa 100644 --- a/include/project.h +++ b/include/project.h @@ -62,7 +62,6 @@ public: QStringList mapSectionIdNames; QMap encounterTypeToName; QMap terrainTypeToName; - QMap regionMapEntries; QMap> metatileLabelsMap; QMap unusedMetatileLabels; QMap metatileBehaviorMap; @@ -157,7 +156,7 @@ public: bool addNewMapsec(const QString &idName, const QString &displayName = QString()); void removeMapsec(const QString &idName); - QString getMapsecDisplayName(const QString &idName) const { return this->mapSectionDisplayNames.value(idName); } + QString getMapsecDisplayName(const QString &idName) const { return this->locationData.value(idName).displayName; } void setMapsecDisplayName(const QString &idName, const QString &displayName); bool hasUnsavedChanges(); @@ -240,6 +239,9 @@ public: static QString getExistingFilepath(QString filepath); void applyParsedLimits(); + void setRegionMapEntries(const QHash &entries); + QHash getRegionMapEntries() const; + static QString getEmptyMapDefineName(); static QString getDynamicMapDefineName(); static QString getDynamicMapName(); @@ -262,8 +264,6 @@ public: static QString getMapGroupPrefix(); private: - QHash mapSectionDisplayNames; - QHash mapSectionCustomData; QMap modifiedFileTimestamps; QMap facingDirections; QHash speciesToIconPath; @@ -298,6 +298,15 @@ private: }; QMap eventGraphicsMap; + // The extra data that can be associated with each MAPSEC name. + struct LocationData + { + MapSectionEntry map; + QString displayName; + QJsonObject custom; + }; + QHash locationData; + void updateLayout(Layout *); void setNewLayoutBlockdata(Layout *layout); diff --git a/include/ui/regionmapeditor.h b/include/ui/regionmapeditor.h index 9a838827..490324af 100644 --- a/include/ui/regionmapeditor.h +++ b/include/ui/regionmapeditor.h @@ -95,7 +95,7 @@ private: void saveConfig(); bool loadRegionMapEntries(); bool saveRegionMapEntries(); - QMap region_map_entries; + QHash region_map_entries; bool buildConfigDialog(); poryjson::Json configRegionMapDialog(); diff --git a/src/core/regionmapeditcommands.cpp b/src/core/regionmapeditcommands.cpp index 7a12cbc6..f21f1d72 100644 --- a/src/core/regionmapeditcommands.cpp +++ b/src/core/regionmapeditcommands.cpp @@ -260,7 +260,7 @@ void ResizeTilemap::undo() { /// -ClearEntries::ClearEntries(RegionMap *map, QMap entries, QUndoCommand *parent) +ClearEntries::ClearEntries(RegionMap *map, QHash entries, QUndoCommand *parent) : QUndoCommand(parent) { setText("Clear Entries"); diff --git a/src/project.cpp b/src/project.cpp index 98bd7215..891f709f 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -712,23 +712,23 @@ void Project::saveRegionMapSections() { OrderedJson::array mapSectionArray; for (const auto &idName : this->mapSectionIdNamesSaveOrder) { + const LocationData location = this->locationData.value(idName); + OrderedJson::object mapSectionObj; mapSectionObj["id"] = idName; - if (this->mapSectionDisplayNames.contains(idName)) { - mapSectionObj["name"] = this->mapSectionDisplayNames.value(idName); + if (!location.displayName.isEmpty()) { + mapSectionObj["name"] = location.displayName; } - if (this->regionMapEntries.contains(idName)) { - MapSectionEntry entry = this->regionMapEntries.value(idName); - mapSectionObj["x"] = entry.x; - mapSectionObj["y"] = entry.y; - mapSectionObj["width"] = entry.width; - mapSectionObj["height"] = entry.height; + if (location.map.valid) { + mapSectionObj["x"] = location.map.x; + mapSectionObj["y"] = location.map.y; + mapSectionObj["width"] = location.map.width; + mapSectionObj["height"] = location.map.height; } - QJsonObject customData = this->mapSectionCustomData.value(idName); - for (auto it = customData.constBegin(); it != customData.constEnd(); it++) { + for (auto it = location.custom.constBegin(); it != location.custom.constEnd(); it++) { mapSectionObj[it.key()] = OrderedJson::fromQJsonValue(it.value()); } @@ -2360,19 +2360,14 @@ bool Project::readFieldmapMasks() { } bool Project::readRegionMapSections() { + this->locationData.clear(); this->mapSectionIdNames.clear(); this->mapSectionIdNamesSaveOrder.clear(); - this->mapSectionDisplayNames.clear(); - this->regionMapEntries.clear(); + this->customMapSectionsData = QJsonObject(); + const QString defaultName = getEmptyMapsecName(); const QString requiredPrefix = projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix); - // The first of these is the custom data for each individual map section object, - // the second is the custom top-level data in the map sections file. - // TODO: Clarify this by relocating the various map section data maps to a single class? - this->mapSectionCustomData.clear(); - this->customMapSectionsData = QJsonObject(); - QJsonDocument doc; const QString filepath = projectConfig.getFilePath(ProjectFilePath::json_region_map_entries); QString error; @@ -2410,8 +2405,10 @@ bool Project::readRegionMapSections() { this->mapSectionIdNames.append(idName); this->mapSectionIdNamesSaveOrder.append(idName); - if (mapSectionObj.contains("name")) - this->mapSectionDisplayNames.insert(idName, ParseUtil::jsonToQString(mapSectionObj.take("name"))); + LocationData location; + if (mapSectionObj.contains("name")) { + location.displayName = ParseUtil::jsonToQString(mapSectionObj.take("name")); + } // Map sections may have additional data indicating their position on the region map. // If they have this data, we can add them to the region map entry list. @@ -2424,13 +2421,11 @@ bool Project::readRegionMapSections() { } } if (hasRegionMapData) { - MapSectionEntry entry; - entry.x = ParseUtil::jsonToInt(mapSectionObj.take("x")); - entry.y = ParseUtil::jsonToInt(mapSectionObj.take("y")); - entry.width = ParseUtil::jsonToInt(mapSectionObj.take("width")); - entry.height = ParseUtil::jsonToInt(mapSectionObj.take("height")); - entry.valid = true; - this->regionMapEntries[idName] = entry; + location.map.x = ParseUtil::jsonToInt(mapSectionObj.take("x")); + location.map.y = ParseUtil::jsonToInt(mapSectionObj.take("y")); + location.map.width = ParseUtil::jsonToInt(mapSectionObj.take("width")); + location.map.height = ParseUtil::jsonToInt(mapSectionObj.take("height")); + location.map.valid = true; } // Chuck the "name_clone" field, this is only for matching. @@ -2438,9 +2433,9 @@ bool Project::readRegionMapSections() { mapSectionObj.remove("name_clone"); // Preserve any remaining fields for when we save. - if (!mapSectionObj.isEmpty()) { - this->mapSectionCustomData[idName] = mapSectionObj; - } + location.custom = mapSectionObj; + + this->locationData.insert(idName, location); } this->customMapSectionsData = mapSectionsGlobalObj; @@ -2453,6 +2448,20 @@ bool Project::readRegionMapSections() { return true; } +void Project::setRegionMapEntries(const QHash &entries) { + for (auto it = entries.constBegin(); it != entries.constEnd(); it++) { + this->locationData[it.key()].map = it.value(); + } +} + +QHash Project::getRegionMapEntries() const { + QHash entries; + for (auto it = this->locationData.constBegin(); it != this->locationData.constEnd(); it++) { + entries[it.key()] = it.value().map; + } + return entries; +} + QString Project::getEmptyMapsecName() { return projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix) + projectConfig.getIdentifier(ProjectIdentifier::define_map_section_empty); } @@ -2503,9 +2512,9 @@ void Project::removeMapsec(const QString &idName) { } void Project::setMapsecDisplayName(const QString &idName, const QString &displayName) { - if (this->mapSectionDisplayNames.value(idName) == displayName) + if (getMapsecDisplayName(idName) == displayName) return; - this->mapSectionDisplayNames[idName] = displayName; + this->locationData[idName].displayName = displayName; this->hasUnsavedDataChanges = true; emit mapSectionDisplayNameChanged(idName, displayName); } diff --git a/src/ui/regionmapeditor.cpp b/src/ui/regionmapeditor.cpp index 2febccd8..27fb5f2f 100644 --- a/src/ui/regionmapeditor.cpp +++ b/src/ui/regionmapeditor.cpp @@ -108,12 +108,12 @@ void RegionMapEditor::applyUserShortcuts() { } bool RegionMapEditor::loadRegionMapEntries() { - this->region_map_entries = this->project->regionMapEntries; + this->region_map_entries = this->project->getRegionMapEntries(); return true; } bool RegionMapEditor::saveRegionMapEntries() { - this->project->regionMapEntries = this->region_map_entries; + this->project->setRegionMapEntries(this->region_map_entries); this->project->saveRegionMapSections(); return true; }