summaryrefslogtreecommitdiff
path: root/src/frontend_common/config.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend_common/config.cpp')
-rw-r--r--src/frontend_common/config.cpp194
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
433void Config::SaveTouchscreenValues() { 436void 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
446void Config::SaveMotionTouchValues() { 450void 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() {
520void Config::SaveDataStorageValues() { 524void 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() {
609void Config::SaveScreenshotValues() { 615void 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
749template <typename Type> 755void Config::WriteBooleanSetting(const std::string& key, const bool& value,
750void 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; 765template <typename T>
756 std::string string_default; 766std::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 } 776void 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()) { 786void 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
796void 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
788void Config::WriteSettingInternal(const std::string& key, const std::string& value) { 818void 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