diff options
author | psi29a <psi29a@gmail.com> | 2023-04-23 09:45:38 +0000 |
---|---|---|
committer | psi29a <psi29a@gmail.com> | 2023-04-23 09:45:38 +0000 |
commit | ebf6f50523eb492e03148f1539955b02abf967ea (patch) | |
tree | 162b56b6072d79484b2dcfbd9534fed5c401a212 | |
parent | 44ed3bed2bf3da7eec1ba9d3c68fc894d2a1cfd2 (diff) | |
parent | 39e867781efe90760a2dfe4a84b20423420a97a1 (diff) |
Merge branch 'settings_default' into 'master'7344-support-launching-the-example-suite
Avoid using Settings::Manager::mDefaultSettings directly in the engine (#6876)
See merge request OpenMW/openmw!2959
-rw-r--r-- | apps/openmw/mwgui/settingswindow.cpp | 25 | ||||
-rw-r--r-- | components/settings/settings.cpp | 3 | ||||
-rw-r--r-- | components/settings/settingvalue.hpp | 22 | ||||
-rw-r--r-- | components/settings/values.cpp | 14 | ||||
-rw-r--r-- | components/settings/values.hpp | 3 |
5 files changed, 48 insertions, 19 deletions
diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index b787ce59e6..7d81c81a8d 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -26,7 +26,7 @@ #include <components/resource/resourcesystem.hpp> #include <components/resource/scenemanager.hpp> #include <components/sceneutil/lightmanager.hpp> -#include <components/settings/settings.hpp> +#include <components/settings/values.hpp> #include <components/vfs/manager.hpp> #include <components/widgets/sharedstatebutton.hpp> @@ -620,21 +620,16 @@ namespace MWGui if (selectedButton == 1 || selectedButton == -1) return; - constexpr std::array<const char*, 6> settings = { - "light bounds multiplier", - "maximum light distance", - "light fade start", - "minimum interior brightness", - "max lights", - "lighting method", - }; - for (const auto& setting : settings) - Settings::Manager::setString( - setting, "Shaders", Settings::Manager::mDefaultSettings[{ "Shaders", setting }]); + Settings::shaders().mLightBoundsMultiplier.reset(); + Settings::shaders().mMaximumLightDistance.reset(); + Settings::shaders().mLightFadeStart.reset(); + Settings::shaders().mMinimumInteriorBrightness.reset(); + Settings::shaders().mMaxLights.reset(); + Settings::shaders().mLightingMethod.reset(); - auto lightingMethod = SceneUtil::LightManager::getLightingMethodFromString( - Settings::Manager::mDefaultSettings[{ "Shaders", "lighting method" }]); - auto lightIndex = mLightingMethodButton->findItemIndexWith(lightingMethodToStr(lightingMethod)); + const SceneUtil::LightingMethod lightingMethod + = SceneUtil::LightManager::getLightingMethodFromString(Settings::shaders().mLightingMethod); + const std::size_t lightIndex = mLightingMethodButton->findItemIndexWith(lightingMethodToStr(lightingMethod)); mLightingMethodButton->setIndexSelected(lightIndex); updateMaxLightsComboBox(mMaxLights); 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<T>(name, category))) + , mValue(sanitize(Settings::Manager::get<T>(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<T>(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<const Sanitizer<T>> mSanitizer; + std::unique_ptr<const Sanitizer<T>> 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 <stdexcept> + 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 |