// 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.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using Microsoft.PowerToys.Run.Plugin.TimeDate.Properties; using Microsoft.PowerToys.Settings.UI.Library; [assembly: InternalsVisibleTo("Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests")] namespace Microsoft.PowerToys.Run.Plugin.TimeDate.Components { /// /// Additional settings for the WindowWalker plugin. /// /// Some code parts reused from TimeZone plugin. internal sealed class TimeDateSettings { /// /// Are the class properties initialized with default values /// private readonly bool _initialized; /// /// An instance of the class /// private static TimeDateSettings instance; /// /// Gets a value indicating whether to show only the time and date in global results or not /// internal bool OnlyDateTimeNowGlobal { get; private set; } /// /// Gets a value indicating whether to show the time with seconds or not /// internal bool TimeWithSeconds { get; private set; } /// /// Gets a value indicating whether the date with the weekday or not /// internal bool DateWithWeekday { get; private set; } /// /// Gets a value indicating whether to hide the number input error message on global results /// internal bool HideNumberMessageOnGlobalQuery { get; private set; } /// /// Initializes a new instance of the class. /// Private constructor to make sure there is never more than one instance of this class /// private TimeDateSettings() { // Init class properties with default values UpdateSettings(null); _initialized = true; } /// /// Gets an instance property of this class that makes sure that the first instance gets created /// and that all the requests end up at that one instance. /// The benefit of this is that we don't need additional variables/parameters /// to communicate the settings between plugin's classes/methods. /// We can simply access this one instance, whenever we need the actual settings. /// internal static TimeDateSettings Instance { get { if (instance == null) { instance = new TimeDateSettings(); } return instance; } } /// /// Return a list with all additional plugin options. /// /// A list with all additional plugin options. internal static List GetAdditionalOptions() { var optionList = new List { new PluginAdditionalOption() { // ToDo: When description property is implemented (#15853), move the note in brackets to description. Key = nameof(OnlyDateTimeNowGlobal), DisplayLabel = Resources.Microsoft_plugin_timedate_SettingOnlyDateTimeNowGlobal, Value = true, }, new PluginAdditionalOption() { // ToDo: When description property is implemented (#15853), move the note in brackets to description. Key = nameof(TimeWithSeconds), DisplayLabel = Resources.Microsoft_plugin_timedate_SettingTimeWithSeconds, Value = false, }, new PluginAdditionalOption() { // ToDo: When description property is implemented (#15853), move the note in brackets to description. Key = nameof(DateWithWeekday), DisplayLabel = Resources.Microsoft_plugin_timedate_SettingDateWithWeekday, Value = false, }, new PluginAdditionalOption() { Key = nameof(HideNumberMessageOnGlobalQuery), DisplayLabel = Resources.Microsoft_plugin_timedate_SettingHideNumberMessageOnGlobalQuery, Value = false, }, }; return optionList; } /// /// Update this settings. /// /// The settings for all power launcher plugins. internal void UpdateSettings(PowerLauncherPluginSettings settings) { if ((settings is null || settings.AdditionalOptions is null) & _initialized) { return; } OnlyDateTimeNowGlobal = GetSettingOrDefault(settings, nameof(OnlyDateTimeNowGlobal)); TimeWithSeconds = GetSettingOrDefault(settings, nameof(TimeWithSeconds)); DateWithWeekday = GetSettingOrDefault(settings, nameof(DateWithWeekday)); HideNumberMessageOnGlobalQuery = GetSettingOrDefault(settings, nameof(HideNumberMessageOnGlobalQuery)); } /// /// Return one setting of the given settings list with the given name. /// /// The object that contain all settings. /// The name of the setting. /// A settings value. private static bool GetSettingOrDefault(PowerLauncherPluginSettings settings, string name) { var option = settings?.AdditionalOptions?.FirstOrDefault(x => x.Key == name); // If a setting isn't available, we use the value defined in the method GetAdditionalOptions() as fallback. // We can use First() instead of FirstOrDefault() because the values must exist. Otherwise, we made a mistake when defining the settings. return option?.Value ?? GetAdditionalOptions().First(x => x.Key == name).Value; } } }