Merge pull request #6539 from lat9nq/default-setting
general: Move most settings' defaults and labels into their definition
This commit is contained in:
		| @@ -30,7 +30,8 @@ StreamPtr AudioOut::OpenStream(Core::Timing::CoreTiming& core_timing, u32 sample | ||||
|                                u32 num_channels, std::string&& name, | ||||
|                                Stream::ReleaseCallback&& release_callback) { | ||||
|     if (!sink) { | ||||
|         sink = CreateSinkFromID(Settings::values.sink_id, Settings::values.audio_device_id); | ||||
|         sink = CreateSinkFromID(Settings::values.sink_id.GetValue(), | ||||
|                                 Settings::values.audio_device_id.GetValue()); | ||||
|     } | ||||
|  | ||||
|     return std::make_shared<Stream>( | ||||
|   | ||||
| @@ -41,7 +41,7 @@ void LogSettings() { | ||||
|     LOG_INFO(Config, "yuzu Configuration:"); | ||||
|     log_setting("Controls_UseDockedMode", values.use_docked_mode.GetValue()); | ||||
|     log_setting("System_RngSeed", values.rng_seed.GetValue().value_or(0)); | ||||
|     log_setting("System_CurrentUser", values.current_user); | ||||
|     log_setting("System_CurrentUser", values.current_user.GetValue()); | ||||
|     log_setting("System_LanguageIndex", values.language_index.GetValue()); | ||||
|     log_setting("System_RegionIndex", values.region_index.GetValue()); | ||||
|     log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue()); | ||||
| @@ -61,18 +61,18 @@ void LogSettings() { | ||||
|     log_setting("Renderer_UseAsynchronousShaders", values.use_asynchronous_shaders.GetValue()); | ||||
|     log_setting("Renderer_UseGarbageCollection", values.use_caches_gc.GetValue()); | ||||
|     log_setting("Renderer_AnisotropicFilteringLevel", values.max_anisotropy.GetValue()); | ||||
|     log_setting("Audio_OutputEngine", values.sink_id); | ||||
|     log_setting("Audio_OutputEngine", values.sink_id.GetValue()); | ||||
|     log_setting("Audio_EnableAudioStretching", values.enable_audio_stretching.GetValue()); | ||||
|     log_setting("Audio_OutputDevice", values.audio_device_id); | ||||
|     log_setting("DataStorage_UseVirtualSd", values.use_virtual_sd); | ||||
|     log_setting("Audio_OutputDevice", values.audio_device_id.GetValue()); | ||||
|     log_setting("DataStorage_UseVirtualSd", values.use_virtual_sd.GetValue()); | ||||
|     log_path("DataStorage_CacheDir", Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir)); | ||||
|     log_path("DataStorage_ConfigDir", Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir)); | ||||
|     log_path("DataStorage_LoadDir", Common::FS::GetYuzuPath(Common::FS::YuzuPath::LoadDir)); | ||||
|     log_path("DataStorage_NANDDir", Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir)); | ||||
|     log_path("DataStorage_SDMCDir", Common::FS::GetYuzuPath(Common::FS::YuzuPath::SDMCDir)); | ||||
|     log_setting("Debugging_ProgramArgs", values.program_args); | ||||
|     log_setting("Services_BCATBackend", values.bcat_backend); | ||||
|     log_setting("Services_BCATBoxcatLocal", values.bcat_boxcat_local); | ||||
|     log_setting("Debugging_ProgramArgs", values.program_args.GetValue()); | ||||
|     log_setting("Services_BCATBackend", values.bcat_backend.GetValue()); | ||||
|     log_setting("Services_BCATBoxcatLocal", values.bcat_boxcat_local.GetValue()); | ||||
| } | ||||
|  | ||||
| bool IsConfiguringGlobal() { | ||||
| @@ -94,7 +94,7 @@ bool IsGPULevelHigh() { | ||||
|  | ||||
| bool IsFastmemEnabled() { | ||||
|     if (values.cpu_accuracy.GetValue() == CPUAccuracy::DebugMode) { | ||||
|         return values.cpuopt_fastmem; | ||||
|         return static_cast<bool>(values.cpuopt_fastmem); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
|   | ||||
| @@ -10,10 +10,12 @@ | ||||
| #include <map> | ||||
| #include <optional> | ||||
| #include <string> | ||||
| #include <utility> | ||||
| #include <vector> | ||||
|  | ||||
| #include "common/common_types.h" | ||||
| #include "common/settings_input.h" | ||||
| #include "input_common/udp/client.h" | ||||
|  | ||||
| namespace Settings { | ||||
|  | ||||
| @@ -34,68 +36,235 @@ enum class CPUAccuracy : u32 { | ||||
|     DebugMode = 2, | ||||
| }; | ||||
|  | ||||
| /** The BasicSetting class is a simple resource manager. It defines a label and default value | ||||
|  * alongside the actual value of the setting for simpler and less-error prone use with frontend | ||||
|  * configurations. Setting a default value and label is required, though subclasses may deviate from | ||||
|  * this requirement. | ||||
|  */ | ||||
| template <typename Type> | ||||
| class Setting final { | ||||
| class BasicSetting { | ||||
| protected: | ||||
|     BasicSetting() = default; | ||||
|  | ||||
|     /** | ||||
|      * Only sets the setting to the given initializer, leaving the other members to their default | ||||
|      * initializers. | ||||
|      * | ||||
|      * @param global_val Initial value of the setting | ||||
|      */ | ||||
|     explicit BasicSetting(const Type& global_val) : global{global_val} {} | ||||
|  | ||||
| public: | ||||
|     Setting() = default; | ||||
|     explicit Setting(Type val) : global{val} {} | ||||
|     ~Setting() = default; | ||||
|     void SetGlobal(bool to_global) { | ||||
|         use_global = to_global; | ||||
|     } | ||||
|     bool UsingGlobal() const { | ||||
|         return use_global; | ||||
|     } | ||||
|     Type GetValue(bool need_global = false) const { | ||||
|         if (use_global || need_global) { | ||||
|             return global; | ||||
|         } | ||||
|         return local; | ||||
|     } | ||||
|     void SetValue(const Type& value) { | ||||
|         if (use_global) { | ||||
|             global = value; | ||||
|         } else { | ||||
|             local = value; | ||||
|         } | ||||
|     /** | ||||
|      * Sets a default value, label, and setting value. | ||||
|      * | ||||
|      * @param default_val Intial value of the setting, and default value of the setting | ||||
|      * @param name Label for the setting | ||||
|      */ | ||||
|     explicit BasicSetting(const Type& default_val, const std::string& name) | ||||
|         : default_value{default_val}, global{default_val}, label{name} {} | ||||
|     ~BasicSetting() = default; | ||||
|  | ||||
|     /** | ||||
|      *  Returns a reference to the setting's value. | ||||
|      * | ||||
|      * @returns A reference to the setting | ||||
|      */ | ||||
|     [[nodiscard]] const Type& GetValue() const { | ||||
|         return global; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     bool use_global = true; | ||||
|     Type global{}; | ||||
|     Type local{}; | ||||
|     /** | ||||
|      * Sets the setting to the given value. | ||||
|      * | ||||
|      * @param value The desired value | ||||
|      */ | ||||
|     void SetValue(const Type& value) { | ||||
|         Type temp{value}; | ||||
|         std::swap(global, temp); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the value that this setting was created with. | ||||
|      * | ||||
|      * @returns A reference to the default value | ||||
|      */ | ||||
|     [[nodiscard]] const Type& GetDefault() const { | ||||
|         return default_value; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the label this setting was created with. | ||||
|      * | ||||
|      * @returns A reference to the label | ||||
|      */ | ||||
|     [[nodiscard]] const std::string& GetLabel() const { | ||||
|         return label; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Assigns a value to the setting. | ||||
|      * | ||||
|      * @param value The desired setting value | ||||
|      * | ||||
|      * @returns A reference to the setting | ||||
|      */ | ||||
|     const Type& operator=(const Type& value) { | ||||
|         Type temp{value}; | ||||
|         std::swap(global, temp); | ||||
|         return global; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns a reference to the setting. | ||||
|      * | ||||
|      * @returns A reference to the setting | ||||
|      */ | ||||
|     explicit operator const Type&() const { | ||||
|         return global; | ||||
|     } | ||||
|  | ||||
| protected: | ||||
|     const Type default_value{}; ///< The default value | ||||
|     Type global{};              ///< The setting | ||||
|     const std::string label{};  ///< The setting's label | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * The InputSetting class allows for getting a reference to either the global or local members. | ||||
|  * The Setting class is a slightly more complex version of the BasicSetting class. This adds a | ||||
|  * custom setting to switch to when a guest application specifically requires it. The effect is that | ||||
|  * other components of the emulator can access the setting's intended value without any need for the | ||||
|  * component to ask whether the custom or global setting is needed at the moment. | ||||
|  * | ||||
|  * By default, the global setting is used. | ||||
|  * | ||||
|  * Like the BasicSetting, this requires setting a default value and label to use. | ||||
|  */ | ||||
| template <typename Type> | ||||
| class Setting final : public BasicSetting<Type> { | ||||
| public: | ||||
|     /** | ||||
|      * Sets a default value, label, and setting value. | ||||
|      * | ||||
|      * @param default_val Intial value of the setting, and default value of the setting | ||||
|      * @param name Label for the setting | ||||
|      */ | ||||
|     explicit Setting(const Type& default_val, const std::string& name) | ||||
|         : BasicSetting<Type>(default_val, name) {} | ||||
|     ~Setting() = default; | ||||
|  | ||||
|     /** | ||||
|      * Tells this setting to represent either the global or custom setting when other member | ||||
|      * functions are used. | ||||
|      * | ||||
|      * @param to_global Whether to use the global or custom setting. | ||||
|      */ | ||||
|     void SetGlobal(bool to_global) { | ||||
|         use_global = to_global; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether this setting is using the global setting or not. | ||||
|      * | ||||
|      * @returns The global state | ||||
|      */ | ||||
|     [[nodiscard]] bool UsingGlobal() const { | ||||
|         return use_global; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns either the global or custom setting depending on the values of this setting's global | ||||
|      * state or if the global value was specifically requested. | ||||
|      * | ||||
|      * @param need_global Request global value regardless of setting's state; defaults to false | ||||
|      * | ||||
|      * @returns The required value of the setting | ||||
|      */ | ||||
|     [[nodiscard]] const Type& GetValue(bool need_global = false) const { | ||||
|         if (use_global || need_global) { | ||||
|             return this->global; | ||||
|         } | ||||
|         return custom; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the current setting value depending on the global state. | ||||
|      * | ||||
|      * @param value The new value | ||||
|      */ | ||||
|     void SetValue(const Type& value) { | ||||
|         Type temp{value}; | ||||
|         if (use_global) { | ||||
|             std::swap(this->global, temp); | ||||
|         } else { | ||||
|             std::swap(custom, temp); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Assigns the current setting value depending on the global state. | ||||
|      * | ||||
|      * @param value The new value | ||||
|      * | ||||
|      * @returns A reference to the current setting value | ||||
|      */ | ||||
|     const Type& operator=(const Type& value) { | ||||
|         Type temp{value}; | ||||
|         if (use_global) { | ||||
|             std::swap(this->global, temp); | ||||
|             return this->global; | ||||
|         } | ||||
|         std::swap(custom, temp); | ||||
|         return custom; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the current setting value depending on the global state. | ||||
|      * | ||||
|      * @returns A reference to the current setting value | ||||
|      */ | ||||
|     explicit operator const Type&() const { | ||||
|         if (use_global) { | ||||
|             return this->global; | ||||
|         } | ||||
|         return custom; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     bool use_global{true}; ///< The setting's global state | ||||
|     Type custom{};         ///< The custom value of the setting | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * The InputSetting class allows for getting a reference to either the global or custom members. | ||||
|  * This is required as we cannot easily modify the values of user-defined types within containers | ||||
|  * using the SetValue() member function found in the Setting class. The primary purpose of this | ||||
|  * class is to store an array of 10 PlayerInput structs for both the global and local (per-game) | ||||
|  * setting and allows for easily accessing and modifying both settings. | ||||
|  * class is to store an array of 10 PlayerInput structs for both the global and custom setting and | ||||
|  * allows for easily accessing and modifying both settings. | ||||
|  */ | ||||
| template <typename Type> | ||||
| class InputSetting final { | ||||
| public: | ||||
|     InputSetting() = default; | ||||
|     explicit InputSetting(Type val) : global{val} {} | ||||
|     explicit InputSetting(Type val) : BasicSetting<Type>(val) {} | ||||
|     ~InputSetting() = default; | ||||
|     void SetGlobal(bool to_global) { | ||||
|         use_global = to_global; | ||||
|     } | ||||
|     bool UsingGlobal() const { | ||||
|     [[nodiscard]] bool UsingGlobal() const { | ||||
|         return use_global; | ||||
|     } | ||||
|     Type& GetValue(bool need_global = false) { | ||||
|     [[nodiscard]] Type& GetValue(bool need_global = false) { | ||||
|         if (use_global || need_global) { | ||||
|             return global; | ||||
|         } | ||||
|         return local; | ||||
|         return custom; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     bool use_global = true; | ||||
|     Type global{}; | ||||
|     Type local{}; | ||||
|     bool use_global{true}; ///< The setting's global state | ||||
|     Type global{};         ///< The setting | ||||
|     Type custom{};         ///< The custom setting value | ||||
| }; | ||||
|  | ||||
| struct TouchFromButtonMap { | ||||
| @@ -105,144 +274,155 @@ struct TouchFromButtonMap { | ||||
|  | ||||
| struct Values { | ||||
|     // Audio | ||||
|     std::string audio_device_id; | ||||
|     std::string sink_id; | ||||
|     bool audio_muted; | ||||
|     Setting<bool> enable_audio_stretching; | ||||
|     Setting<float> volume; | ||||
|     BasicSetting<std::string> audio_device_id{"auto", "output_device"}; | ||||
|     BasicSetting<std::string> sink_id{"auto", "output_engine"}; | ||||
|     BasicSetting<bool> audio_muted{false, "audio_muted"}; | ||||
|     Setting<bool> enable_audio_stretching{true, "enable_audio_stretching"}; | ||||
|     Setting<float> volume{1.0f, "volume"}; | ||||
|  | ||||
|     // Core | ||||
|     Setting<bool> use_multi_core; | ||||
|     Setting<bool> use_multi_core{true, "use_multi_core"}; | ||||
|  | ||||
|     // Cpu | ||||
|     Setting<CPUAccuracy> cpu_accuracy; | ||||
|     Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Accurate, "cpu_accuracy"}; | ||||
|  | ||||
|     bool cpuopt_page_tables; | ||||
|     bool cpuopt_block_linking; | ||||
|     bool cpuopt_return_stack_buffer; | ||||
|     bool cpuopt_fast_dispatcher; | ||||
|     bool cpuopt_context_elimination; | ||||
|     bool cpuopt_const_prop; | ||||
|     bool cpuopt_misc_ir; | ||||
|     bool cpuopt_reduce_misalign_checks; | ||||
|     bool cpuopt_fastmem; | ||||
|     BasicSetting<bool> cpuopt_page_tables{true, "cpuopt_page_tables"}; | ||||
|     BasicSetting<bool> cpuopt_block_linking{true, "cpuopt_block_linking"}; | ||||
|     BasicSetting<bool> cpuopt_return_stack_buffer{true, "cpuopt_return_stack_buffer"}; | ||||
|     BasicSetting<bool> cpuopt_fast_dispatcher{true, "cpuopt_fast_dispatcher"}; | ||||
|     BasicSetting<bool> cpuopt_context_elimination{true, "cpuopt_context_elimination"}; | ||||
|     BasicSetting<bool> cpuopt_const_prop{true, "cpuopt_const_prop"}; | ||||
|     BasicSetting<bool> cpuopt_misc_ir{true, "cpuopt_misc_ir"}; | ||||
|     BasicSetting<bool> cpuopt_reduce_misalign_checks{true, "cpuopt_reduce_misalign_checks"}; | ||||
|     BasicSetting<bool> cpuopt_fastmem{true, "cpuopt_fastmem"}; | ||||
|  | ||||
|     Setting<bool> cpuopt_unsafe_unfuse_fma; | ||||
|     Setting<bool> cpuopt_unsafe_reduce_fp_error; | ||||
|     Setting<bool> cpuopt_unsafe_ignore_standard_fpcr; | ||||
|     Setting<bool> cpuopt_unsafe_inaccurate_nan; | ||||
|     Setting<bool> cpuopt_unsafe_fastmem_check; | ||||
|     Setting<bool> cpuopt_unsafe_unfuse_fma{true, "cpuopt_unsafe_unfuse_fma"}; | ||||
|     Setting<bool> cpuopt_unsafe_reduce_fp_error{true, "cpuopt_unsafe_reduce_fp_error"}; | ||||
|     Setting<bool> cpuopt_unsafe_ignore_standard_fpcr{true, "cpuopt_unsafe_ignore_standard_fpcr"}; | ||||
|     Setting<bool> cpuopt_unsafe_inaccurate_nan{true, "cpuopt_unsafe_inaccurate_nan"}; | ||||
|     Setting<bool> cpuopt_unsafe_fastmem_check{true, "cpuopt_unsafe_fastmem_check"}; | ||||
|  | ||||
|     // Renderer | ||||
|     Setting<RendererBackend> renderer_backend; | ||||
|     bool renderer_debug; | ||||
|     Setting<int> vulkan_device; | ||||
|     Setting<RendererBackend> renderer_backend{RendererBackend::OpenGL, "backend"}; | ||||
|     BasicSetting<bool> renderer_debug{false, "debug"}; | ||||
|     Setting<int> vulkan_device{0, "vulkan_device"}; | ||||
|  | ||||
|     Setting<u16> resolution_factor{1}; | ||||
|     Setting<int> fullscreen_mode; | ||||
|     Setting<int> aspect_ratio; | ||||
|     Setting<int> max_anisotropy; | ||||
|     Setting<bool> use_frame_limit; | ||||
|     Setting<u16> frame_limit; | ||||
|     Setting<bool> use_disk_shader_cache; | ||||
|     Setting<GPUAccuracy> gpu_accuracy; | ||||
|     Setting<bool> use_asynchronous_gpu_emulation; | ||||
|     Setting<bool> use_nvdec_emulation; | ||||
|     Setting<bool> accelerate_astc; | ||||
|     Setting<bool> use_vsync; | ||||
|     Setting<bool> disable_fps_limit; | ||||
|     Setting<bool> use_assembly_shaders; | ||||
|     Setting<bool> use_asynchronous_shaders; | ||||
|     Setting<bool> use_fast_gpu_time; | ||||
|     Setting<bool> use_caches_gc; | ||||
|     Setting<u16> resolution_factor{1, "resolution_factor"}; | ||||
|     // *nix platforms may have issues with the borderless windowed fullscreen mode. | ||||
|     // Default to exclusive fullscreen on these platforms for now. | ||||
|     Setting<int> fullscreen_mode{ | ||||
| #ifdef _WIN32 | ||||
|         0, | ||||
| #else | ||||
|         1, | ||||
| #endif | ||||
|         "fullscreen_mode"}; | ||||
|     Setting<int> aspect_ratio{0, "aspect_ratio"}; | ||||
|     Setting<int> max_anisotropy{0, "max_anisotropy"}; | ||||
|     Setting<bool> use_frame_limit{true, "use_frame_limit"}; | ||||
|     Setting<u16> frame_limit{100, "frame_limit"}; | ||||
|     Setting<bool> use_disk_shader_cache{true, "use_disk_shader_cache"}; | ||||
|     Setting<GPUAccuracy> gpu_accuracy{GPUAccuracy::High, "gpu_accuracy"}; | ||||
|     Setting<bool> use_asynchronous_gpu_emulation{true, "use_asynchronous_gpu_emulation"}; | ||||
|     Setting<bool> use_nvdec_emulation{true, "use_nvdec_emulation"}; | ||||
|     Setting<bool> accelerate_astc{true, "accelerate_astc"}; | ||||
|     Setting<bool> use_vsync{true, "use_vsync"}; | ||||
|     Setting<bool> disable_fps_limit{false, "disable_fps_limit"}; | ||||
|     Setting<bool> use_assembly_shaders{false, "use_assembly_shaders"}; | ||||
|     Setting<bool> use_asynchronous_shaders{false, "use_asynchronous_shaders"}; | ||||
|     Setting<bool> use_fast_gpu_time{true, "use_fast_gpu_time"}; | ||||
|     Setting<bool> use_caches_gc{false, "use_caches_gc"}; | ||||
|  | ||||
|     Setting<float> bg_red; | ||||
|     Setting<float> bg_green; | ||||
|     Setting<float> bg_blue; | ||||
|     Setting<float> bg_red{0.0f, "bg_red"}; | ||||
|     Setting<float> bg_green{0.0f, "bg_green"}; | ||||
|     Setting<float> bg_blue{0.0f, "bg_blue"}; | ||||
|  | ||||
|     // System | ||||
|     Setting<std::optional<u32>> rng_seed; | ||||
|     Setting<std::optional<u32>> rng_seed{std::optional<u32>(), "rng_seed"}; | ||||
|     // Measured in seconds since epoch | ||||
|     std::optional<std::chrono::seconds> custom_rtc; | ||||
|     // Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc` | ||||
|     std::chrono::seconds custom_rtc_differential; | ||||
|  | ||||
|     s32 current_user; | ||||
|     Setting<s32> language_index; | ||||
|     Setting<s32> region_index; | ||||
|     Setting<s32> time_zone_index; | ||||
|     Setting<s32> sound_index; | ||||
|     BasicSetting<s32> current_user{0, "current_user"}; | ||||
|     Setting<s32> language_index{1, "language_index"}; | ||||
|     Setting<s32> region_index{1, "region_index"}; | ||||
|     Setting<s32> time_zone_index{0, "time_zone_index"}; | ||||
|     Setting<s32> sound_index{1, "sound_index"}; | ||||
|  | ||||
|     // Controls | ||||
|     InputSetting<std::array<PlayerInput, 10>> players; | ||||
|  | ||||
|     Setting<bool> use_docked_mode; | ||||
|     Setting<bool> use_docked_mode{true, "use_docked_mode"}; | ||||
|  | ||||
|     Setting<bool> vibration_enabled; | ||||
|     Setting<bool> enable_accurate_vibrations; | ||||
|     Setting<bool> vibration_enabled{true, "vibration_enabled"}; | ||||
|     Setting<bool> enable_accurate_vibrations{false, "enable_accurate_vibrations"}; | ||||
|  | ||||
|     Setting<bool> motion_enabled; | ||||
|     std::string motion_device; | ||||
|     std::string udp_input_servers; | ||||
|     Setting<bool> motion_enabled{true, "motion_enabled"}; | ||||
|     BasicSetting<std::string> motion_device{"engine:motion_emu,update_period:100,sensitivity:0.01", | ||||
|                                             "motion_device"}; | ||||
|     BasicSetting<std::string> udp_input_servers{InputCommon::CemuhookUDP::DEFAULT_SRV, | ||||
|                                                 "udp_input_servers"}; | ||||
|  | ||||
|     bool mouse_panning; | ||||
|     float mouse_panning_sensitivity; | ||||
|     bool mouse_enabled; | ||||
|     BasicSetting<bool> mouse_panning{false, "mouse_panning"}; | ||||
|     BasicSetting<float> mouse_panning_sensitivity{1.0f, "mouse_panning_sensitivity"}; | ||||
|     BasicSetting<bool> mouse_enabled{false, "mouse_enabled"}; | ||||
|     std::string mouse_device; | ||||
|     MouseButtonsRaw mouse_buttons; | ||||
|  | ||||
|     bool emulate_analog_keyboard; | ||||
|     bool keyboard_enabled; | ||||
|     BasicSetting<bool> emulate_analog_keyboard{false, "emulate_analog_keyboard"}; | ||||
|     BasicSetting<bool> keyboard_enabled{false, "keyboard_enabled"}; | ||||
|     KeyboardKeysRaw keyboard_keys; | ||||
|     KeyboardModsRaw keyboard_mods; | ||||
|  | ||||
|     bool debug_pad_enabled; | ||||
|     BasicSetting<bool> debug_pad_enabled{false, "debug_pad_enabled"}; | ||||
|     ButtonsRaw debug_pad_buttons; | ||||
|     AnalogsRaw debug_pad_analogs; | ||||
|  | ||||
|     TouchscreenInput touchscreen; | ||||
|  | ||||
|     bool use_touch_from_button; | ||||
|     std::string touch_device; | ||||
|     int touch_from_button_map_index; | ||||
|     BasicSetting<bool> use_touch_from_button{false, "use_touch_from_button"}; | ||||
|     BasicSetting<std::string> touch_device{"min_x:100,min_y:50,max_x:1800,max_y:850", | ||||
|                                            "touch_device"}; | ||||
|     BasicSetting<int> touch_from_button_map_index{0, "touch_from_button_map"}; | ||||
|     std::vector<TouchFromButtonMap> touch_from_button_maps; | ||||
|  | ||||
|     std::atomic_bool is_device_reload_pending{true}; | ||||
|  | ||||
|     // Data Storage | ||||
|     bool use_virtual_sd; | ||||
|     bool gamecard_inserted; | ||||
|     bool gamecard_current_game; | ||||
|     std::string gamecard_path; | ||||
|     BasicSetting<bool> use_virtual_sd{true, "use_virtual_sd"}; | ||||
|     BasicSetting<bool> gamecard_inserted{false, "gamecard_inserted"}; | ||||
|     BasicSetting<bool> gamecard_current_game{false, "gamecard_current_game"}; | ||||
|     BasicSetting<std::string> gamecard_path{std::string(), "gamecard_path"}; | ||||
|  | ||||
|     // Debugging | ||||
|     bool record_frame_times; | ||||
|     bool use_gdbstub; | ||||
|     u16 gdbstub_port; | ||||
|     std::string program_args; | ||||
|     bool dump_exefs; | ||||
|     bool dump_nso; | ||||
|     bool enable_fs_access_log; | ||||
|     bool reporting_services; | ||||
|     bool quest_flag; | ||||
|     bool disable_macro_jit; | ||||
|     bool extended_logging; | ||||
|     bool use_debug_asserts; | ||||
|     bool use_auto_stub; | ||||
|     BasicSetting<bool> use_gdbstub{false, "use_gdbstub"}; | ||||
|     BasicSetting<u16> gdbstub_port{0, "gdbstub_port"}; | ||||
|     BasicSetting<std::string> program_args{std::string(), "program_args"}; | ||||
|     BasicSetting<bool> dump_exefs{false, "dump_exefs"}; | ||||
|     BasicSetting<bool> dump_nso{false, "dump_nso"}; | ||||
|     BasicSetting<bool> enable_fs_access_log{false, "enable_fs_access_log"}; | ||||
|     BasicSetting<bool> reporting_services{false, "reporting_services"}; | ||||
|     BasicSetting<bool> quest_flag{false, "quest_flag"}; | ||||
|     BasicSetting<bool> disable_macro_jit{false, "disable_macro_jit"}; | ||||
|     BasicSetting<bool> extended_logging{false, "extended_logging"}; | ||||
|     BasicSetting<bool> use_debug_asserts{false, "use_debug_asserts"}; | ||||
|     BasicSetting<bool> use_auto_stub{false, "use_auto_stub"}; | ||||
|  | ||||
|     // Miscellaneous | ||||
|     std::string log_filter; | ||||
|     bool use_dev_keys; | ||||
|     BasicSetting<std::string> log_filter{"*:Info", "log_filter"}; | ||||
|     BasicSetting<bool> use_dev_keys{false, "use_dev_keys"}; | ||||
|  | ||||
|     // Services | ||||
|     std::string bcat_backend; | ||||
|     bool bcat_boxcat_local; | ||||
|     BasicSetting<std::string> bcat_backend{"none", "bcat_backend"}; | ||||
|     BasicSetting<bool> bcat_boxcat_local{false, "bcat_boxcat_local"}; | ||||
|  | ||||
|     // WebService | ||||
|     bool enable_telemetry; | ||||
|     std::string web_api_url; | ||||
|     std::string yuzu_username; | ||||
|     std::string yuzu_token; | ||||
|     BasicSetting<bool> enable_telemetry{true, "enable_telemetry"}; | ||||
|     BasicSetting<std::string> web_api_url{"https://api.yuzu-emu.org", "web_api_url"}; | ||||
|     BasicSetting<std::string> yuzu_username{std::string(), "yuzu_username"}; | ||||
|     BasicSetting<std::string> yuzu_token{std::string(), "yuzu_token"}; | ||||
|  | ||||
|     // Add-Ons | ||||
|     std::map<u64, std::vector<std::string>> disabled_addons; | ||||
|   | ||||
| @@ -263,9 +263,9 @@ struct System::Impl { | ||||
|         if (Settings::values.gamecard_inserted) { | ||||
|             if (Settings::values.gamecard_current_game) { | ||||
|                 fs_controller.SetGameCard(GetGameFileFromPath(virtual_filesystem, filepath)); | ||||
|             } else if (!Settings::values.gamecard_path.empty()) { | ||||
|                 fs_controller.SetGameCard( | ||||
|                     GetGameFileFromPath(virtual_filesystem, Settings::values.gamecard_path)); | ||||
|             } else if (!Settings::values.gamecard_path.GetValue().empty()) { | ||||
|                 const auto gamecard_path = Settings::values.gamecard_path.GetValue(); | ||||
|                 fs_controller.SetGameCard(GetGameFileFromPath(virtual_filesystem, gamecard_path)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,7 @@ ProfileSelectApplet::~ProfileSelectApplet() = default; | ||||
| void DefaultProfileSelectApplet::SelectProfile( | ||||
|     std::function<void(std::optional<Common::UUID>)> callback) const { | ||||
|     Service::Account::ProfileManager manager; | ||||
|     callback(manager.GetUser(Settings::values.current_user).value_or(Common::UUID{})); | ||||
|     callback(manager.GetUser(Settings::values.current_user.GetValue()).value_or(Common::UUID{})); | ||||
|     LOG_INFO(Service_ACC, "called, selecting current user instead of prompting..."); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -48,7 +48,8 @@ ProfileManager::ProfileManager() { | ||||
|         CreateNewUser(UUID::Generate(), "yuzu"); | ||||
|     } | ||||
|  | ||||
|     auto current = std::clamp<int>(Settings::values.current_user, 0, MAX_USERS - 1); | ||||
|     auto current = | ||||
|         std::clamp<int>(static_cast<s32>(Settings::values.current_user), 0, MAX_USERS - 1); | ||||
|  | ||||
|     // If user index don't exist. Load the first user and change the active user | ||||
|     if (!UserExistsIndex(current)) { | ||||
|   | ||||
| @@ -1443,7 +1443,7 @@ void IApplicationFunctions::PopLaunchParameter(Kernel::HLERequestContext& ctx) { | ||||
|         params.is_account_selected = 1; | ||||
|  | ||||
|         Account::ProfileManager profile_manager{}; | ||||
|         const auto uuid = profile_manager.GetUser(Settings::values.current_user); | ||||
|         const auto uuid = profile_manager.GetUser(static_cast<s32>(Settings::values.current_user)); | ||||
|         ASSERT(uuid); | ||||
|         params.current_user = uuid->uuid; | ||||
|  | ||||
|   | ||||
| @@ -579,7 +579,7 @@ void Module::Interface::CreateDeliveryCacheStorageServiceWithApplicationId( | ||||
| std::unique_ptr<Backend> CreateBackendFromSettings([[maybe_unused]] Core::System& system, | ||||
|                                                    DirectoryGetter getter) { | ||||
| #ifdef YUZU_ENABLE_BOXCAT | ||||
|     if (Settings::values.bcat_backend == "boxcat") { | ||||
|     if (Settings::values.bcat_backend.GetValue() == "boxcat") { | ||||
|         return std::make_unique<Boxcat>(system.GetAppletManager(), std::move(getter)); | ||||
|     } | ||||
| #endif | ||||
|   | ||||
| @@ -179,7 +179,7 @@ private: | ||||
|         IPC::ResponseBuilder rb{ctx, 3}; | ||||
|         rb.Push(ResultSuccess); | ||||
|  | ||||
|         if (Settings::values.bcat_backend == "none") { | ||||
|         if (Settings::values.bcat_backend.GetValue() == "none") { | ||||
|             rb.PushEnum(RequestState::NotSubmitted); | ||||
|         } else { | ||||
|             rb.PushEnum(RequestState::Connected); | ||||
| @@ -384,7 +384,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 3}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         if (Settings::values.bcat_backend == "none") { | ||||
|         if (Settings::values.bcat_backend.GetValue() == "none") { | ||||
|             rb.Push<u8>(0); | ||||
|         } else { | ||||
|             rb.Push<u8>(1); | ||||
| @@ -395,7 +395,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 3}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         if (Settings::values.bcat_backend == "none") { | ||||
|         if (Settings::values.bcat_backend.GetValue() == "none") { | ||||
|             rb.Push<u8>(0); | ||||
|         } else { | ||||
|             rb.Push<u8>(1); | ||||
|   | ||||
| @@ -160,7 +160,7 @@ void SET::GetQuestFlag(Kernel::HLERequestContext& ctx) { | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.Push(static_cast<u32>(Settings::values.quest_flag)); | ||||
|     rb.Push(static_cast<u32>(Settings::values.quest_flag.GetValue())); | ||||
| } | ||||
|  | ||||
| void SET::GetLanguageCode(Kernel::HLERequestContext& ctx) { | ||||
|   | ||||
| @@ -155,8 +155,8 @@ static bool LoadNroImpl(Kernel::KProcess& process, const std::vector<u8>& data) | ||||
|         codeset.segments[i].size = PageAlignSize(nro_header.segments[i].size); | ||||
|     } | ||||
|  | ||||
|     if (!Settings::values.program_args.empty()) { | ||||
|         const auto arg_data = Settings::values.program_args; | ||||
|     if (!Settings::values.program_args.GetValue().empty()) { | ||||
|         const auto arg_data = Settings::values.program_args.GetValue(); | ||||
|         codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; | ||||
|         NSOArgumentHeader args_header{ | ||||
|             NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; | ||||
|   | ||||
| @@ -104,8 +104,8 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core:: | ||||
|         codeset.segments[i].size = nso_header.segments[i].size; | ||||
|     } | ||||
|  | ||||
|     if (should_pass_arguments && !Settings::values.program_args.empty()) { | ||||
|         const auto arg_data{Settings::values.program_args}; | ||||
|     if (should_pass_arguments && !Settings::values.program_args.GetValue().empty()) { | ||||
|         const auto arg_data{Settings::values.program_args.GetValue()}; | ||||
|  | ||||
|         codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; | ||||
|         NSOArgumentHeader args_header{ | ||||
|   | ||||
| @@ -397,7 +397,7 @@ void Reporter::ClearFSAccessLog() const { | ||||
| } | ||||
|  | ||||
| bool Reporter::IsReportingEnabled() const { | ||||
|     return Settings::values.reporting_services; | ||||
|     return Settings::values.reporting_services.GetValue(); | ||||
| } | ||||
|  | ||||
| } // namespace Core | ||||
|   | ||||
| @@ -135,7 +135,7 @@ u64 RegenerateTelemetryId() { | ||||
|  | ||||
| bool VerifyLogin(const std::string& username, const std::string& token) { | ||||
| #ifdef ENABLE_WEB_SERVICE | ||||
|     return WebService::VerifyLogin(Settings::values.web_api_url, username, token); | ||||
|     return WebService::VerifyLogin(Settings::values.web_api_url.GetValue(), username, token); | ||||
| #else | ||||
|     return false; | ||||
| #endif | ||||
| @@ -152,7 +152,8 @@ TelemetrySession::~TelemetrySession() { | ||||
|  | ||||
| #ifdef ENABLE_WEB_SERVICE | ||||
|     auto backend = std::make_unique<WebService::TelemetryJson>( | ||||
|         Settings::values.web_api_url, Settings::values.yuzu_username, Settings::values.yuzu_token); | ||||
|         Settings::values.web_api_url.GetValue(), Settings::values.yuzu_username.GetValue(), | ||||
|         Settings::values.yuzu_token.GetValue()); | ||||
| #else | ||||
|     auto backend = std::make_unique<Telemetry::NullVisitor>(); | ||||
| #endif | ||||
| @@ -212,7 +213,7 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader, | ||||
|  | ||||
|     // Log user configuration information | ||||
|     constexpr auto field_type = Telemetry::FieldType::UserConfig; | ||||
|     AddField(field_type, "Audio_SinkId", Settings::values.sink_id); | ||||
|     AddField(field_type, "Audio_SinkId", Settings::values.sink_id.GetValue()); | ||||
|     AddField(field_type, "Audio_EnableAudioStretching", | ||||
|              Settings::values.enable_audio_stretching.GetValue()); | ||||
|     AddField(field_type, "Core_UseMultiCore", Settings::values.use_multi_core.GetValue()); | ||||
| @@ -242,7 +243,8 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader, | ||||
| bool TelemetrySession::SubmitTestcase() { | ||||
| #ifdef ENABLE_WEB_SERVICE | ||||
|     auto backend = std::make_unique<WebService::TelemetryJson>( | ||||
|         Settings::values.web_api_url, Settings::values.yuzu_username, Settings::values.yuzu_token); | ||||
|         Settings::values.web_api_url.GetValue(), Settings::values.yuzu_username.GetValue(), | ||||
|         Settings::values.yuzu_token.GetValue()); | ||||
|     field_collection.Accept(*backend); | ||||
|     return backend->SubmitTestcase(); | ||||
| #else | ||||
|   | ||||
| @@ -84,7 +84,8 @@ public: | ||||
|         std::lock_guard lock{mutex}; | ||||
|         const auto axis_value = | ||||
|             static_cast<float>(mouse_input->GetMouseState(button).axis.at(axis)); | ||||
|         return axis_value * Settings::values.mouse_panning_sensitivity / (100.0f * range); | ||||
|         const float sensitivity = Settings::values.mouse_panning_sensitivity.GetValue(); | ||||
|         return axis_value * sensitivity / (100.0f * range); | ||||
|     } | ||||
|  | ||||
|     std::pair<float, float> GetAnalog(u32 analog_axis_x, u32 analog_axis_y) const { | ||||
|   | ||||
| @@ -13,7 +13,7 @@ class TouchFromButtonDevice final : public Input::TouchDevice { | ||||
| public: | ||||
|     TouchFromButtonDevice() { | ||||
|         const auto button_index = | ||||
|             static_cast<std::size_t>(Settings::values.touch_from_button_map_index); | ||||
|             static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue()); | ||||
|         const auto& buttons = Settings::values.touch_from_button_maps[button_index].buttons; | ||||
|  | ||||
|         for (const auto& config_entry : buttons) { | ||||
|   | ||||
| @@ -201,7 +201,7 @@ bool Client::DeviceConnected(std::size_t pad) const { | ||||
| void Client::ReloadSockets() { | ||||
|     Reset(); | ||||
|  | ||||
|     std::stringstream servers_ss(Settings::values.udp_input_servers); | ||||
|     std::stringstream servers_ss(static_cast<std::string>(Settings::values.udp_input_servers)); | ||||
|     std::string server_token; | ||||
|     std::size_t client = 0; | ||||
|     while (std::getline(servers_ss, server_token, ',')) { | ||||
| @@ -370,7 +370,7 @@ std::optional<std::size_t> Client::GetUnusedFingerID() const { | ||||
|  | ||||
| void Client::UpdateTouchInput(Response::TouchPad& touch_pad, std::size_t client, std::size_t id) { | ||||
|     // TODO: Use custom calibration per device | ||||
|     const Common::ParamPackage touch_param(Settings::values.touch_device); | ||||
|     const Common::ParamPackage touch_param(Settings::values.touch_device.GetValue()); | ||||
|     const u16 min_x = static_cast<u16>(touch_param.Get("min_x", 100)); | ||||
|     const u16 min_y = static_cast<u16>(touch_param.Get("min_y", 50)); | ||||
|     const u16 max_x = static_cast<u16>(touch_param.Get("max_x", 1800)); | ||||
|   | ||||
| @@ -103,7 +103,7 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_, | ||||
|       gpu(gpu_), | ||||
|       library(OpenLibrary()), | ||||
|       instance(CreateInstance(library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type, | ||||
|                               true, Settings::values.renderer_debug)), | ||||
|                               true, Settings::values.renderer_debug.GetValue())), | ||||
|       debug_callback(Settings::values.renderer_debug ? CreateDebugCallback(instance) : nullptr), | ||||
|       surface(CreateSurface(instance, render_window)), | ||||
|       device(CreateDevice(instance, dld, *surface)), | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -102,28 +102,75 @@ private: | ||||
|     void SaveUILayoutValues(); | ||||
|     void SaveWebServiceValues(); | ||||
|  | ||||
|     /** | ||||
|      * Reads a setting from the qt_config. | ||||
|      * | ||||
|      * @param name The setting's identifier | ||||
|      * @param default_value The value to use when the setting is not already present in the config | ||||
|      */ | ||||
|     QVariant ReadSetting(const QString& name) const; | ||||
|     QVariant ReadSetting(const QString& name, const QVariant& default_value) const; | ||||
|     // Templated ReadSettingGlobal functions will also look for the use_global setting and set | ||||
|     // both the value and the global state properly | ||||
|     template <typename Type> | ||||
|     void ReadSettingGlobal(Settings::Setting<Type>& setting, const QString& name); | ||||
|     template <typename Type> | ||||
|     void ReadSettingGlobal(Settings::Setting<Type>& setting, const QString& name, | ||||
|                            const QVariant& default_value); | ||||
|  | ||||
|     /** | ||||
|      * Only reads a setting from the qt_config if the current config is a global config, or if the | ||||
|      * current config is a custom config and the setting is overriding the global setting. Otherwise | ||||
|      * it does nothing. | ||||
|      * | ||||
|      * @param setting The variable to be modified | ||||
|      * @param name The setting's identifier | ||||
|      * @param default_value The value to use when the setting is not already present in the config | ||||
|      */ | ||||
|     template <typename Type> | ||||
|     void ReadSettingGlobal(Type& setting, const QString& name, const QVariant& default_value) const; | ||||
|     // Templated WriteSettingGlobal functions will also write the global state if needed and will | ||||
|     // skip writing the actual setting if it defers to the global value | ||||
|  | ||||
|     /** | ||||
|      * Writes a setting to the qt_config. | ||||
|      * | ||||
|      * @param name The setting's idetentifier | ||||
|      * @param value Value of the setting | ||||
|      * @param default_value Default of the setting if not present in qt_config | ||||
|      * @param use_global Specifies if the custom or global config should be in use, for custom | ||||
|      * configs | ||||
|      */ | ||||
|     void WriteSetting(const QString& name, const QVariant& value); | ||||
|     void WriteSetting(const QString& name, const QVariant& value, const QVariant& default_value); | ||||
|     void WriteSetting(const QString& name, const QVariant& value, const QVariant& default_value, | ||||
|                       bool use_global); | ||||
|  | ||||
|     /** | ||||
|      * Reads a value from the qt_config and applies it to the setting, using its label and default | ||||
|      * value. If the config is a custom config, this will also read the global state of the setting | ||||
|      * and apply that information to it. | ||||
|      * | ||||
|      * @param The setting | ||||
|      */ | ||||
|     template <typename Type> | ||||
|     void WriteSettingGlobal(const QString& name, const Settings::Setting<Type>& setting); | ||||
|     void ReadGlobalSetting(Settings::Setting<Type>& setting); | ||||
|  | ||||
|     /** | ||||
|      * Sets a value to the qt_config using the setting's label and default value. If the config is a | ||||
|      * custom config, it will apply the global state, and the custom value if needed. | ||||
|      * | ||||
|      * @param The setting | ||||
|      */ | ||||
|     template <typename Type> | ||||
|     void WriteSettingGlobal(const QString& name, const Settings::Setting<Type>& setting, | ||||
|                             const QVariant& default_value); | ||||
|     void WriteSettingGlobal(const QString& name, const QVariant& value, bool use_global, | ||||
|                             const QVariant& default_value); | ||||
|     void WriteGlobalSetting(const Settings::Setting<Type>& setting); | ||||
|  | ||||
|     /** | ||||
|      * Reads a value from the qt_config using the setting's label and default value and applies the | ||||
|      * value to the setting. | ||||
|      * | ||||
|      * @param The setting | ||||
|      */ | ||||
|     template <typename Type> | ||||
|     void ReadBasicSetting(Settings::BasicSetting<Type>& setting); | ||||
|  | ||||
|     /** Sets a value from the setting in the qt_config using the setting's label and default value. | ||||
|      * | ||||
|      * @param The setting | ||||
|      */ | ||||
|     template <typename Type> | ||||
|     void WriteBasicSetting(const Settings::BasicSetting<Type>& setting); | ||||
|  | ||||
|     ConfigType type; | ||||
|     std::unique_ptr<QSettings> qt_config; | ||||
|   | ||||
| @@ -69,7 +69,7 @@ void ConfigureAudio::SetOutputSinkFromSinkID() { | ||||
|     [[maybe_unused]] const QSignalBlocker blocker(ui->output_sink_combo_box); | ||||
|  | ||||
|     int new_sink_index = 0; | ||||
|     const QString sink_id = QString::fromStdString(Settings::values.sink_id); | ||||
|     const QString sink_id = QString::fromStdString(Settings::values.sink_id.GetValue()); | ||||
|     for (int index = 0; index < ui->output_sink_combo_box->count(); index++) { | ||||
|         if (ui->output_sink_combo_box->itemText(index) == sink_id) { | ||||
|             new_sink_index = index; | ||||
| @@ -83,7 +83,7 @@ void ConfigureAudio::SetOutputSinkFromSinkID() { | ||||
| void ConfigureAudio::SetAudioDeviceFromDeviceID() { | ||||
|     int new_device_index = -1; | ||||
|  | ||||
|     const QString device_id = QString::fromStdString(Settings::values.audio_device_id); | ||||
|     const QString device_id = QString::fromStdString(Settings::values.audio_device_id.GetValue()); | ||||
|     for (int index = 0; index < ui->audio_device_combo_box->count(); index++) { | ||||
|         if (ui->audio_device_combo_box->itemText(index) == device_id) { | ||||
|             new_device_index = index; | ||||
| @@ -106,9 +106,9 @@ void ConfigureAudio::ApplyConfiguration() { | ||||
|         Settings::values.sink_id = | ||||
|             ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex()) | ||||
|                 .toStdString(); | ||||
|         Settings::values.audio_device_id = | ||||
|         Settings::values.audio_device_id.SetValue( | ||||
|             ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex()) | ||||
|                 .toStdString(); | ||||
|                 .toStdString()); | ||||
|  | ||||
|         // Guard if during game and set to game-specific value | ||||
|         if (Settings::values.volume.UsingGlobal()) { | ||||
|   | ||||
| @@ -24,23 +24,26 @@ void ConfigureCpuDebug::SetConfiguration() { | ||||
|     const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); | ||||
|  | ||||
|     ui->cpuopt_page_tables->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables); | ||||
|     ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables.GetValue()); | ||||
|     ui->cpuopt_block_linking->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_block_linking->setChecked(Settings::values.cpuopt_block_linking); | ||||
|     ui->cpuopt_block_linking->setChecked(Settings::values.cpuopt_block_linking.GetValue()); | ||||
|     ui->cpuopt_return_stack_buffer->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_return_stack_buffer->setChecked(Settings::values.cpuopt_return_stack_buffer); | ||||
|     ui->cpuopt_return_stack_buffer->setChecked( | ||||
|         Settings::values.cpuopt_return_stack_buffer.GetValue()); | ||||
|     ui->cpuopt_fast_dispatcher->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_fast_dispatcher->setChecked(Settings::values.cpuopt_fast_dispatcher); | ||||
|     ui->cpuopt_fast_dispatcher->setChecked(Settings::values.cpuopt_fast_dispatcher.GetValue()); | ||||
|     ui->cpuopt_context_elimination->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_context_elimination->setChecked(Settings::values.cpuopt_context_elimination); | ||||
|     ui->cpuopt_context_elimination->setChecked( | ||||
|         Settings::values.cpuopt_context_elimination.GetValue()); | ||||
|     ui->cpuopt_const_prop->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_const_prop->setChecked(Settings::values.cpuopt_const_prop); | ||||
|     ui->cpuopt_const_prop->setChecked(Settings::values.cpuopt_const_prop.GetValue()); | ||||
|     ui->cpuopt_misc_ir->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_misc_ir->setChecked(Settings::values.cpuopt_misc_ir); | ||||
|     ui->cpuopt_misc_ir->setChecked(Settings::values.cpuopt_misc_ir.GetValue()); | ||||
|     ui->cpuopt_reduce_misalign_checks->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks); | ||||
|     ui->cpuopt_reduce_misalign_checks->setChecked( | ||||
|         Settings::values.cpuopt_reduce_misalign_checks.GetValue()); | ||||
|     ui->cpuopt_fastmem->setEnabled(runtime_lock); | ||||
|     ui->cpuopt_fastmem->setChecked(Settings::values.cpuopt_fastmem); | ||||
|     ui->cpuopt_fastmem->setChecked(Settings::values.cpuopt_fastmem.GetValue()); | ||||
| } | ||||
|  | ||||
| void ConfigureCpuDebug::ApplyConfiguration() { | ||||
|   | ||||
| @@ -31,20 +31,21 @@ void ConfigureDebug::SetConfiguration() { | ||||
|     const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); | ||||
|  | ||||
|     ui->toggle_console->setEnabled(runtime_lock); | ||||
|     ui->toggle_console->setChecked(UISettings::values.show_console); | ||||
|     ui->log_filter_edit->setText(QString::fromStdString(Settings::values.log_filter)); | ||||
|     ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args)); | ||||
|     ui->toggle_console->setChecked(UISettings::values.show_console.GetValue()); | ||||
|     ui->log_filter_edit->setText(QString::fromStdString(Settings::values.log_filter.GetValue())); | ||||
|     ui->homebrew_args_edit->setText( | ||||
|         QString::fromStdString(Settings::values.program_args.GetValue())); | ||||
|     ui->fs_access_log->setEnabled(runtime_lock); | ||||
|     ui->fs_access_log->setChecked(Settings::values.enable_fs_access_log); | ||||
|     ui->reporting_services->setChecked(Settings::values.reporting_services); | ||||
|     ui->quest_flag->setChecked(Settings::values.quest_flag); | ||||
|     ui->use_debug_asserts->setChecked(Settings::values.use_debug_asserts); | ||||
|     ui->use_auto_stub->setChecked(Settings::values.use_auto_stub); | ||||
|     ui->fs_access_log->setChecked(Settings::values.enable_fs_access_log.GetValue()); | ||||
|     ui->reporting_services->setChecked(Settings::values.reporting_services.GetValue()); | ||||
|     ui->quest_flag->setChecked(Settings::values.quest_flag.GetValue()); | ||||
|     ui->use_debug_asserts->setChecked(Settings::values.use_debug_asserts.GetValue()); | ||||
|     ui->use_auto_stub->setChecked(Settings::values.use_auto_stub.GetValue()); | ||||
|     ui->enable_graphics_debugging->setEnabled(runtime_lock); | ||||
|     ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug); | ||||
|     ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug.GetValue()); | ||||
|     ui->disable_macro_jit->setEnabled(runtime_lock); | ||||
|     ui->disable_macro_jit->setChecked(Settings::values.disable_macro_jit); | ||||
|     ui->extended_logging->setChecked(Settings::values.extended_logging); | ||||
|     ui->disable_macro_jit->setChecked(Settings::values.disable_macro_jit.GetValue()); | ||||
|     ui->extended_logging->setChecked(Settings::values.extended_logging.GetValue()); | ||||
| } | ||||
|  | ||||
| void ConfigureDebug::ApplyConfiguration() { | ||||
| @@ -61,7 +62,7 @@ void ConfigureDebug::ApplyConfiguration() { | ||||
|     Settings::values.extended_logging = ui->extended_logging->isChecked(); | ||||
|     Debugger::ToggleConsole(); | ||||
|     Common::Log::Filter filter; | ||||
|     filter.ParseFilterString(Settings::values.log_filter); | ||||
|     filter.ParseFilterString(Settings::values.log_filter.GetValue()); | ||||
|     Common::Log::SetGlobalFilter(filter); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -43,18 +43,19 @@ void ConfigureFilesystem::setConfiguration() { | ||||
|         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::NANDDir))); | ||||
|     ui->sdmc_directory_edit->setText( | ||||
|         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::SDMCDir))); | ||||
|     ui->gamecard_path_edit->setText(QString::fromStdString(Settings::values.gamecard_path)); | ||||
|     ui->gamecard_path_edit->setText( | ||||
|         QString::fromStdString(Settings::values.gamecard_path.GetValue())); | ||||
|     ui->dump_path_edit->setText( | ||||
|         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::DumpDir))); | ||||
|     ui->load_path_edit->setText( | ||||
|         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::LoadDir))); | ||||
|  | ||||
|     ui->gamecard_inserted->setChecked(Settings::values.gamecard_inserted); | ||||
|     ui->gamecard_current_game->setChecked(Settings::values.gamecard_current_game); | ||||
|     ui->dump_exefs->setChecked(Settings::values.dump_exefs); | ||||
|     ui->dump_nso->setChecked(Settings::values.dump_nso); | ||||
|     ui->gamecard_inserted->setChecked(Settings::values.gamecard_inserted.GetValue()); | ||||
|     ui->gamecard_current_game->setChecked(Settings::values.gamecard_current_game.GetValue()); | ||||
|     ui->dump_exefs->setChecked(Settings::values.dump_exefs.GetValue()); | ||||
|     ui->dump_nso->setChecked(Settings::values.dump_nso.GetValue()); | ||||
|  | ||||
|     ui->cache_game_list->setChecked(UISettings::values.cache_game_list); | ||||
|     ui->cache_game_list->setChecked(UISettings::values.cache_game_list.GetValue()); | ||||
|  | ||||
|     UpdateEnabledControls(); | ||||
| } | ||||
|   | ||||
| @@ -40,10 +40,10 @@ void ConfigureGeneral::SetConfiguration() { | ||||
|     ui->use_multi_core->setEnabled(runtime_lock); | ||||
|     ui->use_multi_core->setChecked(Settings::values.use_multi_core.GetValue()); | ||||
|  | ||||
|     ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing); | ||||
|     ui->toggle_user_on_boot->setChecked(UISettings::values.select_user_on_boot); | ||||
|     ui->toggle_background_pause->setChecked(UISettings::values.pause_when_in_background); | ||||
|     ui->toggle_hide_mouse->setChecked(UISettings::values.hide_mouse); | ||||
|     ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing.GetValue()); | ||||
|     ui->toggle_user_on_boot->setChecked(UISettings::values.select_user_on_boot.GetValue()); | ||||
|     ui->toggle_background_pause->setChecked(UISettings::values.pause_when_in_background.GetValue()); | ||||
|     ui->toggle_hide_mouse->setChecked(UISettings::values.hide_mouse.GetValue()); | ||||
|  | ||||
|     ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue()); | ||||
|     ui->frame_limit->setValue(Settings::values.frame_limit.GetValue()); | ||||
|   | ||||
| @@ -148,12 +148,12 @@ void ConfigureInputAdvanced::LoadConfiguration() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     ui->debug_enabled->setChecked(Settings::values.debug_pad_enabled); | ||||
|     ui->mouse_enabled->setChecked(Settings::values.mouse_enabled); | ||||
|     ui->keyboard_enabled->setChecked(Settings::values.keyboard_enabled); | ||||
|     ui->emulate_analog_keyboard->setChecked(Settings::values.emulate_analog_keyboard); | ||||
|     ui->mouse_panning->setChecked(Settings::values.mouse_panning); | ||||
|     ui->mouse_panning_sensitivity->setValue(Settings::values.mouse_panning_sensitivity); | ||||
|     ui->debug_enabled->setChecked(Settings::values.debug_pad_enabled.GetValue()); | ||||
|     ui->mouse_enabled->setChecked(Settings::values.mouse_enabled.GetValue()); | ||||
|     ui->keyboard_enabled->setChecked(Settings::values.keyboard_enabled.GetValue()); | ||||
|     ui->emulate_analog_keyboard->setChecked(Settings::values.emulate_analog_keyboard.GetValue()); | ||||
|     ui->mouse_panning->setChecked(Settings::values.mouse_panning.GetValue()); | ||||
|     ui->mouse_panning_sensitivity->setValue(Settings::values.mouse_panning_sensitivity.GetValue()); | ||||
|     ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled); | ||||
|  | ||||
|     UpdateUIEnabled(); | ||||
|   | ||||
| @@ -101,15 +101,16 @@ ConfigureMotionTouch::ConfigureMotionTouch(QWidget* parent, | ||||
| ConfigureMotionTouch::~ConfigureMotionTouch() = default; | ||||
|  | ||||
| void ConfigureMotionTouch::SetConfiguration() { | ||||
|     const Common::ParamPackage motion_param(Settings::values.motion_device); | ||||
|     const Common::ParamPackage touch_param(Settings::values.touch_device); | ||||
|     const Common::ParamPackage motion_param(Settings::values.motion_device.GetValue()); | ||||
|     const Common::ParamPackage touch_param(Settings::values.touch_device.GetValue()); | ||||
|  | ||||
|     ui->touch_from_button_checkbox->setChecked(Settings::values.use_touch_from_button); | ||||
|     ui->touch_from_button_checkbox->setChecked(Settings::values.use_touch_from_button.GetValue()); | ||||
|     touch_from_button_maps = Settings::values.touch_from_button_maps; | ||||
|     for (const auto& touch_map : touch_from_button_maps) { | ||||
|         ui->touch_from_button_map->addItem(QString::fromStdString(touch_map.name)); | ||||
|     } | ||||
|     ui->touch_from_button_map->setCurrentIndex(Settings::values.touch_from_button_map_index); | ||||
|     ui->touch_from_button_map->setCurrentIndex( | ||||
|         Settings::values.touch_from_button_map_index.GetValue()); | ||||
|     ui->motion_sensitivity->setValue(motion_param.Get("sensitivity", 0.01f)); | ||||
|  | ||||
|     min_x = touch_param.Get("min_x", 100); | ||||
| @@ -124,7 +125,7 @@ void ConfigureMotionTouch::SetConfiguration() { | ||||
|     udp_server_list_model->setStringList({}); | ||||
|     ui->udp_server_list->setModel(udp_server_list_model); | ||||
|  | ||||
|     std::stringstream ss(Settings::values.udp_input_servers); | ||||
|     std::stringstream ss(Settings::values.udp_input_servers.GetValue()); | ||||
|     std::string token; | ||||
|  | ||||
|     while (std::getline(ss, token, ',')) { | ||||
|   | ||||
| @@ -166,7 +166,7 @@ void ConfigureProfileManager::PopulateUserList() { | ||||
| void ConfigureProfileManager::UpdateCurrentUser() { | ||||
|     ui->pm_add->setEnabled(profile_manager->GetUserCount() < Service::Account::MAX_USERS); | ||||
|  | ||||
|     const auto& current_user = profile_manager->GetUser(Settings::values.current_user); | ||||
|     const auto& current_user = profile_manager->GetUser(Settings::values.current_user.GetValue()); | ||||
|     ASSERT(current_user); | ||||
|     const auto username = GetAccountUsername(*profile_manager, *current_user); | ||||
|  | ||||
| @@ -245,15 +245,18 @@ void ConfigureProfileManager::DeleteUser() { | ||||
|         this, tr("Confirm Delete"), | ||||
|         tr("You are about to delete user with name \"%1\". Are you sure?").arg(username)); | ||||
|  | ||||
|     if (confirm == QMessageBox::No) | ||||
|     if (confirm == QMessageBox::No) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (Settings::values.current_user == tree_view->currentIndex().row()) | ||||
|     if (Settings::values.current_user.GetValue() == tree_view->currentIndex().row()) { | ||||
|         Settings::values.current_user = 0; | ||||
|     } | ||||
|     UpdateCurrentUser(); | ||||
|  | ||||
|     if (!profile_manager->RemoveUser(*uuid)) | ||||
|     if (!profile_manager->RemoveUser(*uuid)) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     item_model->removeRows(tree_view->currentIndex().row(), 1); | ||||
|     tree_view->clearSelection(); | ||||
|   | ||||
| @@ -65,7 +65,7 @@ void ConfigureService::RetranslateUi() { | ||||
|  | ||||
| void ConfigureService::SetConfiguration() { | ||||
|     const int index = | ||||
|         ui->bcat_source->findData(QString::fromStdString(Settings::values.bcat_backend)); | ||||
|         ui->bcat_source->findData(QString::fromStdString(Settings::values.bcat_backend.GetValue())); | ||||
|     ui->bcat_source->setCurrentIndex(index == -1 ? 0 : index); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -113,11 +113,12 @@ void ConfigureUi::SetConfiguration() { | ||||
|     ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme)); | ||||
|     ui->language_combobox->setCurrentIndex( | ||||
|         ui->language_combobox->findData(UISettings::values.language)); | ||||
|     ui->show_add_ons->setChecked(UISettings::values.show_add_ons); | ||||
|     ui->show_add_ons->setChecked(UISettings::values.show_add_ons.GetValue()); | ||||
|     ui->icon_size_combobox->setCurrentIndex( | ||||
|         ui->icon_size_combobox->findData(UISettings::values.icon_size)); | ||||
|         ui->icon_size_combobox->findData(UISettings::values.icon_size.GetValue())); | ||||
|  | ||||
|     ui->enable_screenshot_save_as->setChecked(UISettings::values.enable_screenshot_save_as); | ||||
|     ui->enable_screenshot_save_as->setChecked( | ||||
|         UISettings::values.enable_screenshot_save_as.GetValue()); | ||||
|     ui->screenshot_path_edit->setText(QString::fromStdString( | ||||
|         Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ScreenshotsDir))); | ||||
| } | ||||
| @@ -178,7 +179,7 @@ void ConfigureUi::InitializeRowComboBoxes() { | ||||
|  | ||||
| void ConfigureUi::UpdateFirstRowComboBox(bool init) { | ||||
|     const int currentIndex = | ||||
|         init ? UISettings::values.row_1_text_id | ||||
|         init ? UISettings::values.row_1_text_id.GetValue() | ||||
|              : ui->row_1_text_combobox->findData(ui->row_1_text_combobox->currentData()); | ||||
|  | ||||
|     ui->row_1_text_combobox->clear(); | ||||
| @@ -197,7 +198,7 @@ void ConfigureUi::UpdateFirstRowComboBox(bool init) { | ||||
|  | ||||
| void ConfigureUi::UpdateSecondRowComboBox(bool init) { | ||||
|     const int currentIndex = | ||||
|         init ? UISettings::values.row_2_text_id | ||||
|         init ? UISettings::values.row_2_text_id.GetValue() | ||||
|              : ui->row_2_text_combobox->findData(ui->row_2_text_combobox->currentData()); | ||||
|  | ||||
|     ui->row_2_text_combobox->clear(); | ||||
|   | ||||
| @@ -88,22 +88,22 @@ void ConfigureWeb::SetConfiguration() { | ||||
|     ui->web_signup_link->setOpenExternalLinks(true); | ||||
|     ui->web_token_info_link->setOpenExternalLinks(true); | ||||
|  | ||||
|     if (Settings::values.yuzu_username.empty()) { | ||||
|     if (Settings::values.yuzu_username.GetValue().empty()) { | ||||
|         ui->username->setText(tr("Unspecified")); | ||||
|     } else { | ||||
|         ui->username->setText(QString::fromStdString(Settings::values.yuzu_username)); | ||||
|         ui->username->setText(QString::fromStdString(Settings::values.yuzu_username.GetValue())); | ||||
|     } | ||||
|  | ||||
|     ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry); | ||||
|     ui->edit_token->setText(QString::fromStdString( | ||||
|         GenerateDisplayToken(Settings::values.yuzu_username, Settings::values.yuzu_token))); | ||||
|     ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry.GetValue()); | ||||
|     ui->edit_token->setText(QString::fromStdString(GenerateDisplayToken( | ||||
|         Settings::values.yuzu_username.GetValue(), Settings::values.yuzu_token.GetValue()))); | ||||
|  | ||||
|     // Connect after setting the values, to avoid calling OnLoginChanged now | ||||
|     connect(ui->edit_token, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged); | ||||
|  | ||||
|     user_verified = true; | ||||
|  | ||||
|     ui->toggle_discordrpc->setChecked(UISettings::values.enable_discord_presence); | ||||
|     ui->toggle_discordrpc->setChecked(UISettings::values.enable_discord_presence.GetValue()); | ||||
| } | ||||
|  | ||||
| void ConfigureWeb::ApplyConfiguration() { | ||||
|   | ||||
| @@ -15,10 +15,10 @@ | ||||
| namespace Debugger { | ||||
| void ToggleConsole() { | ||||
|     static bool console_shown = false; | ||||
|     if (console_shown == UISettings::values.show_console) { | ||||
|     if (console_shown == UISettings::values.show_console.GetValue()) { | ||||
|         return; | ||||
|     } else { | ||||
|         console_shown = UISettings::values.show_console; | ||||
|         console_shown = UISettings::values.show_console.GetValue(); | ||||
|     } | ||||
|  | ||||
| #if defined(_WIN32) && !defined(_DEBUG) | ||||
|   | ||||
| @@ -244,7 +244,8 @@ void GameList::OnUpdateThemedIcons() { | ||||
|     for (int i = 0; i < item_model->invisibleRootItem()->rowCount(); i++) { | ||||
|         QStandardItem* child = item_model->invisibleRootItem()->child(i); | ||||
|  | ||||
|         const int icon_size = std::min(static_cast<int>(UISettings::values.icon_size), 64); | ||||
|         const int icon_size = | ||||
|             std::min(static_cast<int>(UISettings::values.icon_size.GetValue()), 64); | ||||
|         switch (child->data(GameListItem::TypeRole).value<GameListItemType>()) { | ||||
|         case GameListItemType::SdmcDir: | ||||
|             child->setData( | ||||
|   | ||||
| @@ -80,7 +80,7 @@ public: | ||||
|         setData(qulonglong(program_id), ProgramIdRole); | ||||
|         setData(game_type, FileTypeRole); | ||||
|  | ||||
|         const u32 size = UISettings::values.icon_size; | ||||
|         const u32 size = UISettings::values.icon_size.GetValue(); | ||||
|  | ||||
|         QPixmap picture; | ||||
|         if (!picture.loadFromData(picture_data.data(), static_cast<u32>(picture_data.size()))) { | ||||
| @@ -108,8 +108,8 @@ public: | ||||
|                 data(TitleRole).toString(), | ||||
|             }}; | ||||
|  | ||||
|             const auto& row1 = row_data.at(UISettings::values.row_1_text_id); | ||||
|             const int row2_id = UISettings::values.row_2_text_id; | ||||
|             const auto& row1 = row_data.at(UISettings::values.row_1_text_id.GetValue()); | ||||
|             const int row2_id = UISettings::values.row_2_text_id.GetValue(); | ||||
|  | ||||
|             if (role == SortRole) { | ||||
|                 return row1.toLower(); | ||||
| @@ -233,7 +233,8 @@ public: | ||||
|         UISettings::GameDir* game_dir = &directory; | ||||
|         setData(QVariant(UISettings::values.game_dirs.indexOf(directory)), GameDirRole); | ||||
|  | ||||
|         const int icon_size = std::min(static_cast<int>(UISettings::values.icon_size), 64); | ||||
|         const int icon_size = | ||||
|             std::min(static_cast<int>(UISettings::values.icon_size.GetValue()), 64); | ||||
|         switch (dir_type) { | ||||
|         case GameListItemType::SdmcDir: | ||||
|             setData( | ||||
| @@ -294,7 +295,8 @@ public: | ||||
|     explicit GameListAddDir() { | ||||
|         setData(type(), TypeRole); | ||||
|  | ||||
|         const int icon_size = std::min(static_cast<int>(UISettings::values.icon_size), 64); | ||||
|         const int icon_size = | ||||
|             std::min(static_cast<int>(UISettings::values.icon_size.GetValue()), 64); | ||||
|         setData(QIcon::fromTheme(QStringLiteral("plus")) | ||||
|                     .pixmap(icon_size) | ||||
|                     .scaled(icon_size, icon_size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), | ||||
| @@ -316,7 +318,8 @@ public: | ||||
|     explicit GameListFavorites() { | ||||
|         setData(type(), TypeRole); | ||||
|  | ||||
|         const int icon_size = std::min(static_cast<int>(UISettings::values.icon_size), 64); | ||||
|         const int icon_size = | ||||
|             std::min(static_cast<int>(UISettings::values.icon_size.GetValue()), 64); | ||||
|         setData(QIcon::fromTheme(QStringLiteral("star")) | ||||
|                     .pixmap(icon_size) | ||||
|                     .scaled(icon_size, icon_size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), | ||||
|   | ||||
| @@ -156,11 +156,13 @@ enum class CalloutFlag : uint32_t { | ||||
| }; | ||||
|  | ||||
| void GMainWindow::ShowTelemetryCallout() { | ||||
|     if (UISettings::values.callout_flags & static_cast<uint32_t>(CalloutFlag::Telemetry)) { | ||||
|     if (UISettings::values.callout_flags.GetValue() & | ||||
|         static_cast<uint32_t>(CalloutFlag::Telemetry)) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     UISettings::values.callout_flags |= static_cast<uint32_t>(CalloutFlag::Telemetry); | ||||
|     UISettings::values.callout_flags = | ||||
|         UISettings::values.callout_flags.GetValue() | static_cast<uint32_t>(CalloutFlag::Telemetry); | ||||
|     const QString telemetry_message = | ||||
|         tr("<a href='https://yuzu-emu.org/help/feature/telemetry/'>Anonymous " | ||||
|            "data is collected</a> to help improve yuzu. " | ||||
| @@ -177,7 +179,7 @@ static void InitializeLogging() { | ||||
|     using namespace Common; | ||||
|  | ||||
|     Log::Filter log_filter; | ||||
|     log_filter.ParseFilterString(Settings::values.log_filter); | ||||
|     log_filter.ParseFilterString(Settings::values.log_filter.GetValue()); | ||||
|     Log::SetGlobalFilter(log_filter); | ||||
|  | ||||
|     const auto log_dir = FS::GetYuzuPath(FS::YuzuPath::LogDir); | ||||
| @@ -216,7 +218,7 @@ GMainWindow::GMainWindow() | ||||
|     default_theme_paths = QIcon::themeSearchPaths(); | ||||
|     UpdateUITheme(); | ||||
|  | ||||
|     SetDiscordEnabled(UISettings::values.enable_discord_presence); | ||||
|     SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); | ||||
|     discord_rpc->Update(); | ||||
|  | ||||
|     RegisterMetaTypes(); | ||||
| @@ -1060,23 +1062,24 @@ void GMainWindow::RestoreUIState() { | ||||
|     render_window->restoreGeometry(UISettings::values.renderwindow_geometry); | ||||
| #if MICROPROFILE_ENABLED | ||||
|     microProfileDialog->restoreGeometry(UISettings::values.microprofile_geometry); | ||||
|     microProfileDialog->setVisible(UISettings::values.microprofile_visible); | ||||
|     microProfileDialog->setVisible(UISettings::values.microprofile_visible.GetValue()); | ||||
| #endif | ||||
|  | ||||
|     game_list->LoadInterfaceLayout(); | ||||
|  | ||||
|     ui.action_Single_Window_Mode->setChecked(UISettings::values.single_window_mode); | ||||
|     ui.action_Single_Window_Mode->setChecked(UISettings::values.single_window_mode.GetValue()); | ||||
|     ToggleWindowMode(); | ||||
|  | ||||
|     ui.action_Fullscreen->setChecked(UISettings::values.fullscreen); | ||||
|     ui.action_Fullscreen->setChecked(UISettings::values.fullscreen.GetValue()); | ||||
|  | ||||
|     ui.action_Display_Dock_Widget_Headers->setChecked(UISettings::values.display_titlebar); | ||||
|     ui.action_Display_Dock_Widget_Headers->setChecked( | ||||
|         UISettings::values.display_titlebar.GetValue()); | ||||
|     OnDisplayTitleBars(ui.action_Display_Dock_Widget_Headers->isChecked()); | ||||
|  | ||||
|     ui.action_Show_Filter_Bar->setChecked(UISettings::values.show_filter_bar); | ||||
|     ui.action_Show_Filter_Bar->setChecked(UISettings::values.show_filter_bar.GetValue()); | ||||
|     game_list->SetFilterVisible(ui.action_Show_Filter_Bar->isChecked()); | ||||
|  | ||||
|     ui.action_Show_Status_Bar->setChecked(UISettings::values.show_status_bar); | ||||
|     ui.action_Show_Status_Bar->setChecked(UISettings::values.show_status_bar.GetValue()); | ||||
|     statusBar()->setVisible(ui.action_Show_Status_Bar->isChecked()); | ||||
|     Debugger::ToggleConsole(); | ||||
| } | ||||
| @@ -1243,13 +1246,14 @@ bool GMainWindow::LoadROM(const QString& filename, std::size_t program_index) { | ||||
|     const Core::System::ResultStatus result{ | ||||
|         system.Load(*render_window, filename.toStdString(), program_index)}; | ||||
|  | ||||
|     const auto drd_callout = | ||||
|         (UISettings::values.callout_flags & static_cast<u32>(CalloutFlag::DRDDeprecation)) == 0; | ||||
|     const auto drd_callout = (UISettings::values.callout_flags.GetValue() & | ||||
|                               static_cast<u32>(CalloutFlag::DRDDeprecation)) == 0; | ||||
|  | ||||
|     if (result == Core::System::ResultStatus::Success && | ||||
|         system.GetAppLoader().GetFileType() == Loader::FileType::DeconstructedRomDirectory && | ||||
|         drd_callout) { | ||||
|         UISettings::values.callout_flags |= static_cast<u32>(CalloutFlag::DRDDeprecation); | ||||
|         UISettings::values.callout_flags = UISettings::values.callout_flags.GetValue() | | ||||
|                                            static_cast<u32>(CalloutFlag::DRDDeprecation); | ||||
|         QMessageBox::warning( | ||||
|             this, tr("Warning Outdated Game Format"), | ||||
|             tr("You are using the deconstructed ROM directory format for this game, which is an " | ||||
| @@ -2453,7 +2457,8 @@ void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_tex | ||||
| } | ||||
|  | ||||
| void GMainWindow::OnMenuReportCompatibility() { | ||||
|     if (!Settings::values.yuzu_token.empty() && !Settings::values.yuzu_username.empty()) { | ||||
|     if (!Settings::values.yuzu_token.GetValue().empty() && | ||||
|         !Settings::values.yuzu_username.GetValue().empty()) { | ||||
|         CompatDB compatdb{this}; | ||||
|         compatdb.exec(); | ||||
|     } else { | ||||
| @@ -2618,7 +2623,7 @@ void GMainWindow::ResetWindowSize1080() { | ||||
|  | ||||
| void GMainWindow::OnConfigure() { | ||||
|     const auto old_theme = UISettings::values.theme; | ||||
|     const bool old_discord_presence = UISettings::values.enable_discord_presence; | ||||
|     const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); | ||||
|  | ||||
|     ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get()); | ||||
|     connect(&configure_dialog, &ConfigureDialog::LanguageChanged, this, | ||||
| @@ -2675,8 +2680,8 @@ void GMainWindow::OnConfigure() { | ||||
|     if (UISettings::values.theme != old_theme) { | ||||
|         UpdateUITheme(); | ||||
|     } | ||||
|     if (UISettings::values.enable_discord_presence != old_discord_presence) { | ||||
|         SetDiscordEnabled(UISettings::values.enable_discord_presence); | ||||
|     if (UISettings::values.enable_discord_presence.GetValue() != old_discord_presence) { | ||||
|         SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); | ||||
|     } | ||||
|     emit UpdateThemedIcons(); | ||||
|  | ||||
| @@ -2832,7 +2837,8 @@ void GMainWindow::OnCaptureScreenshot() { | ||||
|         } | ||||
|     } | ||||
| #endif | ||||
|     render_window->CaptureScreenshot(UISettings::values.screenshot_resolution_factor, filename); | ||||
|     render_window->CaptureScreenshot(UISettings::values.screenshot_resolution_factor.GetValue(), | ||||
|                                      filename); | ||||
|     OnStartGame(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -13,6 +13,7 @@ | ||||
| #include <QStringList> | ||||
| #include <QVector> | ||||
| #include "common/common_types.h" | ||||
| #include "common/settings.h" | ||||
|  | ||||
| namespace UISettings { | ||||
|  | ||||
| @@ -48,26 +49,26 @@ struct Values { | ||||
|     QByteArray gamelist_header_state; | ||||
|  | ||||
|     QByteArray microprofile_geometry; | ||||
|     bool microprofile_visible; | ||||
|     Settings::BasicSetting<bool> microprofile_visible{false, "microProfileDialogVisible"}; | ||||
|  | ||||
|     bool single_window_mode; | ||||
|     bool fullscreen; | ||||
|     bool display_titlebar; | ||||
|     bool show_filter_bar; | ||||
|     bool show_status_bar; | ||||
|     Settings::BasicSetting<bool> single_window_mode{true, "singleWindowMode"}; | ||||
|     Settings::BasicSetting<bool> fullscreen{false, "fullscreen"}; | ||||
|     Settings::BasicSetting<bool> display_titlebar{true, "displayTitleBars"}; | ||||
|     Settings::BasicSetting<bool> show_filter_bar{true, "showFilterBar"}; | ||||
|     Settings::BasicSetting<bool> show_status_bar{true, "showStatusBar"}; | ||||
|  | ||||
|     bool confirm_before_closing; | ||||
|     bool first_start; | ||||
|     bool pause_when_in_background; | ||||
|     bool hide_mouse; | ||||
|     Settings::BasicSetting<bool> confirm_before_closing{true, "confirmClose"}; | ||||
|     Settings::BasicSetting<bool> first_start{true, "firstStart"}; | ||||
|     Settings::BasicSetting<bool> pause_when_in_background{false, "pauseWhenInBackground"}; | ||||
|     Settings::BasicSetting<bool> hide_mouse{false, "hideInactiveMouse"}; | ||||
|  | ||||
|     bool select_user_on_boot; | ||||
|     Settings::BasicSetting<bool> select_user_on_boot{false, "select_user_on_boot"}; | ||||
|  | ||||
|     // Discord RPC | ||||
|     bool enable_discord_presence; | ||||
|     Settings::BasicSetting<bool> enable_discord_presence{true, "enable_discord_presence"}; | ||||
|  | ||||
|     bool enable_screenshot_save_as; | ||||
|     u16 screenshot_resolution_factor; | ||||
|     Settings::BasicSetting<bool> enable_screenshot_save_as{true, "enable_screenshot_save_as"}; | ||||
|     Settings::BasicSetting<u16> screenshot_resolution_factor{0, "screenshot_resolution_factor"}; | ||||
|  | ||||
|     QString roms_path; | ||||
|     QString symbols_path; | ||||
| @@ -83,18 +84,18 @@ struct Values { | ||||
|     // Shortcut name <Shortcut, context> | ||||
|     std::vector<Shortcut> shortcuts; | ||||
|  | ||||
|     uint32_t callout_flags; | ||||
|     Settings::BasicSetting<uint32_t> callout_flags{0, "calloutFlags"}; | ||||
|  | ||||
|     // logging | ||||
|     bool show_console; | ||||
|     Settings::BasicSetting<bool> show_console{false, "showConsole"}; | ||||
|  | ||||
|     // Game List | ||||
|     bool show_add_ons; | ||||
|     uint32_t icon_size; | ||||
|     uint8_t row_1_text_id; | ||||
|     uint8_t row_2_text_id; | ||||
|     Settings::BasicSetting<bool> show_add_ons{true, "show_add_ons"}; | ||||
|     Settings::BasicSetting<uint32_t> icon_size{64, "icon_size"}; | ||||
|     Settings::BasicSetting<uint8_t> row_1_text_id{3, "row_1_text_id"}; | ||||
|     Settings::BasicSetting<uint8_t> row_2_text_id{2, "row_2_text_id"}; | ||||
|     std::atomic_bool is_game_list_reload_pending{false}; | ||||
|     bool cache_game_list; | ||||
|     Settings::BasicSetting<bool> cache_game_list{true, "cache_game_list"}; | ||||
|  | ||||
|     bool configuration_applied; | ||||
|     bool reset_to_defaults; | ||||
|   | ||||
| @@ -241,6 +241,24 @@ static const std::array<int, 8> keyboard_mods{ | ||||
|     SDL_SCANCODE_RCTRL, SDL_SCANCODE_RSHIFT, SDL_SCANCODE_RALT, SDL_SCANCODE_RGUI, | ||||
| }; | ||||
|  | ||||
| template <> | ||||
| void Config::ReadSetting(const std::string& group, Settings::BasicSetting<float>& setting) { | ||||
|     setting = sdl2_config->GetReal(group, setting.GetLabel(), setting.GetDefault()); | ||||
| } | ||||
| template <> | ||||
| void Config::ReadSetting(const std::string& group, Settings::BasicSetting<std::string>& setting) { | ||||
|     setting = sdl2_config->Get(group, setting.GetLabel(), setting.GetDefault()); | ||||
| } | ||||
| template <> | ||||
| void Config::ReadSetting(const std::string& group, Settings::BasicSetting<bool>& setting) { | ||||
|     setting = sdl2_config->GetBoolean(group, setting.GetLabel(), setting.GetDefault()); | ||||
| } | ||||
| template <typename Type> | ||||
| void Config::ReadSetting(const std::string& group, Settings::BasicSetting<Type>& setting) { | ||||
|     setting = static_cast<Type>(sdl2_config->GetInteger(group, setting.GetLabel(), | ||||
|                                                         static_cast<long>(setting.GetDefault()))); | ||||
| } | ||||
|  | ||||
| void Config::ReadValues() { | ||||
|     // Controls | ||||
|     for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) { | ||||
| @@ -264,8 +282,7 @@ void Config::ReadValues() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     Settings::values.mouse_enabled = | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "mouse_enabled", false); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.mouse_enabled); | ||||
|     for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) { | ||||
|         std::string default_param = InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]); | ||||
|         Settings::values.mouse_buttons[i] = sdl2_config->Get( | ||||
| @@ -275,14 +292,11 @@ void Config::ReadValues() { | ||||
|             Settings::values.mouse_buttons[i] = default_param; | ||||
|     } | ||||
|  | ||||
|     Settings::values.motion_device = sdl2_config->Get( | ||||
|         "ControlsGeneral", "motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01"); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.motion_device); | ||||
|  | ||||
|     Settings::values.keyboard_enabled = | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "keyboard_enabled", false); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.keyboard_enabled); | ||||
|  | ||||
|     Settings::values.debug_pad_enabled = | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "debug_pad_enabled", false); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.debug_pad_enabled); | ||||
|     for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { | ||||
|         std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); | ||||
|         Settings::values.debug_pad_buttons[i] = sdl2_config->Get( | ||||
| @@ -303,12 +317,9 @@ void Config::ReadValues() { | ||||
|             Settings::values.debug_pad_analogs[i] = default_param; | ||||
|     } | ||||
|  | ||||
|     Settings::values.vibration_enabled.SetValue( | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "vibration_enabled", true)); | ||||
|     Settings::values.enable_accurate_vibrations.SetValue( | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "enable_accurate_vibrations", false)); | ||||
|     Settings::values.motion_enabled.SetValue( | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "motion_enabled", true)); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.vibration_enabled); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.enable_accurate_vibrations); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.motion_enabled); | ||||
|     Settings::values.touchscreen.enabled = | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "touch_enabled", true); | ||||
|     Settings::values.touchscreen.rotation_angle = | ||||
| @@ -349,13 +360,11 @@ void Config::ReadValues() { | ||||
|             Settings::TouchFromButtonMap{"default", {}}); | ||||
|         num_touch_from_button_maps = 1; | ||||
|     } | ||||
|     Settings::values.use_touch_from_button = | ||||
|         sdl2_config->GetBoolean("ControlsGeneral", "use_touch_from_button", false); | ||||
|     Settings::values.touch_from_button_map_index = | ||||
|         std::clamp(Settings::values.touch_from_button_map_index, 0, num_touch_from_button_maps - 1); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.use_touch_from_button); | ||||
|     Settings::values.touch_from_button_map_index = std::clamp( | ||||
|         Settings::values.touch_from_button_map_index.GetValue(), 0, num_touch_from_button_maps - 1); | ||||
|  | ||||
|     Settings::values.udp_input_servers = | ||||
|         sdl2_config->Get("Controls", "udp_input_address", InputCommon::CemuhookUDP::DEFAULT_SRV); | ||||
|     ReadSetting("ControlsGeneral", Settings::values.udp_input_servers); | ||||
|  | ||||
|     std::transform(keyboard_keys.begin(), keyboard_keys.end(), | ||||
|                    Settings::values.keyboard_keys.begin(), InputCommon::GenerateKeyboardParam); | ||||
| @@ -367,8 +376,7 @@ void Config::ReadValues() { | ||||
|                    Settings::values.keyboard_mods.begin(), InputCommon::GenerateKeyboardParam); | ||||
|  | ||||
|     // Data Storage | ||||
|     Settings::values.use_virtual_sd = | ||||
|         sdl2_config->GetBoolean("Data Storage", "use_virtual_sd", true); | ||||
|     ReadSetting("Data Storage", Settings::values.use_virtual_sd); | ||||
|     FS::SetYuzuPath(FS::YuzuPath::NANDDir, | ||||
|                     sdl2_config->Get("Data Storage", "nand_directory", | ||||
|                                      FS::GetYuzuPathString(FS::YuzuPath::NANDDir))); | ||||
| @@ -381,18 +389,16 @@ void Config::ReadValues() { | ||||
|     FS::SetYuzuPath(FS::YuzuPath::DumpDir, | ||||
|                     sdl2_config->Get("Data Storage", "dump_directory", | ||||
|                                      FS::GetYuzuPathString(FS::YuzuPath::DumpDir))); | ||||
|     Settings::values.gamecard_inserted = | ||||
|         sdl2_config->GetBoolean("Data Storage", "gamecard_inserted", false); | ||||
|     Settings::values.gamecard_current_game = | ||||
|         sdl2_config->GetBoolean("Data Storage", "gamecard_current_game", false); | ||||
|     Settings::values.gamecard_path = sdl2_config->Get("Data Storage", "gamecard_path", ""); | ||||
|     ReadSetting("Data Storage", Settings::values.gamecard_inserted); | ||||
|     ReadSetting("Data Storage", Settings::values.gamecard_current_game); | ||||
|     ReadSetting("Data Storage", Settings::values.gamecard_path); | ||||
|  | ||||
|     // System | ||||
|     Settings::values.use_docked_mode.SetValue( | ||||
|         sdl2_config->GetBoolean("System", "use_docked_mode", true)); | ||||
|     ReadSetting("System", Settings::values.use_docked_mode); | ||||
|  | ||||
|     Settings::values.current_user = std::clamp<int>( | ||||
|         sdl2_config->GetInteger("System", "current_user", 0), 0, Service::Account::MAX_USERS - 1); | ||||
|     ReadSetting("System", Settings::values.current_user); | ||||
|     Settings::values.current_user = std::clamp<int>(Settings::values.current_user.GetValue(), 0, | ||||
|                                                     Service::Account::MAX_USERS - 1); | ||||
|  | ||||
|     const auto rng_seed_enabled = sdl2_config->GetBoolean("System", "rng_seed_enabled", false); | ||||
|     if (rng_seed_enabled) { | ||||
| @@ -409,89 +415,60 @@ void Config::ReadValues() { | ||||
|         Settings::values.custom_rtc = std::nullopt; | ||||
|     } | ||||
|  | ||||
|     Settings::values.language_index.SetValue( | ||||
|         sdl2_config->GetInteger("System", "language_index", 1)); | ||||
|     Settings::values.time_zone_index.SetValue( | ||||
|         sdl2_config->GetInteger("System", "time_zone_index", 0)); | ||||
|     ReadSetting("System", Settings::values.language_index); | ||||
|     ReadSetting("System", Settings::values.time_zone_index); | ||||
|  | ||||
|     // Core | ||||
|     Settings::values.use_multi_core.SetValue( | ||||
|         sdl2_config->GetBoolean("Core", "use_multi_core", true)); | ||||
|     ReadSetting("Core", Settings::values.use_multi_core); | ||||
|  | ||||
|     // Renderer | ||||
|     const int renderer_backend = sdl2_config->GetInteger( | ||||
|         "Renderer", "backend", static_cast<int>(Settings::RendererBackend::OpenGL)); | ||||
|     Settings::values.renderer_backend.SetValue( | ||||
|         static_cast<Settings::RendererBackend>(renderer_backend)); | ||||
|     Settings::values.renderer_debug = sdl2_config->GetBoolean("Renderer", "debug", false); | ||||
|     Settings::values.vulkan_device.SetValue( | ||||
|         sdl2_config->GetInteger("Renderer", "vulkan_device", 0)); | ||||
|     ReadSetting("Renderer", Settings::values.renderer_backend); | ||||
|     ReadSetting("Renderer", Settings::values.renderer_debug); | ||||
|     ReadSetting("Renderer", Settings::values.vulkan_device); | ||||
|  | ||||
|     Settings::values.aspect_ratio.SetValue( | ||||
|         static_cast<int>(sdl2_config->GetInteger("Renderer", "aspect_ratio", 0))); | ||||
|     Settings::values.max_anisotropy.SetValue( | ||||
|         static_cast<int>(sdl2_config->GetInteger("Renderer", "max_anisotropy", 0))); | ||||
|     Settings::values.use_frame_limit.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "use_frame_limit", true)); | ||||
|     Settings::values.frame_limit.SetValue( | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Renderer", "frame_limit", 100))); | ||||
|     Settings::values.use_disk_shader_cache.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "use_disk_shader_cache", false)); | ||||
|     const int gpu_accuracy_level = sdl2_config->GetInteger("Renderer", "gpu_accuracy", 1); | ||||
|     Settings::values.gpu_accuracy.SetValue(static_cast<Settings::GPUAccuracy>(gpu_accuracy_level)); | ||||
|     Settings::values.use_asynchronous_gpu_emulation.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "use_asynchronous_gpu_emulation", true)); | ||||
|     Settings::values.use_vsync.SetValue( | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Renderer", "use_vsync", 1))); | ||||
|     Settings::values.disable_fps_limit.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "disable_fps_limit", false)); | ||||
|     Settings::values.use_assembly_shaders.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "use_assembly_shaders", true)); | ||||
|     Settings::values.use_asynchronous_shaders.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "use_asynchronous_shaders", false)); | ||||
|     Settings::values.use_nvdec_emulation.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "use_nvdec_emulation", true)); | ||||
|     Settings::values.accelerate_astc.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "accelerate_astc", true)); | ||||
|     Settings::values.use_fast_gpu_time.SetValue( | ||||
|         sdl2_config->GetBoolean("Renderer", "use_fast_gpu_time", true)); | ||||
|     ReadSetting("Renderer", Settings::values.aspect_ratio); | ||||
|     ReadSetting("Renderer", Settings::values.max_anisotropy); | ||||
|     ReadSetting("Renderer", Settings::values.use_frame_limit); | ||||
|     ReadSetting("Renderer", Settings::values.frame_limit); | ||||
|     ReadSetting("Renderer", Settings::values.use_disk_shader_cache); | ||||
|     ReadSetting("Renderer", Settings::values.gpu_accuracy); | ||||
|     ReadSetting("Renderer", Settings::values.use_asynchronous_gpu_emulation); | ||||
|     ReadSetting("Renderer", Settings::values.use_vsync); | ||||
|     ReadSetting("Renderer", Settings::values.disable_fps_limit); | ||||
|     ReadSetting("Renderer", Settings::values.use_assembly_shaders); | ||||
|     ReadSetting("Renderer", Settings::values.use_asynchronous_shaders); | ||||
|     ReadSetting("Renderer", Settings::values.use_nvdec_emulation); | ||||
|     ReadSetting("Renderer", Settings::values.accelerate_astc); | ||||
|     ReadSetting("Renderer", Settings::values.use_fast_gpu_time); | ||||
|  | ||||
|     Settings::values.bg_red.SetValue( | ||||
|         static_cast<float>(sdl2_config->GetReal("Renderer", "bg_red", 0.0))); | ||||
|     Settings::values.bg_green.SetValue( | ||||
|         static_cast<float>(sdl2_config->GetReal("Renderer", "bg_green", 0.0))); | ||||
|     Settings::values.bg_blue.SetValue( | ||||
|         static_cast<float>(sdl2_config->GetReal("Renderer", "bg_blue", 0.0))); | ||||
|     ReadSetting("Renderer", Settings::values.bg_red); | ||||
|     ReadSetting("Renderer", Settings::values.bg_green); | ||||
|     ReadSetting("Renderer", Settings::values.bg_blue); | ||||
|  | ||||
|     // Audio | ||||
|     Settings::values.sink_id = sdl2_config->Get("Audio", "output_engine", "auto"); | ||||
|     Settings::values.enable_audio_stretching.SetValue( | ||||
|         sdl2_config->GetBoolean("Audio", "enable_audio_stretching", true)); | ||||
|     Settings::values.audio_device_id = sdl2_config->Get("Audio", "output_device", "auto"); | ||||
|     Settings::values.volume.SetValue( | ||||
|         static_cast<float>(sdl2_config->GetReal("Audio", "volume", 1))); | ||||
|     ReadSetting("Audio", Settings::values.sink_id); | ||||
|     ReadSetting("Audio", Settings::values.enable_audio_stretching); | ||||
|     ReadSetting("Audio", Settings::values.audio_device_id); | ||||
|     ReadSetting("Audio", Settings::values.volume); | ||||
|  | ||||
|     // Miscellaneous | ||||
|     Settings::values.log_filter = sdl2_config->Get("Miscellaneous", "log_filter", "*:Trace"); | ||||
|     Settings::values.use_dev_keys = sdl2_config->GetBoolean("Miscellaneous", "use_dev_keys", false); | ||||
|     // log_filter has a different default here than from common | ||||
|     Settings::values.log_filter = | ||||
|         sdl2_config->Get("Miscellaneous", Settings::values.log_filter.GetLabel(), "*:Trace"); | ||||
|     ReadSetting("Miscellaneous", Settings::values.use_dev_keys); | ||||
|  | ||||
|     // Debugging | ||||
|     Settings::values.record_frame_times = | ||||
|         sdl2_config->GetBoolean("Debugging", "record_frame_times", false); | ||||
|     Settings::values.program_args = sdl2_config->Get("Debugging", "program_args", ""); | ||||
|     Settings::values.dump_exefs = sdl2_config->GetBoolean("Debugging", "dump_exefs", false); | ||||
|     Settings::values.dump_nso = sdl2_config->GetBoolean("Debugging", "dump_nso", false); | ||||
|     Settings::values.enable_fs_access_log = | ||||
|         sdl2_config->GetBoolean("Debugging", "enable_fs_access_log", false); | ||||
|     Settings::values.reporting_services = | ||||
|         sdl2_config->GetBoolean("Debugging", "reporting_services", false); | ||||
|     Settings::values.quest_flag = sdl2_config->GetBoolean("Debugging", "quest_flag", false); | ||||
|     Settings::values.use_debug_asserts = | ||||
|         sdl2_config->GetBoolean("Debugging", "use_debug_asserts", false); | ||||
|     Settings::values.use_auto_stub = sdl2_config->GetBoolean("Debugging", "use_auto_stub", false); | ||||
|  | ||||
|     Settings::values.disable_macro_jit = | ||||
|         sdl2_config->GetBoolean("Debugging", "disable_macro_jit", false); | ||||
|     ReadSetting("Debugging", Settings::values.program_args); | ||||
|     ReadSetting("Debugging", Settings::values.dump_exefs); | ||||
|     ReadSetting("Debugging", Settings::values.dump_nso); | ||||
|     ReadSetting("Debugging", Settings::values.enable_fs_access_log); | ||||
|     ReadSetting("Debugging", Settings::values.reporting_services); | ||||
|     ReadSetting("Debugging", Settings::values.quest_flag); | ||||
|     ReadSetting("Debugging", Settings::values.use_debug_asserts); | ||||
|     ReadSetting("Debugging", Settings::values.use_auto_stub); | ||||
|     ReadSetting("Debugging", Settings::values.disable_macro_jit); | ||||
|  | ||||
|     const auto title_list = sdl2_config->Get("AddOns", "title_ids", ""); | ||||
|     std::stringstream ss(title_list); | ||||
| @@ -511,17 +488,14 @@ void Config::ReadValues() { | ||||
|     } | ||||
|  | ||||
|     // Web Service | ||||
|     Settings::values.enable_telemetry = | ||||
|         sdl2_config->GetBoolean("WebService", "enable_telemetry", true); | ||||
|     Settings::values.web_api_url = | ||||
|         sdl2_config->Get("WebService", "web_api_url", "https://api.yuzu-emu.org"); | ||||
|     Settings::values.yuzu_username = sdl2_config->Get("WebService", "yuzu_username", ""); | ||||
|     Settings::values.yuzu_token = sdl2_config->Get("WebService", "yuzu_token", ""); | ||||
|     ReadSetting("WebService", Settings::values.enable_telemetry); | ||||
|     ReadSetting("WebService", Settings::values.web_api_url); | ||||
|     ReadSetting("WebService", Settings::values.yuzu_username); | ||||
|     ReadSetting("WebService", Settings::values.yuzu_token); | ||||
|  | ||||
|     // Services | ||||
|     Settings::values.bcat_backend = sdl2_config->Get("Services", "bcat_backend", "none"); | ||||
|     Settings::values.bcat_boxcat_local = | ||||
|         sdl2_config->GetBoolean("Services", "bcat_boxcat_local", false); | ||||
|     ReadSetting("Services", Settings::values.bcat_backend); | ||||
|     ReadSetting("Services", Settings::values.bcat_boxcat_local); | ||||
| } | ||||
|  | ||||
| void Config::Reload() { | ||||
|   | ||||
| @@ -8,6 +8,8 @@ | ||||
| #include <memory> | ||||
| #include <string> | ||||
|  | ||||
| #include "common/settings.h" | ||||
|  | ||||
| class INIReader; | ||||
|  | ||||
| class Config { | ||||
| @@ -22,4 +24,14 @@ public: | ||||
|     ~Config(); | ||||
|  | ||||
|     void Reload(); | ||||
|  | ||||
| private: | ||||
|     /** | ||||
|      * Applies a value read from the sdl2_config to a BasicSetting. | ||||
|      * | ||||
|      * @param group The name of the INI group | ||||
|      * @param setting The yuzu setting to modify | ||||
|      */ | ||||
|     template <typename Type> | ||||
|     void ReadSetting(const std::string& group, Settings::BasicSetting<Type>& setting); | ||||
| }; | ||||
|   | ||||
| @@ -78,7 +78,7 @@ static void InitializeLogging() { | ||||
|     using namespace Common; | ||||
|  | ||||
|     Log::Filter log_filter(Log::Level::Debug); | ||||
|     log_filter.ParseFilterString(Settings::values.log_filter); | ||||
|     log_filter.ParseFilterString(static_cast<std::string>(Settings::values.log_filter)); | ||||
|     Log::SetGlobalFilter(log_filter); | ||||
|  | ||||
|     Log::AddBackend(std::make_unique<Log::ColorConsoleBackend>()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user