From e5a80d1ed4ca8699311b9c79beb72719bf9e4d97 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Fri, 19 Oct 2018 15:15:41 -0400 Subject: [PATCH] settings: Fix various issues with setting/getting current config Sets title ID properly in SetCurrentTitleID and enuses proper reading/saving in qt config --- src/core/settings.cpp | 1 + src/yuzu/configuration/config.cpp | 56 +++++++++++++++++----- src/yuzu/configuration/config.h | 4 +- src/yuzu/configuration/configure_input.cpp | 2 +- 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 4bcc7b931d..1a0167583c 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -64,6 +64,7 @@ void Values::SetCurrentTitleID(u64 title_id) { return; update_current_game(title_id, current_game); + current_title_id = title_id; } PerGameValues& Values::operator[](u64 title_id) { diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 2f9bcb6f70..4ed6b6eb46 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -122,7 +122,7 @@ Settings::PerGameValues ApplyValuesDelta(const Settings::PerGameValues& base, return out; } -void Config::ReadPerGameSettings(Settings::PerGameValues& values) { +void Config::ReadPerGameSettings(Settings::PerGameValues& values) const { qt_config->beginGroup("Controls"); for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); @@ -158,7 +158,7 @@ void Config::ReadPerGameSettings(Settings::PerGameValues& values) { qt_config->endGroup(); qt_config->beginGroup("System"); - + values.use_docked_mode = qt_config->value("use_docked_mode", false).toBool(); qt_config->endGroup(); qt_config->beginGroup("Renderer"); @@ -194,7 +194,7 @@ void Config::ReadPerGameSettings(Settings::PerGameValues& values) { qt_config->endGroup(); } -void Config::ReadPerGameSettingsDelta(PerGameValuesChange& values) { +void Config::ReadPerGameSettingsDelta(PerGameValuesChange& values) const { qt_config->beginGroup("Controls"); for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { values.buttons[i] = qt_config @@ -246,23 +246,26 @@ void Config::ReadPerGameSettingsDelta(PerGameValuesChange& values) { bool Config::UpdateCurrentGame(u64 title_id, Settings::PerGameValues& values) { if (Settings::values.CurrentTitleID() != 0) { - update_values.insert_or_assign(Settings::values.CurrentTitleID(), - *Settings::values.operator->()); + update_values.insert_or_assign(Settings::values.CurrentTitleID(), *Settings::values); } if (update_values.find(title_id) != update_values.end()) { - values = update_values[title_id]; + values = ApplyValuesDelta(Settings::values.default_game, update_values[title_id], + GetPerGameSettingsDelta(title_id)); return true; } const auto size = qt_config->beginReadArray("Per Game Settings"); + bool found = false; for (int i = 0; i < size; ++i) { qt_config->setArrayIndex(i); const auto read_title_id = qt_config->value("title_id", 0).toULongLong(); if (read_title_id != title_id) continue; + found = true; + PerGameValuesChange changes{}; ReadPerGameSettings(values); ReadPerGameSettingsDelta(changes); @@ -272,6 +275,9 @@ bool Config::UpdateCurrentGame(u64 title_id, Settings::PerGameValues& values) { qt_config->endArray(); + if (!found) + values = Settings::values.default_game; + return true; } @@ -455,11 +461,11 @@ void Config::SavePerGameSettings(const Settings::PerGameValues& values) { void Config::SavePerGameSettingsDelta(const PerGameValuesChange& values) { qt_config->beginGroup("Controls"); for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { - qt_config->setValue(QString::fromStdString(Settings::NativeButton::mapping[i]), + qt_config->setValue(QString::fromStdString(Settings::NativeButton::mapping[i]) + "_changed", values.buttons[i]); } for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { - qt_config->setValue(QString::fromStdString(Settings::NativeAnalog::mapping[i]), + qt_config->setValue(QString::fromStdString(Settings::NativeAnalog::mapping[i]) + "_changed", values.analogs[i]); } qt_config->setValue("motion_device_changed", values.motion_device); @@ -523,6 +529,18 @@ void Config::SaveValues() { qt_config->setArrayIndex(i++); qt_config->setValue("title_id", kv.first); SavePerGameSettings(kv.second); + + const auto iter = update_values_delta.find(kv.first); + if (iter != update_values_delta.end()) { + SavePerGameSettingsDelta(iter->second); + } else { + LOG_WARNING( + Config, + "Missing values delta for title_id={:016X}! Falling back to default-derived delta.", + kv.first); + SavePerGameSettingsDelta( + CalculateValuesDelta(Settings::values.default_game, kv.second)); + } } qt_config->endArray(); @@ -625,10 +643,26 @@ void Config::Save() { } PerGameValuesChange Config::GetPerGameSettingsDelta(u64 title_id) const { - if (update_values_delta.find(title_id) == update_values_delta.end()) - return {}; + if (update_values_delta.find(title_id) != update_values_delta.end()) + return update_values_delta.at(title_id); - return update_values_delta.at(title_id); + const auto size = qt_config->beginReadArray("Per Game Settings"); + + for (int i = 0; i < size; ++i) { + qt_config->setArrayIndex(i); + const auto read_title_id = qt_config->value("title_id", 0).toULongLong(); + if (read_title_id != title_id) + continue; + + PerGameValuesChange changes{}; + ReadPerGameSettingsDelta(changes); + qt_config->endArray(); + return changes; + } + + qt_config->endArray(); + + return {}; } void Config::SetPerGameSettingsDelta(u64 title_id, PerGameValuesChange change) { diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index f481b56ca2..02676a7f5d 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -67,8 +67,8 @@ private: std::map update_values; std::map update_values_delta; - void ReadPerGameSettings(Settings::PerGameValues& values); - void ReadPerGameSettingsDelta(PerGameValuesChange& values); + void ReadPerGameSettings(Settings::PerGameValues& values) const; + void ReadPerGameSettingsDelta(PerGameValuesChange& values) const; void SavePerGameSettings(const Settings::PerGameValues& values); void SavePerGameSettingsDelta(const PerGameValuesChange& values); void ReadValues(); diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 295132d1b0..ddb27eda78 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -262,7 +262,7 @@ void ConfigureInput::applyConfiguration() { std::transform(analogs_delta.begin(), analogs_delta.end(), changes.analogs.begin(), [](const QCheckBox* box) { return box->isChecked(); }); - temp = ApplyValuesDelta(*Settings::values, temp, changes); + temp = ApplyValuesDelta(Settings::values.default_game, temp, changes); Settings::values->buttons = temp.buttons; Settings::values->analogs = temp.analogs; }