Merge pull request #4538 from valentinvanelslande/profiles
Add multiple input profile support
This commit is contained in:
commit
95a57a2fe3
14 changed files with 518 additions and 280 deletions
|
@ -2,6 +2,7 @@
|
|||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <algorithm>
|
||||
#include <unordered_map>
|
||||
#include <QSettings>
|
||||
#include "citra_qt/configuration/config.h"
|
||||
|
@ -51,43 +52,69 @@ const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> Config:
|
|||
|
||||
void Config::ReadValues() {
|
||||
qt_config->beginGroup("Controls");
|
||||
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
|
||||
std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
|
||||
Settings::values.buttons[i] =
|
||||
ReadSetting(Settings::NativeButton::mapping[i], QString::fromStdString(default_param))
|
||||
|
||||
Settings::values.current_input_profile_index = ReadSetting("profile", 0).toInt();
|
||||
|
||||
const auto append_profile = [this] {
|
||||
Settings::InputProfile profile;
|
||||
profile.name = ReadSetting("name", "default").toString().toStdString();
|
||||
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
|
||||
std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
|
||||
profile.buttons[i] = ReadSetting(Settings::NativeButton::mapping[i],
|
||||
QString::fromStdString(default_param))
|
||||
.toString()
|
||||
.toStdString();
|
||||
if (profile.buttons[i].empty())
|
||||
profile.buttons[i] = default_param;
|
||||
}
|
||||
for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
|
||||
std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
|
||||
default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
|
||||
default_analogs[i][3], default_analogs[i][4], 0.5f);
|
||||
profile.analogs[i] = ReadSetting(Settings::NativeAnalog::mapping[i],
|
||||
QString::fromStdString(default_param))
|
||||
.toString()
|
||||
.toStdString();
|
||||
if (profile.analogs[i].empty())
|
||||
profile.analogs[i] = default_param;
|
||||
}
|
||||
profile.motion_device =
|
||||
ReadSetting("motion_device",
|
||||
"engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0")
|
||||
.toString()
|
||||
.toStdString();
|
||||
if (Settings::values.buttons[i].empty())
|
||||
Settings::values.buttons[i] = default_param;
|
||||
}
|
||||
|
||||
for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
|
||||
std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
|
||||
default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
|
||||
default_analogs[i][3], default_analogs[i][4], 0.5f);
|
||||
Settings::values.analogs[i] =
|
||||
ReadSetting(Settings::NativeAnalog::mapping[i], QString::fromStdString(default_param))
|
||||
profile.touch_device =
|
||||
ReadSetting("touch_device", "engine:emu_window").toString().toStdString();
|
||||
profile.udp_input_address =
|
||||
ReadSetting("udp_input_address", InputCommon::CemuhookUDP::DEFAULT_ADDR)
|
||||
.toString()
|
||||
.toStdString();
|
||||
if (Settings::values.analogs[i].empty())
|
||||
Settings::values.analogs[i] = default_param;
|
||||
profile.udp_input_port = static_cast<u16>(
|
||||
ReadSetting("udp_input_port", InputCommon::CemuhookUDP::DEFAULT_PORT).toInt());
|
||||
profile.udp_pad_index = static_cast<u8>(ReadSetting("udp_pad_index", 0).toUInt());
|
||||
Settings::values.input_profiles.emplace_back(std::move(profile));
|
||||
};
|
||||
|
||||
int num_input_profiles = qt_config->beginReadArray("profiles");
|
||||
|
||||
for (int i = 0; i < num_input_profiles; ++i) {
|
||||
qt_config->setArrayIndex(i);
|
||||
append_profile();
|
||||
}
|
||||
|
||||
Settings::values.motion_device =
|
||||
ReadSetting("motion_device",
|
||||
"engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0")
|
||||
.toString()
|
||||
.toStdString();
|
||||
Settings::values.touch_device =
|
||||
ReadSetting("touch_device", "engine:emu_window").toString().toStdString();
|
||||
qt_config->endArray();
|
||||
|
||||
Settings::values.udp_input_address =
|
||||
ReadSetting("udp_input_address", InputCommon::CemuhookUDP::DEFAULT_ADDR)
|
||||
.toString()
|
||||
.toStdString();
|
||||
Settings::values.udp_input_port = static_cast<u16>(
|
||||
ReadSetting("udp_input_port", InputCommon::CemuhookUDP::DEFAULT_PORT).toInt());
|
||||
Settings::values.udp_pad_index = static_cast<u8>(ReadSetting("udp_pad_index", 0).toUInt());
|
||||
// create a input profile if no input profiles exist, with the default or old settings
|
||||
if (num_input_profiles == 0) {
|
||||
append_profile();
|
||||
num_input_profiles = 1;
|
||||
}
|
||||
|
||||
// ensure that the current input profile index is valid.
|
||||
Settings::values.current_input_profile_index =
|
||||
std::clamp(Settings::values.current_input_profile_index, 0, num_input_profiles - 1);
|
||||
|
||||
Settings::LoadProfile(Settings::values.current_input_profile_index);
|
||||
|
||||
qt_config->endGroup();
|
||||
|
||||
|
@ -271,8 +298,8 @@ void Config::ReadValues() {
|
|||
UISettings::values.game_dirs.append(game_dir);
|
||||
}
|
||||
qt_config->endArray();
|
||||
// create NAND and SD card directories if empty, these are not removable through the UI, also
|
||||
// carries over old game list settings if present
|
||||
// create NAND and SD card directories if empty, these are not removable through the UI,
|
||||
// also carries over old game list settings if present
|
||||
if (UISettings::values.game_dirs.isEmpty()) {
|
||||
UISettings::GameDir game_dir;
|
||||
game_dir.path = "INSTALLED";
|
||||
|
@ -356,29 +383,36 @@ void Config::ReadValues() {
|
|||
|
||||
void Config::SaveValues() {
|
||||
qt_config->beginGroup("Controls");
|
||||
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
|
||||
std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
|
||||
WriteSetting(QString::fromStdString(Settings::NativeButton::mapping[i]),
|
||||
QString::fromStdString(Settings::values.buttons[i]),
|
||||
QString::fromStdString(default_param));
|
||||
WriteSetting("profile", Settings::values.current_input_profile_index, 0);
|
||||
qt_config->beginWriteArray("profiles");
|
||||
for (std::size_t p = 0; p < Settings::values.input_profiles.size(); ++p) {
|
||||
qt_config->setArrayIndex(static_cast<int>(p));
|
||||
const auto& profile = Settings::values.input_profiles[p];
|
||||
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
|
||||
std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
|
||||
WriteSetting(QString::fromStdString(Settings::NativeButton::mapping[i]),
|
||||
QString::fromStdString(profile.buttons[i]),
|
||||
QString::fromStdString(default_param));
|
||||
}
|
||||
for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
|
||||
std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
|
||||
default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
|
||||
default_analogs[i][3], default_analogs[i][4], 0.5f);
|
||||
WriteSetting(QString::fromStdString(Settings::NativeAnalog::mapping[i]),
|
||||
QString::fromStdString(profile.analogs[i]),
|
||||
QString::fromStdString(default_param));
|
||||
}
|
||||
WriteSetting("motion_device", QString::fromStdString(profile.motion_device),
|
||||
"engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0");
|
||||
WriteSetting("touch_device", QString::fromStdString(profile.touch_device),
|
||||
"engine:emu_window");
|
||||
WriteSetting("udp_input_address", QString::fromStdString(profile.udp_input_address),
|
||||
InputCommon::CemuhookUDP::DEFAULT_ADDR);
|
||||
WriteSetting("udp_input_port", profile.udp_input_port,
|
||||
InputCommon::CemuhookUDP::DEFAULT_PORT);
|
||||
WriteSetting("udp_pad_index", profile.udp_pad_index, 0);
|
||||
}
|
||||
for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
|
||||
std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
|
||||
default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
|
||||
default_analogs[i][3], default_analogs[i][4], 0.5f);
|
||||
WriteSetting(QString::fromStdString(Settings::NativeAnalog::mapping[i]),
|
||||
QString::fromStdString(Settings::values.analogs[i]),
|
||||
QString::fromStdString(default_param));
|
||||
}
|
||||
WriteSetting("motion_device", QString::fromStdString(Settings::values.motion_device),
|
||||
"engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0");
|
||||
WriteSetting("touch_device", QString::fromStdString(Settings::values.touch_device),
|
||||
"engine:emu_window");
|
||||
WriteSetting("udp_input_address", QString::fromStdString(Settings::values.udp_input_address),
|
||||
InputCommon::CemuhookUDP::DEFAULT_ADDR);
|
||||
WriteSetting("udp_input_port", Settings::values.udp_input_port,
|
||||
InputCommon::CemuhookUDP::DEFAULT_PORT);
|
||||
WriteSetting("udp_pad_index", Settings::values.udp_pad_index, 0);
|
||||
qt_config->endArray();
|
||||
qt_config->endGroup();
|
||||
|
||||
qt_config->beginGroup("Core");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue