diff --git a/src/app/upgrade.cpp b/src/app/upgrade.cpp index 5cf8dbec8..3c46cb324 100644 --- a/src/app/upgrade.cpp +++ b/src/app/upgrade.cpp @@ -36,12 +36,15 @@ #include "base/preferences.h" #include "base/profile.h" #include "base/settingsstorage.h" +#include "base/settingvalue.h" #include "base/utils/fs.h" #include "base/utils/io.h" #include "base/utils/string.h" namespace { + const int MIGRATION_VERSION = 1; + void exportWebUIHttpsFiles() { const auto migrate = [](const QString &oldKey, const QString &newKey, const QString &savePath) @@ -229,12 +232,23 @@ namespace bool upgrade(const bool /*ask*/) { - exportWebUIHttpsFiles(); - upgradeTorrentContentLayout(); - upgradeListenPortSettings(); - upgradeSchedulerDaysSettings(); - upgradeDNSServiceSettings(); - upgradeTrayIconStyleSettings(); + CachedSettingValue version {"Meta/MigrationVersion", 0}; + + if (version != MIGRATION_VERSION) + { + if (version < 1) + { + exportWebUIHttpsFiles(); + upgradeTorrentContentLayout(); + upgradeListenPortSettings(); + upgradeSchedulerDaysSettings(); + upgradeDNSServiceSettings(); + upgradeTrayIconStyleSettings(); + } + + version = MIGRATION_VERSION; + } + return true; } @@ -255,7 +269,7 @@ void handleChangedDefaults(const DefaultPreferencesMode mode) SettingsStorage *settingsStorage {SettingsStorage::instance()}; for (auto it = changedDefaults.cbegin(); it != changedDefaults.cend(); ++it) { - if (settingsStorage->loadValue(it->name).isNull()) + if (!settingsStorage->hasKey(it->name)) settingsStorage->storeValue(it->name, (mode == DefaultPreferencesMode::Legacy ? it->legacy : it->current)); } } diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index 91a7275c7..d7248e7d3 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -1296,12 +1296,12 @@ void Preferences::setMainVSplitterState(const QByteArray &state) QString Preferences::getMainLastDir() const { - return value("MainWindowLastDir", QDir::homePath()); + return value("MainWindow/LastDir", QDir::homePath()); } void Preferences::setMainLastDir(const QString &path) { - setValue("MainWindowLastDir", path); + setValue("MainWindow/LastDir", path); } QByteArray Preferences::getPeerListState() const diff --git a/src/base/settingsstorage.h b/src/base/settingsstorage.h index 500398a2a..524f87170 100644 --- a/src/base/settingsstorage.h +++ b/src/base/settingsstorage.h @@ -60,17 +60,18 @@ public: { if constexpr (std::is_enum_v) { - const auto value = loadValueImpl(key).toString(); + const auto value = loadValue(key); return Utils::String::toEnum(value, defaultValue); } - else if constexpr (std::is_same_v) - { - return loadValueImpl(key, defaultValue); - } else if constexpr (IsQFlags::value) { - const QVariant value = loadValueImpl(key, static_cast(defaultValue)); - return T {value.template value()}; + const typename T::Int value = loadValue(key, static_cast(defaultValue)); + return T {value}; + } + else if constexpr (std::is_same_v) + { + // fast path for loading QVariant + return loadValueImpl(key, defaultValue); } else { diff --git a/src/base/utils/version.h b/src/base/utils/version.h index 12c7f75d1..8357313b3 100644 --- a/src/base/utils/version.h +++ b/src/base/utils/version.h @@ -146,9 +146,9 @@ namespace Utils { return Version(s); } - catch (const RuntimeError &er) + catch (const RuntimeError &error) { - qDebug() << "Error parsing version:" << er.message(); + qDebug() << "Error parsing version:" << error.message(); return defaultVersion; } } diff --git a/src/webui/www/private/views/preferences.html b/src/webui/www/private/views/preferences.html index cc47719ca..acd3c36c8 100644 --- a/src/webui/www/private/views/preferences.html +++ b/src/webui/www/private/views/preferences.html @@ -634,62 +634,62 @@ QBT_TR(Language)QBT_TR[CONTEXT=OptionsDialog]