summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpsi29a <psi29a@gmail.com>2023-04-23 09:45:38 +0000
committerpsi29a <psi29a@gmail.com>2023-04-23 09:45:38 +0000
commitebf6f50523eb492e03148f1539955b02abf967ea (patch)
tree162b56b6072d79484b2dcfbd9534fed5c401a212
parent44ed3bed2bf3da7eec1ba9d3c68fc894d2a1cfd2 (diff)
parent39e867781efe90760a2dfe4a84b20423420a97a1 (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.cpp25
-rw-r--r--components/settings/settings.cpp3
-rw-r--r--components/settings/settingvalue.hpp22
-rw-r--r--components/settings/values.cpp14
-rw-r--r--components/settings/values.hpp3
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