mirror of
https://github.com/huderlem/porymap.git
synced 2026-03-22 01:54:46 -05:00
102 lines
3.4 KiB
C++
102 lines
3.4 KiB
C++
#include "customattributesdialog.h"
|
|
#include "ui_customattributesdialog.h"
|
|
#include "utility.h"
|
|
|
|
#include <QMessageBox>
|
|
|
|
static int curInputType = 0;
|
|
|
|
CustomAttributesDialog::CustomAttributesDialog(CustomAttributesTable *table) :
|
|
QDialog(table),
|
|
ui(new Ui::CustomAttributesDialog),
|
|
m_table(table)
|
|
{
|
|
setAttribute(Qt::WA_DeleteOnClose);
|
|
ui->setupUi(this);
|
|
|
|
// Type combo box
|
|
ui->comboBox_Type->addItems({"String", "Number", "Boolean"});
|
|
|
|
// When the value type is changed, update the value input widget
|
|
connect(ui->comboBox_Type, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &CustomAttributesDialog::setInputType);
|
|
ui->comboBox_Type->setCurrentIndex(curInputType);
|
|
|
|
ui->spinBox_Value->setMinimum(INT_MIN);
|
|
ui->spinBox_Value->setMaximum(INT_MAX);
|
|
|
|
connect(ui->lineEdit_Name, &QLineEdit::textChanged, this, &CustomAttributesDialog::onNameChanged);
|
|
connect(ui->buttonBox, &QDialogButtonBox::clicked, this, &CustomAttributesDialog::clickedButton);
|
|
|
|
adjustSize();
|
|
}
|
|
|
|
CustomAttributesDialog::~CustomAttributesDialog() {
|
|
delete ui;
|
|
}
|
|
|
|
void CustomAttributesDialog::setInputType(int inputType) {
|
|
if (inputType < 0 || inputType >= ui->stackedWidget_Value->count())
|
|
return;
|
|
|
|
ui->stackedWidget_Value->setCurrentIndex(inputType);
|
|
|
|
// Preserve input widget for later dialogs
|
|
curInputType = inputType;
|
|
}
|
|
|
|
void CustomAttributesDialog::onNameChanged(const QString &) {
|
|
validateName(true);
|
|
}
|
|
|
|
bool CustomAttributesDialog::validateName(bool allowEmpty) {
|
|
const QString name = ui->lineEdit_Name->text();
|
|
|
|
QString errorText;
|
|
if (name.isEmpty()) {
|
|
if (!allowEmpty) errorText = QString("%1 cannot be empty.").arg(ui->label_Name->text());
|
|
} else if (m_table->restrictedKeys().contains(name)) {
|
|
errorText = QString("The name '%1' is reserved, please choose a different name.").arg(name);
|
|
}
|
|
|
|
bool isValid = errorText.isEmpty();
|
|
ui->label_NameError->setText(errorText);
|
|
ui->label_NameError->setVisible(!isValid);
|
|
Util::setErrorStylesheet(ui->lineEdit_Name, !isValid);
|
|
return isValid;
|
|
}
|
|
|
|
QVariant CustomAttributesDialog::getValue() const {
|
|
QVariant value;
|
|
auto widget = ui->stackedWidget_Value->currentWidget();
|
|
if (widget == ui->page_String) {
|
|
value = QVariant(ui->lineEdit_Value->text());
|
|
} else if (widget == ui->page_Number) {
|
|
value = QVariant(ui->spinBox_Value->value());
|
|
} else if (widget == ui->page_Boolean) {
|
|
value = QVariant(ui->checkBox_Value->isChecked());
|
|
}
|
|
return value;
|
|
}
|
|
|
|
void CustomAttributesDialog::addNewAttribute() {
|
|
m_table->addNewAttribute(ui->lineEdit_Name->text(), QJsonValue::fromVariant(getValue()));
|
|
}
|
|
|
|
void CustomAttributesDialog::clickedButton(QAbstractButton *button) {
|
|
auto buttonRole = ui->buttonBox->buttonRole(button);
|
|
if (buttonRole == QDialogButtonBox::AcceptRole && validateName()) {
|
|
const QString key = ui->lineEdit_Name->text();
|
|
if (m_table->keys().contains(key)) {
|
|
// Warn user if key name would overwrite an existing custom attribute
|
|
const QString msg = QString("Overwrite value for existing attribute '%1'?").arg(key);
|
|
if (QMessageBox::warning(this, "Warning", msg, QMessageBox::Yes | QMessageBox::Cancel) == QMessageBox::Cancel){
|
|
return;
|
|
}
|
|
}
|
|
addNewAttribute();
|
|
done(QDialog::Accepted);
|
|
} else if (buttonRole == QDialogButtonBox::RejectRole) {
|
|
done(QDialog::Rejected);
|
|
}
|
|
}
|