summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/InputCommon')
-rw-r--r--Source/Core/InputCommon/ControllerEmu.cpp54
-rw-r--r--Source/Core/InputCommon/ControllerEmu.h95
2 files changed, 86 insertions, 63 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu.cpp b/Source/Core/InputCommon/ControllerEmu.cpp
index 54d25748ad..117184c8db 100644
--- a/Source/Core/InputCommon/ControllerEmu.cpp
+++ b/Source/Core/InputCommon/ControllerEmu.cpp
@@ -44,14 +44,18 @@ void ControllerEmu::ControlGroup::LoadConfig(IniFile::Section* sec, const std::s
std::string group(base + name + "/");
// settings
- for (auto& s : settings)
+ for (auto& s : numeric_settings)
{
- if (s->is_virtual)
+ if (s->m_type == SettingType::VIRTUAL)
continue;
- if (s->is_iterate)
+ sec->Get(group + s->m_name, &s->m_value, s->m_default_value * 100);
+ s->m_value /= 100;
+ }
+ for (auto& s : boolean_settings)
+ {
+ if (s->m_type == SettingType::VIRTUAL)
continue;
- sec->Get(group + s->name, &s->value, s->default_value * 100);
- s->value /= 100;
+ sec->Get(group + s->m_name, &s->m_value, s->m_default_value);
}
for (auto& c : controls)
@@ -105,14 +109,17 @@ void ControllerEmu::ControlGroup::SaveConfig(IniFile::Section* sec, const std::s
{
std::string group(base + name + "/");
- for (auto& s : settings)
+ for (auto& s : numeric_settings)
{
- if (s->is_virtual)
+ if (s->m_type == SettingType::VIRTUAL)
continue;
- if (s->is_iterate)
+ sec->Set(group + s->m_name, s->m_value * 100.0, s->m_default_value * 100.0);
+ }
+ for (auto& s : boolean_settings)
+ {
+ if (s->m_type == SettingType::VIRTUAL)
continue;
-
- sec->Set(group + s->name, s->value * 100.0, s->default_value * 100.0);
+ sec->Set(group + s->m_name, s->m_value, s->m_default_value);
}
for (auto& c : controls)
@@ -163,25 +170,26 @@ ControllerEmu::AnalogStick::AnalogStick(const char* const _name, const char* con
controls.emplace_back(std::make_unique<Input>(named_direction));
controls.emplace_back(std::make_unique<Input>(_trans("Modifier")));
- settings.emplace_back(std::make_unique<Setting>(_trans("Radius"), default_radius, 0, 100));
- settings.emplace_back(std::make_unique<Setting>(_trans("Dead Zone"), 0, 0, 50));
+ numeric_settings.emplace_back(
+ std::make_unique<NumericSetting>(_trans("Radius"), default_radius, 0, 100));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0, 0, 50));
}
ControllerEmu::Buttons::Buttons(const std::string& _name) : ControlGroup(_name, GROUP_TYPE_BUTTONS)
{
- settings.emplace_back(std::make_unique<Setting>(_trans("Threshold"), 0.5));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Threshold"), 0.5));
}
ControllerEmu::MixedTriggers::MixedTriggers(const std::string& _name)
: ControlGroup(_name, GROUP_TYPE_MIXED_TRIGGERS)
{
- settings.emplace_back(std::make_unique<Setting>(_trans("Threshold"), 0.9));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Threshold"), 0.9));
}
ControllerEmu::Triggers::Triggers(const std::string& _name)
: ControlGroup(_name, GROUP_TYPE_TRIGGERS)
{
- settings.emplace_back(std::make_unique<Setting>(_trans("Dead Zone"), 0, 0, 50));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0, 0, 50));
}
ControllerEmu::Slider::Slider(const std::string& _name) : ControlGroup(_name, GROUP_TYPE_SLIDER)
@@ -189,7 +197,7 @@ ControllerEmu::Slider::Slider(const std::string& _name) : ControlGroup(_name, GR
controls.emplace_back(std::make_unique<Input>("Left"));
controls.emplace_back(std::make_unique<Input>("Right"));
- settings.emplace_back(std::make_unique<Setting>(_trans("Dead Zone"), 0, 0, 50));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0, 0, 50));
}
ControllerEmu::Force::Force(const std::string& _name) : ControlGroup(_name, GROUP_TYPE_FORCE)
@@ -203,7 +211,7 @@ ControllerEmu::Force::Force(const std::string& _name) : ControlGroup(_name, GROU
controls.emplace_back(std::make_unique<Input>(_trans("Forward")));
controls.emplace_back(std::make_unique<Input>(_trans("Backward")));
- settings.emplace_back(std::make_unique<Setting>(_trans("Dead Zone"), 0, 0, 50));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0, 0, 50));
}
ControllerEmu::Tilt::Tilt(const std::string& _name) : ControlGroup(_name, GROUP_TYPE_TILT)
@@ -217,9 +225,9 @@ ControllerEmu::Tilt::Tilt(const std::string& _name) : ControlGroup(_name, GROUP_
controls.emplace_back(std::make_unique<Input>(_trans("Modifier")));
- settings.emplace_back(std::make_unique<Setting>(_trans("Dead Zone"), 0, 0, 50));
- settings.emplace_back(std::make_unique<Setting>(_trans("Circle Stick"), 0));
- settings.emplace_back(std::make_unique<Setting>(_trans("Angle"), 0.9, 0, 180));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0, 0, 50));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Circle Stick"), 0));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Angle"), 0.9, 0, 180));
}
ControllerEmu::Cursor::Cursor(const std::string& _name)
@@ -231,9 +239,9 @@ ControllerEmu::Cursor::Cursor(const std::string& _name)
controls.emplace_back(std::make_unique<Input>("Backward"));
controls.emplace_back(std::make_unique<Input>(_trans("Hide")));
- settings.emplace_back(std::make_unique<Setting>(_trans("Center"), 0.5));
- settings.emplace_back(std::make_unique<Setting>(_trans("Width"), 0.5));
- settings.emplace_back(std::make_unique<Setting>(_trans("Height"), 0.5));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Center"), 0.5));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Width"), 0.5));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Height"), 0.5));
}
void ControllerEmu::LoadDefaults(const ControllerInterface& ciface)
diff --git a/Source/Core/InputCommon/ControllerEmu.h b/Source/Core/InputCommon/ControllerEmu.h
index 56e469ee8e..fd5f499159 100644
--- a/Source/Core/InputCommon/ControllerEmu.h
+++ b/Source/Core/InputCommon/ControllerEmu.h
@@ -71,48 +71,62 @@ public:
Output(const std::string& _name) : Control(new ControllerInterface::OutputReference, _name) {}
};
- class Setting
+ enum class SettingType
+ {
+ NORMAL, // normal settings are saved to configuration files
+ VIRTUAL, // virtual settings are not saved at all
+ };
+
+ class NumericSetting
{
public:
- Setting(const std::string& _name, const ControlState def_value, const unsigned int _low = 0,
- const unsigned int _high = 100)
- : name(_name), value(def_value), default_value(def_value), low(_low), high(_high),
- is_virtual(false), is_iterate(false)
+ NumericSetting(const std::string& name, const ControlState default_value,
+ const unsigned int low = 0, const unsigned int high = 100,
+ const SettingType type = SettingType::NORMAL)
+ : m_type(type), m_name(name), m_default_value(default_value), m_low(low), m_high(high)
{
}
- virtual ~Setting() {}
- const std::string name;
- ControlState value;
- const ControlState default_value;
- const unsigned int low, high;
- bool is_virtual;
- bool is_iterate;
-
- virtual void SetValue(ControlState new_value) { value = new_value; }
- virtual ControlState GetValue() { return value; }
+ ControlState GetValue() const { return m_value; }
+ void SetValue(ControlState value) { m_value = value; }
+ const SettingType m_type;
+ const std::string m_name;
+ const ControlState m_default_value;
+ const unsigned int m_low, m_high;
+ ControlState m_value;
};
- class BackgroundInputSetting : public Setting
+ class BooleanSetting
{
public:
- BackgroundInputSetting(const std::string& _name) : Setting(_name, false)
- {
- is_virtual = true;
- }
-
- void SetValue(ControlState new_value) override
+ BooleanSetting(const std::string& name, const bool default_value,
+ const SettingType type = SettingType::NORMAL)
+ : m_type(type), m_name(name), m_default_value(default_value)
{
- SConfig::GetInstance().m_BackgroundInput = !!new_value;
}
- ControlState GetValue() override { return SConfig::GetInstance().m_BackgroundInput; }
+ virtual bool GetValue() const { return m_value; }
+ virtual void SetValue(bool value) { m_value = value; }
+ const SettingType m_type;
+ const std::string m_name;
+ const bool m_default_value;
+ bool m_value;
};
- class IterateUI : public Setting
+ class BackgroundInputSetting : public BooleanSetting
{
public:
- IterateUI(const std::string& _name) : Setting(_name, false) { is_iterate = true; }
+ BackgroundInputSetting(const std::string& name)
+ : BooleanSetting(name, false, SettingType::VIRTUAL)
+ {
+ }
+
+ bool GetValue() const override { return SConfig::GetInstance().m_BackgroundInput; }
+ void SetValue(bool value) override
+ {
+ m_value = value;
+ SConfig::GetInstance().m_BackgroundInput = value;
+ }
};
ControlGroup(const std::string& _name, const unsigned int _type = GROUP_TYPE_OTHER)
@@ -137,7 +151,8 @@ public:
const unsigned int type;
std::vector<std::unique_ptr<Control>> controls;
- std::vector<std::unique_ptr<Setting>> settings;
+ std::vector<std::unique_ptr<NumericSetting>> numeric_settings;
+ std::vector<std::unique_ptr<BooleanSetting>> boolean_settings;
};
class AnalogStick : public ControlGroup
@@ -152,8 +167,8 @@ public:
ControlState yy = controls[0]->control_ref->State() - controls[1]->control_ref->State();
ControlState xx = controls[3]->control_ref->State() - controls[2]->control_ref->State();
- ControlState radius = settings[SETTING_RADIUS]->value;
- ControlState deadzone = settings[SETTING_DEADZONE]->value;
+ ControlState radius = numeric_settings[SETTING_RADIUS]->GetValue();
+ ControlState deadzone = numeric_settings[SETTING_DEADZONE]->GetValue();
ControlState m = controls[4]->control_ref->State();
ControlState ang = atan2(yy, xx);
@@ -192,7 +207,7 @@ public:
{
for (auto& control : controls)
{
- if (control->control_ref->State() > settings[0]->value) // threshold
+ if (control->control_ref->State() > numeric_settings[0]->GetValue()) // threshold
*buttons |= *bitmasks;
bitmasks++;
@@ -210,7 +225,7 @@ public:
const unsigned int trig_count = ((unsigned int)(controls.size() / 2));
for (unsigned int i = 0; i < trig_count; ++i, ++bitmasks, ++analog)
{
- if (controls[i]->control_ref->State() > settings[0]->value) // threshold
+ if (controls[i]->control_ref->State() > numeric_settings[0]->GetValue()) // threshold
{
*analog = 1.0;
*digital |= *bitmasks;
@@ -231,7 +246,7 @@ public:
void GetState(ControlState* analog)
{
const unsigned int trig_count = ((unsigned int)(controls.size()));
- const ControlState deadzone = settings[0]->value;
+ const ControlState deadzone = numeric_settings[0]->GetValue();
for (unsigned int i = 0; i < trig_count; ++i, ++analog)
*analog = std::max(controls[i]->control_ref->State() - deadzone, 0.0) / (1 - deadzone);
}
@@ -244,7 +259,7 @@ public:
void GetState(ControlState* const slider)
{
- const ControlState deadzone = settings[0]->value;
+ const ControlState deadzone = numeric_settings[0]->GetValue();
const ControlState state =
controls[1]->control_ref->State() - controls[0]->control_ref->State();
@@ -262,7 +277,7 @@ public:
void GetState(ControlState* axis)
{
- const ControlState deadzone = settings[0]->value;
+ const ControlState deadzone = numeric_settings[0]->GetValue();
for (unsigned int i = 0; i < 6; i += 2)
{
ControlState tmpf = 0;
@@ -293,9 +308,9 @@ public:
ControlState yy = controls[0]->control_ref->State() - controls[1]->control_ref->State();
ControlState xx = controls[3]->control_ref->State() - controls[2]->control_ref->State();
- ControlState deadzone = settings[0]->value;
- ControlState circle = settings[1]->value;
- auto const angle = settings[2]->value / 1.8;
+ ControlState deadzone = numeric_settings[0]->GetValue();
+ ControlState circle = numeric_settings[1]->GetValue();
+ auto const angle = numeric_settings[2]->GetValue() / 1.8;
ControlState m = controls[4]->control_ref->State();
// deadzone / circle stick code
@@ -386,9 +401,9 @@ public:
// adjust cursor according to settings
if (adjusted)
{
- xx *= (settings[1]->value * 2);
- yy *= (settings[2]->value * 2);
- yy += (settings[0]->value - 0.5);
+ xx *= (numeric_settings[1]->GetValue() * 2);
+ yy *= (numeric_settings[2]->GetValue() * 2);
+ yy += (numeric_settings[0]->GetValue() - 0.5);
}
*x = xx;