From 6b55dc935d0c821317ff002e3fac94598a9504c2 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 15 Oct 2022 22:32:05 -0400 Subject: [PATCH] Add custom header value type selection --- forms/mainwindow.ui | 5 ++++ include/mainwindow.h | 2 +- src/editor.cpp | 48 ++++++++++++++++-------------- src/mainwindow.cpp | 71 ++++++++++++++++++++++++++++++-------------- 4 files changed, 80 insertions(+), 46 deletions(-) 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()