diff --git a/include/core/regionmap.h b/include/core/regionmap.h index 6f436796..c231e0b5 100644 --- a/include/core/regionmap.h +++ b/include/core/regionmap.h @@ -68,7 +68,7 @@ public: void resetSquare(int index); void clearLayout(); void clearImage(); - void replaceSectionId(unsigned oldId, unsigned newId); + void replaceSection(QString oldSection, QString newSection); unsigned getTileId(int index); shared_ptr getTile(int index); @@ -101,6 +101,8 @@ public: QList getLayout(QString layer); void setLayout(QString layer, QList layout); + bool layoutEnabled() { return this->layout_format != LayoutFormat::None; } + QMap> getAllLayouts(); void setAllLayouts(QMap> newLayouts); @@ -143,7 +145,7 @@ private: // TODO: defaults needed? tsl::ordered_map *region_map_entries = nullptr; - QString alias; + QString alias = ""; int tilemap_width; int tilemap_height; @@ -174,16 +176,15 @@ private: QStringList layout_constants; QString layout_qualifiers; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QVector> tilemap; +#else QList> tilemap; +#endif - QStringList layout_layers; // TODO: is this used? + QStringList layout_layers; QString current_layer; - - // TODO: just use ordered map? - QMap> layouts; // key: layer, value: layout - - // TODO - QString city_map_tiles_path; + QMap> layouts; int get_tilemap_index(int x, int y); int get_layout_index(int x, int y); diff --git a/include/ui/regionmapeditor.h b/include/ui/regionmapeditor.h index 9fb8b84d..88d06d22 100644 --- a/include/ui/regionmapeditor.h +++ b/include/ui/regionmapeditor.h @@ -112,6 +112,7 @@ private: void displayCityMap(QString name); void displayRegionMapEntryOptions(); void updateRegionMapEntryOptions(QString); + void setRegionMap(RegionMap *map); bool createCityMap(QString name); bool tryInsertNewMapEntry(QString); diff --git a/resources/text/region_map_default_emerald.json b/resources/text/region_map_default_emerald.json index a25e459c..77de6032 100644 --- a/resources/text/region_map_default_emerald.json +++ b/resources/text/region_map_default_emerald.json @@ -33,8 +33,5 @@ }, "layout": null } - ], - "entries": { - "path": "src/data/region_map/region_map_sections.json" - } + ] } diff --git a/resources/text/region_map_default_firered.json b/resources/text/region_map_default_firered.json index aa5e199e..c9518705 100644 --- a/resources/text/region_map_default_firered.json +++ b/resources/text/region_map_default_firered.json @@ -84,8 +84,5 @@ "path": "src/data/region_map/region_map_layout_sevii_67.h" } } - ], - "revion_map_sections": { - "path": "src/data/region_map/region_map_sections.json" - } + ] } diff --git a/src/core/regionmap.cpp b/src/core/regionmap.cpp index cdd7394b..d354d878 100644 --- a/src/core/regionmap.cpp +++ b/src/core/regionmap.cpp @@ -80,7 +80,6 @@ bool RegionMap::loadTilemap(poryjson::Json tilemapJson) { this->tileset_path = tilemapObject["tileset_path"].string_value(); this->tilemap_path = tilemapObject["tilemap_path"].string_value(); - //! TODO: set a config option for this if (tilemapObject.contains("palette")) { this->palette_path = tilemapObject["palette"].string_value(); } @@ -346,9 +345,13 @@ void RegionMap::clearImage() { this->setTilemap(zeros); } -void RegionMap::replaceSectionId(unsigned oldId, unsigned newId) { - // TODO - +void RegionMap::replaceSection(QString oldSection, QString newSection) { + for (auto &square : this->layouts[this->current_layer]) { + if (square.map_section == oldSection) { + square.map_section = newSection; + square.has_map = (newSection != "MAPSEC_NONE"); + } + } } void RegionMap::resize(int newWidth, int newHeight) { diff --git a/src/ui/regionmapeditor.cpp b/src/ui/regionmapeditor.cpp index 63f6de0f..ea795c22 100644 --- a/src/ui/regionmapeditor.cpp +++ b/src/ui/regionmapeditor.cpp @@ -409,6 +409,8 @@ bool RegionMapEditor::load() { } } else { + // TODO: put this first? so can fall back on the above if parse errors + // TODO: verify this object before assignment logInfo("Region map configuration file found."); ParseUtil parser; OrderedJson::object obj; @@ -443,16 +445,31 @@ bool RegionMapEditor::load() { // display the first region map in the list if (!region_maps.empty()) { - this->region_map = region_maps.begin()->second; - this->currIndex = this->region_map->firstLayoutIndex(); - this->region_map->editHistory.setActive(); - - displayRegionMap(); + setRegionMap(region_maps.begin()->second); } return true; } +void RegionMapEditor::setRegionMap(RegionMap *map) { + // + this->region_map = map; + this->currIndex = this->region_map->firstLayoutIndex(); + this->region_map->editHistory.setActive(); + + if (this->region_map->layoutEnabled()) { + this->ui->tabWidget_Region_Map->setTabEnabled(1, true); + this->ui->tabWidget_Region_Map->setTabEnabled(2, true); + } else { + this->ui->tabWidget_Region_Map->setTabEnabled(1, false); + this->ui->tabWidget_Region_Map->setTabEnabled(2, false); + } + + this->ui->tabWidget_Region_Map->setCurrentIndex(0); + + displayRegionMap(); +} + bool RegionMapEditor::loadCityMaps() { // unused // TODO @@ -505,15 +522,7 @@ void RegionMapEditor::updateLayerDisplayed() { void RegionMapEditor::on_comboBox_regionSelector_textActivated(const QString ®ion) { // if (this->region_maps.contains(region)) { - this->region_map = region_maps.at(region); - this->region_map->editHistory.setActive(); - this->currIndex = this->region_map->firstLayoutIndex(); - // TODO: make the above into a function that takes an alias string? in case there is more to it - - // TODO: anything else needed here? - displayRegionMap(); - - //this->editGroup.setActiveStack(&(this->region_map->editHistory)); + setRegionMap(region_maps.at(region)); } } @@ -572,6 +581,8 @@ void RegionMapEditor::displayRegionMapLayout() { } void RegionMapEditor::displayRegionMapLayoutOptions() { + if (!this->region_map->layoutEnabled()) return; + this->ui->comboBox_RM_ConnectedMap->clear(); this->ui->comboBox_RM_ConnectedMap->addItems(this->project->mapSectionValueToName.values()); @@ -634,6 +645,8 @@ void RegionMapEditor::displayRegionMapEntriesImage() { } void RegionMapEditor::displayRegionMapEntryOptions() { + if (!this->region_map->layoutEnabled()) return; + this->ui->comboBox_RM_Entry_MapSection->addItems(this->project->mapSectionValueToName.values()); int width = this->region_map->tilemapWidth() - this->region_map->padLeft() - this->region_map->padRight(); int height = this->region_map->tilemapHeight() - this->region_map->padTop() - this->region_map->padBottom(); @@ -646,6 +659,8 @@ void RegionMapEditor::displayRegionMapEntryOptions() { } void RegionMapEditor::updateRegionMapEntryOptions(QString section) { + if (!this->region_map->layoutEnabled()) return; + bool enabled = (section != "MAPSEC_NONE") && (this->region_map_entries.contains(section)); this->ui->lineEdit_RM_MapName->setEnabled(enabled); @@ -671,8 +686,6 @@ void RegionMapEditor::updateRegionMapEntryOptions(QString section) { this->ui->spinBox_RM_Entry_width->setValue(entry.width); this->ui->spinBox_RM_Entry_height->setValue(entry.height); - // TODO: if not enabled, button to enable, otherwise button to disable / remove entry from map - this->ui->lineEdit_RM_MapName->blockSignals(false); this->ui->spinBox_RM_Entry_x->blockSignals(false); this->ui->spinBox_RM_Entry_y->blockSignals(false); @@ -1007,6 +1020,7 @@ void RegionMapEditor::on_comboBox_layoutLayer_textActivated(const QString &text) void RegionMapEditor::on_spinBox_RM_Entry_x_valueChanged(int x) { //tryInsertNewMapEntry(activeEntry); + qDebug() << "spinBox_RM_Entry_x valueChanged" << x; if (!this->region_map_entries.contains(activeEntry)) return; MapSectionEntry oldEntry = this->region_map_entries[activeEntry]; this->region_map_entries[activeEntry].x = x; @@ -1213,8 +1227,6 @@ void RegionMapEditor::resize(int w, int h) { } void RegionMapEditor::on_action_Swap_triggered() { - // TODO: does this function still work? - // TODO: fix for string ids not uint8 ids QDialog popup(this, Qt::WindowTitleHint | Qt::WindowCloseButtonHint); popup.setWindowTitle("Swap Map Sections"); popup.setWindowModality(Qt::NonModal); @@ -1232,21 +1244,22 @@ void RegionMapEditor::on_action_Swap_triggered() { form.addRow(&buttonBox); QString beforeSection, afterSection; - uint8_t oldId, newId; connect(&buttonBox, &QDialogButtonBox::rejected, &popup, &QDialog::reject); - connect(&buttonBox, &QDialogButtonBox::accepted, [this, &popup, &oldSecBox, &newSecBox, - &beforeSection, &afterSection, &oldId, &newId](){ + connect(&buttonBox, &QDialogButtonBox::accepted, [this, &popup, &oldSecBox, &newSecBox, &beforeSection, &afterSection](){ beforeSection = oldSecBox->currentText(); afterSection = newSecBox->currentText(); if (!beforeSection.isEmpty() && !afterSection.isEmpty()) { - oldId = static_cast(this->project->mapSectionNameToValue.value(beforeSection)); - newId = static_cast(this->project->mapSectionNameToValue.value(afterSection)); popup.accept(); } }); if (popup.exec() == QDialog::Accepted) { - this->region_map->replaceSectionId(oldId, newId); + QList oldLayout = this->region_map->getLayout(this->region_map->getLayer()); + this->region_map->replaceSection(beforeSection, afterSection); + QList newLayout = this->region_map->getLayout(this->region_map->getLayer()); + EditLayout *commit = new EditLayout(this->region_map, this->region_map->getLayer(), -2, oldLayout, newLayout); + commit->setText("Swap Layout Sections " + beforeSection + " >> " + afterSection); + this->region_map->editHistory.push(commit); displayRegionMapLayout(); this->region_map_layout_item->select(this->region_map_layout_item->selectedTile); this->hasUnsavedChanges = true;