From 5a62df9f555e52426180c2a3cacbade511828fa7 Mon Sep 17 00:00:00 2001 From: garak Date: Thu, 20 Jun 2019 12:40:36 -0400 Subject: [PATCH] add json saving to wild encounter editor --- forms/mainwindow.ui | 74 +++++++++++++-- include/editor.h | 4 + include/mainwindow.h | 2 + include/project.h | 4 +- src/core/wildmoninfo.cpp | 16 ++-- src/editor.cpp | 193 +++++++++++++++++++++++++++++++-------- src/mainwindow.cpp | 14 ++- src/project.cpp | 68 ++++++++++++-- 8 files changed, 309 insertions(+), 66 deletions(-) diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index 386c790e..61669603 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -2701,17 +2701,79 @@ - QFrame::StyledPanel + QFrame::NoFrame QFrame::Raised - - - - - -1 + + + + + QFrame::NoFrame + + QFrame::Plain + + + + + + Group + + + + + + + QComboBox::AdjustToContents + + + + + + + <html><head/><body><p>Create a new group for wild pokemon data on this map.</p></body></html> + + + + + + + :/icons/add.ico:/icons/add.ico + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Configure JSON... + + + + + + + + + + diff --git a/include/editor.h b/include/editor.h index 21647f9e..7f0d61b8 100644 --- a/include/editor.h +++ b/include/editor.h @@ -43,6 +43,8 @@ public: void redo(); void closeProject(); bool setMap(QString map_name); + void saveUiFields(); + void saveEncounterTabData(); void displayMap(); void displayMetatileSelector(); void displayMapMetatiles(); @@ -71,6 +73,7 @@ public: void setConnectionMap(QString mapName); void addNewConnection(); void removeCurrentConnection(); + void addNewWildMonGroup(); void updateDiveMap(QString mapName); void updateEmergeMap(QString mapName); void setSelectedConnectionFromMap(QString mapName); @@ -78,6 +81,7 @@ public: void updateSecondaryTileset(QString tilesetLabel, bool forceLoad = false); void toggleBorderVisibility(bool visible); void updateCustomMapHeaderValues(QTableWidget *); + void configureEncounterJSON(); Tileset *getCurrentMapPrimaryTileset(); DraggablePixmapItem *addMapEvent(Event *event); diff --git a/include/mainwindow.h b/include/mainwindow.h index 11a12017..5f0c9f46 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -145,6 +145,8 @@ private slots: void on_pushButton_DeleteCustomHeaderField_clicked(); void on_tableWidget_CustomHeaderFields_cellChanged(int row, int column); void on_horizontalSlider_MetatileZoom_valueChanged(int value); + void on_pushButton_NewWildMonGroup_clicked(); + void on_pushButton_ConfigureEncountersJSON_clicked(); void on_actionRegion_Map_Editor_triggered(); diff --git a/include/project.h b/include/project.h index 53d251a6..6c0655bd 100644 --- a/include/project.h +++ b/include/project.h @@ -87,8 +87,8 @@ public: QString readMapLocation(QString map_name); void readWildMonData(); - QMap wildMonData;// "MAP_CONSTANT": wild_encounter_json - QMap encounterMapToBaseLabel; + QMap> wildMonData;// "MAP_CONSTANT": {base_label: wild_encounter_json + QMap encounterMapToBaseLabel;// delete this? // when saving, preserve the extra fields for gBattlePyramidWildMonHeaders, gBattlePikeWildMonHeaders void readSpeciesIconPaths(); QMap speciesToIconPath; diff --git a/src/core/wildmoninfo.cpp b/src/core/wildmoninfo.cpp index 4ae83e97..768df609 100644 --- a/src/core/wildmoninfo.cpp +++ b/src/core/wildmoninfo.cpp @@ -87,15 +87,19 @@ void createSpeciesTableRow(Project *project, QTableWidget *table, WildPokemon mo table->setCellWidget(index - 1, 2, minLevelFrame); table->setCellWidget(index - 1, 3, maxLevelFrame); table->setCellWidget(index - 1, 4, percentLabel); + + // TODO: lock max spinbox to min spinbox } void populateWildMonTabWidget(QTabWidget *tabWidget, QVector>> fields) { - QPushButton *newTabButton = new QPushButton("Configure JSON..."); - QObject::connect(newTabButton, &QPushButton::clicked, [=](){ - // TODO - qDebug() << "configure json pressed"; - }); - tabWidget->setCornerWidget(newTabButton); + //QPushButton *newTabButton = new QPushButton("Configure JSON..."); + //QObject::connect(newTabButton, &QPushButton::clicked, [=](){ + // // TODO + // qDebug() << "configure json pressed"; + //}); + //tabWidget->setCornerWidget(newTabButton); + + // delete everything in the tab widget here? no for (QPair> field : fields) { QTableWidget *table = new QTableWidget; diff --git a/src/editor.cpp b/src/editor.cpp index 0c70f594..e6c94a72 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -24,6 +24,7 @@ Editor::Editor(Ui::MainWindow* ui) void Editor::saveProject() { if (project) { + saveUiFields(); project->saveAllMaps(); project->saveAllDataStructures(); } @@ -31,11 +32,17 @@ void Editor::saveProject() { void Editor::save() { if (project && map) { + saveUiFields(); project->saveMap(map); project->saveAllDataStructures(); } } +void Editor::saveUiFields() { + // + saveEncounterTabData(); +} + void Editor::undo() { if (current_view && map_item->paintingEnabled) { map->undo(); @@ -154,60 +161,166 @@ void Editor::setEditingWildMons() { // nothing for now } +// TODO: figure out why this is being called twice void Editor::displayWildMonTables() { - WildPokemonHeader header = project->wildMonData.value(map->constantName); + QStackedWidget *stack = ui->stackedWidget_WildMons; + QComboBox *labelCombo = ui->comboBox_EncounterGroupLabel; + // TODO: temp. instead do a for loop here + //WildPokemonHeader header = project->wildMonData.value(map->constantName).first(); - int tabIndex = 0; - for (QPair> monField : project->wildMonFields) { - QString field = monField.first; - QTableWidget *speciesTable = static_cast(ui->tabWidget_WildMons->widget(tabIndex++)); - clearTable(speciesTable); - //speciesTable->horizontalHeader()->hide(); + // TODO: return when there is no data for the map + while (stack->count()) { + // + QWidget *oldWidget = stack->widget(0); + stack->removeWidget(oldWidget); + delete oldWidget; + } - if (project->wildMonData.contains(map->constantName) && header.wildMons[field].active) { - int i = 1; + labelCombo->clear(); - speciesTable->setRowCount(header.wildMons[field].wildPokemon.size()); - speciesTable->setColumnCount(6);// TODO: stretch last column? + if (!project->wildMonData.contains(map->constantName)) { + return; + } - QStringList landMonTableHeaders; - landMonTableHeaders << "Index" << "Species" << "Min Level" << "Max Level" << "Index Percentage" << "Encounter Rate"; - speciesTable->setHorizontalHeaderLabels(landMonTableHeaders); - speciesTable->horizontalHeader()->show(); - speciesTable->verticalHeader()->hide(); - speciesTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - speciesTable->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + // do I have to disconnect this signal? or set it up only once? + connect(labelCombo, QOverload::of(&QComboBox::activated), [=](int index){ + stack->setCurrentIndex(index);//setCurrentWidget(tabWidget); + }); + labelCombo->addItems(project->wildMonData[map->constantName].keys()); + labelCombo->setCurrentText(project->wildMonData[map->constantName].firstKey()); - speciesTable->setShowGrid(false); + // TODO: instance of this map, use .value() + for (int labelIndex = 0; labelIndex < project->wildMonData[map->constantName].keys().size(); labelIndex++) { - // set encounter rate slider - // don't forget to add number label next to it - QFrame *encounterFrame = new QFrame; - QHBoxLayout *encounterLayout = new QHBoxLayout; + QString label = project->wildMonData.value(map->constantName).keys().at(labelIndex); - QSlider *encounterRate = new QSlider(Qt::Horizontal); - encounterRate->setMinimum(1); - encounterRate->setMaximum(100); + WildPokemonHeader header = project->wildMonData.value(map->constantName).value(label); - QLabel *encounterLabel = new QLabel; - connect(encounterRate, &QSlider::valueChanged, [=](int value){ - encounterLabel->setText(QString::number(value)); - }); - encounterRate->setValue(header.wildMons[field].encounterRate); + //QTableWidget *speciesTable = new QTableWidget; + //clearTable(speciesTable); + QTabWidget *tabWidget = new QTabWidget; + stack->insertWidget(labelIndex, tabWidget); + populateWildMonTabWidget(tabWidget, project->wildMonFields); + //stack->setCurrentWidget(tabWidget); - encounterLayout->addWidget(encounterLabel); - encounterLayout->addWidget(encounterRate); + int tabIndex = 0; + for (QPair> monField : project->wildMonFields) { + QString field = monField.first; - encounterFrame->setLayout(encounterLayout); + // tabWidget_WildMons + QTableWidget *speciesTable = static_cast(tabWidget->widget(tabIndex++));//static_cast(ui->tabWidget_WildMons->widget(tabIndex++)); + clearTable(speciesTable); + //speciesTable->horizontalHeader()->hide(); - speciesTable->setCellWidget(0, 5, encounterFrame); + if (project->wildMonData.contains(map->constantName) && header.wildMons[field].active) { + int i = 1; - for (WildPokemon mon : header.wildMons[field].wildPokemon) { - createSpeciesTableRow(project, speciesTable, mon, i, field); - i++; + //ui->stackedWidget_WildMons->insertWidget(0, speciesTable); + //return; + + speciesTable->setRowCount(header.wildMons[field].wildPokemon.size()); + speciesTable->setColumnCount(6);// TODO: stretch last column? + + QStringList landMonTableHeaders; + landMonTableHeaders << "Index" << "Species" << "Min Level" << "Max Level" << "Index Percentage" << "Encounter Rate"; + speciesTable->setHorizontalHeaderLabels(landMonTableHeaders); + speciesTable->horizontalHeader()->show(); + speciesTable->verticalHeader()->hide(); + speciesTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + speciesTable->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + + speciesTable->setShowGrid(false); + + // set encounter rate slider + // don't forget to add number label next to it + QFrame *encounterFrame = new QFrame; + QHBoxLayout *encounterLayout = new QHBoxLayout; + + QSlider *encounterRate = new QSlider(Qt::Horizontal); + encounterRate->setMinimum(1); + encounterRate->setMaximum(100); + + QLabel *encounterLabel = new QLabel; + connect(encounterRate, &QSlider::valueChanged, [=](int value){ + encounterLabel->setText(QString::number(value)); + }); + encounterRate->setValue(header.wildMons[field].encounterRate); + + encounterLayout->addWidget(encounterLabel); + encounterLayout->addWidget(encounterRate); + + encounterFrame->setLayout(encounterLayout); + + speciesTable->setCellWidget(0, 5, encounterFrame); + + for (WildPokemon mon : header.wildMons[field].wildPokemon) { + createSpeciesTableRow(project, speciesTable, mon, i, field); + i++; + } + } else { + // create button to add this field to this map } - } else { - // create button to add this field to this map + } + } + stack->setCurrentIndex(0); +} + +// TODO: move this funciton +void Editor::addNewWildMonGroup() { + // + qDebug() << "new wild encounter group to map" << map->name; +} + +void Editor::configureEncounterJSON() { + // + qDebug() << "configure wild encounter json"; +} + +// TODO: move this? +void Editor::saveEncounterTabData() { + if (!project->wildMonData.contains(map->constantName)) { + qDebug() << "don't save encounters for this map"; + return; + } + // + QStackedWidget *stack = ui->stackedWidget_WildMons; + QComboBox *labelCombo = ui->comboBox_EncounterGroupLabel; + + // TODO: verify that this exists before accsessing so no seg fault + QMap &encounterMap = project->wildMonData[map->constantName]; + + for (int groupIndex = 0; groupIndex < encounterMap.keys().size(); groupIndex++) { + // + QTabWidget *tabWidget = static_cast(stack->widget(groupIndex)); + + // TODO: verify this exists before so no segfault + WildPokemonHeader &encounterHeader = encounterMap[labelCombo->itemText(groupIndex)]; + + //qDebug() << encounterHeader.wildMons.keys(); + + //for (int tabIndex = 0; tabIndex < tabWidget->count(); tabIndex++) { + // QTableWidget *monTable = + //} + int fieldIndex = 0; + for (QPair> monField : project->wildMonFields) { + // project->wildMonData + //qDebug() << monField.first << "mons"; + QTableWidget *monTable = static_cast(tabWidget->widget(fieldIndex++)); + + QVector newWildMons; + + //for (auto *speciesCombo : monTable->findChildren()) { + for (int row = 0; row < monTable->rowCount(); row++) { + // cellWidget(row, column) + WildPokemon newWildMon; + newWildMon.species = monTable->cellWidget(row, 1)->findChild()->currentText(); + newWildMon.minLevel = monTable->cellWidget(row, 2)->findChild()->value();//static_cast(monTable->cellWidget(row, 2))->value(); + newWildMon.maxLevel = monTable->cellWidget(row, 3)->findChild()->value();//static_cast(monTable->cellWidget(row, 3))->value(); + newWildMons.append(newWildMon);//(speciesCombo->currentText()); + } + encounterHeader.wildMons[monField.first].wildPokemon = newWildMons; + encounterHeader.wildMons[monField.first].encounterRate = monTable->findChild()->value(); + //fieldIndex++; } } } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a9570074..a236dc65 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -261,13 +261,13 @@ bool MainWindow::openProject(QString dir) { setWindowTitle(editor->project->getProjectTitle()); loadDataStructures(); populateMapList(); - populateWildMonTabWidget(ui->tabWidget_WildMons, editor->project->wildMonFields); + //populateWildMonTabWidget(ui->tabWidget_WildMons, editor->project->wildMonFields); success = setMap(getDefaultMap(), true); } else { setWindowTitle(editor->project->getProjectTitle()); loadDataStructures(); populateMapList(); - populateWildMonTabWidget(ui->tabWidget_WildMons, editor->project->wildMonFields); + //populateWildMonTabWidget(ui->tabWidget_WildMons, editor->project->wildMonFields); } if (success) { @@ -1967,6 +1967,16 @@ void MainWindow::on_pushButton_RemoveConnection_clicked() editor->removeCurrentConnection(); } +void MainWindow::on_pushButton_NewWildMonGroup_clicked() { + // + editor->addNewWildMonGroup(); +} + +void MainWindow::on_pushButton_ConfigureEncountersJSON_clicked() { + // + editor->configureEncounterJSON(); +} + void MainWindow::on_comboBox_DiveMap_activated(const QString &mapName) { editor->updateDiveMap(mapName); diff --git a/src/project.cpp b/src/project.cpp index 1355c5ea..e925a412 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -522,8 +522,8 @@ void Project::saveMapGroups() { void Project::saveWildMonData() { // - //QString wildEncountersJsonFilepath = QString("%1/src/data/wild_encounters.json").arg(root); - QString wildEncountersJsonFilepath = QString("%1/src/data/wild_encounters_test.json").arg(root); + QString wildEncountersJsonFilepath = QString("%1/src/data/wild_encounters.json").arg(root); + //QString wildEncountersJsonFilepath = QString("%1/src/data/wild_encounters_test.json").arg(root); QFile wildEncountersFile(wildEncountersJsonFilepath); if (!wildEncountersFile.open(QIODevice::WriteOnly)) { logError(QString("Error: Could not open %1 for writing").arg(wildEncountersJsonFilepath)); @@ -537,15 +537,60 @@ void Project::saveWildMonData() { QJsonObject monHeadersObject; monHeadersObject["label"] = "gWildMonHeaders"; monHeadersObject["for_maps"] = true; + + QJsonArray fieldsInfoArray; + for (QPair> fieldInfo : wildMonFields) { + QJsonObject fieldObject; + QJsonArray rateArray; + + for (int rate : fieldInfo.second) + rateArray.append(rate); + + fieldObject["type"] = fieldInfo.first; + fieldObject["encounter_rates"] = rateArray; + + fieldsInfoArray.append(fieldObject); + } + monHeadersObject["fields"] = fieldsInfoArray; + QJsonArray encountersArray = QJsonArray(); for (QString key : wildMonData.keys()) { - QJsonObject encounterObject; - encounterObject["map"] = key; - encounterObject["base_label"] = encounterMapToBaseLabel[key]; - // - //text += key + "\n"; - // ["base_label"] = encounterMapToBaseLabel[mapConstant] - encountersArray.append(encounterObject); + for (QString groupLabel : wildMonData.value(key).keys()) { + QJsonObject encounterObject; + encounterObject["map"] = key; + encounterObject["base_label"] = groupLabel;//encounterMapToBaseLabel[key]; + // + + WildPokemonHeader encounterHeader = wildMonData.value(key).value(groupLabel); + for (QString fieldName : encounterHeader.wildMons.keys()) { + // + QJsonObject fieldObject; + WildMonInfo monInfo = encounterHeader.wildMons.value(fieldName); + fieldObject["encounter_rate"] = monInfo.encounterRate; + QJsonArray monArray; + for (WildPokemon wildMon : monInfo.wildPokemon) { + // + QJsonObject monEntry; + monEntry["min_level"] = wildMon.minLevel; + monEntry["max_level"] = wildMon.maxLevel; + monEntry["species"] = wildMon.species; + monArray.append(monEntry); + } + fieldObject["mons"] = monArray;//fieldObject; + encounterObject[fieldName] = fieldObject; + } + //encounterObject[]; + // QMap wildMons; + + //QJsonArray + //for (auto fieldItem : wildMonFields) { + // QString fieldLabel = fieldItem.first; + // encounterObject[fieldLabel] = ; + //} + + encountersArray.append(encounterObject); + } + // TODO: save fields json data } monHeadersObject["encounters"] = encountersArray; wildEncounterGroups.append(monHeadersObject); @@ -1397,7 +1442,10 @@ void Project::readWildMonData() { } } } - wildMonData.insert(mapConstant, header); + //if (!wildMonData.contains(mapConstant)) + // wildMonData.insert(mapConstant, header); + //else + wildMonData[mapConstant].insert(encounter["base_label"].toString(), header); } }