PAD: Move input-related stuff out

This commit is contained in:
Connor McLaughlin 2022-11-27 18:27:17 +10:00 committed by refractionpcsx2
parent 256f7b9b0f
commit 59e10bcac6
8 changed files with 233 additions and 227 deletions

View File

@ -329,8 +329,8 @@ ControllerMacroEditWidget::ControllerMacroEditWidget(ControllerMacroWidget* pare
// populate list view // populate list view
for (u32 i = 0; i < cinfo->num_bindings; i++) for (u32 i = 0; i < cinfo->num_bindings; i++)
{ {
const PAD::ControllerBindingInfo& bi = cinfo->bindings[i]; const InputBindingInfo& bi = cinfo->bindings[i];
if (bi.type == PAD::ControllerBindingType::Motor) if (bi.type == InputBindingInfo::Type::Motor)
continue; continue;
QListWidgetItem* item = new QListWidgetItem(); QListWidgetItem* item = new QListWidgetItem();
@ -356,7 +356,7 @@ ControllerMacroEditWidget::~ControllerMacroEditWidget() = default;
QString ControllerMacroEditWidget::getSummary() const QString ControllerMacroEditWidget::getSummary() const
{ {
QString str; QString str;
for (const PAD::ControllerBindingInfo* bi : m_binds) for (const InputBindingInfo* bi : m_binds)
{ {
if (!str.isEmpty()) if (!str.isEmpty())
str += static_cast<QChar>('/'); str += static_cast<QChar>('/');
@ -409,11 +409,11 @@ void ControllerMacroEditWidget::updateBinds()
if (!cinfo) if (!cinfo)
return; return;
std::vector<const PAD::ControllerBindingInfo*> new_binds; std::vector<const InputBindingInfo*> new_binds;
for (u32 i = 0, bind_index = 0; i < cinfo->num_bindings; i++) for (u32 i = 0, bind_index = 0; i < cinfo->num_bindings; i++)
{ {
const PAD::ControllerBindingInfo& bi = cinfo->bindings[i]; const InputBindingInfo& bi = cinfo->bindings[i];
if (bi.type == PAD::ControllerBindingType::Motor) if (bi.type == InputBindingInfo::Type::Motor)
continue; continue;
const QListWidgetItem* item = m_ui.bindList->item(static_cast<int>(bind_index)); const QListWidgetItem* item = m_ui.bindList->item(static_cast<int>(bind_index));
@ -434,7 +434,7 @@ void ControllerMacroEditWidget::updateBinds()
m_binds = std::move(new_binds); m_binds = std::move(new_binds);
std::string binds_string; std::string binds_string;
for (const PAD::ControllerBindingInfo* bi : m_binds) for (const InputBindingInfo* bi : m_binds)
{ {
if (!binds_string.empty()) if (!binds_string.empty())
binds_string.append(" & "); binds_string.append(" & ");
@ -490,12 +490,12 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
for (u32 i = 0; i < cinfo->num_settings; i++) for (u32 i = 0; i < cinfo->num_settings; i++)
{ {
const PAD::ControllerSettingInfo& si = cinfo->settings[i]; const SettingInfo& si = cinfo->settings[i];
std::string key_name = si.name; std::string key_name = si.name;
switch (si.type) switch (si.type)
{ {
case PAD::ControllerSettingInfo::Type::Boolean: case SettingInfo::Type::Boolean:
{ {
QCheckBox* cb = new QCheckBox(qApp->translate(cinfo->name, si.display_name), widget_parent); QCheckBox* cb = new QCheckBox(qApp->translate(cinfo->name, si.display_name), widget_parent);
cb->setObjectName(QString::fromUtf8(si.name)); cb->setObjectName(QString::fromUtf8(si.name));
@ -506,7 +506,7 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
} }
break; break;
case PAD::ControllerSettingInfo::Type::Integer: case SettingInfo::Type::Integer:
{ {
QSpinBox* sb = new QSpinBox(widget_parent); QSpinBox* sb = new QSpinBox(widget_parent);
sb->setObjectName(QString::fromUtf8(si.name)); sb->setObjectName(QString::fromUtf8(si.name));
@ -520,7 +520,7 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
} }
break; break;
case PAD::ControllerSettingInfo::Type::IntegerList: case SettingInfo::Type::IntegerList:
{ {
QComboBox* cb = new QComboBox(widget_parent); QComboBox* cb = new QComboBox(widget_parent);
cb->setObjectName(QString::fromUtf8(si.name)); cb->setObjectName(QString::fromUtf8(si.name));
@ -533,7 +533,7 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
} }
break; break;
case PAD::ControllerSettingInfo::Type::Float: case SettingInfo::Type::Float:
{ {
QDoubleSpinBox* sb = new QDoubleSpinBox(widget_parent); QDoubleSpinBox* sb = new QDoubleSpinBox(widget_parent);
sb->setObjectName(QString::fromUtf8(si.name)); sb->setObjectName(QString::fromUtf8(si.name));
@ -547,7 +547,7 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
} }
break; break;
case PAD::ControllerSettingInfo::Type::String: case SettingInfo::Type::String:
{ {
QLineEdit* le = new QLineEdit(widget_parent); QLineEdit* le = new QLineEdit(widget_parent);
le->setObjectName(QString::fromUtf8(si.name)); le->setObjectName(QString::fromUtf8(si.name));
@ -558,7 +558,7 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
} }
break; break;
case PAD::ControllerSettingInfo::Type::Path: case SettingInfo::Type::Path:
{ {
QLineEdit* le = new QLineEdit(widget_parent); QLineEdit* le = new QLineEdit(widget_parent);
le->setObjectName(QString::fromUtf8(si.name)); le->setObjectName(QString::fromUtf8(si.name));
@ -597,12 +597,12 @@ void ControllerCustomSettingsWidget::restoreDefaults()
for (u32 i = 0; i < cinfo->num_settings; i++) for (u32 i = 0; i < cinfo->num_settings; i++)
{ {
const PAD::ControllerSettingInfo& si = cinfo->settings[i]; const SettingInfo& si = cinfo->settings[i];
const QString key(QString::fromStdString(si.name)); const QString key(QString::fromStdString(si.name));
switch (si.type) switch (si.type)
{ {
case PAD::ControllerSettingInfo::Type::Boolean: case SettingInfo::Type::Boolean:
{ {
QCheckBox* widget = findChild<QCheckBox*>(QString::fromStdString(si.name)); QCheckBox* widget = findChild<QCheckBox*>(QString::fromStdString(si.name));
if (widget) if (widget)
@ -610,7 +610,7 @@ void ControllerCustomSettingsWidget::restoreDefaults()
} }
break; break;
case PAD::ControllerSettingInfo::Type::Integer: case SettingInfo::Type::Integer:
{ {
QSpinBox* widget = findChild<QSpinBox*>(QString::fromStdString(si.name)); QSpinBox* widget = findChild<QSpinBox*>(QString::fromStdString(si.name));
if (widget) if (widget)
@ -618,7 +618,7 @@ void ControllerCustomSettingsWidget::restoreDefaults()
} }
break; break;
case PAD::ControllerSettingInfo::Type::IntegerList: case SettingInfo::Type::IntegerList:
{ {
QComboBox* widget = findChild<QComboBox*>(QString::fromStdString(si.name)); QComboBox* widget = findChild<QComboBox*>(QString::fromStdString(si.name));
if (widget) if (widget)
@ -626,7 +626,7 @@ void ControllerCustomSettingsWidget::restoreDefaults()
} }
break; break;
case PAD::ControllerSettingInfo::Type::Float: case SettingInfo::Type::Float:
{ {
QDoubleSpinBox* widget = findChild<QDoubleSpinBox*>(QString::fromStdString(si.name)); QDoubleSpinBox* widget = findChild<QDoubleSpinBox*>(QString::fromStdString(si.name));
if (widget) if (widget)
@ -634,7 +634,7 @@ void ControllerCustomSettingsWidget::restoreDefaults()
} }
break; break;
case PAD::ControllerSettingInfo::Type::String: case SettingInfo::Type::String:
{ {
QLineEdit* widget = findChild<QLineEdit*>(QString::fromStdString(si.name)); QLineEdit* widget = findChild<QLineEdit*>(QString::fromStdString(si.name));
if (widget) if (widget)
@ -642,7 +642,7 @@ void ControllerCustomSettingsWidget::restoreDefaults()
} }
break; break;
case PAD::ControllerSettingInfo::Type::Path: case SettingInfo::Type::Path:
{ {
QLineEdit* widget = findChild<QLineEdit*>(QString::fromStdString(si.name)); QLineEdit* widget = findChild<QLineEdit*>(QString::fromStdString(si.name));
if (widget) if (widget)

View File

@ -122,7 +122,7 @@ private:
ControllerBindingWidget* m_bwidget; ControllerBindingWidget* m_bwidget;
u32 m_index; u32 m_index;
std::vector<const PAD::ControllerBindingInfo*> m_binds; std::vector<const InputBindingInfo*> m_binds;
u32 m_frequency = 0; u32 m_frequency = 0;
}; };

View File

@ -25,6 +25,64 @@ class SettingsWrapper;
enum class CDVD_SourceType : uint8_t; enum class CDVD_SourceType : uint8_t;
/// Generic setting information which can be reused in multiple components.
struct SettingInfo
{
enum class Type
{
Boolean,
Integer,
IntegerList,
Float,
String,
StringList,
Path,
};
Type type;
const char* name;
const char* display_name;
const char* description;
const char* default_value;
const char* min_value;
const char* max_value;
const char* step_value;
const char* format;
const char** options;
float multiplier;
const char* StringDefaultValue() const;
bool BooleanDefaultValue() const;
s32 IntegerDefaultValue() const;
s32 IntegerMinValue() const;
s32 IntegerMaxValue() const;
s32 IntegerStepValue() const;
float FloatDefaultValue() const;
float FloatMinValue() const;
float FloatMaxValue() const;
float FloatStepValue() const;
};
enum class GenericInputBinding : u8;
struct InputBindingInfo
{
enum class Type : u8
{
Unknown,
Button,
Axis,
HalfAxis,
Motor,
Macro
};
const char* name;
const char* display_name;
Type type;
GenericInputBinding generic_mapping;
};
enum GamefixId enum GamefixId
{ {
GamefixId_FIRST = 0, GamefixId_FIRST = 0,

View File

@ -350,10 +350,10 @@ namespace FullscreenUI
static void DrawClampingModeSetting(SettingsInterface* bsi, const char* title, const char* summary, bool vu); static void DrawClampingModeSetting(SettingsInterface* bsi, const char* title, const char* summary, bool vu);
static void PopulateGraphicsAdapterList(); static void PopulateGraphicsAdapterList();
static void PopulateGameListDirectoryCache(SettingsInterface* si); static void PopulateGameListDirectoryCache(SettingsInterface* si);
static void BeginInputBinding(SettingsInterface* bsi, PAD::ControllerBindingType type, const std::string_view& section, static void BeginInputBinding(SettingsInterface* bsi, InputBindingInfo::Type type, const std::string_view& section,
const std::string_view& key, const std::string_view& display_name); const std::string_view& key, const std::string_view& display_name);
static void DrawInputBindingWindow(); static void DrawInputBindingWindow();
static void DrawInputBindingButton(SettingsInterface* bsi, PAD::ControllerBindingType type, const char* section, const char* name, static void DrawInputBindingButton(SettingsInterface* bsi, InputBindingInfo::Type type, const char* section, const char* name,
const char* display_name, bool show_type = true); const char* display_name, bool show_type = true);
static void ClearInputBindingVariables(); static void ClearInputBindingVariables();
static void StartAutomaticBinding(u32 port); static void StartAutomaticBinding(u32 port);
@ -367,7 +367,7 @@ namespace FullscreenUI
static std::vector<const HotkeyInfo*> s_hotkey_list_cache; static std::vector<const HotkeyInfo*> s_hotkey_list_cache;
static std::atomic_bool s_settings_changed{false}; static std::atomic_bool s_settings_changed{false};
static std::atomic_bool s_game_settings_changed{false}; static std::atomic_bool s_game_settings_changed{false};
static PAD::ControllerBindingType s_input_binding_type = PAD::ControllerBindingType::Unknown; static InputBindingInfo::Type s_input_binding_type = InputBindingInfo::Type::Unknown;
static std::string s_input_binding_section; static std::string s_input_binding_section;
static std::string s_input_binding_key; static std::string s_input_binding_key;
static std::string s_input_binding_display_name; static std::string s_input_binding_display_name;
@ -806,7 +806,7 @@ void FullscreenUI::Render()
if (s_about_window_open) if (s_about_window_open)
DrawAboutWindow(); DrawAboutWindow();
if (s_input_binding_type != PAD::ControllerBindingType::Unknown) if (s_input_binding_type != InputBindingInfo::Type::Unknown)
DrawInputBindingWindow(); DrawInputBindingWindow();
ImGuiFullscreen::EndLayout(); ImGuiFullscreen::EndLayout();
@ -1199,8 +1199,8 @@ s32 FullscreenUI::GetEffectiveIntSetting(SettingsInterface* bsi, const char* sec
return Host::Internal::GetBaseSettingsLayer()->GetIntValue(section, key, default_value); return Host::Internal::GetBaseSettingsLayer()->GetIntValue(section, key, default_value);
} }
void FullscreenUI::DrawInputBindingButton(SettingsInterface* bsi, PAD::ControllerBindingType type, const char* section, const char* name, void FullscreenUI::DrawInputBindingButton(
const char* display_name, bool show_type) SettingsInterface* bsi, InputBindingInfo::Type type, const char* section, const char* name, const char* display_name, bool show_type)
{ {
std::string title(fmt::format("{}/{}", section, name)); std::string title(fmt::format("{}/{}", section, name));
@ -1218,17 +1218,17 @@ void FullscreenUI::DrawInputBindingButton(SettingsInterface* bsi, PAD::Controlle
{ {
switch (type) switch (type)
{ {
case PAD::ControllerBindingType::Button: case InputBindingInfo::Type::Button:
title = fmt::format(ICON_FA_DOT_CIRCLE " {}", display_name); title = fmt::format(ICON_FA_DOT_CIRCLE " {}", display_name);
break; break;
case PAD::ControllerBindingType::Axis: case InputBindingInfo::Type::Axis:
case PAD::ControllerBindingType::HalfAxis: case InputBindingInfo::Type::HalfAxis:
title = fmt::format(ICON_FA_BULLSEYE " {}", display_name); title = fmt::format(ICON_FA_BULLSEYE " {}", display_name);
break; break;
case PAD::ControllerBindingType::Motor: case InputBindingInfo::Type::Motor:
title = fmt::format(ICON_FA_BELL " {}", display_name); title = fmt::format(ICON_FA_BELL " {}", display_name);
break; break;
case PAD::ControllerBindingType::Macro: case InputBindingInfo::Type::Macro:
title = fmt::format(ICON_FA_PIZZA_SLICE " {}", display_name); title = fmt::format(ICON_FA_PIZZA_SLICE " {}", display_name);
break; break;
default: default:
@ -1261,17 +1261,17 @@ void FullscreenUI::DrawInputBindingButton(SettingsInterface* bsi, PAD::Controlle
void FullscreenUI::ClearInputBindingVariables() void FullscreenUI::ClearInputBindingVariables()
{ {
s_input_binding_type = PAD::ControllerBindingType::Unknown; s_input_binding_type = InputBindingInfo::Type::Unknown;
s_input_binding_section = {}; s_input_binding_section = {};
s_input_binding_key = {}; s_input_binding_key = {};
s_input_binding_display_name = {}; s_input_binding_display_name = {};
s_input_binding_new_bindings = {}; s_input_binding_new_bindings = {};
} }
void FullscreenUI::BeginInputBinding(SettingsInterface* bsi, PAD::ControllerBindingType type, const std::string_view& section, void FullscreenUI::BeginInputBinding(SettingsInterface* bsi, InputBindingInfo::Type type, const std::string_view& section,
const std::string_view& key, const std::string_view& display_name) const std::string_view& key, const std::string_view& display_name)
{ {
if (s_input_binding_type != PAD::ControllerBindingType::Unknown) if (s_input_binding_type != InputBindingInfo::Type::Unknown)
{ {
InputManager::RemoveHook(); InputManager::RemoveHook();
ClearInputBindingVariables(); ClearInputBindingVariables();
@ -1327,7 +1327,7 @@ void FullscreenUI::BeginInputBinding(SettingsInterface* bsi, PAD::ControllerBind
void FullscreenUI::DrawInputBindingWindow() void FullscreenUI::DrawInputBindingWindow()
{ {
pxAssert(s_input_binding_type != PAD::ControllerBindingType::Unknown); pxAssert(s_input_binding_type != InputBindingInfo::Type::Unknown);
const double time_remaining = INPUT_BINDING_TIMEOUT_SECONDS - s_input_binding_timer.GetTimeSeconds(); const double time_remaining = INPUT_BINDING_TIMEOUT_SECONDS - s_input_binding_timer.GetTimeSeconds();
if (time_remaining <= 0.0) if (time_remaining <= 0.0)
@ -3586,7 +3586,7 @@ void FullscreenUI::DrawControllerSettingsPage()
for (u32 i = 0; i < ci->num_bindings; i++) for (u32 i = 0; i < ci->num_bindings; i++)
{ {
const PAD::ControllerBindingInfo& bi = ci->bindings[i]; const InputBindingInfo& bi = ci->bindings[i];
DrawInputBindingButton(bsi, bi.type, section, bi.name, bi.display_name, true); DrawInputBindingButton(bsi, bi.type, section, bi.name, bi.display_name, true);
} }
@ -3597,7 +3597,7 @@ void FullscreenUI::DrawControllerSettingsPage()
for (u32 macro_index = 0; macro_index < PAD::NUM_MACRO_BUTTONS_PER_CONTROLLER; macro_index++) for (u32 macro_index = 0; macro_index < PAD::NUM_MACRO_BUTTONS_PER_CONTROLLER; macro_index++)
{ {
DrawInputBindingButton(bsi, PAD::ControllerBindingType::Macro, section, fmt::format("Macro{}", macro_index + 1).c_str(), DrawInputBindingButton(bsi, InputBindingInfo::Type::Macro, section, fmt::format("Macro{}", macro_index + 1).c_str(),
fmt::format("Macro {} Trigger", macro_index + 1).c_str()); fmt::format("Macro {} Trigger", macro_index + 1).c_str());
std::string binds_string(bsi->GetStringValue(section, fmt::format("Macro{}Binds", macro_index + 1).c_str())); std::string binds_string(bsi->GetStringValue(section, fmt::format("Macro{}Binds", macro_index + 1).c_str()));
@ -3608,9 +3608,9 @@ void FullscreenUI::DrawControllerSettingsPage()
ImGuiFullscreen::ChoiceDialogOptions options; ImGuiFullscreen::ChoiceDialogOptions options;
for (u32 i = 0; i < ci->num_bindings; i++) for (u32 i = 0; i < ci->num_bindings; i++)
{ {
const PAD::ControllerBindingInfo& bi = ci->bindings[i]; const InputBindingInfo& bi = ci->bindings[i];
if (bi.type != PAD::ControllerBindingType::Button && bi.type != PAD::ControllerBindingType::Axis && if (bi.type != InputBindingInfo::Type::Button && bi.type != InputBindingInfo::Type::Axis &&
bi.type != PAD::ControllerBindingType::HalfAxis) bi.type != InputBindingInfo::Type::HalfAxis)
{ {
continue; continue;
} }
@ -3624,7 +3624,7 @@ void FullscreenUI::DrawControllerSettingsPage()
std::string_view to_modify; std::string_view to_modify;
for (u32 j = 0; j < ci->num_bindings; j++) for (u32 j = 0; j < ci->num_bindings; j++)
{ {
const PAD::ControllerBindingInfo& bi = ci->bindings[j]; const InputBindingInfo& bi = ci->bindings[j];
if (bi.display_name == title) if (bi.display_name == title)
{ {
to_modify = bi.name; to_modify = bi.name;
@ -3714,22 +3714,22 @@ void FullscreenUI::DrawControllerSettingsPage()
for (u32 i = 0; i < ci->num_settings; i++) for (u32 i = 0; i < ci->num_settings; i++)
{ {
const PAD::ControllerSettingInfo& si = ci->settings[i]; const SettingInfo& si = ci->settings[i];
std::string title(fmt::format(ICON_FA_COG " {}", si.display_name)); std::string title(fmt::format(ICON_FA_COG " {}", si.display_name));
switch (si.type) switch (si.type)
{ {
case PAD::ControllerSettingInfo::Type::Boolean: case SettingInfo::Type::Boolean:
DrawToggleSetting(bsi, title.c_str(), si.description, section, si.name, si.BooleanDefaultValue(), true, false); DrawToggleSetting(bsi, title.c_str(), si.description, section, si.name, si.BooleanDefaultValue(), true, false);
break; break;
case PAD::ControllerSettingInfo::Type::Integer: case SettingInfo::Type::Integer:
DrawIntRangeSetting(bsi, title.c_str(), si.description, section, si.name, si.IntegerDefaultValue(), DrawIntRangeSetting(bsi, title.c_str(), si.description, section, si.name, si.IntegerDefaultValue(),
si.IntegerMinValue(), si.IntegerMaxValue(), si.format, true); si.IntegerMinValue(), si.IntegerMaxValue(), si.format, true);
break; break;
case PAD::ControllerSettingInfo::Type::IntegerList: case SettingInfo::Type::IntegerList:
DrawIntListSetting(bsi, title.c_str(), si.description, section, si.name, si.IntegerDefaultValue(), si.options, 0, DrawIntListSetting(bsi, title.c_str(), si.description, section, si.name, si.IntegerDefaultValue(), si.options, 0,
si.IntegerMinValue(), true); si.IntegerMinValue(), true);
break; break;
case PAD::ControllerSettingInfo::Type::Float: case SettingInfo::Type::Float:
DrawFloatSpinBoxSetting(bsi, title.c_str(), si.description, section, si.name, si.FloatDefaultValue(), DrawFloatSpinBoxSetting(bsi, title.c_str(), si.description, section, si.name, si.FloatDefaultValue(),
si.FloatMinValue(), si.FloatMaxValue(), si.FloatStepValue(), si.multiplier, si.format, true); si.FloatMinValue(), si.FloatMaxValue(), si.FloatStepValue(), si.multiplier, si.format, true);
break; break;
@ -3760,7 +3760,7 @@ void FullscreenUI::DrawHotkeySettingsPage()
last_category = hotkey; last_category = hotkey;
} }
DrawInputBindingButton(bsi, PAD::ControllerBindingType::Button, "Hotkeys", hotkey->name, hotkey->display_name, false); DrawInputBindingButton(bsi, InputBindingInfo::Type::Button, "Hotkeys", hotkey->name, hotkey->display_name, false);
} }
EndMenuButtons(); EndMenuButtons();

View File

@ -505,11 +505,11 @@ void ImGuiManager::DrawInputsOverlay()
for (u32 bind = 0; bind < cinfo->num_bindings; bind++) for (u32 bind = 0; bind < cinfo->num_bindings; bind++)
{ {
const PAD::ControllerBindingInfo& bi = cinfo->bindings[bind]; const InputBindingInfo& bi = cinfo->bindings[bind];
switch (bi.type) switch (bi.type)
{ {
case PAD::ControllerBindingType::Axis: case InputBindingInfo::Type::Axis:
case PAD::ControllerBindingType::HalfAxis: case InputBindingInfo::Type::HalfAxis:
{ {
// axes are always shown // axes are always shown
const float value = static_cast<float>(g_key_status.GetRawPressure(port, bind)) * (1.0f / 255.0f); const float value = static_cast<float>(g_key_status.GetRawPressure(port, bind)) * (1.0f / 255.0f);
@ -520,7 +520,7 @@ void ImGuiManager::DrawInputsOverlay()
} }
break; break;
case PAD::ControllerBindingType::Button: case InputBindingInfo::Type::Button:
{ {
// buttons only shown when active // buttons only shown when active
const float value = static_cast<float>(g_key_status.GetRawPressure(port, bind)) * (1.0f / 255.0f); const float value = static_cast<float>(g_key_status.GetRawPressure(port, bind)) * (1.0f / 255.0f);
@ -529,9 +529,9 @@ void ImGuiManager::DrawInputsOverlay()
} }
break; break;
case PAD::ControllerBindingType::Motor: case InputBindingInfo::Type::Motor:
case PAD::ControllerBindingType::Macro: case InputBindingInfo::Type::Macro:
case PAD::ControllerBindingType::Unknown: case InputBindingInfo::Type::Unknown:
default: default:
break; break;
} }

View File

@ -183,62 +183,6 @@ u8 PADpoll(u8 value)
return pad_poll(value); return pad_poll(value);
} }
const char* PAD::ControllerSettingInfo::StringDefaultValue() const
{
return default_value ? default_value : "";
}
bool PAD::ControllerSettingInfo::BooleanDefaultValue() const
{
return default_value ? StringUtil::FromChars<bool>(default_value).value_or(false) : false;
}
s32 PAD::ControllerSettingInfo::IntegerDefaultValue() const
{
return default_value ? StringUtil::FromChars<s32>(default_value).value_or(0) : 0;
}
s32 PAD::ControllerSettingInfo::IntegerMinValue() const
{
static constexpr s32 fallback_value = std::numeric_limits<s32>::min();
return min_value ? StringUtil::FromChars<s32>(min_value).value_or(fallback_value) : fallback_value;
}
s32 PAD::ControllerSettingInfo::IntegerMaxValue() const
{
static constexpr s32 fallback_value = std::numeric_limits<s32>::max();
return max_value ? StringUtil::FromChars<s32>(max_value).value_or(fallback_value) : fallback_value;
}
s32 PAD::ControllerSettingInfo::IntegerStepValue() const
{
static constexpr s32 fallback_value = 1;
return step_value ? StringUtil::FromChars<s32>(step_value).value_or(fallback_value) : fallback_value;
}
float PAD::ControllerSettingInfo::FloatDefaultValue() const
{
return default_value ? StringUtil::FromChars<float>(default_value).value_or(0.0f) : 0.0f;
}
float PAD::ControllerSettingInfo::FloatMinValue() const
{
static constexpr float fallback_value = std::numeric_limits<float>::min();
return min_value ? StringUtil::FromChars<float>(min_value).value_or(fallback_value) : fallback_value;
}
float PAD::ControllerSettingInfo::FloatMaxValue() const
{
static constexpr float fallback_value = std::numeric_limits<float>::max();
return max_value ? StringUtil::FromChars<float>(max_value).value_or(fallback_value) : fallback_value;
}
float PAD::ControllerSettingInfo::FloatStepValue() const
{
static constexpr float fallback_value = 0.1f;
return step_value ? StringUtil::FromChars<float>(step_value).value_or(fallback_value) : fallback_value;
}
std::string PAD::GetConfigSection(u32 pad_index) std::string PAD::GetConfigSection(u32 pad_index)
{ {
return fmt::format("Pad{}", pad_index + 1); return fmt::format("Pad{}", pad_index + 1);
@ -336,21 +280,22 @@ void PAD::SetDefaultControllerConfig(SettingsInterface& si)
{ {
for (u32 i = 0; i < ci->num_settings; i++) for (u32 i = 0; i < ci->num_settings; i++)
{ {
const ControllerSettingInfo& csi = ci->settings[i]; const SettingInfo& csi = ci->settings[i];
switch (csi.type) switch (csi.type)
{ {
case ControllerSettingInfo::Type::Boolean: case SettingInfo::Type::Boolean:
si.SetBoolValue(section.c_str(), csi.name, csi.BooleanDefaultValue()); si.SetBoolValue(section.c_str(), csi.name, csi.BooleanDefaultValue());
break; break;
case ControllerSettingInfo::Type::Integer: case SettingInfo::Type::Integer:
case ControllerSettingInfo::Type::IntegerList: case SettingInfo::Type::IntegerList:
si.SetIntValue(section.c_str(), csi.name, csi.IntegerDefaultValue()); si.SetIntValue(section.c_str(), csi.name, csi.IntegerDefaultValue());
break; break;
case ControllerSettingInfo::Type::Float: case SettingInfo::Type::Float:
si.SetFloatValue(section.c_str(), csi.name, csi.FloatDefaultValue()); si.SetFloatValue(section.c_str(), csi.name, csi.FloatDefaultValue());
break; break;
case ControllerSettingInfo::Type::String: case SettingInfo::Type::String:
case ControllerSettingInfo::Type::Path: case SettingInfo::Type::StringList:
case SettingInfo::Type::Path:
si.SetStringValue(section.c_str(), csi.name, csi.StringDefaultValue()); si.SetStringValue(section.c_str(), csi.name, csi.StringDefaultValue());
break; break;
default: default:
@ -418,35 +363,35 @@ void PAD::Update()
UpdateMacroButtons(); UpdateMacroButtons();
} }
static const PAD::ControllerBindingInfo s_dualshock2_binds[] = { static const InputBindingInfo s_dualshock2_binds[] = {
{"Up", "D-Pad Up", PAD::ControllerBindingType::Button, GenericInputBinding::DPadUp}, {"Up", "D-Pad Up", InputBindingInfo::Type::Button, GenericInputBinding::DPadUp},
{"Right", "D-Pad Right", PAD::ControllerBindingType::Button, GenericInputBinding::DPadRight}, {"Right", "D-Pad Right", InputBindingInfo::Type::Button, GenericInputBinding::DPadRight},
{"Down", "D-Pad Down", PAD::ControllerBindingType::Button, GenericInputBinding::DPadDown}, {"Down", "D-Pad Down", InputBindingInfo::Type::Button, GenericInputBinding::DPadDown},
{"Left", "D-Pad Left", PAD::ControllerBindingType::Button, GenericInputBinding::DPadLeft}, {"Left", "D-Pad Left", InputBindingInfo::Type::Button, GenericInputBinding::DPadLeft},
{"Triangle", "Triangle", PAD::ControllerBindingType::Button, GenericInputBinding::Triangle}, {"Triangle", "Triangle", InputBindingInfo::Type::Button, GenericInputBinding::Triangle},
{"Circle", "Circle", PAD::ControllerBindingType::Button, GenericInputBinding::Circle}, {"Circle", "Circle", InputBindingInfo::Type::Button, GenericInputBinding::Circle},
{"Cross", "Cross", PAD::ControllerBindingType::Button, GenericInputBinding::Cross}, {"Cross", "Cross", InputBindingInfo::Type::Button, GenericInputBinding::Cross},
{"Square", "Square", PAD::ControllerBindingType::Button, GenericInputBinding::Square}, {"Square", "Square", InputBindingInfo::Type::Button, GenericInputBinding::Square},
{"Select", "Select", PAD::ControllerBindingType::Button, GenericInputBinding::Select}, {"Select", "Select", InputBindingInfo::Type::Button, GenericInputBinding::Select},
{"Start", "Start", PAD::ControllerBindingType::Button, GenericInputBinding::Start}, {"Start", "Start", InputBindingInfo::Type::Button, GenericInputBinding::Start},
{"L1", "L1 (Left Bumper)", PAD::ControllerBindingType::Button, GenericInputBinding::L1}, {"L1", "L1 (Left Bumper)", InputBindingInfo::Type::Button, GenericInputBinding::L1},
{"L2", "L2 (Left Trigger)", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::L2}, {"L2", "L2 (Left Trigger)", InputBindingInfo::Type::HalfAxis, GenericInputBinding::L2},
{"R1", "R1 (Right Bumper)", PAD::ControllerBindingType::Button, GenericInputBinding::R1}, {"R1", "R1 (Right Bumper)", InputBindingInfo::Type::Button, GenericInputBinding::R1},
{"R2", "R2 (Right Trigger)", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::R2}, {"R2", "R2 (Right Trigger)", InputBindingInfo::Type::HalfAxis, GenericInputBinding::R2},
{"L3", "L3 (Left Stick Button)", PAD::ControllerBindingType::Button, GenericInputBinding::L3}, {"L3", "L3 (Left Stick Button)", InputBindingInfo::Type::Button, GenericInputBinding::L3},
{"R3", "R3 (Right Stick Button)", PAD::ControllerBindingType::Button, GenericInputBinding::R3}, {"R3", "R3 (Right Stick Button)", InputBindingInfo::Type::Button, GenericInputBinding::R3},
{"Analog", "Analog Toggle", PAD::ControllerBindingType::Button, GenericInputBinding::System}, {"Analog", "Analog Toggle", InputBindingInfo::Type::Button, GenericInputBinding::System},
{"Pressure", "Apply Pressure", PAD::ControllerBindingType::Button, GenericInputBinding::Unknown}, {"Pressure", "Apply Pressure", InputBindingInfo::Type::Button, GenericInputBinding::Unknown},
{"LUp", "Left Stick Up", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::LeftStickUp}, {"LUp", "Left Stick Up", InputBindingInfo::Type::HalfAxis, GenericInputBinding::LeftStickUp},
{"LRight", "Left Stick Right", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::LeftStickRight}, {"LRight", "Left Stick Right", InputBindingInfo::Type::HalfAxis, GenericInputBinding::LeftStickRight},
{"LDown", "Left Stick Down", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::LeftStickDown}, {"LDown", "Left Stick Down", InputBindingInfo::Type::HalfAxis, GenericInputBinding::LeftStickDown},
{"LLeft", "Left Stick Left", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::LeftStickLeft}, {"LLeft", "Left Stick Left", InputBindingInfo::Type::HalfAxis, GenericInputBinding::LeftStickLeft},
{"RUp", "Right Stick Up", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::RightStickUp}, {"RUp", "Right Stick Up", InputBindingInfo::Type::HalfAxis, GenericInputBinding::RightStickUp},
{"RRight", "Right Stick Right", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::RightStickRight}, {"RRight", "Right Stick Right", InputBindingInfo::Type::HalfAxis, GenericInputBinding::RightStickRight},
{"RDown", "Right Stick Down", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::RightStickDown}, {"RDown", "Right Stick Down", InputBindingInfo::Type::HalfAxis, GenericInputBinding::RightStickDown},
{"RLeft", "Right Stick Left", PAD::ControllerBindingType::HalfAxis, GenericInputBinding::RightStickLeft}, {"RLeft", "Right Stick Left", InputBindingInfo::Type::HalfAxis, GenericInputBinding::RightStickLeft},
{"LargeMotor", "Large (Low Frequency) Motor", PAD::ControllerBindingType::Motor, GenericInputBinding::LargeMotor}, {"LargeMotor", "Large (Low Frequency) Motor", InputBindingInfo::Type::Motor, GenericInputBinding::LargeMotor},
{"SmallMotor", "Small (High Frequency) Motor", PAD::ControllerBindingType::Motor, GenericInputBinding::SmallMotor}, {"SmallMotor", "Small (High Frequency) Motor", InputBindingInfo::Type::Motor, GenericInputBinding::SmallMotor},
}; };
static const char* s_dualshock2_invert_entries[] = { static const char* s_dualshock2_invert_entries[] = {
@ -456,33 +401,33 @@ static const char* s_dualshock2_invert_entries[] = {
"Invert Left/Right + Up/Down", "Invert Left/Right + Up/Down",
nullptr}; nullptr};
static const PAD::ControllerSettingInfo s_dualshock2_settings[] = { static const SettingInfo s_dualshock2_settings[] = {
{PAD::ControllerSettingInfo::Type::IntegerList, "InvertL", "Invert Left Stick", {SettingInfo::Type::IntegerList, "InvertL", "Invert Left Stick",
"Inverts the direction of the left analog stick.", "Inverts the direction of the left analog stick.",
"0", "0", "3", nullptr, nullptr, s_dualshock2_invert_entries, 0.0f}, "0", "0", "3", nullptr, nullptr, s_dualshock2_invert_entries, 0.0f},
{PAD::ControllerSettingInfo::Type::IntegerList, "InvertR", "Invert Right Stick", {SettingInfo::Type::IntegerList, "InvertR", "Invert Right Stick",
"Inverts the direction of the right analog stick.", "Inverts the direction of the right analog stick.",
"0", "0", "3", nullptr, nullptr, s_dualshock2_invert_entries, 0.0f}, "0", "0", "3", nullptr, nullptr, s_dualshock2_invert_entries, 0.0f},
{PAD::ControllerSettingInfo::Type::Float, "Deadzone", "Analog Deadzone", {SettingInfo::Type::Float, "Deadzone", "Analog Deadzone",
"Sets the analog stick deadzone, i.e. the fraction of the stick movement which will be ignored.", "Sets the analog stick deadzone, i.e. the fraction of the stick movement which will be ignored.",
"0.00", "0.00", "1.00", "0.01", "%.0f%%", nullptr, 100.0f}, "0.00", "0.00", "1.00", "0.01", "%.0f%%", nullptr, 100.0f},
{PAD::ControllerSettingInfo::Type::Float, "AxisScale", "Analog Sensitivity", {SettingInfo::Type::Float, "AxisScale", "Analog Sensitivity",
"Sets the analog stick axis scaling factor. A value between 1.30 and 1.40 is recommended when using recent " "Sets the analog stick axis scaling factor. A value between 1.30 and 1.40 is recommended when using recent "
"controllers, e.g. DualShock 4, Xbox One Controller.", "controllers, e.g. DualShock 4, Xbox One Controller.",
"1.33", "0.01", "2.00", "0.01", "%.0f%%", nullptr, 100.0f}, "1.33", "0.01", "2.00", "0.01", "%.0f%%", nullptr, 100.0f},
{PAD::ControllerSettingInfo::Type::Float, "LargeMotorScale", "Large Motor Vibration Scale", {SettingInfo::Type::Float, "LargeMotorScale", "Large Motor Vibration Scale",
"Increases or decreases the intensity of low frequency vibration sent by the game.", "Increases or decreases the intensity of low frequency vibration sent by the game.",
"1.00", "0.00", "2.00", "0.01", "%.0f%%", nullptr, 100.0f}, "1.00", "0.00", "2.00", "0.01", "%.0f%%", nullptr, 100.0f},
{PAD::ControllerSettingInfo::Type::Float, "SmallMotorScale", "Small Motor Vibration Scale", {SettingInfo::Type::Float, "SmallMotorScale", "Small Motor Vibration Scale",
"Increases or decreases the intensity of high frequency vibration sent by the game.", "Increases or decreases the intensity of high frequency vibration sent by the game.",
"1.00", "0.00", "2.00", "0.01", "%.0f%%", nullptr, 100.0f}, "1.00", "0.00", "2.00", "0.01", "%.0f%%", nullptr, 100.0f},
{PAD::ControllerSettingInfo::Type::Float, "ButtonDeadzone", "Button/Trigger Deadzone", {SettingInfo::Type::Float, "ButtonDeadzone", "Button/Trigger Deadzone",
"Sets the deadzone for activating buttons/triggers, i.e. the fraction of the trigger which will be ignored.", "Sets the deadzone for activating buttons/triggers, i.e. the fraction of the trigger which will be ignored.",
"0.00", "0.00", "1.00", "0.01", "%.0f%%", nullptr, 100.0f}, "0.00", "0.00", "1.00", "0.01", "%.0f%%", nullptr, 100.0f},
/*{PAD::ControllerSettingInfo::Type::Float, "InitialPressure", "Initial Pressure", /*{SettingInfo::Type::Float, "InitialPressure", "Initial Pressure",
"Sets the pressure when the modifier button isn't held.", "Sets the pressure when the modifier button isn't held.",
"1.00", "0.01", "1.00", "0.01", "%.0f%%", nullptr, 100.0f},*/ "1.00", "0.01", "1.00", "0.01", "%.0f%%", nullptr, 100.0f},*/
{PAD::ControllerSettingInfo::Type::Float, "PressureModifier", "Modifier Pressure", {SettingInfo::Type::Float, "PressureModifier", "Modifier Pressure",
"Sets the pressure when the modifier button is held.", "Sets the pressure when the modifier button is held.",
"0.50", "0.01", "1.00", "0.01", "%.0f%%", nullptr, 100.0f}, "0.50", "0.01", "1.00", "0.01", "%.0f%%", nullptr, 100.0f},
}; };
@ -538,8 +483,8 @@ std::vector<std::string> PAD::GetControllerBinds(const std::string_view& type)
{ {
for (u32 i = 0; i < info->num_bindings; i++) for (u32 i = 0; i < info->num_bindings; i++)
{ {
const ControllerBindingInfo& bi = info->bindings[i]; const InputBindingInfo& bi = info->bindings[i];
if (bi.type == ControllerBindingType::Unknown || bi.type == ControllerBindingType::Motor) if (bi.type == InputBindingInfo::Type::Unknown || bi.type == InputBindingInfo::Type::Motor)
continue; continue;
ret.emplace_back(info->bindings[i].name); ret.emplace_back(info->bindings[i].name);
@ -598,7 +543,7 @@ void PAD::CopyConfiguration(SettingsInterface* dest_si, const SettingsInterface&
{ {
for (u32 i = 0; i < info->num_bindings; i++) for (u32 i = 0; i < info->num_bindings; i++)
{ {
const ControllerBindingInfo& bi = info->bindings[i]; const InputBindingInfo& bi = info->bindings[i];
dest_si->CopyStringListValue(src_si, section.c_str(), bi.name); dest_si->CopyStringListValue(src_si, section.c_str(), bi.name);
} }
@ -622,21 +567,22 @@ void PAD::CopyConfiguration(SettingsInterface* dest_si, const SettingsInterface&
for (u32 i = 0; i < info->num_settings; i++) for (u32 i = 0; i < info->num_settings; i++)
{ {
const ControllerSettingInfo& csi = info->settings[i]; const SettingInfo& csi = info->settings[i];
switch (csi.type) switch (csi.type)
{ {
case ControllerSettingInfo::Type::Boolean: case SettingInfo::Type::Boolean:
dest_si->CopyBoolValue(src_si, section.c_str(), csi.name); dest_si->CopyBoolValue(src_si, section.c_str(), csi.name);
break; break;
case ControllerSettingInfo::Type::Integer: case SettingInfo::Type::Integer:
case ControllerSettingInfo::Type::IntegerList: case SettingInfo::Type::IntegerList:
dest_si->CopyIntValue(src_si, section.c_str(), csi.name); dest_si->CopyIntValue(src_si, section.c_str(), csi.name);
break; break;
case ControllerSettingInfo::Type::Float: case SettingInfo::Type::Float:
dest_si->CopyFloatValue(src_si, section.c_str(), csi.name); dest_si->CopyFloatValue(src_si, section.c_str(), csi.name);
break; break;
case ControllerSettingInfo::Type::String: case SettingInfo::Type::String:
case ControllerSettingInfo::Type::Path: case SettingInfo::Type::StringList:
case SettingInfo::Type::Path:
dest_si->CopyStringValue(src_si, section.c_str(), csi.name); dest_si->CopyStringValue(src_si, section.c_str(), csi.name);
break; break;
default: default:
@ -701,7 +647,7 @@ bool PAD::MapController(SettingsInterface& si, u32 controller,
u32 num_mappings = 0; u32 num_mappings = 0;
for (u32 i = 0; i < info->num_bindings; i++) for (u32 i = 0; i < info->num_bindings; i++)
{ {
const ControllerBindingInfo& bi = info->bindings[i]; const InputBindingInfo& bi = info->bindings[i];
if (bi.generic_mapping == GenericInputBinding::Unknown) if (bi.generic_mapping == GenericInputBinding::Unknown)
continue; continue;

View File

@ -20,6 +20,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "Config.h"
#include "PAD/Host/Global.h" #include "PAD/Host/Global.h"
#include "SaveState.h" #include "SaveState.h"
@ -46,16 +47,6 @@ namespace PAD
Count Count
}; };
enum class ControllerBindingType : u8
{
Unknown,
Button,
Axis,
HalfAxis,
Motor,
Macro
};
enum class VibrationCapabilities : u8 enum class VibrationCapabilities : u8
{ {
NoVibration, NoVibration,
@ -64,61 +55,16 @@ namespace PAD
Count Count
}; };
struct ControllerBindingInfo
{
const char* name;
const char* display_name;
ControllerBindingType type;
GenericInputBinding generic_mapping;
};
struct ControllerSettingInfo
{
enum class Type
{
Boolean,
Integer,
IntegerList,
Float,
String,
Path,
};
Type type;
const char* name;
const char* display_name;
const char* description;
const char* default_value;
const char* min_value;
const char* max_value;
const char* step_value;
const char* format;
const char** options;
float multiplier;
const char* StringDefaultValue() const;
bool BooleanDefaultValue() const;
s32 IntegerDefaultValue() const;
s32 IntegerMinValue() const;
s32 IntegerMaxValue() const;
s32 IntegerStepValue() const;
float FloatDefaultValue() const;
float FloatMinValue() const;
float FloatMaxValue() const;
float FloatStepValue() const;
};
struct ControllerInfo struct ControllerInfo
{ {
ControllerType type; ControllerType type;
const char* name; const char* name;
const char* display_name; const char* display_name;
const ControllerBindingInfo* bindings; const InputBindingInfo* bindings;
u32 num_bindings; u32 num_bindings;
const ControllerSettingInfo* settings; const SettingInfo* settings;
u32 num_settings; u32 num_settings;
PAD::VibrationCapabilities vibration_caps; VibrationCapabilities vibration_caps;
}; };
/// Total number of pad ports, across both multitaps. /// Total number of pad ports, across both multitaps.

View File

@ -31,6 +31,62 @@
#include "GS/GS.h" #include "GS/GS.h"
#endif #endif
const char* SettingInfo::StringDefaultValue() const
{
return default_value ? default_value : "";
}
bool SettingInfo::BooleanDefaultValue() const
{
return default_value ? StringUtil::FromChars<bool>(default_value).value_or(false) : false;
}
s32 SettingInfo::IntegerDefaultValue() const
{
return default_value ? StringUtil::FromChars<s32>(default_value).value_or(0) : 0;
}
s32 SettingInfo::IntegerMinValue() const
{
static constexpr s32 fallback_value = std::numeric_limits<s32>::min();
return min_value ? StringUtil::FromChars<s32>(min_value).value_or(fallback_value) : fallback_value;
}
s32 SettingInfo::IntegerMaxValue() const
{
static constexpr s32 fallback_value = std::numeric_limits<s32>::max();
return max_value ? StringUtil::FromChars<s32>(max_value).value_or(fallback_value) : fallback_value;
}
s32 SettingInfo::IntegerStepValue() const
{
static constexpr s32 fallback_value = 1;
return step_value ? StringUtil::FromChars<s32>(step_value).value_or(fallback_value) : fallback_value;
}
float SettingInfo::FloatDefaultValue() const
{
return default_value ? StringUtil::FromChars<float>(default_value).value_or(0.0f) : 0.0f;
}
float SettingInfo::FloatMinValue() const
{
static constexpr float fallback_value = std::numeric_limits<float>::min();
return min_value ? StringUtil::FromChars<float>(min_value).value_or(fallback_value) : fallback_value;
}
float SettingInfo::FloatMaxValue() const
{
static constexpr float fallback_value = std::numeric_limits<float>::max();
return max_value ? StringUtil::FromChars<float>(max_value).value_or(fallback_value) : fallback_value;
}
float SettingInfo::FloatStepValue() const
{
static constexpr float fallback_value = 0.1f;
return step_value ? StringUtil::FromChars<float>(step_value).value_or(fallback_value) : fallback_value;
}
namespace EmuFolders namespace EmuFolders
{ {
std::string AppRoot; std::string AppRoot;