settings: Fix various issues with setting/getting current config

Sets title ID properly in SetCurrentTitleID and enuses proper reading/saving in qt config
This commit is contained in:
Zach Hilman
2018-10-19 15:15:41 -04:00
parent 4e80486361
commit e5a80d1ed4
4 changed files with 49 additions and 14 deletions

View File

@@ -64,6 +64,7 @@ void Values::SetCurrentTitleID(u64 title_id) {
return; return;
update_current_game(title_id, current_game); update_current_game(title_id, current_game);
current_title_id = title_id;
} }
PerGameValues& Values::operator[](u64 title_id) { PerGameValues& Values::operator[](u64 title_id) {

View File

@@ -122,7 +122,7 @@ Settings::PerGameValues ApplyValuesDelta(const Settings::PerGameValues& base,
return out; return out;
} }
void Config::ReadPerGameSettings(Settings::PerGameValues& values) { void Config::ReadPerGameSettings(Settings::PerGameValues& values) const {
qt_config->beginGroup("Controls"); qt_config->beginGroup("Controls");
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[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->endGroup();
qt_config->beginGroup("System"); qt_config->beginGroup("System");
values.use_docked_mode = qt_config->value("use_docked_mode", false).toBool();
qt_config->endGroup(); qt_config->endGroup();
qt_config->beginGroup("Renderer"); qt_config->beginGroup("Renderer");
@@ -194,7 +194,7 @@ void Config::ReadPerGameSettings(Settings::PerGameValues& values) {
qt_config->endGroup(); qt_config->endGroup();
} }
void Config::ReadPerGameSettingsDelta(PerGameValuesChange& values) { void Config::ReadPerGameSettingsDelta(PerGameValuesChange& values) const {
qt_config->beginGroup("Controls"); qt_config->beginGroup("Controls");
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
values.buttons[i] = qt_config values.buttons[i] = qt_config
@@ -246,23 +246,26 @@ void Config::ReadPerGameSettingsDelta(PerGameValuesChange& values) {
bool Config::UpdateCurrentGame(u64 title_id, Settings::PerGameValues& values) { bool Config::UpdateCurrentGame(u64 title_id, Settings::PerGameValues& values) {
if (Settings::values.CurrentTitleID() != 0) { if (Settings::values.CurrentTitleID() != 0) {
update_values.insert_or_assign(Settings::values.CurrentTitleID(), update_values.insert_or_assign(Settings::values.CurrentTitleID(), *Settings::values);
*Settings::values.operator->());
} }
if (update_values.find(title_id) != update_values.end()) { 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; return true;
} }
const auto size = qt_config->beginReadArray("Per Game Settings"); const auto size = qt_config->beginReadArray("Per Game Settings");
bool found = false;
for (int i = 0; i < size; ++i) { for (int i = 0; i < size; ++i) {
qt_config->setArrayIndex(i); qt_config->setArrayIndex(i);
const auto read_title_id = qt_config->value("title_id", 0).toULongLong(); const auto read_title_id = qt_config->value("title_id", 0).toULongLong();
if (read_title_id != title_id) if (read_title_id != title_id)
continue; continue;
found = true;
PerGameValuesChange changes{}; PerGameValuesChange changes{};
ReadPerGameSettings(values); ReadPerGameSettings(values);
ReadPerGameSettingsDelta(changes); ReadPerGameSettingsDelta(changes);
@@ -272,6 +275,9 @@ bool Config::UpdateCurrentGame(u64 title_id, Settings::PerGameValues& values) {
qt_config->endArray(); qt_config->endArray();
if (!found)
values = Settings::values.default_game;
return true; return true;
} }
@@ -455,11 +461,11 @@ void Config::SavePerGameSettings(const Settings::PerGameValues& values) {
void Config::SavePerGameSettingsDelta(const PerGameValuesChange& values) { void Config::SavePerGameSettingsDelta(const PerGameValuesChange& values) {
qt_config->beginGroup("Controls"); qt_config->beginGroup("Controls");
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 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]); values.buttons[i]);
} }
for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++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]); values.analogs[i]);
} }
qt_config->setValue("motion_device_changed", values.motion_device); qt_config->setValue("motion_device_changed", values.motion_device);
@@ -523,6 +529,18 @@ void Config::SaveValues() {
qt_config->setArrayIndex(i++); qt_config->setArrayIndex(i++);
qt_config->setValue("title_id", kv.first); qt_config->setValue("title_id", kv.first);
SavePerGameSettings(kv.second); 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(); qt_config->endArray();
@@ -625,10 +643,26 @@ void Config::Save() {
} }
PerGameValuesChange Config::GetPerGameSettingsDelta(u64 title_id) const { PerGameValuesChange Config::GetPerGameSettingsDelta(u64 title_id) const {
if (update_values_delta.find(title_id) == update_values_delta.end()) if (update_values_delta.find(title_id) != update_values_delta.end())
return {}; 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) { void Config::SetPerGameSettingsDelta(u64 title_id, PerGameValuesChange change) {

View File

@@ -67,8 +67,8 @@ private:
std::map<u64, Settings::PerGameValues> update_values; std::map<u64, Settings::PerGameValues> update_values;
std::map<u64, PerGameValuesChange> update_values_delta; std::map<u64, PerGameValuesChange> update_values_delta;
void ReadPerGameSettings(Settings::PerGameValues& values); void ReadPerGameSettings(Settings::PerGameValues& values) const;
void ReadPerGameSettingsDelta(PerGameValuesChange& values); void ReadPerGameSettingsDelta(PerGameValuesChange& values) const;
void SavePerGameSettings(const Settings::PerGameValues& values); void SavePerGameSettings(const Settings::PerGameValues& values);
void SavePerGameSettingsDelta(const PerGameValuesChange& values); void SavePerGameSettingsDelta(const PerGameValuesChange& values);
void ReadValues(); void ReadValues();

View File

@@ -262,7 +262,7 @@ void ConfigureInput::applyConfiguration() {
std::transform(analogs_delta.begin(), analogs_delta.end(), changes.analogs.begin(), std::transform(analogs_delta.begin(), analogs_delta.end(), changes.analogs.begin(),
[](const QCheckBox* box) { return box->isChecked(); }); [](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->buttons = temp.buttons;
Settings::values->analogs = temp.analogs; Settings::values->analogs = temp.analogs;
} }