summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerEmu
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2024-03-20 22:40:01 -0500
committerJordan Woyak <jordan.woyak@gmail.com>2024-04-12 15:54:18 -0500
commite9fe0d3d5b81bcaffbbc00c132705adc03142c61 (patch)
treedb94b4b0466a8f52dcbf0f69918eceb4791e3f36 /Source/Core/InputCommon/ControllerEmu
parent5039072ae9a97d7bf6f6711225a2368c71350f13 (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.cpp35
-rw-r--r--Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h9
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; }