summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerEmu/ControlGroup
diff options
context:
space:
mode:
authorTilka <tilkax@gmail.com>2020-02-09 01:37:30 +0000
committerGitHub <noreply@github.com>2020-02-09 01:37:30 +0000
commit2e2540317e8752b8fe2e4d549a0b5c1ab1911041 (patch)
treec5997fb92fc14a5dbbc061a5b572da18d0877e86 /Source/Core/InputCommon/ControllerEmu/ControlGroup
parent7fe11c95782a305e1e03a401e54d819700b39805 (diff)
parent0a1634bedf17f7b27a3781d8e5ac6bafb20cd546 (diff)
Merge pull request #8417 from jordan-woyak/setting-expressions
InputCommon: Allow controller settings specified with input expresions.
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu/ControlGroup')
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp14
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.h8
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h4
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.cpp22
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp8
5 files changed, 40 insertions, 16 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp
index e104918fe2..6f980d8c60 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp
@@ -17,12 +17,22 @@ void Attachments::AddAttachment(std::unique_ptr<EmulatedController> att)
u32 Attachments::GetSelectedAttachment() const
{
- return m_selected_attachment;
+ const u32 value = m_selection_value.GetValue();
+
+ if (value < m_attachments.size())
+ return value;
+
+ return 0;
}
void Attachments::SetSelectedAttachment(u32 val)
{
- m_selected_attachment = val;
+ m_selection_setting.SetValue(val);
+}
+
+NumericSetting<int>& Attachments::GetSelectionSetting()
+{
+ return m_selection_setting;
}
const std::vector<std::unique_ptr<EmulatedController>>& Attachments::GetAttachmentList() const
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.h
index 81e76eccfe..f92bd8b1fd 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.h
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.h
@@ -12,6 +12,7 @@
#include "Common/CommonTypes.h"
#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h"
#include "InputCommon/ControllerEmu/ControllerEmu.h"
+#include "InputCommon/ControllerEmu/Setting/NumericSetting.h"
namespace ControllerEmu
{
@@ -27,11 +28,14 @@ public:
u32 GetSelectedAttachment() const;
void SetSelectedAttachment(u32 val);
+ NumericSetting<int>& GetSelectionSetting();
+
const std::vector<std::unique_ptr<EmulatedController>>& GetAttachmentList() const;
private:
- std::vector<std::unique_ptr<EmulatedController>> m_attachments;
+ SettingValue<int> m_selection_value;
+ NumericSetting<int> m_selection_setting = {&m_selection_value, {""}, 0, 0, 0};
- std::atomic<u32> m_selected_attachment = {};
+ std::vector<std::unique_ptr<EmulatedController>> m_attachments;
};
} // namespace ControllerEmu
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h
index c2311415e5..9560a37843 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h
@@ -24,13 +24,11 @@ public:
{
for (auto& control : controls)
{
- if (control->control_ref->State() > ACTIVATION_THRESHOLD)
+ if (control->control_ref->GetState<bool>())
*buttons |= *bitmasks;
bitmasks++;
}
}
-
- static constexpr ControlState ACTIVATION_THRESHOLD = 0.5;
};
} // namespace ControllerEmu
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.cpp
index 40ccae24f7..1a262a8dfd 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.cpp
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.cpp
@@ -74,15 +74,19 @@ void ControlGroup::LoadConfig(IniFile::Section* sec, const std::string& defdev,
ext->SetSelectedAttachment(0);
u32 n = 0;
- std::string extname;
- sec->Get(base + name, &extname, "");
+ std::string attachment_text;
+ sec->Get(base + name, &attachment_text, "");
+
+ // First assume attachment string is a valid expression.
+ // If it instead matches one of the names of our attachments it is overridden below.
+ ext->GetSelectionSetting().GetInputReference().SetExpression(attachment_text);
for (auto& ai : ext->GetAttachmentList())
{
ai->SetDefaultDevice(defdev);
ai->LoadConfig(sec, base + ai->GetName() + "/");
- if (ai->GetName() == extname)
+ if (ai->GetName() == attachment_text)
ext->SetSelectedAttachment(n);
n++;
@@ -114,8 +118,16 @@ void ControlGroup::SaveConfig(IniFile::Section* sec, const std::string& defdev,
if (type == GroupType::Attachments)
{
auto* const ext = static_cast<Attachments*>(this);
- sec->Set(base + name, ext->GetAttachmentList()[ext->GetSelectedAttachment()]->GetName(),
- "None");
+
+ if (ext->GetSelectionSetting().IsSimpleValue())
+ {
+ sec->Set(base + name, ext->GetAttachmentList()[ext->GetSelectedAttachment()]->GetName(),
+ "None");
+ }
+ else
+ {
+ sec->Set(base + name, ext->GetSelectionSetting().GetInputReference().GetExpression(), "None");
+ }
for (auto& ai : ext->GetAttachmentList())
ai->SaveConfig(sec, base + ai->GetName() + "/");
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp
index 908de81a96..a902034795 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp
@@ -35,19 +35,19 @@ void ModifySettingsButton::GetState()
{
for (size_t i = 0; i < controls.size(); ++i)
{
- ControlState state = controls[i]->control_ref->State();
+ const bool state = controls[i]->control_ref->GetState<bool>();
if (!associated_settings_toggle[i])
{
// not toggled
- associated_settings[i] = state > ACTIVATION_THRESHOLD;
+ associated_settings[i] = state;
}
else
{
// toggle (loading savestates does not en-/disable toggle)
// after we passed the threshold, we en-/disable. but after that, we don't change it
// anymore
- if (!threshold_exceeded[i] && state > ACTIVATION_THRESHOLD)
+ if (!threshold_exceeded[i] && state)
{
associated_settings[i] = !associated_settings[i];
@@ -59,7 +59,7 @@ void ModifySettingsButton::GetState()
threshold_exceeded[i] = true;
}
- if (state < ACTIVATION_THRESHOLD)
+ if (!state)
threshold_exceeded[i] = false;
}
}