diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 3084caca8..1a7f2d9d3 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -816,7 +816,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("TPDownloadGeometry", ""); m_settings->registerSetting("ShaderDownloadGeometry", ""); - m_settings->registerSetting("UI/FolderResourceColumnVisibility", QVariantMap{}); + m_settings->registerSetting("UI/FolderResourceColumnVisibility", "{}"); // HACK: This code feels so stupid is there a less stupid way of doing this? { @@ -855,7 +855,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("CloseAfterLaunch", false); m_settings->registerSetting("QuitAfterGameStop", false); - m_settings->registerSetting("Env", QVariant(QMap())); + m_settings->registerSetting("Env", "{}"); // Custom Microsoft Authentication Client ID m_settings->registerSetting("MSAClientIDOverride", ""); diff --git a/launcher/BaseInstance.cpp b/launcher/BaseInstance.cpp index 096052a45..f4bc7e30b 100644 --- a/launcher/BaseInstance.cpp +++ b/launcher/BaseInstance.cpp @@ -44,6 +44,7 @@ #include #include "Application.h" +#include "Json.h" #include "settings/INISettingsObject.h" #include "settings/OverrideSetting.h" #include "settings/Setting.h" @@ -202,25 +203,25 @@ bool BaseInstance::shouldStopOnConsoleOverflow() const QStringList BaseInstance::getLinkedInstances() const { - return m_settings->get("linkedInstances").toStringList(); + auto setting = m_settings->get("linkedInstances").toString(); + return Json::toStringList(setting); } void BaseInstance::setLinkedInstances(const QStringList& list) { - auto linkedInstances = m_settings->get("linkedInstances").toStringList(); - m_settings->set("linkedInstances", list); + m_settings->set("linkedInstances", Json::fromStringList(list)); } void BaseInstance::addLinkedInstanceId(const QString& id) { - auto linkedInstances = m_settings->get("linkedInstances").toStringList(); + auto linkedInstances = getLinkedInstances(); linkedInstances.append(id); setLinkedInstances(linkedInstances); } bool BaseInstance::removeLinkedInstanceId(const QString& id) { - auto linkedInstances = m_settings->get("linkedInstances").toStringList(); + auto linkedInstances = getLinkedInstances(); int numRemoved = linkedInstances.removeAll(id); setLinkedInstances(linkedInstances); return numRemoved > 0; @@ -228,7 +229,7 @@ bool BaseInstance::removeLinkedInstanceId(const QString& id) bool BaseInstance::isLinkedToInstanceId(const QString& id) const { - auto linkedInstances = m_settings->get("linkedInstances").toStringList(); + auto linkedInstances = getLinkedInstances(); return linkedInstances.contains(id); } diff --git a/launcher/Json.cpp b/launcher/Json.cpp index 8623eb2a8..8eedb9b05 100644 --- a/launcher/Json.cpp +++ b/launcher/Json.cpp @@ -304,4 +304,23 @@ QString fromStringList(const QStringList& list) return QString::fromUtf8(doc.toJson(QJsonDocument::Compact)); } +QVariantMap toMap(const QString& jsonString) +{ + QJsonParseError parseError; + QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &parseError); + + if (parseError.error != QJsonParseError::NoError || !doc.isObject()) + return {}; + + QJsonObject obj = doc.object(); + return obj.toVariantMap(); +} + +QString fromMap(const QVariantMap& map) +{ + QJsonObject obj = QJsonObject::fromVariantMap(map); + QJsonDocument doc(obj); + return QString::fromUtf8(doc.toJson(QJsonDocument::Compact)); +} + } // namespace Json diff --git a/launcher/Json.h b/launcher/Json.h index 509a41fd5..e51c737c2 100644 --- a/launcher/Json.h +++ b/launcher/Json.h @@ -282,5 +282,8 @@ JSON_HELPERFUNCTIONS(Variant, QVariant) QStringList toStringList(const QString& jsonString); QString fromStringList(const QStringList& list); +QVariantMap toMap(const QString& jsonString); +QString fromMap(const QVariantMap& map); + } // namespace Json using JSONValidationError = Json::JsonException; diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index ed8ed398d..6df86bbed 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -38,6 +38,7 @@ #include "MinecraftInstance.h" #include "Application.h" #include "BuildConfig.h" +#include "Json.h" #include "QObjectPtr.h" #include "minecraft/launch/AutoInstallJava.h" #include "minecraft/launch/CreateGameFolders.h" @@ -232,7 +233,7 @@ void MinecraftInstance::loadSpecificSettings() m_settings->registerOverride(global_settings->getSetting("Env"), envSetting); m_settings->registerSetting("UI/ColumnsOverride", false); - m_settings->registerSetting("UI/FolderResourceColumnVisibility", QVariantMap{}); + m_settings->registerSetting("UI/FolderResourceColumnVisibility", "{}"); m_settings->set("InstanceType", "OneSix"); } @@ -623,7 +624,8 @@ QProcessEnvironment MinecraftInstance::createEnvironment() } // custom env - auto insertEnv = [&env](QMap envMap) { + auto insertEnv = [&env](QString value) { + auto envMap = Json::toMap(value); if (envMap.isEmpty()) return; @@ -634,9 +636,9 @@ QProcessEnvironment MinecraftInstance::createEnvironment() bool overrideEnv = settings()->get("OverrideEnv").toBool(); if (!overrideEnv) - insertEnv(APPLICATION->settings()->get("Env").toMap()); + insertEnv(APPLICATION->settings()->get("Env").toString()); else - insertEnv(settings()->get("Env").toMap()); + insertEnv(settings()->get("Env").toString()); return env; } diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 183367b8b..7b745b46f 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -597,14 +597,14 @@ void ResourceFolderModel::saveColumns(QTreeView* tree) if (!settings->get("UI/ColumnsOverride").toBool()) { settings = APPLICATION->settings(); } - auto visibility = settings->get("UI/FolderResourceColumnVisibility").toMap(); + auto visibility = Json::toMap(settings->get("UI/FolderResourceColumnVisibility").toString()); for (auto i = 0; i < m_column_names.size(); ++i) { if (m_columnsHideable[i]) { auto name = m_column_names[i]; visibility[name] = !tree->isColumnHidden(i); } } - settings->set("UI/FolderResourceColumnVisibility", visibility); + settings->set("UI/FolderResourceColumnVisibility", Json::fromMap(visibility)); } void ResourceFolderModel::loadColumns(QTreeView* tree) @@ -615,7 +615,7 @@ void ResourceFolderModel::loadColumns(QTreeView* tree) tree->header()->restoreState(QByteArray::fromBase64(setting->get().toString().toUtf8())); auto setVisible = [this, tree](QVariant value) { - auto visibility = value.toMap(); + auto visibility = Json::toMap(value.toString()); for (auto i = 0; i < m_column_names.size(); ++i) { if (m_columnsHideable[i]) { auto name = m_column_names[i]; @@ -630,13 +630,13 @@ void ResourceFolderModel::loadColumns(QTreeView* tree) settings = APPLICATION->settings(); } auto visibility = settings->getSetting("UI/FolderResourceColumnVisibility"); - setVisible(visibility->get().toMap()); + setVisible(visibility->get()); // allways connect the signal in case the setting is toggled on and off auto gSetting = APPLICATION->settings()->getOrRegisterSetting("UI/FolderResourceColumnVisibility"); connect(gSetting.get(), &Setting::SettingChanged, tree, [this, setVisible](const Setting&, QVariant value) { if (!m_instance->settings()->get("UI/ColumnsOverride").toBool()) { - setVisible(value.toMap()); + setVisible(value); } }); } diff --git a/launcher/settings/INIFile.cpp b/launcher/settings/INIFile.cpp index 8403642fa..75e888938 100644 --- a/launcher/settings/INIFile.cpp +++ b/launcher/settings/INIFile.cpp @@ -44,6 +44,7 @@ #include #include +#include "Json.h" INIFile::INIFile() {} @@ -151,16 +152,22 @@ bool parseOldFileFormat(QIODevice& device, QSettings::SettingsMap& map) QVariant migrateQByteArrayToBase64(QString key, QVariant value) { - if (key.startsWith("WideBarVisibility_") || (key.startsWith("UI/") && key.endsWith("_Page/Columns"))) { - return QString::fromUtf8(value.toByteArray().toBase64()); - } static const QStringList otherByteArrays = { "MainWindowState", "MainWindowGeometry", "ConsoleWindowState", "ConsoleWindowGeometry", "PagedGeometry", "NewInstanceGeometry", "ModDownloadGeometry", "RPDownloadGeometry", "TPDownloadGeometry", "ShaderDownloadGeometry" }; + if (key.startsWith("WideBarVisibility_") || (key.startsWith("UI/") && key.endsWith("_Page/Columns"))) { + return QString::fromUtf8(value.toByteArray().toBase64()); + } if (otherByteArrays.contains(key)) { return QString::fromUtf8(value.toByteArray()); } + if (key == "linkedInstances") { + return Json::fromStringList(value.toStringList()); + } + if (key == "Env") { + return Json::fromMap(value.toMap()); + } return value; } diff --git a/launcher/ui/widgets/MinecraftSettingsWidget.cpp b/launcher/ui/widgets/MinecraftSettingsWidget.cpp index 610dc143b..8ec5640c3 100644 --- a/launcher/ui/widgets/MinecraftSettingsWidget.cpp +++ b/launcher/ui/widgets/MinecraftSettingsWidget.cpp @@ -180,7 +180,7 @@ void MinecraftSettingsWidget::loadSettings() // Environment variables m_ui->environmentVariables->initialize(m_instance != nullptr, m_instance == nullptr || settings->get("OverrideEnv").toBool(), - settings->get("Env").toMap()); + Json::toMap(settings->get("Env").toString())); // Legacy Tweaks m_ui->legacySettingsGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideLegacySettings").toBool()); @@ -342,7 +342,7 @@ void MinecraftSettingsWidget::saveSettings() settings->set("OverrideEnv", env); if (env) - settings->set("Env", m_ui->environmentVariables->value()); + settings->set("Env", Json::fromMap(m_ui->environmentVariables->value())); else settings->reset("Env");