From 77de44fdb4d73c53d9eb6897759fdf4d841072f8 Mon Sep 17 00:00:00 2001 From: Jaime Bernardo Date: Mon, 30 Sep 2024 16:54:07 +0100 Subject: [PATCH] [NewPlus]Normalize settings infrastructure (#35145) --- .../powertoys_module.cpp | 21 +++++-- .../NewShellExtensionContextMenu/settings.cpp | 62 ++++++++----------- .../Settings.UI.Library/NewPlusProperties.cs | 34 ++++++++++ .../Settings.UI.Library/NewPlusSettings.cs | 29 ++++----- .../ViewModels/DashboardViewModel.cs | 2 +- .../ViewModels/NewPlusViewModel.cs | 27 +++----- 6 files changed, 94 insertions(+), 81 deletions(-) create mode 100644 src/settings-ui/Settings.UI.Library/NewPlusProperties.cs diff --git a/src/modules/NewPlus/NewShellExtensionContextMenu/powertoys_module.cpp b/src/modules/NewPlus/NewShellExtensionContextMenu/powertoys_module.cpp index 2962f236fc..2e6dccfdee 100644 --- a/src/modules/NewPlus/NewShellExtensionContextMenu/powertoys_module.cpp +++ b/src/modules/NewPlus/NewShellExtensionContextMenu/powertoys_module.cpp @@ -51,21 +51,30 @@ public: return true; } - virtual void set_config(PCWSTR config) override + virtual void set_config(const wchar_t* config) override { // The following just checks to see if the Template Location was changed for metrics purposes // Note: We are not saving the settings here and instead relying on read/write of json in Settings App .cs code paths try { - json::JsonObject config_as_json = json::JsonValue::Parse(winrt::to_hstring(config)).GetObjectW(); + // Parse the input JSON string. + PowerToysSettings::PowerToyValues values = + PowerToysSettings::PowerToyValues::from_json_string(config, get_key()); - const auto latest_location_value = config_as_json.GetNamedString(newplus::constants::non_localizable::settings_json_key_template_location).data(); - const auto existing_location_value = NewSettingsInstance().GetTemplateLocation(); + values.save_to_settings_file(); + NewSettingsInstance().Load(); - if (!newplus::utilities::wstring_same_when_comparing_ignore_case(latest_location_value, existing_location_value)) + auto templateValue = values.get_string_value(newplus::constants::non_localizable::settings_json_key_template_location); + if (templateValue.has_value()) { - Trace::EventChangedTemplateLocation(); + const auto latest_location_value = templateValue.value(); + const auto existing_location_value = NewSettingsInstance().GetTemplateLocation(); + if (!newplus::utilities::wstring_same_when_comparing_ignore_case(latest_location_value, existing_location_value)) + { + Trace::EventChangedTemplateLocation(); + } } + } catch (std::exception& e) { diff --git a/src/modules/NewPlus/NewShellExtensionContextMenu/settings.cpp b/src/modules/NewPlus/NewShellExtensionContextMenu/settings.cpp index f1322caf1f..7dd5042c4d 100644 --- a/src/modules/NewPlus/NewShellExtensionContextMenu/settings.cpp +++ b/src/modules/NewPlus/NewShellExtensionContextMenu/settings.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "settings.h" #include "constants.h" @@ -38,18 +39,13 @@ NewSettings::NewSettings() void NewSettings::Save() { - json::JsonObject new_settings_json_data; + PowerToysSettings::PowerToyValues values(newplus::constants::non_localizable::powertoy_key, newplus::constants::non_localizable::powertoy_key); - new_settings_json_data.SetNamedValue(newplus::constants::non_localizable::settings_json_key_hide_file_extension, - json::value(new_settings.hide_file_extension)); + values.add_property(newplus::constants::non_localizable::settings_json_key_hide_file_extension, new_settings.hide_file_extension); + values.add_property(newplus::constants::non_localizable::settings_json_key_hide_starting_digits, new_settings.hide_starting_digits); + values.add_property(newplus::constants::non_localizable::settings_json_key_template_location, new_settings.template_location); - new_settings_json_data.SetNamedValue(newplus::constants::non_localizable::settings_json_key_hide_starting_digits, - json::value(new_settings.hide_starting_digits)); - - new_settings_json_data.SetNamedValue(newplus::constants::non_localizable::settings_json_key_template_location, - json::value(new_settings.template_location)); - - json::to_file(new_settings_json_file_path, new_settings_json_data); + values.save_to_settings_file(); GetSystemTimeAsFileTime(&new_settings_last_loaded_timestamp); } @@ -122,35 +118,27 @@ void NewSettings::Reload() void NewSettings::ParseJson() { - auto json = json::from_file(new_settings_json_file_path); - if (json) + PowerToysSettings::PowerToyValues settings = + PowerToysSettings::PowerToyValues::load_from_settings_file(newplus::constants::non_localizable::powertoy_key); + + auto templateValue = settings.get_string_value(newplus::constants::non_localizable::settings_json_key_template_location); + if (templateValue.has_value()) { - try - { - const json::JsonObject& new_settings_json = json.value(); - - if (json::has(new_settings_json, newplus::constants::non_localizable::settings_json_key_hide_file_extension, json::JsonValueType::Boolean)) - { - new_settings.hide_file_extension = new_settings_json.GetNamedBoolean( - newplus::constants::non_localizable::settings_json_key_hide_file_extension); - } - - if (json::has(new_settings_json, newplus::constants::non_localizable::settings_json_key_hide_starting_digits, json::JsonValueType::Boolean)) - { - new_settings.hide_starting_digits = new_settings_json.GetNamedBoolean( - newplus::constants::non_localizable::settings_json_key_hide_starting_digits); - } - - if (json::has(new_settings_json, newplus::constants::non_localizable::settings_json_key_template_location, json::JsonValueType::String)) - { - new_settings.template_location = new_settings_json.GetNamedString( - newplus::constants::non_localizable::settings_json_key_template_location); - } - } - catch (const winrt::hresult_error&) - { - } + new_settings.template_location = templateValue.value(); } + + auto hideFileExtensionValue = settings.get_bool_value(newplus::constants::non_localizable::settings_json_key_hide_file_extension); + if (hideFileExtensionValue.has_value()) + { + new_settings.hide_file_extension = hideFileExtensionValue.value(); + } + + auto hideStartingDigitsValue = settings.get_bool_value(newplus::constants::non_localizable::settings_json_key_hide_starting_digits); + if (hideStartingDigitsValue.has_value()) + { + new_settings.hide_starting_digits = hideStartingDigitsValue.value(); + } + GetSystemTimeAsFileTime(&new_settings_last_loaded_timestamp); } diff --git a/src/settings-ui/Settings.UI.Library/NewPlusProperties.cs b/src/settings-ui/Settings.UI.Library/NewPlusProperties.cs new file mode 100644 index 0000000000..2a4970c690 --- /dev/null +++ b/src/settings-ui/Settings.UI.Library/NewPlusProperties.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Microsoft.PowerToys.Settings.UI.Library +{ + public class NewPlusProperties + { + public const string ModuleName = "NewPlus"; + + public NewPlusProperties() + { + HideFileExtension = new BoolProperty(true); + HideStartingDigits = new BoolProperty(true); + TemplateLocation = new StringProperty(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "PowerToys", "NewPlus", "Templates")); + } + + [JsonPropertyName("HideFileExtension")] + public BoolProperty HideFileExtension { get; set; } + + [JsonPropertyName("HideStartingDigits")] + public BoolProperty HideStartingDigits { get; set; } + + [JsonPropertyName("TemplateLocation")] + public StringProperty TemplateLocation { get; set; } + + public override string ToString() => JsonSerializer.Serialize(this); + } +} diff --git a/src/settings-ui/Settings.UI.Library/NewPlusSettings.cs b/src/settings-ui/Settings.UI.Library/NewPlusSettings.cs index 6010185f8c..2450898684 100644 --- a/src/settings-ui/Settings.UI.Library/NewPlusSettings.cs +++ b/src/settings-ui/Settings.UI.Library/NewPlusSettings.cs @@ -12,34 +12,27 @@ using Settings.UI.Library.Resources; namespace Microsoft.PowerToys.Settings.UI.Library { - public class NewPlusSettings : ISettingsConfig + public class NewPlusSettings : BasePTModuleSettings, ISettingsConfig { public const string ModuleName = "NewPlus"; + public const string ModuleVersion = "1.0"; - public void InitializeWithDefaultSettings() + [JsonPropertyName("properties")] + public NewPlusProperties Properties { get; set; } + + public NewPlusSettings() { - // This code path should never happen + Name = ModuleName; + Version = ModuleVersion; + Properties = new NewPlusProperties(); } - public string ToJsonString() - { - return JsonSerializer.Serialize(this); - } - - [JsonPropertyName("HideFileExtension")] - public bool HideFileExtension { get; set; } - - [JsonPropertyName("HideStartingDigits")] - public bool HideStartingDigits { get; set; } - - [JsonPropertyName("TemplateLocation")] - public string TemplateLocation { get; set; } - public string GetModuleName() { - return ModuleName; + return Name; } + // This can be utilized in the future if the settings.json file is to be modified/deleted. public bool UpgradeSettingsConfiguration() { return false; diff --git a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs index c72a52c7f7..7884a0994f 100644 --- a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs @@ -130,7 +130,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { var settingsUtils = new SettingsUtils(); var settings = NewPlusViewModel.LoadSettings(settingsUtils); - NewPlusViewModel.CopyTemplateExamples(settings.TemplateLocation); + NewPlusViewModel.CopyTemplateExamples(settings.Properties.TemplateLocation.Value); } } diff --git a/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs index b1cceb8afb..cab1a9df77 100644 --- a/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs @@ -47,9 +47,9 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels Settings = LoadSettings(settingsUtils); // Initialize properties - _hideFileExtension = Settings.HideFileExtension; - _hideStartingDigits = Settings.HideStartingDigits; - _templateLocation = Settings.TemplateLocation; + _hideFileExtension = Settings.Properties.HideFileExtension.Value; + _hideStartingDigits = Settings.Properties.HideStartingDigits.Value; + _templateLocation = Settings.Properties.TemplateLocation.Value; InitializeEnabledValue(); InitializeGpoValues(); @@ -119,12 +119,10 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels if (_templateLocation != value) { _templateLocation = value; - Settings.TemplateLocation = value; + Settings.Properties.TemplateLocation.Value = value; OnPropertyChanged(nameof(TemplateLocation)); NotifySettingsChanged(); - - SaveSettingsToJson(); } } } @@ -146,12 +144,10 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels if (_hideFileExtension != value && !_hideFileExtensionIsGPOConfigured) { _hideFileExtension = value; - Settings.HideFileExtension = value; + Settings.Properties.HideFileExtension.Value = value; OnPropertyChanged(nameof(HideFileExtension)); NotifySettingsChanged(); - - SaveSettingsToJson(); } } } @@ -168,12 +164,10 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels if (_hideStartingDigits != value) { _hideStartingDigits = value; - Settings.HideStartingDigits = value; + Settings.Properties.HideStartingDigits.Value = value; OnPropertyChanged(nameof(HideStartingDigits)); NotifySettingsChanged(); - - SaveSettingsToJson(); } } } @@ -208,10 +202,10 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { settings = settingsUtils.GetSettingsOrDefault(NewPlusSettings.ModuleName); - if (string.IsNullOrEmpty(settings.TemplateLocation)) + if (string.IsNullOrEmpty(settings.Properties.TemplateLocation.Value)) { // This can happen when running the DEBUG Settings application without first letting the runner create the default settings file. - settings.TemplateLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "PowerToys", "NewPlus", "Templates"); + settings.Properties.TemplateLocation.Value = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "PowerToys", "NewPlus", "Templates"); } } catch (Exception e) @@ -278,10 +272,5 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.GetSettingsWindow()); return await Task.FromResult(GetFolderDialogWithFlags(hwnd, FolderDialogFlags._BIF_NEWDIALOGSTYLE)); } - - private void SaveSettingsToJson() - { - _settingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName); - } } }