Add custom header value type selection

This commit is contained in:
GriffinR 2022-10-15 22:32:05 -04:00
parent 463a7e01f6
commit 6b55dc935d
4 changed files with 80 additions and 46 deletions

View file

@ -2142,6 +2142,11 @@
<attribute name="verticalHeaderVisible"> <attribute name="verticalHeaderVisible">
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<column>
<property name="text">
<string>Type</string>
</property>
</column>
<column> <column>
<property name="text"> <property name="text">
<string>Key</string> <string>Key</string>

View file

@ -388,7 +388,7 @@ private:
void redrawMetatileSelection(); void redrawMetatileSelection();
QObjectList shortcutableObjects() const; QObjectList shortcutableObjects() const;
QTableWidgetItem * createNewCustomHeaderItem(QJsonValue value); void addCustomHeaderValue(QString key, QJsonValue value, bool isNew = false);
}; };
enum MapListUserRoles { enum MapListUserRoles {

View file

@ -1951,30 +1951,34 @@ void Editor::updateCustomMapHeaderValues(QTableWidget *table)
QMap<QString, QJsonValue> fields; QMap<QString, QJsonValue> fields;
for (int row = 0; row < table->rowCount(); row++) { for (int row = 0; row < table->rowCount(); row++) {
QString key = ""; QString key = "";
QString value = ""; QTableWidgetItem *typeItem = table->item(row, 0);
QTableWidgetItem *keyItem = table->item(row, 0); QTableWidgetItem *keyItem = table->item(row, 1);
QTableWidgetItem *valueItem = table->item(row, 1); QTableWidgetItem *valueItem = table->item(row, 2);
if (keyItem) key = keyItem->text(); if (keyItem) key = keyItem->text();
if (!key.isEmpty() && valueItem) { if (key.isEmpty() || !typeItem || !valueItem)
// Use the original table value to determine which type the input text should be saved as. continue;
QJsonValue value = valueItem->data(Qt::UserRole).toJsonValue();
switch (value.type()) // Read which JSON type to save the value as from the table data
{ QJsonValue::Type type = static_cast<QJsonValue::Type>(typeItem->data(Qt::UserRole).toInt());
case QJsonValue::String: QJsonValue value;
value = QJsonValue(valueItem->text()); switch (type)
break; {
case QJsonValue::Double: case QJsonValue::String:
value = QJsonValue(valueItem->text().toInt()); value = QJsonValue(valueItem->text());
break; break;
case QJsonValue::Bool: case QJsonValue::Double:
value = QJsonValue(valueItem->checkState() == Qt::Checked); value = QJsonValue(valueItem->text().toInt());
break; break;
default: case QJsonValue::Bool:
// Arrays and objects can't be updated via the table, just preserve the original value. value = QJsonValue(valueItem->checkState() == Qt::Checked);
break; break;
} default:
fields[key] = value; // All other types will just be preserved
value = valueItem->data(Qt::UserRole).toJsonValue();
break;
} }
fields[key] = value;
} }
map->customHeaders = fields; map->customHeaders = fields;
emit editedMapData(); emit editedMapData();

View file

@ -802,12 +802,8 @@ void MainWindow::displayMapProperties() {
// Custom fields table. // Custom fields table.
ui->tableWidget_CustomHeaderFields->blockSignals(true); ui->tableWidget_CustomHeaderFields->blockSignals(true);
ui->tableWidget_CustomHeaderFields->setRowCount(0); ui->tableWidget_CustomHeaderFields->setRowCount(0);
for (auto it = map->customHeaders.begin(); it != map->customHeaders.end(); it++) { for (auto it = map->customHeaders.begin(); it != map->customHeaders.end(); it++)
int rowIndex = ui->tableWidget_CustomHeaderFields->rowCount(); addCustomHeaderValue(it.key(), it.value());
ui->tableWidget_CustomHeaderFields->insertRow(rowIndex);
ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 0, new QTableWidgetItem(it.key()));
ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 1, createNewCustomHeaderItem(it.value()));
}
ui->tableWidget_CustomHeaderFields->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); ui->tableWidget_CustomHeaderFields->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableWidget_CustomHeaderFields->blockSignals(false); ui->tableWidget_CustomHeaderFields->blockSignals(false);
} }
@ -3080,36 +3076,65 @@ void MainWindow::togglePreferenceSpecificUi() {
ui->actionOpen_Project_in_Text_Editor->setEnabled(true); ui->actionOpen_Project_in_Text_Editor->setEnabled(true);
} }
QTableWidgetItem * MainWindow::createNewCustomHeaderItem(QJsonValue value) { void MainWindow::addCustomHeaderValue(QString key, QJsonValue value, bool isNew) {
QTableWidgetItem * tableItem; QTableWidgetItem * valueItem;
switch (value.type()) QJsonValue::Type type = value.type();
switch (type)
{ {
case QJsonValue::String: case QJsonValue::String:
case QJsonValue::Double: case QJsonValue::Double:
tableItem = new QTableWidgetItem(ParseUtil::jsonToQString(value)); valueItem = new QTableWidgetItem(ParseUtil::jsonToQString(value));
break; break;
case QJsonValue::Bool: case QJsonValue::Bool:
tableItem = new QTableWidgetItem(""); valueItem = new QTableWidgetItem("");
tableItem->setCheckState(value.toBool() ? Qt::Checked : Qt::Unchecked); valueItem->setCheckState(value.toBool() ? Qt::Checked : Qt::Unchecked);
break; break;
default: default:
tableItem = new QTableWidgetItem("This value cannot be edited from this table"); valueItem = new QTableWidgetItem("This value cannot be edited from this table");
tableItem->setFlags(Qt::NoItemFlags); valueItem->setFlags(Qt::NoItemFlags);
valueItem->setData(Qt::UserRole, value); // Preserve the value for writing to the file
break; break;
} }
tableItem->setData(Qt::UserRole, value); // Save the original value/type for when it's written back to the project
return tableItem; const QHash<QJsonValue::Type, QString> 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() void MainWindow::on_pushButton_AddCustomHeaderField_clicked()
{ {
int rowIndex = this->ui->tableWidget_CustomHeaderFields->rowCount(); const QMap<QString, QJsonValue> valueTypes = {
this->ui->tableWidget_CustomHeaderFields->insertRow(rowIndex); {"String", QJsonValue(QString(""))},
this->ui->tableWidget_CustomHeaderFields->selectRow(rowIndex); {"Number", QJsonValue(0)},
// TODO: New items default to string, allow type selection {"Boolean", QJsonValue(false)},
QJsonValue defaultValue = QJsonValue(QString("")); };
this->ui->tableWidget_CustomHeaderFields->setItem(rowIndex, 1, createNewCustomHeaderItem(defaultValue));
this->editor->updateCustomMapHeaderValues(this->ui->tableWidget_CustomHeaderFields); 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() void MainWindow::on_pushButton_DeleteCustomHeaderField_clicked()