diff --git a/include/mainwindow.h b/include/mainwindow.h index 16bc3cc8..4eae446f 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -388,6 +388,7 @@ private: void redrawMetatileSelection(); QObjectList shortcutableObjects() const; + QTableWidgetItem * createNewCustomHeaderItem(QJsonValue value); }; enum MapListUserRoles { diff --git a/src/editor.cpp b/src/editor.cpp index 290a30b6..50da1ca2 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -1948,17 +1948,35 @@ void Editor::toggleBorderVisibility(bool visible, bool enableScriptCallback) void Editor::updateCustomMapHeaderValues(QTableWidget *table) { - QMap fields; + QMap fields; for (int row = 0; row < table->rowCount(); row++) { - QString keyStr = ""; - QString valueStr = ""; - QTableWidgetItem *key = table->item(row, 0); - QTableWidgetItem *value = table->item(row, 1); - if (key) keyStr = key->text(); - if (value) valueStr = value->text(); - fields[keyStr] = valueStr; + QString key = ""; + QString value = ""; + QTableWidgetItem *keyItem = table->item(row, 0); + QTableWidgetItem *valueItem = table->item(row, 1); + if (keyItem) key = keyItem->text(); + if (!key.isEmpty() && valueItem) { + // Use the original table value to determine which type the input text should be saved as. + QJsonValue value = valueItem->data(Qt::UserRole).toJsonValue(); + switch (value.type()) + { + case QJsonValue::String: + value = QJsonValue(valueItem->text()); + break; + case QJsonValue::Double: + value = QJsonValue(valueItem->text().toInt()); + break; + case QJsonValue::Bool: + value = QJsonValue(valueItem->checkState() == Qt::Checked); + break; + default: + // Arrays and objects can't be updated via the table, just preserve the original value. + break; + } + fields[key] = value; + } } - //map->customHeaders = fields; + map->customHeaders = fields; emit editedMapData(); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cba737f0..94055e76 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -803,27 +803,10 @@ void MainWindow::displayMapProperties() { ui->tableWidget_CustomHeaderFields->blockSignals(true); ui->tableWidget_CustomHeaderFields->setRowCount(0); for (auto it = map->customHeaders.begin(); it != map->customHeaders.end(); it++) { - QTableWidgetItem * tableItem; - QJsonValue value = it.value(); - switch (value.type()) - { - case QJsonValue::String: - case QJsonValue::Double: - tableItem = new QTableWidgetItem(ParseUtil::jsonToQString(value)); - break; - case QJsonValue::Bool: - tableItem = new QTableWidgetItem(""); - tableItem->setCheckState(value.toBool() ? Qt::Checked : Qt::Unchecked); - break; - default: - tableItem = new QTableWidgetItem("This value cannot be edited from this table"); - tableItem->setFlags(Qt::NoItemFlags); - break; - } int rowIndex = ui->tableWidget_CustomHeaderFields->rowCount(); ui->tableWidget_CustomHeaderFields->insertRow(rowIndex); ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 0, new QTableWidgetItem(it.key())); - ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 1, tableItem); + ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 1, createNewCustomHeaderItem(it.value())); } ui->tableWidget_CustomHeaderFields->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); ui->tableWidget_CustomHeaderFields->blockSignals(false); @@ -3097,11 +3080,35 @@ void MainWindow::togglePreferenceSpecificUi() { ui->actionOpen_Project_in_Text_Editor->setEnabled(true); } +QTableWidgetItem * MainWindow::createNewCustomHeaderItem(QJsonValue value) { + QTableWidgetItem * tableItem; + switch (value.type()) + { + case QJsonValue::String: + case QJsonValue::Double: + tableItem = new QTableWidgetItem(ParseUtil::jsonToQString(value)); + break; + case QJsonValue::Bool: + tableItem = new QTableWidgetItem(""); + tableItem->setCheckState(value.toBool() ? Qt::Checked : Qt::Unchecked); + break; + default: + tableItem = new QTableWidgetItem("This value cannot be edited from this table"); + tableItem->setFlags(Qt::NoItemFlags); + break; + } + tableItem->setData(Qt::UserRole, value); // Save the original value/type for when it's written back to the project + return tableItem; +} + void MainWindow::on_pushButton_AddCustomHeaderField_clicked() { int rowIndex = this->ui->tableWidget_CustomHeaderFields->rowCount(); this->ui->tableWidget_CustomHeaderFields->insertRow(rowIndex); this->ui->tableWidget_CustomHeaderFields->selectRow(rowIndex); + // TODO: New items default to string, allow type selection + QJsonValue defaultValue = QJsonValue(QString("")); + this->ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 1, createNewCustomHeaderItem(defaultValue)); this->editor->updateCustomMapHeaderValues(this->ui->tableWidget_CustomHeaderFields); } diff --git a/src/project.cpp b/src/project.cpp index 7b41350e..6207fe5b 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -1440,7 +1440,28 @@ void Project::saveMap(Map *map) { // Custom header fields. for (QString key : map->customHeaders.keys()) { - //mapObj[key] = map->customHeaders[key]; + QJsonValue value = map->customHeaders[key]; + switch (value.type()) + { + default: + case QJsonValue::String: + mapObj[key] = value.toString(); + break; + case QJsonValue::Double: + mapObj[key] = value.toInt(); + break; + case QJsonValue::Bool: + mapObj[key] = value.toBool(); + break; + case QJsonValue::Array: + // TODO: Custom array values are replaced with empty strings + mapObj[key] = value.toString(); + break; + case QJsonValue::Object: + // TODO: Custom object values are replaced with empty strings + mapObj[key] = value.toString(); + break; + } } OrderedJson mapJson(mapObj);