add new area (map section) functionality

This commit is contained in:
garak 2024-02-16 19:17:56 -05:00
parent 22b4108a7f
commit 74e4e2647c
5 changed files with 110 additions and 1 deletions

View file

@ -80,6 +80,9 @@ public:
QString importExportPath; QString importExportPath;
QSet<QString> disabledSettingsNames; QSet<QString> disabledSettingsNames;
// For files that are read and could contain extra text
QMap<QString, QString> extraFileText;
void set_root(QString); void set_root(QString);
void initSignals(); void initSignals();
@ -135,6 +138,8 @@ public:
bool readSpeciesIconPaths(); bool readSpeciesIconPaths();
QMap<QString, QString> speciesToIconPath; QMap<QString, QString> speciesToIconPath;
int appendMapsec(QString name);
QSet<QString> getTopLevelMapFields(); QSet<QString> getTopLevelMapFields();
bool loadMapData(Map*); bool loadMapData(Map*);
bool readMapLayouts(); bool readMapLayouts();
@ -159,6 +164,7 @@ public:
void saveAllDataStructures(); void saveAllDataStructures();
void saveMapLayouts(); void saveMapLayouts();
void saveMapGroups(); void saveMapGroups();
void saveMapSections();
void saveWildMonData(); void saveWildMonData();
void saveMapConstantsHeader(); void saveMapConstantsHeader();
void saveHealLocations(Map*); void saveHealLocations(Map*);

View file

@ -117,6 +117,7 @@ public:
QStandardItem *createAreaItem(QString areaName, int areaIndex); QStandardItem *createAreaItem(QString areaName, int areaIndex);
QStandardItem *createMapItem(QString mapName, int areaIndex, int mapIndex); QStandardItem *createMapItem(QString mapName, int areaIndex, int mapIndex);
QStandardItem *insertAreaItem(QString areaName);
QStandardItem *insertMapItem(QString mapName, QString areaName, int groupIndex); QStandardItem *insertMapItem(QString mapName, QString areaName, int groupIndex);
QStandardItem *getItem(const QModelIndex &index) const; QStandardItem *getItem(const QModelIndex &index) const;

View file

@ -1427,7 +1427,35 @@ void MainWindow::mapListAddLayout() {
} }
void MainWindow::mapListAddArea() { void MainWindow::mapListAddArea() {
// this->mapAreaModel->insertMapItem(newMapName, newMap->location, newMapGroup); // Note: there is no checking here for the limits on map section count
QDialog dialog(this, Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
dialog.setWindowModality(Qt::ApplicationModal);
QDialogButtonBox newItemButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog);
connect(&newItemButtonBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
QLineEdit *newNameEdit = new QLineEdit(&dialog);
newNameEdit->setText(projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix));
newNameEdit->setClearButtonEnabled(false);
QRegularExpression re_validChars(QString("%1[_A-Za-z0-9]+$").arg(projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix)));
QRegularExpressionValidator *validator = new QRegularExpressionValidator(re_validChars);
newNameEdit->setValidator(validator);
connect(&newItemButtonBox, &QDialogButtonBox::accepted, [&](){
if (!this->editor->project->mapSectionNameToValue.contains(newNameEdit->text()))
dialog.accept();
});
QFormLayout form(&dialog);
form.addRow("New Map Section Name", newNameEdit);
form.addRow(&newItemButtonBox);
if (dialog.exec() == QDialog::Accepted) {
QString newFieldName = newNameEdit->text();
if (newFieldName.isEmpty()) return;
this->mapAreaModel->insertAreaItem(newFieldName);
}
} }
void MainWindow::mapListAddItem() { void MainWindow::mapListAddItem() {

View file

@ -700,6 +700,34 @@ void Project::saveMapGroups() {
mapGroupsFile.close(); mapGroupsFile.close();
} }
void Project::saveMapSections() {
QString filepath = root + "/" + projectConfig.getFilePath(ProjectFilePath::constants_region_map_sections);
QString text = QString("#ifndef GUARD_REGIONMAPSEC_H\n");
text += QString("#define GUARD_REGIONMAPSEC_H\n\n");
int longestLength = 0;
for (QString label : this->mapSectionNameToValue.keys()) {
if (label.size() > longestLength)
longestLength = label.size();
}
// mapSectionValueToName
for (int value : this->mapSectionValueToName.keys()) {
QString line = QString("#define %1 0x%2\n")
.arg(this->mapSectionValueToName[value], -1 * longestLength)
.arg(QString("%1").arg(value, 2, 16, QLatin1Char('0')).toUpper());
text += line;
}
text += "\n" + this->extraFileText[projectConfig.getFilePath(ProjectFilePath::constants_region_map_sections)] + "\n";
text += QString("#endif // GUARD_REGIONMAPSEC_H\n");
ignoreWatchedFileTemporarily(filepath);
saveTextFile(filepath, text);
}
void Project::saveWildMonData() { void Project::saveWildMonData() {
if (!userConfig.getEncounterJsonActive()) return; if (!userConfig.getEncounterJsonActive()) return;
@ -1421,6 +1449,7 @@ void Project::updateLayout(Layout *layout) {
void Project::saveAllDataStructures() { void Project::saveAllDataStructures() {
saveMapLayouts(); saveMapLayouts();
saveMapGroups(); saveMapGroups();
saveMapSections();
saveMapConstantsHeader(); saveMapConstantsHeader();
saveWildMonData(); saveWildMonData();
} }
@ -2158,9 +2187,46 @@ bool Project::readRegionMapSections() {
for (QString defineName : this->mapSectionNameToValue.keys()) { for (QString defineName : this->mapSectionNameToValue.keys()) {
this->mapSectionValueToName.insert(this->mapSectionNameToValue[defineName], defineName); this->mapSectionValueToName.insert(this->mapSectionNameToValue[defineName], defineName);
} }
// extra text
QString extraText;
QString fileText = ParseUtil::readTextFile(root + "/" + filename);
QTextStream stream(&fileText);
QString currentLine;
while (stream.readLineInto(&currentLine)) {
// is this line something that porymap will output again?
if (currentLine.isEmpty()) {
continue;
}
// include guards
else if (currentLine.contains("GUARD_REGIONMAPSEC_H")) {
continue;
}
// defines captured (not considering comments)
else if (currentLine.contains("#define " + projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix))) {
continue;
}
// everything else should be kept here
else {
extraText += currentLine + "\n";
}
}
stream.seek(0);
this->extraFileText[filename] = extraText;
return true; return true;
} }
int Project::appendMapsec(QString name) {
// This function assumes a valid and unique name.
// Will return the new index.
int noneBefore = this->mapSectionNameToValue[projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix) + "NONE"];
this->mapSectionNameToValue[name] = noneBefore;
this->mapSectionValueToName[noneBefore] = name;
this->mapSectionNameToValue[projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix) + "NONE"] = noneBefore + 1;
this->mapSectionValueToName[noneBefore + 1] = projectConfig.getIdentifier(ProjectIdentifier::define_map_section_prefix) + "NONE";
return noneBefore;
}
// Read the constants to preserve any "unused" heal locations when writing the file later // Read the constants to preserve any "unused" heal locations when writing the file later
bool Project::readHealLocationConstants() { bool Project::readHealLocationConstants() {
this->healLocationNameToValue.clear(); this->healLocationNameToValue.clear();

View file

@ -392,6 +392,14 @@ QStandardItem *MapAreaModel::createMapItem(QString mapName, int groupIndex, int
return map; return map;
} }
QStandardItem *MapAreaModel::insertAreaItem(QString areaName) {
int newAreaIndex = this->project->appendMapsec(areaName);
QStandardItem *item = createAreaItem(areaName, newAreaIndex);
this->root->insertRow(newAreaIndex, item);
this->areaItems["MAPSEC_NONE"]->setData(newAreaIndex + 1, MapListRoles::GroupRole);
return item;
}
QStandardItem *MapAreaModel::insertMapItem(QString mapName, QString areaName, int groupIndex) { QStandardItem *MapAreaModel::insertMapItem(QString mapName, QString areaName, int groupIndex) {
// int areaIndex = this->project->mapSectionNameToValue[areaName]; // int areaIndex = this->project->mapSectionNameToValue[areaName];
QStandardItem *area = this->areaItems[areaName]; QStandardItem *area = this->areaItems[areaName];