Save custom header values by type

This commit is contained in:
GriffinR 2022-10-15 14:49:35 -04:00
parent ec626a59a7
commit 463a7e01f6
4 changed files with 75 additions and 28 deletions

View file

@ -388,6 +388,7 @@ private:
void redrawMetatileSelection();
QObjectList shortcutableObjects() const;
QTableWidgetItem * createNewCustomHeaderItem(QJsonValue value);
};
enum MapListUserRoles {

View file

@ -1948,17 +1948,35 @@ void Editor::toggleBorderVisibility(bool visible, bool enableScriptCallback)
void Editor::updateCustomMapHeaderValues(QTableWidget *table)
{
QMap<QString, QString> fields;
QMap<QString, QJsonValue> 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;
}
//map->customHeaders = fields;
fields[key] = value;
}
}
map->customHeaders = fields;
emit editedMapData();
}

View file

@ -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);
}

View file

@ -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);