diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2024-03-20 22:40:01 -0500 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2024-04-12 15:54:18 -0500 |
| commit | e9fe0d3d5b81bcaffbbc00c132705adc03142c61 (patch) | |
| tree | db94b4b0466a8f52dcbf0f69918eceb4791e3f36 /Source/Core/InputCommon/ControllerEmu | |
| parent | 5039072ae9a97d7bf6f6711225a2368c71350f13 (diff) | |
NumericSetting: Stop values from binding to numbered input names.
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu')
| -rw-r--r-- | Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.cpp | 35 | ||||
| -rw-r--r-- | Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h | 9 |
2 files changed, 17 insertions, 27 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.cpp b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.cpp index ec28a4d6f6..f551e39b44 100644 --- a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.cpp +++ b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.cpp @@ -3,7 +3,7 @@ #include "InputCommon/ControllerEmu/Setting/NumericSetting.h" -#include <sstream> +#include <fmt/format.h> namespace ControllerEmu { @@ -11,6 +11,11 @@ NumericSettingBase::NumericSettingBase(const NumericSettingDetails& details) : m { } +// Explicit instantiations so generic definitions can exist outside of the header. +template class NumericSetting<int>; +template class NumericSetting<double>; +template class NumericSetting<bool>; + const char* NumericSettingBase::GetININame() const { return m_details.ini_name; @@ -36,28 +41,20 @@ SettingVisibility NumericSettingBase::GetVisibility() const return m_details.visibility; } -template <> -void NumericSetting<int>::SetExpressionFromValue() -{ - m_value.m_input.SetExpression(ValueToString(GetValue())); -} - -template <> -void NumericSetting<double>::SetExpressionFromValue() +template <typename T> +void NumericSetting<T>::SetExpressionFromValue() { - // We must use a dot decimal separator for expression parser. - std::ostringstream ss; - ss.imbue(std::locale::classic()); - ss << GetValue(); - - m_value.m_input.SetExpression(ss.str()); + // Always include -/+ sign to prevent CoalesceExpression binding. + // e.g. 1 is a valid input name for keyboard devices, +1 is not. + m_value.m_input.SetExpression(fmt::format("{:+g}", ControlState(GetValue()))); } -template <> -void NumericSetting<bool>::SetExpressionFromValue() +template <typename T> +void NumericSetting<T>::SimplifyIfPossible() { - // Cast bool to prevent "true"/"false" strings. - m_value.m_input.SetExpression(ValueToString(int(GetValue()))); + ValueType value; + if (TryParse(std::string(StripWhitespace(m_value.m_input.GetExpression())), &value)) + m_value.SetValue(value); } template <> diff --git a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h index 67d2fce1c7..b102b062e7 100644 --- a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h +++ b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h @@ -143,14 +143,7 @@ public: } bool IsSimpleValue() const override { return m_value.IsSimpleValue(); } - - void SimplifyIfPossible() override - { - ValueType value; - if (TryParse(m_value.m_input.GetExpression(), &value)) - m_value.SetValue(value); - } - + void SimplifyIfPossible() override; void SetExpressionFromValue() override; InputReference& GetInputReference() override { return m_value.m_input; } const InputReference& GetInputReference() const override { return m_value.m_input; } |
