diff options
Diffstat (limited to 'src/frontend_common/config.cpp')
| -rw-r--r-- | src/frontend_common/config.cpp | 194 |
1 files changed, 112 insertions, 82 deletions
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 | ||