Qt: Add clear bindings button to controllers

This commit is contained in:
Connor McLaughlin 2022-05-25 00:27:19 +10:00 committed by refractionpcsx2
parent 332346449f
commit cefe4b773c
5 changed files with 54 additions and 6 deletions

View File

@ -83,6 +83,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="clearBindings">
<property name="text">
<string>Clear Bindings</string>
</property>
<property name="icon">
<iconset theme="file-reduce-line"/>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>

View File

@ -45,6 +45,7 @@ ControllerBindingWidget::ControllerBindingWidget(QWidget* parent, ControllerSett
SettingWidgetBinder::BindWidgetToStringSetting(nullptr, m_ui.controllerType, m_config_section, "Type", "None"); SettingWidgetBinder::BindWidgetToStringSetting(nullptr, m_ui.controllerType, m_config_section, "Type", "None");
connect(m_ui.controllerType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ControllerBindingWidget::onTypeChanged); connect(m_ui.controllerType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ControllerBindingWidget::onTypeChanged);
connect(m_ui.automaticBinding, &QPushButton::clicked, this, &ControllerBindingWidget::doAutomaticBinding); connect(m_ui.automaticBinding, &QPushButton::clicked, this, &ControllerBindingWidget::doAutomaticBinding);
connect(m_ui.clearBindings, &QPushButton::clicked, this, &ControllerBindingWidget::doClearBindings);
} }
ControllerBindingWidget::~ControllerBindingWidget() = default; ControllerBindingWidget::~ControllerBindingWidget() = default;
@ -107,6 +108,22 @@ void ControllerBindingWidget::doAutomaticBinding()
menu.exec(QCursor::pos()); menu.exec(QCursor::pos());
} }
void ControllerBindingWidget::doClearBindings()
{
if (QMessageBox::question(QtUtils::GetRootWidget(this), tr("Clear Bindings"),
tr("Are you sure you want to clear all bindings for this controller? This action cannot be undone.")) != QMessageBox::Yes)
{
return;
}
{
auto lock = Host::GetSettingsLock();
PAD::ClearPortBindings(*Host::Internal::GetBaseSettingsLayer(), m_port_number);
}
saveAndRefresh();
}
void ControllerBindingWidget::doDeviceAutomaticBinding(const QString& device) void ControllerBindingWidget::doDeviceAutomaticBinding(const QString& device)
{ {
std::vector<std::pair<GenericInputBinding, std::string>> mapping = InputManager::GetGenericBindingMapping(device.toStdString()); std::vector<std::pair<GenericInputBinding, std::string>> mapping = InputManager::GetGenericBindingMapping(device.toStdString());
@ -123,13 +140,16 @@ void ControllerBindingWidget::doDeviceAutomaticBinding(const QString& device)
result = PAD::MapController(*Host::Internal::GetBaseSettingsLayer(), m_port_number, mapping); result = PAD::MapController(*Host::Internal::GetBaseSettingsLayer(), m_port_number, mapping);
} }
// force a refresh after mapping
if (result) if (result)
{ saveAndRefresh();
// force a refresh after mapping }
onTypeChanged();
QtHost::QueueSettingsSave(); void ControllerBindingWidget::saveAndRefresh()
g_emu_thread->applySettings(); {
} onTypeChanged();
QtHost::QueueSettingsSave();
g_emu_thread->applySettings();
} }
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////

View File

@ -40,10 +40,12 @@ public:
private Q_SLOTS: private Q_SLOTS:
void onTypeChanged(); void onTypeChanged();
void doAutomaticBinding(); void doAutomaticBinding();
void doClearBindings();
private: private:
void populateControllerTypes(); void populateControllerTypes();
void doDeviceAutomaticBinding(const QString& device); void doDeviceAutomaticBinding(const QString& device);
void saveAndRefresh();
Ui::ControllerBindingWidget m_ui; Ui::ControllerBindingWidget m_ui;

View File

@ -342,6 +342,19 @@ std::vector<std::string> PAD::GetControllerBinds(const std::string_view& type)
return ret; return ret;
} }
void PAD::ClearPortBindings(SettingsInterface& si, u32 port)
{
const std::string section(StringUtil::StdStringFromFormat("Pad%u", port + 1));
const std::string type(si.GetStringValue(section.c_str(), "Type", GetDefaultPadType(port)));
const ControllerInfo* info = GetControllerInfo(type);
if (!info)
return;
for (u32 i = 0; i < info->num_bindings; i++)
si.DeleteValue(section.c_str(), info->bindings[i].name);
}
PAD::VibrationCapabilities PAD::GetControllerVibrationCapabilities(const std::string_view& type) PAD::VibrationCapabilities PAD::GetControllerVibrationCapabilities(const std::string_view& type)
{ {
const ControllerInfo* info = GetControllerInfo(type); const ControllerInfo* info = GetControllerInfo(type);

View File

@ -54,6 +54,9 @@ namespace PAD
/// Restores default configuration. /// Restores default configuration.
void SetDefaultConfig(SettingsInterface& si); void SetDefaultConfig(SettingsInterface& si);
/// Clears all bindings for a given port.
void ClearPortBindings(SettingsInterface& si, u32 port);
/// Updates vibration and other internal state. Called at the *end* of a frame. /// Updates vibration and other internal state. Called at the *end* of a frame.
void Update(); void Update();