diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index 0a71bce5..1a2268a2 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -2142,6 +2142,11 @@
false
+
+
+ Type
+
+
Key
diff --git a/include/mainwindow.h b/include/mainwindow.h
index 4eae446f..455e79eb 100644
--- a/include/mainwindow.h
+++ b/include/mainwindow.h
@@ -388,7 +388,7 @@ private:
void redrawMetatileSelection();
QObjectList shortcutableObjects() const;
- QTableWidgetItem * createNewCustomHeaderItem(QJsonValue value);
+ void addCustomHeaderValue(QString key, QJsonValue value, bool isNew = false);
};
enum MapListUserRoles {
diff --git a/src/editor.cpp b/src/editor.cpp
index 50da1ca2..bf748b7c 100644
--- a/src/editor.cpp
+++ b/src/editor.cpp
@@ -1951,30 +1951,34 @@ void Editor::updateCustomMapHeaderValues(QTableWidget *table)
QMap fields;
for (int row = 0; row < table->rowCount(); row++) {
QString key = "";
- QString value = "";
- QTableWidgetItem *keyItem = table->item(row, 0);
- QTableWidgetItem *valueItem = table->item(row, 1);
+ QTableWidgetItem *typeItem = table->item(row, 0);
+ QTableWidgetItem *keyItem = table->item(row, 1);
+ QTableWidgetItem *valueItem = table->item(row, 2);
+
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;
+ if (key.isEmpty() || !typeItem || !valueItem)
+ continue;
+
+ // Read which JSON type to save the value as from the table data
+ QJsonValue::Type type = static_cast(typeItem->data(Qt::UserRole).toInt());
+ QJsonValue value;
+ switch (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:
+ // All other types will just be preserved
+ value = valueItem->data(Qt::UserRole).toJsonValue();
+ break;
}
+ fields[key] = value;
}
map->customHeaders = fields;
emit editedMapData();
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 94055e76..e8787184 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -802,12 +802,8 @@ void MainWindow::displayMapProperties() {
// Custom fields table.
ui->tableWidget_CustomHeaderFields->blockSignals(true);
ui->tableWidget_CustomHeaderFields->setRowCount(0);
- for (auto it = map->customHeaders.begin(); it != map->customHeaders.end(); it++) {
- 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, createNewCustomHeaderItem(it.value()));
- }
+ for (auto it = map->customHeaders.begin(); it != map->customHeaders.end(); it++)
+ addCustomHeaderValue(it.key(), it.value());
ui->tableWidget_CustomHeaderFields->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableWidget_CustomHeaderFields->blockSignals(false);
}
@@ -3080,36 +3076,65 @@ void MainWindow::togglePreferenceSpecificUi() {
ui->actionOpen_Project_in_Text_Editor->setEnabled(true);
}
-QTableWidgetItem * MainWindow::createNewCustomHeaderItem(QJsonValue value) {
- QTableWidgetItem * tableItem;
- switch (value.type())
+void MainWindow::addCustomHeaderValue(QString key, QJsonValue value, bool isNew) {
+ QTableWidgetItem * valueItem;
+ QJsonValue::Type type = value.type();
+ switch (type)
{
case QJsonValue::String:
case QJsonValue::Double:
- tableItem = new QTableWidgetItem(ParseUtil::jsonToQString(value));
+ valueItem = new QTableWidgetItem(ParseUtil::jsonToQString(value));
break;
case QJsonValue::Bool:
- tableItem = new QTableWidgetItem("");
- tableItem->setCheckState(value.toBool() ? Qt::Checked : Qt::Unchecked);
+ valueItem = new QTableWidgetItem("");
+ valueItem->setCheckState(value.toBool() ? Qt::Checked : Qt::Unchecked);
break;
default:
- tableItem = new QTableWidgetItem("This value cannot be edited from this table");
- tableItem->setFlags(Qt::NoItemFlags);
+ valueItem = new QTableWidgetItem("This value cannot be edited from this table");
+ valueItem->setFlags(Qt::NoItemFlags);
+ valueItem->setData(Qt::UserRole, value); // Preserve the value for writing to the file
break;
}
- tableItem->setData(Qt::UserRole, value); // Save the original value/type for when it's written back to the project
- return tableItem;
+
+ const QHash typeToName = {
+ {QJsonValue::Bool, "Bool"},
+ {QJsonValue::Double, "Number"},
+ {QJsonValue::String, "String"},
+ {QJsonValue::Array, "Array"},
+ {QJsonValue::Object, "Object"},
+ {QJsonValue::Null, "Null"},
+ {QJsonValue::Undefined, "Null"},
+ };
+ QTableWidgetItem * typeItem = new QTableWidgetItem(typeToName[type]);
+ typeItem->setFlags(Qt::ItemIsEnabled);
+ typeItem->setData(Qt::UserRole, type); // Record the type for writing to the file
+
+ int rowIndex = this->ui->tableWidget_CustomHeaderFields->rowCount();
+ this->ui->tableWidget_CustomHeaderFields->insertRow(rowIndex);
+ this->ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 0, typeItem);
+ this->ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 1, new QTableWidgetItem(key));
+ this->ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 2, valueItem);
+
+ if (isNew) {
+ valueItem->setText(""); // Erase the "0" in new numbers
+ this->ui->tableWidget_CustomHeaderFields->selectRow(rowIndex);
+ this->editor->updateCustomMapHeaderValues(this->ui->tableWidget_CustomHeaderFields);
+ }
}
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);
+ const QMap valueTypes = {
+ {"String", QJsonValue(QString(""))},
+ {"Number", QJsonValue(0)},
+ {"Boolean", QJsonValue(false)},
+ };
+
+ bool ok;
+ QStringList typeNames = valueTypes.keys();
+ QString selection = QInputDialog::getItem(this, "", "Choose Value Type", typeNames, typeNames.indexOf("String"), false, &ok);
+ if (ok)
+ addCustomHeaderValue("", valueTypes[selection], true);
}
void MainWindow::on_pushButton_DeleteCustomHeaderField_clicked()