Merge pull request #4538 from valentinvanelslande/profiles

Add multiple input profile support
This commit is contained in:
Weiyi Wang 2019-01-17 22:32:24 -05:00 committed by GitHub
commit 95a57a2fe3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 518 additions and 280 deletions

View file

@ -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");