diff options
| author | JMC47 <JMC4789@gmail.com> | 2019-04-09 19:30:26 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-04-09 19:30:26 -0400 |
| commit | e10a472134fdf557ec35505eb5fb7c74ba9f2af7 (patch) | |
| tree | 9593eb71abc3f724159693d46eb8504ede9529f0 /Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h | |
| parent | 0b8ac0a22f2fcebb7cbd00bbb36fd0c89191d34a (diff) | |
| parent | 5efb717873691fa42447ca0d9d9810b5ad501b42 (diff) | |
Merge pull request #7936 from jordan-woyak/numeric-setting-cleanup
InputCommon: Clean up how numeric settings are handled.
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h')
| -rw-r--r-- | Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h | 126 |
1 files changed, 112 insertions, 14 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h index 2e84d383ba..ccc46634ed 100644 --- a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h +++ b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h @@ -4,29 +4,127 @@ #pragma once +#include <atomic> #include <string> #include "Common/CommonTypes.h" -#include "InputCommon/ControllerEmu/Setting/Setting.h" +#include "Common/IniFile.h" #include "InputCommon/ControllerInterface/Device.h" namespace ControllerEmu { -class NumericSetting +enum class SettingType +{ + Double, + Bool, +}; + +struct NumericSettingDetails +{ + NumericSettingDetails(const char* const _ini_name, const char* const _ui_suffix = nullptr, + const char* const _ui_description = nullptr, + const char* const _ui_name = nullptr) + : ini_name(_ini_name), ui_suffix(_ui_suffix), ui_description(_ui_description), + ui_name(_ui_name ? _ui_name : _ini_name) + { + } + + // The name used in ini files. + const char* const ini_name; + + // A string applied to the number in the UI (unit of measure). + const char* const ui_suffix; + + // Detailed description of the setting. + const char* const ui_description; + + // The name used in the UI (if different from ini file). + const char* const ui_name; +}; + +class NumericSettingBase { public: - NumericSetting(const std::string& setting_name, const ControlState default_value, - const u32 low = 0, const u32 high = 100, - const SettingType setting_type = SettingType::NORMAL); - - ControlState GetValue() const; - void SetValue(ControlState value); - const SettingType m_type; - const std::string m_name; - const ControlState m_default_value; - const u32 m_low; - const u32 m_high; - ControlState m_value; + NumericSettingBase(const NumericSettingDetails& details); + + virtual ~NumericSettingBase() = default; + + virtual void LoadFromIni(const IniFile::Section& section, const std::string& group_name) = 0; + virtual void SaveToIni(IniFile::Section& section, const std::string& group_name) const = 0; + + virtual SettingType GetType() const = 0; + + const char* GetUIName() const; + const char* GetUISuffix() const; + const char* GetUIDescription() const; + +protected: + NumericSettingDetails m_details; +}; + +template <typename T> +class SettingValue; + +template <typename T> +class NumericSetting : public NumericSettingBase +{ +public: + using ValueType = T; + + static_assert(std::is_same<ValueType, double>() || std::is_same<ValueType, bool>(), + "NumericSetting is only implemented for double and bool."); + + NumericSetting(SettingValue<ValueType>* value, const NumericSettingDetails& details, + ValueType default_value, ValueType min_value, ValueType max_value) + : NumericSettingBase(details), m_value(*value), m_default_value(default_value), + m_min_value(min_value), m_max_value(max_value) + { + } + + void LoadFromIni(const IniFile::Section& section, const std::string& group_name) override + { + ValueType value; + section.Get(group_name + m_details.ini_name, &value, m_default_value); + SetValue(value); + } + + void SaveToIni(IniFile::Section& section, const std::string& group_name) const override + { + section.Set(group_name + m_details.ini_name, GetValue(), m_default_value); + } + + ValueType GetValue() const { return m_value.GetValue(); } + void SetValue(ValueType value) { m_value.SetValue(value); } + + ValueType GetDefaultValue() const { return m_default_value; } + ValueType GetMinValue() const { return m_min_value; } + ValueType GetMaxValue() const { return m_max_value; } + + SettingType GetType() const override; + +private: + SettingValue<ValueType>& m_value; + + const ValueType m_default_value; + const ValueType m_min_value; + const ValueType m_max_value; +}; + +template <typename T> +class SettingValue +{ + using ValueType = T; + + friend class NumericSetting<T>; + +public: + ValueType GetValue() const { return m_value; } + +private: + void SetValue(ValueType value) { m_value = value; } + + // Values are R/W by both UI and CPU threads. + std::atomic<ValueType> m_value; }; } // namespace ControllerEmu |
