diff options
| -rw-r--r-- | src/android/app/src/main/jni/android_config.cpp | 5 | ||||
| -rw-r--r-- | src/frontend_common/config.cpp | 194 | ||||
| -rw-r--r-- | src/frontend_common/config.h | 28 | ||||
| -rw-r--r-- | src/yuzu/configuration/qt_config.cpp | 69 | ||||
| -rw-r--r-- | src/yuzu_cmd/sdl_config.cpp | 26 |
5 files changed, 188 insertions, 134 deletions
diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index 9c3a5a9b2..fb17ab6f6 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp | |||
| @@ -114,8 +114,9 @@ void AndroidConfig::SavePathValues() { | |||
| 114 | for (size_t i = 0; i < AndroidSettings::values.game_dirs.size(); ++i) { | 114 | for (size_t i = 0; i < AndroidSettings::values.game_dirs.size(); ++i) { |
| 115 | SetArrayIndex(i); | 115 | SetArrayIndex(i); |
| 116 | const auto& game_dir = AndroidSettings::values.game_dirs[i]; | 116 | const auto& game_dir = AndroidSettings::values.game_dirs[i]; |
| 117 | WriteSetting(std::string("path"), game_dir.path); | 117 | WriteStringSetting(std::string("path"), game_dir.path); |
| 118 | WriteSetting(std::string("deep_scan"), game_dir.deep_scan, std::make_optional(false)); | 118 | WriteBooleanSetting(std::string("deep_scan"), game_dir.deep_scan, |
| 119 | std::make_optional(false)); | ||
| 119 | } | 120 | } |
| 120 | EndArray(); | 121 | EndArray(); |
| 121 | 122 | ||
diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp index d9f99148b..51576b4ee 100644 --- a/src/frontend_common/config.cpp +++ b/src/frontend_common/config.cpp | |||
| @@ -403,59 +403,63 @@ void Config::SavePlayerValues(const std::size_t player_index) { | |||
| 403 | // No custom profile selected | 403 | // No custom profile selected |
| 404 | return; | 404 | return; |
| 405 | } | 405 | } |
| 406 | WriteSetting(std::string(player_prefix).append("profile_name"), player.profile_name, | 406 | WriteStringSetting(std::string(player_prefix).append("profile_name"), player.profile_name, |
| 407 | std::make_optional(std::string(""))); | 407 | std::make_optional(std::string(""))); |
| 408 | } | 408 | } |
| 409 | 409 | ||
| 410 | WriteSetting(std::string(player_prefix).append("type"), static_cast<u8>(player.controller_type), | 410 | WriteIntegerSetting( |
| 411 | std::make_optional(static_cast<u8>(Settings::ControllerType::ProController))); | 411 | std::string(player_prefix).append("type"), static_cast<u8>(player.controller_type), |
| 412 | std::make_optional(static_cast<u8>(Settings::ControllerType::ProController))); | ||
| 412 | 413 | ||
| 413 | if (!player_prefix.empty() || !Settings::IsConfiguringGlobal()) { | 414 | if (!player_prefix.empty() || !Settings::IsConfiguringGlobal()) { |
| 414 | WriteSetting(std::string(player_prefix).append("connected"), player.connected, | 415 | WriteBooleanSetting(std::string(player_prefix).append("connected"), player.connected, |
| 415 | std::make_optional(player_index == 0)); | 416 | std::make_optional(player_index == 0)); |
| 416 | WriteSetting(std::string(player_prefix).append("vibration_enabled"), | 417 | WriteIntegerSetting(std::string(player_prefix).append("vibration_enabled"), |
| 417 | player.vibration_enabled, std::make_optional(true)); | 418 | player.vibration_enabled, std::make_optional(true)); |
| 418 | WriteSetting(std::string(player_prefix).append("vibration_strength"), | 419 | WriteIntegerSetting(std::string(player_prefix).append("vibration_strength"), |
| 419 | player.vibration_strength, std::make_optional(100)); | 420 | player.vibration_strength, std::make_optional(100)); |
| 420 | WriteSetting(std::string(player_prefix).append("body_color_left"), player.body_color_left, | 421 | WriteIntegerSetting(std::string(player_prefix).append("body_color_left"), |
| 421 | std::make_optional(Settings::JOYCON_BODY_NEON_BLUE)); | 422 | player.body_color_left, |
| 422 | WriteSetting(std::string(player_prefix).append("body_color_right"), player.body_color_right, | 423 | std::make_optional(Settings::JOYCON_BODY_NEON_BLUE)); |
| 423 | std::make_optional(Settings::JOYCON_BODY_NEON_RED)); | 424 | WriteIntegerSetting(std::string(player_prefix).append("body_color_right"), |
| 424 | WriteSetting(std::string(player_prefix).append("button_color_left"), | 425 | player.body_color_right, |
| 425 | player.button_color_left, | 426 | std::make_optional(Settings::JOYCON_BODY_NEON_RED)); |
| 426 | std::make_optional(Settings::JOYCON_BUTTONS_NEON_BLUE)); | 427 | WriteIntegerSetting(std::string(player_prefix).append("button_color_left"), |
| 427 | WriteSetting(std::string(player_prefix).append("button_color_right"), | 428 | player.button_color_left, |
| 428 | player.button_color_right, | 429 | std::make_optional(Settings::JOYCON_BUTTONS_NEON_BLUE)); |
| 429 | std::make_optional(Settings::JOYCON_BUTTONS_NEON_RED)); | 430 | WriteIntegerSetting(std::string(player_prefix).append("button_color_right"), |
| 431 | player.button_color_right, | ||
| 432 | std::make_optional(Settings::JOYCON_BUTTONS_NEON_RED)); | ||
| 430 | } | 433 | } |
| 431 | } | 434 | } |
| 432 | 435 | ||
| 433 | void Config::SaveTouchscreenValues() { | 436 | void Config::SaveTouchscreenValues() { |
| 434 | const auto& touchscreen = Settings::values.touchscreen; | 437 | const auto& touchscreen = Settings::values.touchscreen; |
| 435 | 438 | ||
| 436 | WriteSetting(std::string("touchscreen_enabled"), touchscreen.enabled, std::make_optional(true)); | 439 | WriteBooleanSetting(std::string("touchscreen_enabled"), touchscreen.enabled, |
| 440 | std::make_optional(true)); | ||
| 437 | 441 | ||
| 438 | WriteSetting(std::string("touchscreen_angle"), touchscreen.rotation_angle, | 442 | WriteIntegerSetting(std::string("touchscreen_angle"), touchscreen.rotation_angle, |
| 439 | std::make_optional(static_cast<u32>(0))); | 443 | std::make_optional(static_cast<u32>(0))); |
| 440 | WriteSetting(std::string("touchscreen_diameter_x"), touchscreen.diameter_x, | 444 | WriteIntegerSetting(std::string("touchscreen_diameter_x"), touchscreen.diameter_x, |
| 441 | std::make_optional(static_cast<u32>(15))); | 445 | std::make_optional(static_cast<u32>(15))); |
| 442 | WriteSetting(std::string("touchscreen_diameter_y"), touchscreen.diameter_y, | 446 | WriteIntegerSetting(std::string("touchscreen_diameter_y"), touchscreen.diameter_y, |
| 443 | std::make_optional(static_cast<u32>(15))); | 447 | std::make_optional(static_cast<u32>(15))); |
| 444 | } | 448 | } |
| 445 | 449 | ||
| 446 | void Config::SaveMotionTouchValues() { | 450 | void Config::SaveMotionTouchValues() { |
| 447 | BeginArray(std::string("touch_from_button_maps")); | 451 | BeginArray(std::string("touch_from_button_maps")); |
| 448 | for (std::size_t p = 0; p < Settings::values.touch_from_button_maps.size(); ++p) { | 452 | for (std::size_t p = 0; p < Settings::values.touch_from_button_maps.size(); ++p) { |
| 449 | SetArrayIndex(static_cast<int>(p)); | 453 | SetArrayIndex(static_cast<int>(p)); |
| 450 | WriteSetting(std::string("name"), Settings::values.touch_from_button_maps[p].name, | 454 | WriteStringSetting(std::string("name"), Settings::values.touch_from_button_maps[p].name, |
| 451 | std::make_optional(std::string("default"))); | 455 | std::make_optional(std::string("default"))); |
| 452 | 456 | ||
| 453 | BeginArray(std::string("entries")); | 457 | BeginArray(std::string("entries")); |
| 454 | for (std::size_t q = 0; q < Settings::values.touch_from_button_maps[p].buttons.size(); | 458 | for (std::size_t q = 0; q < Settings::values.touch_from_button_maps[p].buttons.size(); |
| 455 | ++q) { | 459 | ++q) { |
| 456 | SetArrayIndex(static_cast<int>(q)); | 460 | SetArrayIndex(static_cast<int>(q)); |
| 457 | WriteSetting(std::string("bind"), | 461 | WriteStringSetting(std::string("bind"), |
| 458 | Settings::values.touch_from_button_maps[p].buttons[q]); | 462 | Settings::values.touch_from_button_maps[p].buttons[q]); |
| 459 | } | 463 | } |
| 460 | EndArray(); // entries | 464 | EndArray(); // entries |
| 461 | } | 465 | } |
| @@ -520,16 +524,16 @@ void Config::SaveCoreValues() { | |||
| 520 | void Config::SaveDataStorageValues() { | 524 | void Config::SaveDataStorageValues() { |
| 521 | BeginGroup(Settings::TranslateCategory(Settings::Category::DataStorage)); | 525 | BeginGroup(Settings::TranslateCategory(Settings::Category::DataStorage)); |
| 522 | 526 | ||
| 523 | WriteSetting(std::string("nand_directory"), FS::GetYuzuPathString(FS::YuzuPath::NANDDir), | 527 | WriteStringSetting(std::string("nand_directory"), FS::GetYuzuPathString(FS::YuzuPath::NANDDir), |
| 524 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::NANDDir))); | 528 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::NANDDir))); |
| 525 | WriteSetting(std::string("sdmc_directory"), FS::GetYuzuPathString(FS::YuzuPath::SDMCDir), | 529 | WriteStringSetting(std::string("sdmc_directory"), FS::GetYuzuPathString(FS::YuzuPath::SDMCDir), |
| 526 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::SDMCDir))); | 530 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::SDMCDir))); |
| 527 | WriteSetting(std::string("load_directory"), FS::GetYuzuPathString(FS::YuzuPath::LoadDir), | 531 | WriteStringSetting(std::string("load_directory"), FS::GetYuzuPathString(FS::YuzuPath::LoadDir), |
| 528 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::LoadDir))); | 532 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::LoadDir))); |
| 529 | WriteSetting(std::string("dump_directory"), FS::GetYuzuPathString(FS::YuzuPath::DumpDir), | 533 | WriteStringSetting(std::string("dump_directory"), FS::GetYuzuPathString(FS::YuzuPath::DumpDir), |
| 530 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::DumpDir))); | 534 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::DumpDir))); |
| 531 | WriteSetting(std::string("tas_directory"), FS::GetYuzuPathString(FS::YuzuPath::TASDir), | 535 | WriteStringSetting(std::string("tas_directory"), FS::GetYuzuPathString(FS::YuzuPath::TASDir), |
| 532 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::TASDir))); | 536 | std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::TASDir))); |
| 533 | 537 | ||
| 534 | WriteCategory(Settings::Category::DataStorage); | 538 | WriteCategory(Settings::Category::DataStorage); |
| 535 | 539 | ||
| @@ -540,7 +544,7 @@ void Config::SaveDebuggingValues() { | |||
| 540 | BeginGroup(Settings::TranslateCategory(Settings::Category::Debugging)); | 544 | BeginGroup(Settings::TranslateCategory(Settings::Category::Debugging)); |
| 541 | 545 | ||
| 542 | // Intentionally not using the QT default setting as this is intended to be changed in the ini | 546 | // Intentionally not using the QT default setting as this is intended to be changed in the ini |
| 543 | WriteSetting(std::string("record_frame_times"), Settings::values.record_frame_times); | 547 | WriteBooleanSetting(std::string("record_frame_times"), Settings::values.record_frame_times); |
| 544 | 548 | ||
| 545 | WriteCategory(Settings::Category::Debugging); | 549 | WriteCategory(Settings::Category::Debugging); |
| 546 | WriteCategory(Settings::Category::DebuggingGraphics); | 550 | WriteCategory(Settings::Category::DebuggingGraphics); |
| @@ -564,11 +568,13 @@ void Config::SaveDisabledAddOnValues() { | |||
| 564 | BeginArray(std::string("")); | 568 | BeginArray(std::string("")); |
| 565 | for (const auto& elem : Settings::values.disabled_addons) { | 569 | for (const auto& elem : Settings::values.disabled_addons) { |
| 566 | SetArrayIndex(i); | 570 | SetArrayIndex(i); |
| 567 | WriteSetting(std::string("title_id"), elem.first, std::make_optional(static_cast<u64>(0))); | 571 | WriteIntegerSetting(std::string("title_id"), elem.first, |
| 572 | std::make_optional(static_cast<u64>(0))); | ||
| 568 | BeginArray(std::string("disabled")); | 573 | BeginArray(std::string("disabled")); |
| 569 | for (std::size_t j = 0; j < elem.second.size(); ++j) { | 574 | for (std::size_t j = 0; j < elem.second.size(); ++j) { |
| 570 | SetArrayIndex(static_cast<int>(j)); | 575 | SetArrayIndex(static_cast<int>(j)); |
| 571 | WriteSetting(std::string("d"), elem.second[j], std::make_optional(std::string(""))); | 576 | WriteStringSetting(std::string("d"), elem.second[j], |
| 577 | std::make_optional(std::string(""))); | ||
| 572 | } | 578 | } |
| 573 | EndArray(); // disabled | 579 | EndArray(); // disabled |
| 574 | ++i; | 580 | ++i; |
| @@ -609,8 +615,8 @@ void Config::SaveRendererValues() { | |||
| 609 | void Config::SaveScreenshotValues() { | 615 | void Config::SaveScreenshotValues() { |
| 610 | BeginGroup(Settings::TranslateCategory(Settings::Category::Screenshots)); | 616 | BeginGroup(Settings::TranslateCategory(Settings::Category::Screenshots)); |
| 611 | 617 | ||
| 612 | WriteSetting(std::string("screenshot_path"), | 618 | WriteStringSetting(std::string("screenshot_path"), |
| 613 | FS::GetYuzuPathString(FS::YuzuPath::ScreenshotsDir)); | 619 | FS::GetYuzuPathString(FS::YuzuPath::ScreenshotsDir)); |
| 614 | WriteCategory(Settings::Category::Screenshots); | 620 | WriteCategory(Settings::Category::Screenshots); |
| 615 | 621 | ||
| 616 | EndGroup(); | 622 | EndGroup(); |
| @@ -746,46 +752,70 @@ bool Config::Exists(const std::string& section, const std::string& key) const { | |||
| 746 | return !value.empty(); | 752 | return !value.empty(); |
| 747 | } | 753 | } |
| 748 | 754 | ||
| 749 | template <typename Type> | 755 | void Config::WriteBooleanSetting(const std::string& key, const bool& value, |
| 750 | void Config::WriteSetting(const std::string& key, const Type& value, | 756 | const std::optional<bool>& default_value, |
| 751 | const std::optional<Type>& default_value, | 757 | const std::optional<bool>& use_global) { |
| 752 | const std::optional<bool>& use_global) { | 758 | std::optional<std::string> string_default = std::nullopt; |
| 753 | std::string full_key = GetFullKey(key, false); | 759 | if (default_value.has_value()) { |
| 760 | string_default = std::make_optional(ToString(default_value.value())); | ||
| 761 | } | ||
| 762 | WritePreparedSetting(key, AdjustOutputString(ToString(value)), string_default, use_global); | ||
| 763 | } | ||
| 754 | 764 | ||
| 755 | std::string saved_value; | 765 | template <typename T> |
| 756 | std::string string_default; | 766 | std::enable_if_t<std::is_integral_v<T>> Config::WriteIntegerSetting( |
| 757 | if constexpr (std::is_same_v<Type, std::string>) { | 767 | const std::string& key, const T& value, const std::optional<T>& default_value, |
| 758 | saved_value.append(AdjustOutputString(value)); | 768 | const std::optional<bool>& use_global) { |
| 759 | if (default_value.has_value()) { | 769 | std::optional<std::string> string_default = std::nullopt; |
| 760 | string_default.append(AdjustOutputString(default_value.value())); | 770 | if (default_value.has_value()) { |
| 761 | } | 771 | string_default = std::make_optional(ToString(default_value.value())); |
| 762 | } else { | 772 | } |
| 763 | saved_value.append(AdjustOutputString(ToString(value))); | 773 | WritePreparedSetting(key, AdjustOutputString(ToString(value)), string_default, use_global); |
| 764 | if (default_value.has_value()) { | 774 | } |
| 765 | string_default.append(ToString(default_value.value())); | 775 | |
| 766 | } | 776 | void Config::WriteDoubleSetting(const std::string& key, const double& value, |
| 777 | const std::optional<double>& default_value, | ||
| 778 | const std::optional<bool>& use_global) { | ||
| 779 | std::optional<std::string> string_default = std::nullopt; | ||
| 780 | if (default_value.has_value()) { | ||
| 781 | string_default = std::make_optional(ToString(default_value.value())); | ||
| 767 | } | 782 | } |
| 783 | WritePreparedSetting(key, AdjustOutputString(ToString(value)), string_default, use_global); | ||
| 784 | } | ||
| 768 | 785 | ||
| 769 | if (default_value.has_value() && use_global.has_value()) { | 786 | void Config::WriteStringSetting(const std::string& key, const std::string& value, |
| 787 | const std::optional<std::string>& default_value, | ||
| 788 | const std::optional<bool>& use_global) { | ||
| 789 | std::optional string_default = default_value; | ||
| 790 | if (default_value.has_value()) { | ||
| 791 | string_default.value().append(AdjustOutputString(default_value.value())); | ||
| 792 | } | ||
| 793 | WritePreparedSetting(key, AdjustOutputString(value), string_default, use_global); | ||
| 794 | } | ||
| 795 | |||
| 796 | void Config::WritePreparedSetting(const std::string& key, const std::string& adjusted_value, | ||
| 797 | const std::optional<std::string>& adjusted_default_value, | ||
| 798 | const std::optional<bool>& use_global) { | ||
| 799 | std::string full_key = GetFullKey(key, false); | ||
| 800 | if (adjusted_default_value.has_value() && use_global.has_value()) { | ||
| 770 | if (!global) { | 801 | if (!global) { |
| 771 | WriteSettingInternal(std::string(full_key).append("\\global"), | 802 | WriteString(std::string(full_key).append("\\global"), ToString(use_global.value())); |
| 772 | ToString(use_global.value())); | ||
| 773 | } | 803 | } |
| 774 | if (global || use_global.value() == false) { | 804 | if (global || use_global.value() == false) { |
| 775 | WriteSettingInternal(std::string(full_key).append("\\default"), | 805 | WriteString(std::string(full_key).append("\\default"), |
| 776 | ToString(string_default == saved_value)); | 806 | ToString(adjusted_default_value == adjusted_value)); |
| 777 | WriteSettingInternal(full_key, saved_value); | 807 | WriteString(full_key, adjusted_value); |
| 778 | } | 808 | } |
| 779 | } else if (default_value.has_value() && !use_global.has_value()) { | 809 | } else if (adjusted_default_value.has_value() && !use_global.has_value()) { |
| 780 | WriteSettingInternal(std::string(full_key).append("\\default"), | 810 | WriteString(std::string(full_key).append("\\default"), |
| 781 | ToString(string_default == saved_value)); | 811 | ToString(adjusted_default_value == adjusted_value)); |
| 782 | WriteSettingInternal(full_key, saved_value); | 812 | WriteString(full_key, adjusted_value); |
| 783 | } else { | 813 | } else { |
| 784 | WriteSettingInternal(full_key, saved_value); | 814 | WriteString(full_key, adjusted_value); |
| 785 | } | 815 | } |
| 786 | } | 816 | } |
| 787 | 817 | ||
| 788 | void Config::WriteSettingInternal(const std::string& key, const std::string& value) { | 818 | void Config::WriteString(const std::string& key, const std::string& value) { |
| 789 | config->SetValue(GetSection().c_str(), key.c_str(), value.c_str()); | 819 | config->SetValue(GetSection().c_str(), key.c_str(), value.c_str()); |
| 790 | } | 820 | } |
| 791 | 821 | ||
| @@ -861,17 +891,17 @@ void Config::WriteSettingGeneric(const Settings::BasicSetting* const setting) { | |||
| 861 | std::string key = AdjustKey(setting->GetLabel()); | 891 | std::string key = AdjustKey(setting->GetLabel()); |
| 862 | if (setting->Switchable()) { | 892 | if (setting->Switchable()) { |
| 863 | if (!global) { | 893 | if (!global) { |
| 864 | WriteSetting(std::string(key).append("\\use_global"), setting->UsingGlobal()); | 894 | WriteBooleanSetting(std::string(key).append("\\use_global"), setting->UsingGlobal()); |
| 865 | } | 895 | } |
| 866 | if (global || !setting->UsingGlobal()) { | 896 | if (global || !setting->UsingGlobal()) { |
| 867 | WriteSetting(std::string(key).append("\\default"), | 897 | WriteBooleanSetting(std::string(key).append("\\default"), |
| 868 | setting->ToString() == setting->DefaultToString()); | 898 | setting->ToString() == setting->DefaultToString()); |
| 869 | WriteSetting(key, setting->ToString()); | 899 | WriteStringSetting(key, setting->ToString()); |
| 870 | } | 900 | } |
| 871 | } else if (global) { | 901 | } else if (global) { |
| 872 | WriteSetting(std::string(key).append("\\default"), | 902 | WriteBooleanSetting(std::string(key).append("\\default"), |
| 873 | setting->ToString() == setting->DefaultToString()); | 903 | setting->ToString() == setting->DefaultToString()); |
| 874 | WriteSetting(key, setting->ToString()); | 904 | WriteStringSetting(key, setting->ToString()); |
| 875 | } | 905 | } |
| 876 | } | 906 | } |
| 877 | 907 | ||
diff --git a/src/frontend_common/config.h b/src/frontend_common/config.h index b3812af17..e73cf6929 100644 --- a/src/frontend_common/config.h +++ b/src/frontend_common/config.h | |||
| @@ -154,11 +154,20 @@ protected: | |||
| 154 | * @param use_global Specifies if the custom or global config should be in use, for custom | 154 | * @param use_global Specifies if the custom or global config should be in use, for custom |
| 155 | * configs | 155 | * configs |
| 156 | */ | 156 | */ |
| 157 | template <typename Type = int> | 157 | void WriteBooleanSetting(const std::string& key, const bool& value, |
| 158 | void WriteSetting(const std::string& key, const Type& value, | 158 | const std::optional<bool>& default_value = std::nullopt, |
| 159 | const std::optional<Type>& default_value = std::nullopt, | 159 | const std::optional<bool>& use_global = std::nullopt); |
| 160 | const std::optional<bool>& use_global = std::nullopt); | 160 | template <typename T> |
| 161 | void WriteSettingInternal(const std::string& key, const std::string& value); | 161 | std::enable_if_t<std::is_integral_v<T>> WriteIntegerSetting( |
| 162 | const std::string& key, const T& value, | ||
| 163 | const std::optional<T>& default_value = std::nullopt, | ||
| 164 | const std::optional<bool>& use_global = std::nullopt); | ||
| 165 | void WriteDoubleSetting(const std::string& key, const double& value, | ||
| 166 | const std::optional<double>& default_value = std::nullopt, | ||
| 167 | const std::optional<bool>& use_global = std::nullopt); | ||
| 168 | void WriteStringSetting(const std::string& key, const std::string& value, | ||
| 169 | const std::optional<std::string>& default_value = std::nullopt, | ||
| 170 | const std::optional<bool>& use_global = std::nullopt); | ||
| 162 | 171 | ||
| 163 | void ReadCategory(Settings::Category category); | 172 | void ReadCategory(Settings::Category category); |
| 164 | void WriteCategory(Settings::Category category); | 173 | void WriteCategory(Settings::Category category); |
| @@ -175,8 +184,10 @@ protected: | |||
| 175 | return value_ ? "true" : "false"; | 184 | return value_ ? "true" : "false"; |
| 176 | } else if constexpr (std::is_same_v<T, u64>) { | 185 | } else if constexpr (std::is_same_v<T, u64>) { |
| 177 | return std::to_string(static_cast<u64>(value_)); | 186 | return std::to_string(static_cast<u64>(value_)); |
| 178 | } else { | 187 | } else if constexpr (std::is_same_v<T, s64>) { |
| 179 | return std::to_string(static_cast<s64>(value_)); | 188 | return std::to_string(static_cast<s64>(value_)); |
| 189 | } else { | ||
| 190 | return std::to_string(value_); | ||
| 180 | } | 191 | } |
| 181 | } | 192 | } |
| 182 | 193 | ||
| @@ -197,6 +208,11 @@ protected: | |||
| 197 | const bool global; | 208 | const bool global; |
| 198 | 209 | ||
| 199 | private: | 210 | private: |
| 211 | void WritePreparedSetting(const std::string& key, const std::string& adjusted_value, | ||
| 212 | const std::optional<std::string>& adjusted_default_value, | ||
| 213 | const std::optional<bool>& use_global); | ||
| 214 | void WriteString(const std::string& key, const std::string& value); | ||
| 215 | |||
| 200 | inline static std::array<char, 19> special_characters = {'!', '#', '$', '%', '^', '&', '*', | 216 | inline static std::array<char, 19> special_characters = {'!', '#', '$', '%', '^', '&', '*', |
| 201 | '|', ';', '\'', '\"', ',', '<', '.', | 217 | '|', ';', '\'', '\"', ',', '<', '.', |
| 202 | '>', '?', '`', '~', '='}; | 218 | '>', '?', '`', '~', '='}; |
diff --git a/src/yuzu/configuration/qt_config.cpp b/src/yuzu/configuration/qt_config.cpp index a71000b72..6aca71d7c 100644 --- a/src/yuzu/configuration/qt_config.cpp +++ b/src/yuzu/configuration/qt_config.cpp | |||
| @@ -348,43 +348,45 @@ void QtConfig::SaveQtPlayerValues(const std::size_t player_index) { | |||
| 348 | 348 | ||
| 349 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { | 349 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { |
| 350 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); | 350 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); |
| 351 | WriteSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]), | 351 | WriteStringSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]), |
| 352 | player.buttons[i], std::make_optional(default_param)); | 352 | player.buttons[i], std::make_optional(default_param)); |
| 353 | } | 353 | } |
| 354 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { | 354 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { |
| 355 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( | 355 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( |
| 356 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], | 356 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], |
| 357 | default_analogs[i][3], default_stick_mod[i], 0.5f); | 357 | default_analogs[i][3], default_stick_mod[i], 0.5f); |
| 358 | WriteSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]), | 358 | WriteStringSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]), |
| 359 | player.analogs[i], std::make_optional(default_param)); | 359 | player.analogs[i], std::make_optional(default_param)); |
| 360 | } | 360 | } |
| 361 | for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { | 361 | for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { |
| 362 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); | 362 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); |
| 363 | WriteSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]), | 363 | WriteStringSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]), |
| 364 | player.motions[i], std::make_optional(default_param)); | 364 | player.motions[i], std::make_optional(default_param)); |
| 365 | } | 365 | } |
| 366 | } | 366 | } |
| 367 | 367 | ||
| 368 | void QtConfig::SaveDebugControlValues() { | 368 | void QtConfig::SaveDebugControlValues() { |
| 369 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { | 369 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { |
| 370 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); | 370 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); |
| 371 | WriteSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]), | 371 | WriteStringSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]), |
| 372 | Settings::values.debug_pad_buttons[i], std::make_optional(default_param)); | 372 | Settings::values.debug_pad_buttons[i], |
| 373 | std::make_optional(default_param)); | ||
| 373 | } | 374 | } |
| 374 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { | 375 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { |
| 375 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( | 376 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( |
| 376 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], | 377 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], |
| 377 | default_analogs[i][3], default_stick_mod[i], 0.5f); | 378 | default_analogs[i][3], default_stick_mod[i], 0.5f); |
| 378 | WriteSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]), | 379 | WriteStringSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]), |
| 379 | Settings::values.debug_pad_analogs[i], std::make_optional(default_param)); | 380 | Settings::values.debug_pad_analogs[i], |
| 381 | std::make_optional(default_param)); | ||
| 380 | } | 382 | } |
| 381 | } | 383 | } |
| 382 | 384 | ||
| 383 | void QtConfig::SaveHidbusValues() { | 385 | void QtConfig::SaveHidbusValues() { |
| 384 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( | 386 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( |
| 385 | 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f); | 387 | 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f); |
| 386 | WriteSetting(std::string("ring_controller"), Settings::values.ringcon_analogs, | 388 | WriteStringSetting(std::string("ring_controller"), Settings::values.ringcon_analogs, |
| 387 | std::make_optional(default_param)); | 389 | std::make_optional(default_param)); |
| 388 | } | 390 | } |
| 389 | 391 | ||
| 390 | void QtConfig::SaveQtControlValues() { | 392 | void QtConfig::SaveQtControlValues() { |
| @@ -409,19 +411,20 @@ void QtConfig::SavePathValues() { | |||
| 409 | 411 | ||
| 410 | WriteCategory(Settings::Category::Paths); | 412 | WriteCategory(Settings::Category::Paths); |
| 411 | 413 | ||
| 412 | WriteSetting(std::string("romsPath"), UISettings::values.roms_path); | 414 | WriteStringSetting(std::string("romsPath"), UISettings::values.roms_path); |
| 413 | BeginArray(std::string("gamedirs")); | 415 | BeginArray(std::string("gamedirs")); |
| 414 | for (int i = 0; i < UISettings::values.game_dirs.size(); ++i) { | 416 | for (int i = 0; i < UISettings::values.game_dirs.size(); ++i) { |
| 415 | SetArrayIndex(i); | 417 | SetArrayIndex(i); |
| 416 | const auto& game_dir = UISettings::values.game_dirs[i]; | 418 | const auto& game_dir = UISettings::values.game_dirs[i]; |
| 417 | WriteSetting(std::string("path"), game_dir.path); | 419 | WriteStringSetting(std::string("path"), game_dir.path); |
| 418 | WriteSetting(std::string("deep_scan"), game_dir.deep_scan, std::make_optional(false)); | 420 | WriteBooleanSetting(std::string("deep_scan"), game_dir.deep_scan, |
| 419 | WriteSetting(std::string("expanded"), game_dir.expanded, std::make_optional(true)); | 421 | std::make_optional(false)); |
| 422 | WriteBooleanSetting(std::string("expanded"), game_dir.expanded, std::make_optional(true)); | ||
| 420 | } | 423 | } |
| 421 | EndArray(); | 424 | EndArray(); |
| 422 | 425 | ||
| 423 | WriteSetting(std::string("recentFiles"), | 426 | WriteStringSetting(std::string("recentFiles"), |
| 424 | UISettings::values.recent_files.join(QStringLiteral(", ")).toStdString()); | 427 | UISettings::values.recent_files.join(QStringLiteral(", ")).toStdString()); |
| 425 | 428 | ||
| 426 | EndGroup(); | 429 | EndGroup(); |
| 427 | } | 430 | } |
| @@ -438,14 +441,14 @@ void QtConfig::SaveShortcutValues() { | |||
| 438 | BeginGroup(group); | 441 | BeginGroup(group); |
| 439 | BeginGroup(name); | 442 | BeginGroup(name); |
| 440 | 443 | ||
| 441 | WriteSetting(std::string("KeySeq"), shortcut.keyseq, | 444 | WriteStringSetting(std::string("KeySeq"), shortcut.keyseq, |
| 442 | std::make_optional(default_hotkey.keyseq)); | 445 | std::make_optional(default_hotkey.keyseq)); |
| 443 | WriteSetting(std::string("Controller_KeySeq"), shortcut.controller_keyseq, | 446 | WriteStringSetting(std::string("Controller_KeySeq"), shortcut.controller_keyseq, |
| 444 | std::make_optional(default_hotkey.controller_keyseq)); | 447 | std::make_optional(default_hotkey.controller_keyseq)); |
| 445 | WriteSetting(std::string("Context"), shortcut.context, | 448 | WriteIntegerSetting(std::string("Context"), shortcut.context, |
| 446 | std::make_optional(default_hotkey.context)); | 449 | std::make_optional(default_hotkey.context)); |
| 447 | WriteSetting(std::string("Repeat"), shortcut.repeat, | 450 | WriteBooleanSetting(std::string("Repeat"), shortcut.repeat, |
| 448 | std::make_optional(default_hotkey.repeat)); | 451 | std::make_optional(default_hotkey.repeat)); |
| 449 | 452 | ||
| 450 | EndGroup(); // name | 453 | EndGroup(); // name |
| 451 | EndGroup(); // group | 454 | EndGroup(); // group |
| @@ -460,9 +463,10 @@ void QtConfig::SaveUIValues() { | |||
| 460 | WriteCategory(Settings::Category::Ui); | 463 | WriteCategory(Settings::Category::Ui); |
| 461 | WriteCategory(Settings::Category::UiGeneral); | 464 | WriteCategory(Settings::Category::UiGeneral); |
| 462 | 465 | ||
| 463 | WriteSetting(std::string("theme"), UISettings::values.theme, | 466 | WriteStringSetting( |
| 464 | std::make_optional(std::string( | 467 | std::string("theme"), UISettings::values.theme, |
| 465 | UISettings::themes[static_cast<size_t>(UISettings::default_theme)].second))); | 468 | std::make_optional(std::string( |
| 469 | UISettings::themes[static_cast<size_t>(UISettings::default_theme)].second))); | ||
| 466 | 470 | ||
| 467 | SaveUIGamelistValues(); | 471 | SaveUIGamelistValues(); |
| 468 | SaveUILayoutValues(); | 472 | SaveUILayoutValues(); |
| @@ -482,7 +486,7 @@ void QtConfig::SaveUIGamelistValues() { | |||
| 482 | BeginArray(std::string("favorites")); | 486 | BeginArray(std::string("favorites")); |
| 483 | for (int i = 0; i < UISettings::values.favorited_ids.size(); i++) { | 487 | for (int i = 0; i < UISettings::values.favorited_ids.size(); i++) { |
| 484 | SetArrayIndex(i); | 488 | SetArrayIndex(i); |
| 485 | WriteSetting(std::string("program_id"), UISettings::values.favorited_ids[i]); | 489 | WriteIntegerSetting(std::string("program_id"), UISettings::values.favorited_ids[i]); |
| 486 | } | 490 | } |
| 487 | EndArray(); // favorites | 491 | EndArray(); // favorites |
| 488 | 492 | ||
| @@ -506,14 +510,15 @@ void QtConfig::SaveMultiplayerValues() { | |||
| 506 | BeginArray(std::string("username_ban_list")); | 510 | BeginArray(std::string("username_ban_list")); |
| 507 | for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.first.size(); ++i) { | 511 | for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.first.size(); ++i) { |
| 508 | SetArrayIndex(static_cast<int>(i)); | 512 | SetArrayIndex(static_cast<int>(i)); |
| 509 | WriteSetting(std::string("username"), UISettings::values.multiplayer_ban_list.first[i]); | 513 | WriteStringSetting(std::string("username"), |
| 514 | UISettings::values.multiplayer_ban_list.first[i]); | ||
| 510 | } | 515 | } |
| 511 | EndArray(); // username_ban_list | 516 | EndArray(); // username_ban_list |
| 512 | 517 | ||
| 513 | BeginArray(std::string("ip_ban_list")); | 518 | BeginArray(std::string("ip_ban_list")); |
| 514 | for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.second.size(); ++i) { | 519 | for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.second.size(); ++i) { |
| 515 | SetArrayIndex(static_cast<int>(i)); | 520 | SetArrayIndex(static_cast<int>(i)); |
| 516 | WriteSetting(std::string("ip"), UISettings::values.multiplayer_ban_list.second[i]); | 521 | WriteStringSetting(std::string("ip"), UISettings::values.multiplayer_ban_list.second[i]); |
| 517 | } | 522 | } |
| 518 | EndArray(); // ip_ban_list | 523 | EndArray(); // ip_ban_list |
| 519 | 524 | ||
diff --git a/src/yuzu_cmd/sdl_config.cpp b/src/yuzu_cmd/sdl_config.cpp index 39fd8050c..e81bf5d45 100644 --- a/src/yuzu_cmd/sdl_config.cpp +++ b/src/yuzu_cmd/sdl_config.cpp | |||
| @@ -213,43 +213,45 @@ void SdlConfig::SaveSdlPlayerValues(const std::size_t player_index) { | |||
| 213 | 213 | ||
| 214 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { | 214 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { |
| 215 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); | 215 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); |
| 216 | WriteSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]), | 216 | WriteStringSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]), |
| 217 | player.buttons[i], std::make_optional(default_param)); | 217 | player.buttons[i], std::make_optional(default_param)); |
| 218 | } | 218 | } |
| 219 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { | 219 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { |
| 220 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( | 220 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( |
| 221 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], | 221 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], |
| 222 | default_analogs[i][3], default_stick_mod[i], 0.5f); | 222 | default_analogs[i][3], default_stick_mod[i], 0.5f); |
| 223 | WriteSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]), | 223 | WriteStringSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]), |
| 224 | player.analogs[i], std::make_optional(default_param)); | 224 | player.analogs[i], std::make_optional(default_param)); |
| 225 | } | 225 | } |
| 226 | for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { | 226 | for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { |
| 227 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); | 227 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); |
| 228 | WriteSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]), | 228 | WriteStringSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]), |
| 229 | player.motions[i], std::make_optional(default_param)); | 229 | player.motions[i], std::make_optional(default_param)); |
| 230 | } | 230 | } |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | void SdlConfig::SaveDebugControlValues() { | 233 | void SdlConfig::SaveDebugControlValues() { |
| 234 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { | 234 | for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { |
| 235 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); | 235 | const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); |
| 236 | WriteSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]), | 236 | WriteStringSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]), |
| 237 | Settings::values.debug_pad_buttons[i], std::make_optional(default_param)); | 237 | Settings::values.debug_pad_buttons[i], |
| 238 | std::make_optional(default_param)); | ||
| 238 | } | 239 | } |
| 239 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { | 240 | for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { |
| 240 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( | 241 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( |
| 241 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], | 242 | default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], |
| 242 | default_analogs[i][3], default_stick_mod[i], 0.5f); | 243 | default_analogs[i][3], default_stick_mod[i], 0.5f); |
| 243 | WriteSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]), | 244 | WriteStringSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]), |
| 244 | Settings::values.debug_pad_analogs[i], std::make_optional(default_param)); | 245 | Settings::values.debug_pad_analogs[i], |
| 246 | std::make_optional(default_param)); | ||
| 245 | } | 247 | } |
| 246 | } | 248 | } |
| 247 | 249 | ||
| 248 | void SdlConfig::SaveHidbusValues() { | 250 | void SdlConfig::SaveHidbusValues() { |
| 249 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( | 251 | const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( |
| 250 | 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f); | 252 | 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f); |
| 251 | WriteSetting(std::string("ring_controller"), Settings::values.ringcon_analogs, | 253 | WriteStringSetting(std::string("ring_controller"), Settings::values.ringcon_analogs, |
| 252 | std::make_optional(default_param)); | 254 | std::make_optional(default_param)); |
| 253 | } | 255 | } |
| 254 | 256 | ||
| 255 | std::vector<Settings::BasicSetting*>& SdlConfig::FindRelevantList(Settings::Category category) { | 257 | std::vector<Settings::BasicSetting*>& SdlConfig::FindRelevantList(Settings::Category category) { |