Add custom header value type selection
This commit is contained in:
parent
463a7e01f6
commit
6b55dc935d
4 changed files with 80 additions and 46 deletions
|
@ -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>
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue