1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-05-19 22:23:31 +02:00
vcmi/launcher/settingsView/configeditordialog_moc.cpp

159 lines
3.7 KiB
C++
Raw Normal View History

2025-03-17 21:58:31 +01:00
/*
* configeditordialog_moc.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "configeditordialog_moc.h"
#include "ui_configeditordialog_moc.h"
#include "../helper.h"
#include "../mainwindow_moc.h"
#include "../../lib/json/JsonNode.h"
#include "../../lib/VCMIDirs.h"
#include "../../lib/json/JsonFormatException.h"
ConfigEditorDialog::ConfigEditorDialog(QWidget *parent):
QDialog(parent),
ui(new Ui::ConfigEditorDialog)
{
ui->setupUi(this);
setWindowTitle(tr("Config editor"));
setWindowModality(Qt::ApplicationModal);
#ifdef VCMI_MOBILE
showMaximized();
#else
show();
#endif
QStringList files = {
"settings.json",
"persistentStorage.json",
"modSettings.json",
};
ui->comboBox->addItems(files);
QFont font("Monospace");
font.setStyleHint(QFont::TypeWriter);
ui->plainTextEdit->setFont(font);
ui->plainTextEdit->setLineWrapMode(QPlainTextEdit::LineWrapMode::NoWrap);
ui->plainTextEdit->setPlainText(loadFile(files.first()));
connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ConfigEditorDialog::onComboBoxTextChanged);
connect(ui->closeButton, &QPushButton::clicked, this, &ConfigEditorDialog::onCloseButtonClicked);
connect(ui->saveButton, &QPushButton::clicked, this, &ConfigEditorDialog::onSaveButtonClicked);
}
ConfigEditorDialog::~ConfigEditorDialog()
{
delete ui;
}
void ConfigEditorDialog::showConfigEditorDialog()
{
auto * dialog = new ConfigEditorDialog();
dialog->setAttribute(Qt::WA_DeleteOnClose);
}
2025-03-23 13:09:03 +01:00
bool ConfigEditorDialog::askUnsavedChanges(QWidget *parent)
2025-03-17 21:58:31 +01:00
{
2025-03-23 13:09:03 +01:00
auto reply = QMessageBox::question(parent, tr("Unsaved changes"), tr("Do you want to discard changes?"), QMessageBox::Yes | QMessageBox::No);
2025-03-17 21:58:31 +01:00
return reply != QMessageBox::Yes;
}
void ConfigEditorDialog::onComboBoxTextChanged(QString filename)
{
auto inputText = ui->plainTextEdit->toPlainText();
if(filename == loadedFile)
return;
if(inputText != loadedText)
{
if(askUnsavedChanges(this))
{
ui->comboBox->setCurrentText(loadedFile);
return;
}
}
ui->plainTextEdit->setPlainText(loadFile(filename));
}
void ConfigEditorDialog::onCloseButtonClicked()
{
auto text = ui->plainTextEdit->toPlainText();
if(text != loadedText)
{
if(askUnsavedChanges(this))
return;
}
close();
}
void ConfigEditorDialog::onSaveButtonClicked()
{
auto text = ui->plainTextEdit->toPlainText();
auto filename = ui->comboBox->currentText();
if(text == loadedText)
{
close();
return;
}
auto stdText = text.toStdString();
try
{
JsonParsingSettings jsonSettings;
jsonSettings.strict = true;
JsonNode node(reinterpret_cast<const std::byte*>(stdText.data()), stdText.size(), jsonSettings, filename.toStdString());
}
catch(const JsonFormatException& e)
{
QMessageBox::critical(this, tr("JSON file is not valid!"), e.what());
return;
}
saveFile(filename, text);
Helper::reLoadSettings();
close();
}
QString ConfigEditorDialog::loadFile(QString filename)
{
auto file = pathToQString(VCMIDirs::get().userConfigPath() / filename.toStdString());
QFile f(file);
if(!f.open(QFile::ReadOnly | QFile::Text))
{
logGlobal->error("ConfigEditor can not open config for reading!");
2025-03-23 13:09:03 +01:00
return {};
2025-03-17 21:58:31 +01:00
}
loadedText = QString::fromUtf8(f.readAll());
loadedFile = filename;
return loadedText;
}
void ConfigEditorDialog::saveFile(QString filename, QString content)
{
auto file = pathToQString(VCMIDirs::get().userConfigPath() / filename.toStdString());
QFile f(file);
if(!f.open(QFile::WriteOnly | QFile::Text))
{
logGlobal->error("ConfigEditor can not open config for writing!");
return;
}
f.write(content.toUtf8());
}