Qt: add button to remove gamepad config
Some checks are pending
Generate Translation Template / Generate Translation Template (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux-aarch64.sh, gcc, rpcs3/rpcs3-ci-jammy-aarch64:1.7, ubuntu-24.04-arm) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux.sh, gcc, rpcs3/rpcs3-ci-jammy:1.7, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1, rpcs3/rpcs3-binaries-linux-arm64, /rpcs3/.ci/build-linux-aarch64.sh, clang, rpcs3/rpcs3-ci-jammy-aarch64:1.7, ubuntu-24.04-arm) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (d812f1254a1157c80fd402f94446310560f54e5f, rpcs3/rpcs3-binaries-linux, /rpcs3/.ci/build-linux.sh, clang, rpcs3/rpcs3-ci-jammy:1.7, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (51ae32f468089a8169aaf1567de355ff4a3e0842, rpcs3/rpcs3-binaries-mac, .ci/build-mac.sh, Intel) (push) Waiting to run
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (8e21bdbc40711a3fccd18fbf17b742348b0f4281, rpcs3/rpcs3-binaries-mac-arm64, .ci/build-mac-arm64.sh, Apple Silicon) (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run
Build RPCS3 / RPCS3 Windows Clang (win64, clang, clang64) (push) Waiting to run
Build RPCS3 / RPCS3 FreeBSD (push) Waiting to run

This commit is contained in:
Megamouse 2025-11-15 15:05:53 +01:00
parent d61f4101ad
commit c7ae97f8ea
3 changed files with 107 additions and 31 deletions

View file

@ -16,6 +16,7 @@
#include "Emu/System.h"
#include "Emu/system_utils.hpp"
#include "Utilities/File.h"
#include "Input/pad_thread.h"
#include "Input/gui_pad_thread.h"
@ -86,21 +87,7 @@ pad_settings_dialog::pad_settings_dialog(std::shared_ptr<gui_settings> gui_setti
if (m_title_id.empty())
{
const QString input_config_dir = QString::fromStdString(rpcs3::utils::get_input_config_dir(m_title_id));
QStringList config_files = gui::utils::get_dir_entries(QDir(input_config_dir), QStringList() << "*.yml");
QString active_config_file = QString::fromStdString(g_cfg_input_configs.active_configs.get_value(g_cfg_input_configs.global_key));
if (!config_files.contains(active_config_file))
{
const QString default_config_file = QString::fromStdString(g_cfg_input_configs.default_config);
if (!config_files.contains(default_config_file) && CreateConfigFile(input_config_dir, default_config_file))
{
config_files.prepend(default_config_file);
}
active_config_file = default_config_file;
}
const auto [config_files, active_config_file] = get_config_files();
for (const QString& profile : config_files)
{
@ -145,6 +132,9 @@ pad_settings_dialog::pad_settings_dialog(std::shared_ptr<gui_settings> gui_setti
// Pushbutton: Add config file
connect(ui->b_addConfig, &QAbstractButton::clicked, this, &pad_settings_dialog::AddConfigFile);
// Pushbutton: Remove config file
connect(ui->b_remConfig, &QAbstractButton::clicked, this, &pad_settings_dialog::RemoveConfigFile);
ui->buttonBox->button(QDialogButtonBox::Reset)->setText(tr("Filter Noise"));
connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton* button)
@ -272,6 +262,27 @@ void pad_settings_dialog::showEvent(QShowEvent* event)
QDialog::showEvent(event);
}
std::pair<QStringList, QString> pad_settings_dialog::get_config_files()
{
const QString input_config_dir = QString::fromStdString(rpcs3::utils::get_input_config_dir(m_title_id));
QStringList config_files = gui::utils::get_dir_entries(QDir(input_config_dir), QStringList() << "*.yml");
QString active_config_file = QString::fromStdString(g_cfg_input_configs.active_configs.get_value(g_cfg_input_configs.global_key));
if (!config_files.contains(active_config_file))
{
const QString default_config_file = QString::fromStdString(g_cfg_input_configs.default_config);
if (!config_files.contains(default_config_file) && CreateConfigFile(input_config_dir, default_config_file))
{
config_files.prepend(default_config_file);
}
active_config_file = default_config_file;
}
return std::make_pair<QStringList, QString>(std::move(config_files), std::move(active_config_file));
}
void pad_settings_dialog::InitButtons()
{
m_pad_buttons = new QButtonGroup(this);
@ -321,6 +332,7 @@ void pad_settings_dialog::InitButtons()
m_pad_buttons->addButton(ui->b_refresh, button_ids::id_refresh);
m_pad_buttons->addButton(ui->b_addConfig, button_ids::id_add_config_file);
m_pad_buttons->addButton(ui->b_remConfig, button_ids::id_remove_config_file);
connect(m_pad_buttons, &QButtonGroup::idClicked, this, &pad_settings_dialog::OnPadButtonClicked);
@ -1320,6 +1332,7 @@ void pad_settings_dialog::OnPadButtonClicked(int id)
case button_ids::id_pad_begin:
case button_ids::id_pad_end:
case button_ids::id_add_config_file:
case button_ids::id_remove_config_file:
case button_ids::id_refresh:
return;
case button_ids::id_reset_parameters:
@ -1636,6 +1649,8 @@ void pad_settings_dialog::ChangeConfig(const QString& config_file)
m_config_file = config_file.toStdString();
ui->b_remConfig->setEnabled(m_title_id.empty() && m_config_file != g_cfg_input_configs.default_config);
// Load in order to get the pad handlers
if (!g_cfg_input.load(m_title_id, m_config_file, true))
{
@ -1810,6 +1825,44 @@ void pad_settings_dialog::AddConfigFile()
}
}
void pad_settings_dialog::RemoveConfigFile()
{
const std::string config_to_remove = m_config_file;
const QString q_config_to_remove = QString::fromStdString(config_to_remove);
if (config_to_remove == g_cfg_input_configs.default_config)
{
QMessageBox::warning(this, tr("Warning!"), tr("Can't remove default configuration '%0'.").arg(q_config_to_remove));
return;
}
if (QMessageBox::question(this, tr("Remove Configuration?"), tr("Do you really want to remove the configuration '%0'?").arg(q_config_to_remove)) != QMessageBox::StandardButton::Yes)
{
return;
}
const std::string filepath = fmt::format("%s%s.yml", rpcs3::utils::get_input_config_dir(m_title_id), config_to_remove);
if (!fs::remove_file(filepath))
{
QMessageBox::warning(this, tr("Warning!"), tr("Failed to remove '%0'.").arg(QString::fromStdString(filepath)));
return;
}
const auto [config_files, active_config_file] = get_config_files();
ui->chooseConfig->setCurrentText(active_config_file);
ui->chooseConfig->removeItem(ui->chooseConfig->findText(q_config_to_remove));
// Save new config if we removed the currently saved config
if (active_config_file == q_config_to_remove)
{
save(false);
}
QMessageBox::information(this, tr("Removed Configuration"), tr("Removed configuration '%0'.\nThe selected configuration is now '%1'.").arg(q_config_to_remove).arg(active_config_file));
}
void pad_settings_dialog::RefreshHandlers()
{
const u32 player_id = GetPlayerIndex();
@ -1949,27 +2002,30 @@ void pad_settings_dialog::ApplyCurrentPlayerConfig(int new_player_id)
cfg.product_id.set(info.product_id);
}
void pad_settings_dialog::SaveExit()
void pad_settings_dialog::save(bool check_duplicates)
{
ApplyCurrentPlayerConfig(m_last_player_id);
for (const auto& [player_id, key] : m_duplicate_buttons)
if (check_duplicates)
{
if (!key.empty())
for (const auto& [player_id, key] : m_duplicate_buttons)
{
int result = QMessageBox::Yes;
m_gui_settings->ShowConfirmationBox(
tr("Warning!"),
tr("The %0 button <b>%1</b> of <b>Player %2</b> was assigned at least twice.<br>Please consider adjusting the configuration.<br><br>Continue anyway?<br>")
.arg(QString::fromStdString(g_cfg_input.player[player_id]->handler.to_string()))
.arg(QString::fromStdString(key))
.arg(player_id + 1),
gui::ib_same_buttons, &result, this);
if (!key.empty())
{
int result = QMessageBox::Yes;
m_gui_settings->ShowConfirmationBox(
tr("Warning!"),
tr("The %0 button <b>%1</b> of <b>Player %2</b> was assigned at least twice.<br>Please consider adjusting the configuration.<br><br>Continue anyway?<br>")
.arg(QString::fromStdString(g_cfg_input.player[player_id]->handler.to_string()))
.arg(QString::fromStdString(key))
.arg(player_id + 1),
gui::ib_same_buttons, &result, this);
if (result == QMessageBox::No)
return;
if (result == QMessageBox::No)
return;
break;
break;
}
}
}
@ -1979,6 +2035,11 @@ void pad_settings_dialog::SaveExit()
g_cfg_input_configs.save();
g_cfg_input.save(m_title_id, m_config_file);
}
void pad_settings_dialog::SaveExit()
{
save(true);
QDialog::accept();
}

View file

@ -74,7 +74,8 @@ class pad_settings_dialog : public QDialog
id_reset_parameters,
id_blacklist,
id_refresh,
id_add_config_file
id_add_config_file,
id_remove_config_file
};
struct pad_button
@ -101,6 +102,7 @@ private Q_SLOTS:
void ChangeDevice(int index);
void HandleDeviceClassChange(u32 class_id) const;
void AddConfigFile();
void RemoveConfigFile();
/** Update the current player config with the GUI values. */
void ApplyCurrentPlayerConfig(int new_player_id);
void RefreshPads();
@ -192,6 +194,9 @@ private:
void start_input_thread();
void pause_input_thread();
std::pair<QStringList, QString> get_config_files();
void save(bool check_duplicates);
void SaveExit();
void CancelExit();

View file

@ -170,7 +170,17 @@
<item>
<widget class="QPushButton" name="b_addConfig">
<property name="text">
<string>Add Configuration</string>
<string>Add New</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_remConfig">
<property name="text">
<string>Remove</string>
</property>
<property name="autoDefault">
<bool>false</bool>