diff --git a/components/settings/settings.cpp b/components/settings/settings.cpp index 04c3425de2..aa44734562 100644 --- a/components/settings/settings.cpp +++ b/components/settings/settings.cpp @@ -141,6 +141,9 @@ namespace Settings parser.loadSettingsFile(additionalDefaults, mDefaultSettings, false, true); } + if (!loadEditorSettings) + Settings::Values::initDefaults(); + // Load "settings.cfg" or "openmw-cs.cfg" from the last config dir as user settings. This path will be used to // save modified settings. auto settingspath = paths.back() / userSettingsFile; diff --git a/components/settings/settingvalue.hpp b/components/settings/settingvalue.hpp index e84f014c9b..bdc91c4a21 100644 --- a/components/settings/settingvalue.hpp +++ b/components/settings/settingvalue.hpp @@ -23,10 +23,25 @@ namespace Settings : mCategory(category) , mName(name) , mSanitizer(std::move(sanitizer)) - , mValue(sanitize(Settings::Manager::get(name, category))) + , mValue(sanitize(Settings::Manager::get(mName, mCategory))) { } + SettingValue(SettingValue&& other) + : mCategory(other.mCategory) + , mName(other.mName) + , mSanitizer(std::move(other.mSanitizer)) + , mDefaultValue(std::move(other.mValue)) + , mValue(sanitize(Settings::Manager::get(mName, mCategory))) + { + } + + SettingValue(const SettingValue& other) = delete; + + SettingValue& operator=(const SettingValue& other) = delete; + + SettingValue& operator=(SettingValue&& other) = delete; + const T& get() const { return mValue; } operator const T&() const { return mValue; } @@ -39,10 +54,13 @@ namespace Settings Settings::Manager::set(mName, mCategory, mValue); } + void reset() { set(mDefaultValue); } + private: const std::string_view mCategory; const std::string_view mName; - const std::unique_ptr> mSanitizer; + std::unique_ptr> mSanitizer; + T mDefaultValue{}; T mValue{}; T sanitize(const T& value) const diff --git a/components/settings/values.cpp b/components/settings/values.cpp index 668a85c8fd..99ca0bcb9b 100644 --- a/components/settings/values.cpp +++ b/components/settings/values.cpp @@ -1,12 +1,24 @@ #include "values.hpp" +#include + namespace Settings { Values* Values::sValues = nullptr; - void Values::init() + void Values::initDefaults() { + if (Values::sValues != nullptr) + throw std::logic_error("Default settings already initialized"); static Values values; Values::sValues = &values; } + + void Values::init() + { + if (Values::sValues == nullptr) + throw std::logic_error("Default settings are not initialized"); + static Values values(std::move(*Values::sValues)); + Values::sValues = &values; + } } diff --git a/components/settings/values.hpp b/components/settings/values.hpp index c6badbaa7c..b95cc1885d 100644 --- a/components/settings/values.hpp +++ b/components/settings/values.hpp @@ -58,6 +58,8 @@ namespace Settings StereoViewCategory mStereoView; PostProcessingCategory mPostProcessing; + static void initDefaults(); + static void init(); private: @@ -195,7 +197,6 @@ namespace Settings { return values().mPostProcessing; } - } #endif