From 1211e2c92f45ccdea6c83c4be7d4370aecf1113d Mon Sep 17 00:00:00 2001 From: "Shawn Yuan (from Dev Box)" Date: Thu, 11 Dec 2025 17:57:56 +0800 Subject: [PATCH] QuickAccessList control refactor --- .../QuickAccess.UI/Helpers/ModuleGpoHelper.cs | 49 +++++ .../QuickAccess.UI/Helpers/ModuleHelper.cs | 155 ------------- .../Services/QuickAccessLauncher.cs | 134 ++++++++++++ .../ViewModels/AllAppsViewModel.cs | 12 +- .../ViewModels/LauncherViewModel.cs | 204 +----------------- .../QuickAccess/IQuickAccessLauncher.cs | 13 ++ .../QuickAccess/QuickAccessItem.cs | 53 ++--- .../QuickAccess/QuickAccessViewModel.cs | 140 ++++++++++++ .../Settings.UI.Controls.csproj | 5 + .../Helpers/ModuleHelper.cs | 121 +++++++++++ .../Settings.UI/Helpers/ModuleGpoHelper.cs | 91 ++++++++ .../Settings.UI/Helpers/ModuleHelper.cs | 201 ----------------- .../Settings.UI/Services/DashboardLauncher.cs | 122 +++++++++++ .../Dashboard/ShortcutConflictWindow.xaml.cs | 2 +- .../SettingsXAML/MainWindow.xaml.cs | 1 + .../ViewModels/DashboardViewModel.cs | 31 ++- .../ViewModels/ShortcutConflictViewModel.cs | 1 + 17 files changed, 731 insertions(+), 604 deletions(-) create mode 100644 src/settings-ui/QuickAccess.UI/Helpers/ModuleGpoHelper.cs delete mode 100644 src/settings-ui/QuickAccess.UI/Helpers/ModuleHelper.cs create mode 100644 src/settings-ui/QuickAccess.UI/Services/QuickAccessLauncher.cs create mode 100644 src/settings-ui/Settings.UI.Controls/QuickAccess/IQuickAccessLauncher.cs create mode 100644 src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessViewModel.cs create mode 100644 src/settings-ui/Settings.UI.Library/Helpers/ModuleHelper.cs create mode 100644 src/settings-ui/Settings.UI/Helpers/ModuleGpoHelper.cs delete mode 100644 src/settings-ui/Settings.UI/Helpers/ModuleHelper.cs create mode 100644 src/settings-ui/Settings.UI/Services/DashboardLauncher.cs diff --git a/src/settings-ui/QuickAccess.UI/Helpers/ModuleGpoHelper.cs b/src/settings-ui/QuickAccess.UI/Helpers/ModuleGpoHelper.cs new file mode 100644 index 0000000000..25f32e191b --- /dev/null +++ b/src/settings-ui/QuickAccess.UI/Helpers/ModuleGpoHelper.cs @@ -0,0 +1,49 @@ +// 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 global::PowerToys.GPOWrapper; +using ManagedCommon; +using Microsoft.PowerToys.Settings.UI.Library; + +namespace Microsoft.PowerToys.QuickAccess.Helpers; + +internal static class ModuleGpoHelper +{ + public static GpoRuleConfigured GetModuleGpoConfiguration(ModuleType moduleType) + { + return moduleType switch + { + ModuleType.AdvancedPaste => GPOWrapper.GetConfiguredAdvancedPasteEnabledValue(), + ModuleType.AlwaysOnTop => GPOWrapper.GetConfiguredAlwaysOnTopEnabledValue(), + ModuleType.Awake => GPOWrapper.GetConfiguredAwakeEnabledValue(), + ModuleType.CmdPal => GPOWrapper.GetConfiguredCmdPalEnabledValue(), + ModuleType.ColorPicker => GPOWrapper.GetConfiguredColorPickerEnabledValue(), + ModuleType.CropAndLock => GPOWrapper.GetConfiguredCropAndLockEnabledValue(), + ModuleType.CursorWrap => GPOWrapper.GetConfiguredCursorWrapEnabledValue(), + ModuleType.EnvironmentVariables => GPOWrapper.GetConfiguredEnvironmentVariablesEnabledValue(), + ModuleType.FancyZones => GPOWrapper.GetConfiguredFancyZonesEnabledValue(), + ModuleType.FileLocksmith => GPOWrapper.GetConfiguredFileLocksmithEnabledValue(), + ModuleType.FindMyMouse => GPOWrapper.GetConfiguredFindMyMouseEnabledValue(), + ModuleType.Hosts => GPOWrapper.GetConfiguredHostsFileEditorEnabledValue(), + ModuleType.ImageResizer => GPOWrapper.GetConfiguredImageResizerEnabledValue(), + ModuleType.KeyboardManager => GPOWrapper.GetConfiguredKeyboardManagerEnabledValue(), + ModuleType.MouseHighlighter => GPOWrapper.GetConfiguredMouseHighlighterEnabledValue(), + ModuleType.MouseJump => GPOWrapper.GetConfiguredMouseJumpEnabledValue(), + ModuleType.MousePointerCrosshairs => GPOWrapper.GetConfiguredMousePointerCrosshairsEnabledValue(), + ModuleType.MouseWithoutBorders => GPOWrapper.GetConfiguredMouseWithoutBordersEnabledValue(), + ModuleType.NewPlus => GPOWrapper.GetConfiguredNewPlusEnabledValue(), + ModuleType.Peek => GPOWrapper.GetConfiguredPeekEnabledValue(), + ModuleType.PowerRename => GPOWrapper.GetConfiguredPowerRenameEnabledValue(), + ModuleType.PowerLauncher => GPOWrapper.GetConfiguredPowerLauncherEnabledValue(), + ModuleType.PowerAccent => GPOWrapper.GetConfiguredQuickAccentEnabledValue(), + ModuleType.Workspaces => GPOWrapper.GetConfiguredWorkspacesEnabledValue(), + ModuleType.RegistryPreview => GPOWrapper.GetConfiguredRegistryPreviewEnabledValue(), + ModuleType.MeasureTool => GPOWrapper.GetConfiguredScreenRulerEnabledValue(), + ModuleType.ShortcutGuide => GPOWrapper.GetConfiguredShortcutGuideEnabledValue(), + ModuleType.PowerOCR => GPOWrapper.GetConfiguredTextExtractorEnabledValue(), + ModuleType.ZoomIt => GPOWrapper.GetConfiguredZoomItEnabledValue(), + _ => GpoRuleConfigured.Unavailable, + }; + } +} diff --git a/src/settings-ui/QuickAccess.UI/Helpers/ModuleHelper.cs b/src/settings-ui/QuickAccess.UI/Helpers/ModuleHelper.cs deleted file mode 100644 index 3e52133324..0000000000 --- a/src/settings-ui/QuickAccess.UI/Helpers/ModuleHelper.cs +++ /dev/null @@ -1,155 +0,0 @@ -// 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 global::PowerToys.GPOWrapper; -using ManagedCommon; -using Microsoft.PowerToys.Settings.UI.Library; - -namespace Microsoft.PowerToys.QuickAccess.Helpers; - -internal static class ModuleHelper -{ - public static string GetModuleLabelResourceName(ModuleType moduleType) - { - return moduleType switch - { - ModuleType.Workspaces => "Workspaces/ModuleTitle", - ModuleType.PowerAccent => "QuickAccent/ModuleTitle", - ModuleType.PowerOCR => "TextExtractor/ModuleTitle", - ModuleType.FindMyMouse => "MouseUtils_FindMyMouse/Header", - ModuleType.MouseHighlighter => "MouseUtils_MouseHighlighter/Header", - ModuleType.MouseJump => "MouseUtils_MouseJump/Header", - ModuleType.MousePointerCrosshairs => "MouseUtils_MousePointerCrosshairs/Header", - ModuleType.CursorWrap => "MouseUtils_CursorWrap/Header", - _ => $"{moduleType}/ModuleTitle", - }; - } - - public static string GetModuleTypeFluentIconName(ModuleType moduleType) - { - return moduleType switch - { - ModuleType.AdvancedPaste => "ms-appx:///Assets/Settings/Icons/AdvancedPaste.png", - ModuleType.Workspaces => "ms-appx:///Assets/Settings/Icons/Workspaces.png", - ModuleType.PowerOCR => "ms-appx:///Assets/Settings/Icons/TextExtractor.png", - ModuleType.PowerAccent => "ms-appx:///Assets/Settings/Icons/QuickAccent.png", - ModuleType.MousePointerCrosshairs => "ms-appx:///Assets/Settings/Icons/MouseCrosshairs.png", - ModuleType.MeasureTool => "ms-appx:///Assets/Settings/Icons/ScreenRuler.png", - ModuleType.PowerLauncher => "ms-appx:///Assets/Settings/Icons/PowerToysRun.png", - _ => $"ms-appx:///Assets/Settings/Icons/{moduleType}.png", - }; - } - - public static bool GetIsModuleEnabled(GeneralSettings generalSettingsConfig, ModuleType moduleType) - { - return moduleType switch - { - ModuleType.AdvancedPaste => generalSettingsConfig.Enabled.AdvancedPaste, - ModuleType.AlwaysOnTop => generalSettingsConfig.Enabled.AlwaysOnTop, - ModuleType.Awake => generalSettingsConfig.Enabled.Awake, - ModuleType.CmdPal => generalSettingsConfig.Enabled.CmdPal, - ModuleType.ColorPicker => generalSettingsConfig.Enabled.ColorPicker, - ModuleType.CropAndLock => generalSettingsConfig.Enabled.CropAndLock, - ModuleType.CursorWrap => generalSettingsConfig.Enabled.CursorWrap, - ModuleType.LightSwitch => generalSettingsConfig.Enabled.LightSwitch, - ModuleType.EnvironmentVariables => generalSettingsConfig.Enabled.EnvironmentVariables, - ModuleType.FancyZones => generalSettingsConfig.Enabled.FancyZones, - ModuleType.FileLocksmith => generalSettingsConfig.Enabled.FileLocksmith, - ModuleType.FindMyMouse => generalSettingsConfig.Enabled.FindMyMouse, - ModuleType.Hosts => generalSettingsConfig.Enabled.Hosts, - ModuleType.ImageResizer => generalSettingsConfig.Enabled.ImageResizer, - ModuleType.KeyboardManager => generalSettingsConfig.Enabled.KeyboardManager, - ModuleType.MouseHighlighter => generalSettingsConfig.Enabled.MouseHighlighter, - ModuleType.MouseJump => generalSettingsConfig.Enabled.MouseJump, - ModuleType.MousePointerCrosshairs => generalSettingsConfig.Enabled.MousePointerCrosshairs, - ModuleType.MouseWithoutBorders => generalSettingsConfig.Enabled.MouseWithoutBorders, - ModuleType.NewPlus => generalSettingsConfig.Enabled.NewPlus, - ModuleType.Peek => generalSettingsConfig.Enabled.Peek, - ModuleType.PowerRename => generalSettingsConfig.Enabled.PowerRename, - ModuleType.PowerLauncher => generalSettingsConfig.Enabled.PowerLauncher, - ModuleType.PowerAccent => generalSettingsConfig.Enabled.PowerAccent, - ModuleType.Workspaces => generalSettingsConfig.Enabled.Workspaces, - ModuleType.RegistryPreview => generalSettingsConfig.Enabled.RegistryPreview, - ModuleType.MeasureTool => generalSettingsConfig.Enabled.MeasureTool, - ModuleType.ShortcutGuide => generalSettingsConfig.Enabled.ShortcutGuide, - ModuleType.PowerOCR => generalSettingsConfig.Enabled.PowerOcr, - ModuleType.ZoomIt => generalSettingsConfig.Enabled.ZoomIt, - _ => false, - }; - } - - public static void SetIsModuleEnabled(GeneralSettings generalSettingsConfig, ModuleType moduleType, bool isEnabled) - { - switch (moduleType) - { - case ModuleType.AdvancedPaste: generalSettingsConfig.Enabled.AdvancedPaste = isEnabled; break; - case ModuleType.AlwaysOnTop: generalSettingsConfig.Enabled.AlwaysOnTop = isEnabled; break; - case ModuleType.Awake: generalSettingsConfig.Enabled.Awake = isEnabled; break; - case ModuleType.CmdPal: generalSettingsConfig.Enabled.CmdPal = isEnabled; break; - case ModuleType.ColorPicker: generalSettingsConfig.Enabled.ColorPicker = isEnabled; break; - case ModuleType.CropAndLock: generalSettingsConfig.Enabled.CropAndLock = isEnabled; break; - case ModuleType.CursorWrap: generalSettingsConfig.Enabled.CursorWrap = isEnabled; break; - case ModuleType.LightSwitch: generalSettingsConfig.Enabled.LightSwitch = isEnabled; break; - case ModuleType.EnvironmentVariables: generalSettingsConfig.Enabled.EnvironmentVariables = isEnabled; break; - case ModuleType.FancyZones: generalSettingsConfig.Enabled.FancyZones = isEnabled; break; - case ModuleType.FileLocksmith: generalSettingsConfig.Enabled.FileLocksmith = isEnabled; break; - case ModuleType.FindMyMouse: generalSettingsConfig.Enabled.FindMyMouse = isEnabled; break; - case ModuleType.Hosts: generalSettingsConfig.Enabled.Hosts = isEnabled; break; - case ModuleType.ImageResizer: generalSettingsConfig.Enabled.ImageResizer = isEnabled; break; - case ModuleType.KeyboardManager: generalSettingsConfig.Enabled.KeyboardManager = isEnabled; break; - case ModuleType.MouseHighlighter: generalSettingsConfig.Enabled.MouseHighlighter = isEnabled; break; - case ModuleType.MouseJump: generalSettingsConfig.Enabled.MouseJump = isEnabled; break; - case ModuleType.MousePointerCrosshairs: generalSettingsConfig.Enabled.MousePointerCrosshairs = isEnabled; break; - case ModuleType.MouseWithoutBorders: generalSettingsConfig.Enabled.MouseWithoutBorders = isEnabled; break; - case ModuleType.NewPlus: generalSettingsConfig.Enabled.NewPlus = isEnabled; break; - case ModuleType.Peek: generalSettingsConfig.Enabled.Peek = isEnabled; break; - case ModuleType.PowerRename: generalSettingsConfig.Enabled.PowerRename = isEnabled; break; - case ModuleType.PowerLauncher: generalSettingsConfig.Enabled.PowerLauncher = isEnabled; break; - case ModuleType.PowerAccent: generalSettingsConfig.Enabled.PowerAccent = isEnabled; break; - case ModuleType.Workspaces: generalSettingsConfig.Enabled.Workspaces = isEnabled; break; - case ModuleType.RegistryPreview: generalSettingsConfig.Enabled.RegistryPreview = isEnabled; break; - case ModuleType.MeasureTool: generalSettingsConfig.Enabled.MeasureTool = isEnabled; break; - case ModuleType.ShortcutGuide: generalSettingsConfig.Enabled.ShortcutGuide = isEnabled; break; - case ModuleType.PowerOCR: generalSettingsConfig.Enabled.PowerOcr = isEnabled; break; - case ModuleType.ZoomIt: generalSettingsConfig.Enabled.ZoomIt = isEnabled; break; - } - } - - public static GpoRuleConfigured GetModuleGpoConfiguration(ModuleType moduleType) - { - return moduleType switch - { - ModuleType.AdvancedPaste => GPOWrapper.GetConfiguredAdvancedPasteEnabledValue(), - ModuleType.AlwaysOnTop => GPOWrapper.GetConfiguredAlwaysOnTopEnabledValue(), - ModuleType.Awake => GPOWrapper.GetConfiguredAwakeEnabledValue(), - ModuleType.CmdPal => GPOWrapper.GetConfiguredCmdPalEnabledValue(), - ModuleType.ColorPicker => GPOWrapper.GetConfiguredColorPickerEnabledValue(), - ModuleType.CropAndLock => GPOWrapper.GetConfiguredCropAndLockEnabledValue(), - ModuleType.CursorWrap => GPOWrapper.GetConfiguredCursorWrapEnabledValue(), - ModuleType.EnvironmentVariables => GPOWrapper.GetConfiguredEnvironmentVariablesEnabledValue(), - ModuleType.FancyZones => GPOWrapper.GetConfiguredFancyZonesEnabledValue(), - ModuleType.FileLocksmith => GPOWrapper.GetConfiguredFileLocksmithEnabledValue(), - ModuleType.FindMyMouse => GPOWrapper.GetConfiguredFindMyMouseEnabledValue(), - ModuleType.Hosts => GPOWrapper.GetConfiguredHostsFileEditorEnabledValue(), - ModuleType.ImageResizer => GPOWrapper.GetConfiguredImageResizerEnabledValue(), - ModuleType.KeyboardManager => GPOWrapper.GetConfiguredKeyboardManagerEnabledValue(), - ModuleType.MouseHighlighter => GPOWrapper.GetConfiguredMouseHighlighterEnabledValue(), - ModuleType.MouseJump => GPOWrapper.GetConfiguredMouseJumpEnabledValue(), - ModuleType.MousePointerCrosshairs => GPOWrapper.GetConfiguredMousePointerCrosshairsEnabledValue(), - ModuleType.MouseWithoutBorders => GPOWrapper.GetConfiguredMouseWithoutBordersEnabledValue(), - ModuleType.NewPlus => GPOWrapper.GetConfiguredNewPlusEnabledValue(), - ModuleType.Peek => GPOWrapper.GetConfiguredPeekEnabledValue(), - ModuleType.PowerRename => GPOWrapper.GetConfiguredPowerRenameEnabledValue(), - ModuleType.PowerLauncher => GPOWrapper.GetConfiguredPowerLauncherEnabledValue(), - ModuleType.PowerAccent => GPOWrapper.GetConfiguredQuickAccentEnabledValue(), - ModuleType.Workspaces => GPOWrapper.GetConfiguredWorkspacesEnabledValue(), - ModuleType.RegistryPreview => GPOWrapper.GetConfiguredRegistryPreviewEnabledValue(), - ModuleType.MeasureTool => GPOWrapper.GetConfiguredScreenRulerEnabledValue(), - ModuleType.ShortcutGuide => GPOWrapper.GetConfiguredShortcutGuideEnabledValue(), - ModuleType.PowerOCR => GPOWrapper.GetConfiguredTextExtractorEnabledValue(), - ModuleType.ZoomIt => GPOWrapper.GetConfiguredZoomItEnabledValue(), - _ => GpoRuleConfigured.Unavailable, - }; - } -} diff --git a/src/settings-ui/QuickAccess.UI/Services/QuickAccessLauncher.cs b/src/settings-ui/QuickAccess.UI/Services/QuickAccessLauncher.cs new file mode 100644 index 0000000000..ba6064c490 --- /dev/null +++ b/src/settings-ui/QuickAccess.UI/Services/QuickAccessLauncher.cs @@ -0,0 +1,134 @@ +// 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.Threading; +using ManagedCommon; +using Microsoft.PowerToys.Settings.UI.Controls; +using Microsoft.PowerToys.Settings.UI.Library; +using PowerToys.Interop; + +namespace Microsoft.PowerToys.QuickAccess.Services +{ + public class QuickAccessLauncher : IQuickAccessLauncher + { + private readonly IQuickAccessCoordinator _coordinator; + + public QuickAccessLauncher(IQuickAccessCoordinator coordinator) + { + _coordinator = coordinator; + } + + public void Launch(ModuleType moduleType) + { + bool moduleRun = true; + + switch (moduleType) + { + case ModuleType.ColorPicker: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowColorPickerSharedEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.EnvironmentVariables: + { + bool launchAdmin = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.LaunchAdministrator; + bool isElevated = _coordinator?.IsRunnerElevated ?? false; + string eventName = !isElevated && launchAdmin + ? Constants.ShowEnvironmentVariablesAdminSharedEvent() + : Constants.ShowEnvironmentVariablesSharedEvent(); + + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName)) + { + eventHandle.Set(); + } + } + + break; + case ModuleType.FancyZones: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.FZEToggleEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.Hosts: + { + bool launchAdmin = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.LaunchAdministrator; + bool isElevated = _coordinator?.IsRunnerElevated ?? false; + string eventName = !isElevated && launchAdmin + ? Constants.ShowHostsAdminSharedEvent() + : Constants.ShowHostsSharedEvent(); + + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName)) + { + eventHandle.Set(); + } + } + + break; + case ModuleType.PowerLauncher: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.PowerLauncherSharedEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.PowerOCR: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowPowerOCRSharedEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.RegistryPreview: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.RegistryPreviewTriggerEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.MeasureTool: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.MeasureToolTriggerEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.ShortcutGuide: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShortcutGuideTriggerEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.CmdPal: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowCmdPalEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.Workspaces: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.WorkspacesLaunchEditorEvent())) + { + eventHandle.Set(); + } + + break; + default: + moduleRun = false; + break; + } + + if (moduleRun) + { + _coordinator?.OnModuleLaunched(moduleType); + } + + _coordinator?.HideFlyout(); + } + } +} diff --git a/src/settings-ui/QuickAccess.UI/ViewModels/AllAppsViewModel.cs b/src/settings-ui/QuickAccess.UI/ViewModels/AllAppsViewModel.cs index 3e0b1e3dd7..c5266a8fc8 100644 --- a/src/settings-ui/QuickAccess.UI/ViewModels/AllAppsViewModel.cs +++ b/src/settings-ui/QuickAccess.UI/ViewModels/AllAppsViewModel.cs @@ -91,17 +91,17 @@ public sealed class AllAppsViewModel : Observable continue; } - var gpo = ModuleHelper.GetModuleGpoConfiguration(moduleType); + var gpo = Helpers.ModuleGpoHelper.GetModuleGpoConfiguration(moduleType); var isLocked = gpo is GpoRuleConfigured.Enabled or GpoRuleConfigured.Disabled; - var isEnabled = gpo == GpoRuleConfigured.Enabled || (!isLocked && ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType)); + var isEnabled = gpo == GpoRuleConfigured.Enabled || (!isLocked && Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType)); var existingItem = FlyoutMenuItems.FirstOrDefault(x => x.Tag == moduleType); if (existingItem != null) { - existingItem.Label = _resourceLoader.GetString(ModuleHelper.GetModuleLabelResourceName(moduleType)); + existingItem.Label = _resourceLoader.GetString(Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleLabelResourceName(moduleType)); existingItem.IsLocked = isLocked; - existingItem.Icon = ModuleHelper.GetModuleTypeFluentIconName(moduleType); + existingItem.Icon = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleTypeFluentIconName(moduleType); if (existingItem.IsEnabled != isEnabled) { @@ -117,11 +117,11 @@ public sealed class AllAppsViewModel : Observable { desiredItems.Add(new FlyoutMenuItem { - Label = _resourceLoader.GetString(ModuleHelper.GetModuleLabelResourceName(moduleType)), + Label = _resourceLoader.GetString(Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleLabelResourceName(moduleType)), IsEnabled = isEnabled, IsLocked = isLocked, Tag = moduleType, - Icon = ModuleHelper.GetModuleTypeFluentIconName(moduleType), + Icon = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleTypeFluentIconName(moduleType), EnabledChangedCallback = EnabledChangedOnUI, ClickCommand = new RelayCommand(() => _coordinator.OpenSettingsForModule(moduleType)), }); diff --git a/src/settings-ui/QuickAccess.UI/ViewModels/LauncherViewModel.cs b/src/settings-ui/QuickAccess.UI/ViewModels/LauncherViewModel.cs index 5c38229155..f8a18132cc 100644 --- a/src/settings-ui/QuickAccess.UI/ViewModels/LauncherViewModel.cs +++ b/src/settings-ui/QuickAccess.UI/ViewModels/LauncherViewModel.cs @@ -2,21 +2,16 @@ // 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.Collections.ObjectModel; -using System.Threading; using global::PowerToys.GPOWrapper; using ManagedCommon; -using Microsoft.PowerToys.QuickAccess.Helpers; using Microsoft.PowerToys.QuickAccess.Services; using Microsoft.PowerToys.Settings.UI.Controls; using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; -using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; using Microsoft.UI.Dispatching; using Microsoft.Windows.ApplicationModel.Resources; -using PowerToys.Interop; namespace Microsoft.PowerToys.QuickAccess.ViewModels; @@ -26,9 +21,9 @@ public sealed class LauncherViewModel : Observable private readonly ISettingsRepository _settingsRepository; private readonly ResourceLoader _resourceLoader; private readonly DispatcherQueue _dispatcherQueue; - private GeneralSettings _generalSettings; + private readonly QuickAccessViewModel _quickAccessViewModel; - public ObservableCollection FlyoutMenuItems { get; } + public ObservableCollection FlyoutMenuItems => _quickAccessViewModel.Items; public bool IsUpdateAvailable { get; private set; } @@ -38,200 +33,15 @@ public sealed class LauncherViewModel : Observable _dispatcherQueue = DispatcherQueue.GetForCurrentThread(); var settingsUtils = SettingsUtils.Default; _settingsRepository = SettingsRepository.GetInstance(settingsUtils); - _generalSettings = _settingsRepository.SettingsConfig; - _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); - _settingsRepository.SettingsChanged += OnSettingsChanged; _resourceLoader = Helpers.ResourceLoaderInstance.ResourceLoader; - FlyoutMenuItems = new ObservableCollection(); - - AddFlyoutMenuItem(ModuleType.ColorPicker); - AddFlyoutMenuItem(ModuleType.CmdPal); - AddFlyoutMenuItem(ModuleType.EnvironmentVariables); - AddFlyoutMenuItem(ModuleType.FancyZones); - AddFlyoutMenuItem(ModuleType.Hosts); - AddFlyoutMenuItem(ModuleType.PowerLauncher); - AddFlyoutMenuItem(ModuleType.PowerOCR); - AddFlyoutMenuItem(ModuleType.RegistryPreview); - AddFlyoutMenuItem(ModuleType.MeasureTool); - AddFlyoutMenuItem(ModuleType.ShortcutGuide); - AddFlyoutMenuItem(ModuleType.Workspaces); + _quickAccessViewModel = new QuickAccessViewModel( + _settingsRepository, + new QuickAccessLauncher(_coordinator), + moduleType => Helpers.ModuleGpoHelper.GetModuleGpoConfiguration(moduleType) == GpoRuleConfigured.Disabled, + _resourceLoader); var updatingSettings = UpdatingSettings.LoadSettings() ?? new UpdatingSettings(); IsUpdateAvailable = updatingSettings.State is UpdatingSettings.UpdatingState.ReadyToInstall or UpdatingSettings.UpdatingState.ReadyToDownload; } - - private void OnSettingsChanged(GeneralSettings newSettings) - { - _dispatcherQueue.TryEnqueue(() => - { - ModuleEnabledChanged(); - }); - } - - private void AddFlyoutMenuItem(ModuleType moduleType) - { - if (ModuleHelper.GetModuleGpoConfiguration(moduleType) == GpoRuleConfigured.Disabled) - { - return; - } - - FlyoutMenuItems.Add(new QuickAccessItem - { - Title = _resourceLoader.GetString(ModuleHelper.GetModuleLabelResourceName(moduleType)), - Tag = moduleType, - Visible = ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType), - Description = GetModuleToolTip(moduleType), - Icon = ModuleHelper.GetModuleTypeFluentIconName(moduleType), - Command = new RelayCommand(() => LaunchModule(moduleType)), - }); - } - - private void LaunchModule(ModuleType moduleType) - { - bool moduleRun = true; - - switch (moduleType) - { - case ModuleType.ColorPicker: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowColorPickerSharedEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.EnvironmentVariables: - { - bool launchAdmin = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.LaunchAdministrator; - bool isElevated = _coordinator?.IsRunnerElevated ?? false; - string eventName = !isElevated && launchAdmin - ? Constants.ShowEnvironmentVariablesAdminSharedEvent() - : Constants.ShowEnvironmentVariablesSharedEvent(); - - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName)) - { - eventHandle.Set(); - } - } - - break; - case ModuleType.FancyZones: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.FZEToggleEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.Hosts: - { - bool launchAdmin = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.LaunchAdministrator; - bool isElevated = _coordinator?.IsRunnerElevated ?? false; - string eventName = !isElevated && launchAdmin - ? Constants.ShowHostsAdminSharedEvent() - : Constants.ShowHostsSharedEvent(); - - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName)) - { - eventHandle.Set(); - } - } - - break; - case ModuleType.PowerLauncher: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.PowerLauncherSharedEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.PowerOCR: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowPowerOCRSharedEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.RegistryPreview: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.RegistryPreviewTriggerEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.MeasureTool: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.MeasureToolTriggerEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.ShortcutGuide: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShortcutGuideTriggerEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.CmdPal: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowCmdPalEvent())) - { - eventHandle.Set(); - } - - break; - case ModuleType.Workspaces: - using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.WorkspacesLaunchEditorEvent())) - { - eventHandle.Set(); - } - - break; - default: - moduleRun = false; - break; - } - - if (moduleRun) - { - _coordinator?.OnModuleLaunched(moduleType); - } - - _coordinator?.HideFlyout(); - } - - private string GetModuleToolTip(ModuleType moduleType) - { - return moduleType switch - { - ModuleType.ColorPicker => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), - ModuleType.FancyZones => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.FancyzonesEditorHotkey.Value.ToString(), - ModuleType.PowerLauncher => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.OpenPowerLauncher.ToString(), - ModuleType.PowerOCR => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), - ModuleType.Workspaces => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.Hotkey.Value.ToString(), - ModuleType.MeasureTool => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), - ModuleType.ShortcutGuide => GetShortcutGuideToolTip(), - _ => string.Empty, - }; - } - - private string GetShortcutGuideToolTip() - { - var shortcutGuideSettings = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig; - return shortcutGuideSettings.Properties.UseLegacyPressWinKeyBehavior.Value - ? "Win" - : shortcutGuideSettings.Properties.OpenShortcutGuide.ToString(); - } - - private void ModuleEnabledChanged() - { - _generalSettings = _settingsRepository.SettingsConfig; - _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); - foreach (var item in FlyoutMenuItems) - { - if (item.Tag is ModuleType moduleType) - { - item.Visible = ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType); - } - } - } } diff --git a/src/settings-ui/Settings.UI.Controls/QuickAccess/IQuickAccessLauncher.cs b/src/settings-ui/Settings.UI.Controls/QuickAccess/IQuickAccessLauncher.cs new file mode 100644 index 0000000000..63f012b7b2 --- /dev/null +++ b/src/settings-ui/Settings.UI.Controls/QuickAccess/IQuickAccessLauncher.cs @@ -0,0 +1,13 @@ +// 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 ManagedCommon; + +namespace Microsoft.PowerToys.Settings.UI.Controls +{ + public interface IQuickAccessLauncher + { + void Launch(ModuleType moduleType); + } +} diff --git a/src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessItem.cs b/src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessItem.cs index 49023da9b7..b639d87802 100644 --- a/src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessItem.cs +++ b/src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessItem.cs @@ -3,66 +3,67 @@ // See the LICENSE file in the project root for more information. using System.Windows.Input; +using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.UI.Xaml; namespace Microsoft.PowerToys.Settings.UI.Controls { - public sealed class QuickAccessItem : DependencyObject + public sealed class QuickAccessItem : Observable { + private string _title = string.Empty; + public string Title { - get => (string)GetValue(TitleProperty); - set => SetValue(TitleProperty, value); + get => _title; + set => Set(ref _title, value); } - public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(QuickAccessItem), new PropertyMetadata(string.Empty)); + private string _description = string.Empty; public string Description { - get => (string)GetValue(DescriptionProperty); - set => SetValue(DescriptionProperty, value); + get => _description; + set => Set(ref _description, value); } - public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register(nameof(Description), typeof(string), typeof(QuickAccessItem), new PropertyMetadata(string.Empty)); + private string _icon = string.Empty; public string Icon { - get => (string)GetValue(IconProperty); - set => SetValue(IconProperty, value); + get => _icon; + set => Set(ref _icon, value); } - public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(string), typeof(QuickAccessItem), new PropertyMetadata(string.Empty)); + private ICommand? _command; - public ICommand Command + public ICommand? Command { - get => (ICommand)GetValue(CommandProperty); - set => SetValue(CommandProperty, value); + get => _command; + set => Set(ref _command, value); } - public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(nameof(Command), typeof(ICommand), typeof(QuickAccessItem), new PropertyMetadata(null)); + private object? _commandParameter; - public object CommandParameter + public object? CommandParameter { - get => (object)GetValue(CommandParameterProperty); - set => SetValue(CommandParameterProperty, value); + get => _commandParameter; + set => Set(ref _commandParameter, value); } - public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(nameof(CommandParameter), typeof(object), typeof(QuickAccessItem), new PropertyMetadata(null)); + private bool _visible = true; public bool Visible { - get => (bool)GetValue(VisibleProperty); - set => SetValue(VisibleProperty, value); + get => _visible; + set => Set(ref _visible, value); } - public static readonly DependencyProperty VisibleProperty = DependencyProperty.Register(nameof(Visible), typeof(bool), typeof(QuickAccessItem), new PropertyMetadata(true)); + private object? _tag; - public object Tag + public object? Tag { - get => (object)GetValue(TagProperty); - set => SetValue(TagProperty, value); + get => _tag; + set => Set(ref _tag, value); } - - public static readonly DependencyProperty TagProperty = DependencyProperty.Register(nameof(Tag), typeof(object), typeof(QuickAccessItem), new PropertyMetadata(null)); } } diff --git a/src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessViewModel.cs b/src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessViewModel.cs new file mode 100644 index 0000000000..5531df1ee5 --- /dev/null +++ b/src/settings-ui/Settings.UI.Controls/QuickAccess/QuickAccessViewModel.cs @@ -0,0 +1,140 @@ +// 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.Collections.ObjectModel; +using ManagedCommon; +using Microsoft.PowerToys.Settings.UI.Library; +using Microsoft.PowerToys.Settings.UI.Library.Helpers; +using Microsoft.PowerToys.Settings.UI.Library.Interfaces; +using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; +using Microsoft.UI.Dispatching; +using Microsoft.Windows.ApplicationModel.Resources; + +namespace Microsoft.PowerToys.Settings.UI.Controls +{ + public partial class QuickAccessViewModel : Observable + { + private readonly ISettingsRepository _settingsRepository; + private readonly IQuickAccessLauncher _launcher; + private readonly Func _isModuleGpoDisabled; + private readonly ResourceLoader _resourceLoader; + private readonly DispatcherQueue _dispatcherQueue; + private GeneralSettings _generalSettings; + + public ObservableCollection Items { get; } = new(); + + public QuickAccessViewModel( + ISettingsRepository settingsRepository, + IQuickAccessLauncher launcher, + Func isModuleGpoDisabled, + ResourceLoader resourceLoader) + { + _settingsRepository = settingsRepository; + _launcher = launcher; + _isModuleGpoDisabled = isModuleGpoDisabled; + _resourceLoader = resourceLoader; + _dispatcherQueue = DispatcherQueue.GetForCurrentThread(); + + _generalSettings = _settingsRepository.SettingsConfig; + _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); + _settingsRepository.SettingsChanged += OnSettingsChanged; + + InitializeItems(); + } + + private void OnSettingsChanged(GeneralSettings newSettings) + { + if (_dispatcherQueue != null) + { + _dispatcherQueue.TryEnqueue(() => + { + _generalSettings = newSettings; + _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); + RefreshItemsVisibility(); + }); + } + } + + private void InitializeItems() + { + AddFlyoutMenuItem(ModuleType.ColorPicker); + AddFlyoutMenuItem(ModuleType.CmdPal); + AddFlyoutMenuItem(ModuleType.EnvironmentVariables); + AddFlyoutMenuItem(ModuleType.FancyZones); + AddFlyoutMenuItem(ModuleType.Hosts); + AddFlyoutMenuItem(ModuleType.PowerLauncher); + AddFlyoutMenuItem(ModuleType.PowerOCR); + AddFlyoutMenuItem(ModuleType.RegistryPreview); + AddFlyoutMenuItem(ModuleType.MeasureTool); + AddFlyoutMenuItem(ModuleType.ShortcutGuide); + AddFlyoutMenuItem(ModuleType.Workspaces); + } + + private void AddFlyoutMenuItem(ModuleType moduleType) + { + if (_isModuleGpoDisabled(moduleType)) + { + return; + } + + Items.Add(new QuickAccessItem + { + Title = _resourceLoader.GetString(Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleLabelResourceName(moduleType)), + Tag = moduleType, + Visible = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType), + Description = GetModuleToolTip(moduleType), + Icon = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleTypeFluentIconName(moduleType), + Command = new RelayCommand(() => _launcher.Launch(moduleType)), + }); + } + + private void ModuleEnabledChanged() + { + if (_dispatcherQueue != null) + { + _dispatcherQueue.TryEnqueue(() => + { + _generalSettings = _settingsRepository.SettingsConfig; + _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); + RefreshItemsVisibility(); + }); + } + } + + private void RefreshItemsVisibility() + { + foreach (var item in Items) + { + if (item.Tag is ModuleType moduleType) + { + item.Visible = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType); + } + } + } + + private string GetModuleToolTip(ModuleType moduleType) + { + return moduleType switch + { + ModuleType.ColorPicker => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), + ModuleType.FancyZones => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.FancyzonesEditorHotkey.Value.ToString(), + ModuleType.PowerLauncher => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.OpenPowerLauncher.ToString(), + ModuleType.PowerOCR => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), + ModuleType.Workspaces => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.Hotkey.Value.ToString(), + ModuleType.MeasureTool => SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), + ModuleType.ShortcutGuide => GetShortcutGuideToolTip(), + _ => string.Empty, + }; + } + + private string GetShortcutGuideToolTip() + { + var shortcutGuideSettings = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig; + return shortcutGuideSettings.Properties.UseLegacyPressWinKeyBehavior.Value + ? "Win" + : shortcutGuideSettings.Properties.OpenShortcutGuide.ToString(); + } + } +} diff --git a/src/settings-ui/Settings.UI.Controls/Settings.UI.Controls.csproj b/src/settings-ui/Settings.UI.Controls/Settings.UI.Controls.csproj index b0c3186f0f..fac43d56a4 100644 --- a/src/settings-ui/Settings.UI.Controls/Settings.UI.Controls.csproj +++ b/src/settings-ui/Settings.UI.Controls/Settings.UI.Controls.csproj @@ -24,4 +24,9 @@ + + + + + diff --git a/src/settings-ui/Settings.UI.Library/Helpers/ModuleHelper.cs b/src/settings-ui/Settings.UI.Library/Helpers/ModuleHelper.cs new file mode 100644 index 0000000000..ded7c4e15e --- /dev/null +++ b/src/settings-ui/Settings.UI.Library/Helpers/ModuleHelper.cs @@ -0,0 +1,121 @@ +// 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 ManagedCommon; + +namespace Microsoft.PowerToys.Settings.UI.Library.Helpers +{ + public static class ModuleHelper + { + public static string GetModuleLabelResourceName(ModuleType moduleType) + { + return moduleType switch + { + ModuleType.Workspaces => "Workspaces/ModuleTitle", + ModuleType.PowerAccent => "QuickAccent/ModuleTitle", + ModuleType.PowerOCR => "TextExtractor/ModuleTitle", + ModuleType.FindMyMouse => "MouseUtils_FindMyMouse/Header", + ModuleType.MouseHighlighter => "MouseUtils_MouseHighlighter/Header", + ModuleType.MouseJump => "MouseUtils_MouseJump/Header", + ModuleType.MousePointerCrosshairs => "MouseUtils_MousePointerCrosshairs/Header", + ModuleType.CursorWrap => "MouseUtils_CursorWrap/Header", + ModuleType.GeneralSettings => "QuickAccessTitle/Title", + _ => $"{moduleType}/ModuleTitle", + }; + } + + public static string GetModuleTypeFluentIconName(ModuleType moduleType) + { + return moduleType switch + { + ModuleType.AdvancedPaste => "ms-appx:///Assets/Settings/Icons/AdvancedPaste.png", + ModuleType.Workspaces => "ms-appx:///Assets/Settings/Icons/Workspaces.png", + ModuleType.PowerOCR => "ms-appx:///Assets/Settings/Icons/TextExtractor.png", + ModuleType.PowerAccent => "ms-appx:///Assets/Settings/Icons/QuickAccent.png", + ModuleType.MousePointerCrosshairs => "ms-appx:///Assets/Settings/Icons/MouseCrosshairs.png", + ModuleType.MeasureTool => "ms-appx:///Assets/Settings/Icons/ScreenRuler.png", + ModuleType.PowerLauncher => "ms-appx:///Assets/Settings/Icons/PowerToysRun.png", + ModuleType.GeneralSettings => "ms-appx:///Assets/Settings/Icons/PowerToys.png", + _ => $"ms-appx:///Assets/Settings/Icons/{moduleType}.png", + }; + } + + public static bool GetIsModuleEnabled(GeneralSettings generalSettingsConfig, ModuleType moduleType) + { + return moduleType switch + { + ModuleType.AdvancedPaste => generalSettingsConfig.Enabled.AdvancedPaste, + ModuleType.AlwaysOnTop => generalSettingsConfig.Enabled.AlwaysOnTop, + ModuleType.Awake => generalSettingsConfig.Enabled.Awake, + ModuleType.CmdPal => generalSettingsConfig.Enabled.CmdPal, + ModuleType.ColorPicker => generalSettingsConfig.Enabled.ColorPicker, + ModuleType.CropAndLock => generalSettingsConfig.Enabled.CropAndLock, + ModuleType.CursorWrap => generalSettingsConfig.Enabled.CursorWrap, + ModuleType.EnvironmentVariables => generalSettingsConfig.Enabled.EnvironmentVariables, + ModuleType.FancyZones => generalSettingsConfig.Enabled.FancyZones, + ModuleType.FileLocksmith => generalSettingsConfig.Enabled.FileLocksmith, + ModuleType.FindMyMouse => generalSettingsConfig.Enabled.FindMyMouse, + ModuleType.Hosts => generalSettingsConfig.Enabled.Hosts, + ModuleType.ImageResizer => generalSettingsConfig.Enabled.ImageResizer, + ModuleType.KeyboardManager => generalSettingsConfig.Enabled.KeyboardManager, + ModuleType.LightSwitch => generalSettingsConfig.Enabled.LightSwitch, + ModuleType.MouseHighlighter => generalSettingsConfig.Enabled.MouseHighlighter, + ModuleType.MouseJump => generalSettingsConfig.Enabled.MouseJump, + ModuleType.MousePointerCrosshairs => generalSettingsConfig.Enabled.MousePointerCrosshairs, + ModuleType.MouseWithoutBorders => generalSettingsConfig.Enabled.MouseWithoutBorders, + ModuleType.NewPlus => generalSettingsConfig.Enabled.NewPlus, + ModuleType.Peek => generalSettingsConfig.Enabled.Peek, + ModuleType.PowerRename => generalSettingsConfig.Enabled.PowerRename, + ModuleType.PowerLauncher => generalSettingsConfig.Enabled.PowerLauncher, + ModuleType.PowerAccent => generalSettingsConfig.Enabled.PowerAccent, + ModuleType.RegistryPreview => generalSettingsConfig.Enabled.RegistryPreview, + ModuleType.MeasureTool => generalSettingsConfig.Enabled.MeasureTool, + ModuleType.ShortcutGuide => generalSettingsConfig.Enabled.ShortcutGuide, + ModuleType.PowerOCR => generalSettingsConfig.Enabled.PowerOcr, + ModuleType.Workspaces => generalSettingsConfig.Enabled.Workspaces, + ModuleType.ZoomIt => generalSettingsConfig.Enabled.ZoomIt, + ModuleType.GeneralSettings => generalSettingsConfig.EnableQuickAccess, + _ => false, + }; + } + + public static void SetIsModuleEnabled(GeneralSettings generalSettingsConfig, ModuleType moduleType, bool isEnabled) + { + switch (moduleType) + { + case ModuleType.AdvancedPaste: generalSettingsConfig.Enabled.AdvancedPaste = isEnabled; break; + case ModuleType.AlwaysOnTop: generalSettingsConfig.Enabled.AlwaysOnTop = isEnabled; break; + case ModuleType.Awake: generalSettingsConfig.Enabled.Awake = isEnabled; break; + case ModuleType.CmdPal: generalSettingsConfig.Enabled.CmdPal = isEnabled; break; + case ModuleType.ColorPicker: generalSettingsConfig.Enabled.ColorPicker = isEnabled; break; + case ModuleType.CropAndLock: generalSettingsConfig.Enabled.CropAndLock = isEnabled; break; + case ModuleType.CursorWrap: generalSettingsConfig.Enabled.CursorWrap = isEnabled; break; + case ModuleType.EnvironmentVariables: generalSettingsConfig.Enabled.EnvironmentVariables = isEnabled; break; + case ModuleType.FancyZones: generalSettingsConfig.Enabled.FancyZones = isEnabled; break; + case ModuleType.FileLocksmith: generalSettingsConfig.Enabled.FileLocksmith = isEnabled; break; + case ModuleType.FindMyMouse: generalSettingsConfig.Enabled.FindMyMouse = isEnabled; break; + case ModuleType.Hosts: generalSettingsConfig.Enabled.Hosts = isEnabled; break; + case ModuleType.ImageResizer: generalSettingsConfig.Enabled.ImageResizer = isEnabled; break; + case ModuleType.KeyboardManager: generalSettingsConfig.Enabled.KeyboardManager = isEnabled; break; + case ModuleType.LightSwitch: generalSettingsConfig.Enabled.LightSwitch = isEnabled; break; + case ModuleType.MouseHighlighter: generalSettingsConfig.Enabled.MouseHighlighter = isEnabled; break; + case ModuleType.MouseJump: generalSettingsConfig.Enabled.MouseJump = isEnabled; break; + case ModuleType.MousePointerCrosshairs: generalSettingsConfig.Enabled.MousePointerCrosshairs = isEnabled; break; + case ModuleType.MouseWithoutBorders: generalSettingsConfig.Enabled.MouseWithoutBorders = isEnabled; break; + case ModuleType.NewPlus: generalSettingsConfig.Enabled.NewPlus = isEnabled; break; + case ModuleType.Peek: generalSettingsConfig.Enabled.Peek = isEnabled; break; + case ModuleType.PowerRename: generalSettingsConfig.Enabled.PowerRename = isEnabled; break; + case ModuleType.PowerLauncher: generalSettingsConfig.Enabled.PowerLauncher = isEnabled; break; + case ModuleType.PowerAccent: generalSettingsConfig.Enabled.PowerAccent = isEnabled; break; + case ModuleType.RegistryPreview: generalSettingsConfig.Enabled.RegistryPreview = isEnabled; break; + case ModuleType.MeasureTool: generalSettingsConfig.Enabled.MeasureTool = isEnabled; break; + case ModuleType.ShortcutGuide: generalSettingsConfig.Enabled.ShortcutGuide = isEnabled; break; + case ModuleType.PowerOCR: generalSettingsConfig.Enabled.PowerOcr = isEnabled; break; + case ModuleType.Workspaces: generalSettingsConfig.Enabled.Workspaces = isEnabled; break; + case ModuleType.ZoomIt: generalSettingsConfig.Enabled.ZoomIt = isEnabled; break; + case ModuleType.GeneralSettings: generalSettingsConfig.EnableQuickAccess = isEnabled; break; + } + } + } +} diff --git a/src/settings-ui/Settings.UI/Helpers/ModuleGpoHelper.cs b/src/settings-ui/Settings.UI/Helpers/ModuleGpoHelper.cs new file mode 100644 index 0000000000..9517c91b21 --- /dev/null +++ b/src/settings-ui/Settings.UI/Helpers/ModuleGpoHelper.cs @@ -0,0 +1,91 @@ +// 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 global::PowerToys.GPOWrapper; +using ManagedCommon; +using Microsoft.PowerToys.Settings.UI.Library; +using Microsoft.PowerToys.Settings.UI.Views; +using Windows.UI; + +namespace Microsoft.PowerToys.Settings.UI.Helpers +{ + internal sealed class ModuleGpoHelper + { + public static GpoRuleConfigured GetModuleGpoConfiguration(ModuleType moduleType) + { + switch (moduleType) + { + case ModuleType.AdvancedPaste: return GPOWrapper.GetConfiguredAdvancedPasteEnabledValue(); + case ModuleType.AlwaysOnTop: return GPOWrapper.GetConfiguredAlwaysOnTopEnabledValue(); + case ModuleType.Awake: return GPOWrapper.GetConfiguredAwakeEnabledValue(); + case ModuleType.CmdPal: return GPOWrapper.GetConfiguredCmdPalEnabledValue(); + case ModuleType.ColorPicker: return GPOWrapper.GetConfiguredColorPickerEnabledValue(); + case ModuleType.CropAndLock: return GPOWrapper.GetConfiguredCropAndLockEnabledValue(); + case ModuleType.CursorWrap: return GPOWrapper.GetConfiguredCursorWrapEnabledValue(); + case ModuleType.EnvironmentVariables: return GPOWrapper.GetConfiguredEnvironmentVariablesEnabledValue(); + case ModuleType.FancyZones: return GPOWrapper.GetConfiguredFancyZonesEnabledValue(); + case ModuleType.FileLocksmith: return GPOWrapper.GetConfiguredFileLocksmithEnabledValue(); + case ModuleType.FindMyMouse: return GPOWrapper.GetConfiguredFindMyMouseEnabledValue(); + case ModuleType.Hosts: return GPOWrapper.GetConfiguredHostsFileEditorEnabledValue(); + case ModuleType.ImageResizer: return GPOWrapper.GetConfiguredImageResizerEnabledValue(); + case ModuleType.KeyboardManager: return GPOWrapper.GetConfiguredKeyboardManagerEnabledValue(); + case ModuleType.MouseHighlighter: return GPOWrapper.GetConfiguredMouseHighlighterEnabledValue(); + case ModuleType.MouseJump: return GPOWrapper.GetConfiguredMouseJumpEnabledValue(); + case ModuleType.MousePointerCrosshairs: return GPOWrapper.GetConfiguredMousePointerCrosshairsEnabledValue(); + case ModuleType.MouseWithoutBorders: return GPOWrapper.GetConfiguredMouseWithoutBordersEnabledValue(); + case ModuleType.NewPlus: return GPOWrapper.GetConfiguredNewPlusEnabledValue(); + case ModuleType.Peek: return GPOWrapper.GetConfiguredPeekEnabledValue(); + case ModuleType.PowerRename: return GPOWrapper.GetConfiguredPowerRenameEnabledValue(); + case ModuleType.PowerLauncher: return GPOWrapper.GetConfiguredPowerLauncherEnabledValue(); + case ModuleType.PowerAccent: return GPOWrapper.GetConfiguredQuickAccentEnabledValue(); + case ModuleType.Workspaces: return GPOWrapper.GetConfiguredWorkspacesEnabledValue(); + case ModuleType.RegistryPreview: return GPOWrapper.GetConfiguredRegistryPreviewEnabledValue(); + case ModuleType.MeasureTool: return GPOWrapper.GetConfiguredScreenRulerEnabledValue(); + case ModuleType.ShortcutGuide: return GPOWrapper.GetConfiguredShortcutGuideEnabledValue(); + case ModuleType.PowerOCR: return GPOWrapper.GetConfiguredTextExtractorEnabledValue(); + case ModuleType.ZoomIt: return GPOWrapper.GetConfiguredZoomItEnabledValue(); + default: return GpoRuleConfigured.Unavailable; + } + } + + public static System.Type GetModulePageType(ModuleType moduleType) + { + return moduleType switch + { + ModuleType.AdvancedPaste => typeof(AdvancedPastePage), + ModuleType.AlwaysOnTop => typeof(AlwaysOnTopPage), + ModuleType.Awake => typeof(AwakePage), + ModuleType.CmdPal => typeof(CmdPalPage), + ModuleType.ColorPicker => typeof(ColorPickerPage), + ModuleType.CropAndLock => typeof(CropAndLockPage), + ModuleType.CursorWrap => typeof(MouseUtilsPage), + ModuleType.LightSwitch => typeof(LightSwitchPage), + ModuleType.EnvironmentVariables => typeof(EnvironmentVariablesPage), + ModuleType.FancyZones => typeof(FancyZonesPage), + ModuleType.FileLocksmith => typeof(FileLocksmithPage), + ModuleType.FindMyMouse => typeof(MouseUtilsPage), + ModuleType.GeneralSettings => typeof(GeneralPage), + ModuleType.Hosts => typeof(HostsPage), + ModuleType.ImageResizer => typeof(ImageResizerPage), + ModuleType.KeyboardManager => typeof(KeyboardManagerPage), + ModuleType.MouseHighlighter => typeof(MouseUtilsPage), + ModuleType.MouseJump => typeof(MouseUtilsPage), + ModuleType.MousePointerCrosshairs => typeof(MouseUtilsPage), + ModuleType.MouseWithoutBorders => typeof(MouseWithoutBordersPage), + ModuleType.NewPlus => typeof(NewPlusPage), + ModuleType.Peek => typeof(PeekPage), + ModuleType.PowerRename => typeof(PowerRenamePage), + ModuleType.PowerLauncher => typeof(PowerLauncherPage), + ModuleType.PowerAccent => typeof(PowerAccentPage), + ModuleType.Workspaces => typeof(WorkspacesPage), + ModuleType.RegistryPreview => typeof(RegistryPreviewPage), + ModuleType.MeasureTool => typeof(MeasureToolPage), + ModuleType.ShortcutGuide => typeof(ShortcutGuidePage), + ModuleType.PowerOCR => typeof(PowerOcrPage), + ModuleType.ZoomIt => typeof(ZoomItPage), + _ => typeof(DashboardPage), // never called, all values listed above + }; + } + } +} diff --git a/src/settings-ui/Settings.UI/Helpers/ModuleHelper.cs b/src/settings-ui/Settings.UI/Helpers/ModuleHelper.cs deleted file mode 100644 index b4c4a379ee..0000000000 --- a/src/settings-ui/Settings.UI/Helpers/ModuleHelper.cs +++ /dev/null @@ -1,201 +0,0 @@ -// 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 global::PowerToys.GPOWrapper; -using ManagedCommon; -using Microsoft.PowerToys.Settings.UI.Library; -using Microsoft.PowerToys.Settings.UI.Views; -using Windows.UI; - -namespace Microsoft.PowerToys.Settings.UI.Helpers -{ - internal sealed class ModuleHelper - { - public static string GetModuleLabelResourceName(ModuleType moduleType) - { - switch (moduleType) - { - case ModuleType.Workspaces: return "Workspaces/ModuleTitle"; - case ModuleType.PowerAccent: return "QuickAccent/ModuleTitle"; - case ModuleType.PowerOCR: return "TextExtractor/ModuleTitle"; - case ModuleType.FindMyMouse: - case ModuleType.MouseHighlighter: - case ModuleType.MouseJump: - case ModuleType.MousePointerCrosshairs: - case ModuleType.CursorWrap: return $"MouseUtils_{moduleType}/Header"; - case ModuleType.GeneralSettings: return "QuickAccessTitle/Title"; - default: return $"{moduleType}/ModuleTitle"; - } - } - - public static string GetModuleTypeFluentIconName(ModuleType moduleType) - { - switch (moduleType) - { - case ModuleType.AdvancedPaste: return "ms-appx:///Assets/Settings/Icons/AdvancedPaste.png"; - case ModuleType.Workspaces: return "ms-appx:///Assets/Settings/Icons/Workspaces.png"; - case ModuleType.PowerOCR: return "ms-appx:///Assets/Settings/Icons/TextExtractor.png"; - case ModuleType.PowerAccent: return "ms-appx:///Assets/Settings/Icons/QuickAccent.png"; - case ModuleType.MousePointerCrosshairs: return "ms-appx:///Assets/Settings/Icons/MouseCrosshairs.png"; - case ModuleType.MeasureTool: return "ms-appx:///Assets/Settings/Icons/ScreenRuler.png"; - case ModuleType.PowerLauncher: return $"ms-appx:///Assets/Settings/Icons/PowerToysRun.png"; - case ModuleType.GeneralSettings: return "ms-appx:///Assets/Settings/Icons/PowerToys.png"; - default: return $"ms-appx:///Assets/Settings/Icons/{moduleType}.png"; - } - } - - public static bool GetIsModuleEnabled(Library.GeneralSettings generalSettingsConfig, ModuleType moduleType) - { - switch (moduleType) - { - case ModuleType.AdvancedPaste: return generalSettingsConfig.Enabled.AdvancedPaste; - case ModuleType.AlwaysOnTop: return generalSettingsConfig.Enabled.AlwaysOnTop; - case ModuleType.Awake: return generalSettingsConfig.Enabled.Awake; - case ModuleType.CmdPal: return generalSettingsConfig.Enabled.CmdPal; - case ModuleType.ColorPicker: return generalSettingsConfig.Enabled.ColorPicker; - case ModuleType.CropAndLock: return generalSettingsConfig.Enabled.CropAndLock; - case ModuleType.CursorWrap: return generalSettingsConfig.Enabled.CursorWrap; - case ModuleType.LightSwitch: return generalSettingsConfig.Enabled.LightSwitch; - case ModuleType.EnvironmentVariables: return generalSettingsConfig.Enabled.EnvironmentVariables; - case ModuleType.FancyZones: return generalSettingsConfig.Enabled.FancyZones; - case ModuleType.FileLocksmith: return generalSettingsConfig.Enabled.FileLocksmith; - case ModuleType.FindMyMouse: return generalSettingsConfig.Enabled.FindMyMouse; - case ModuleType.Hosts: return generalSettingsConfig.Enabled.Hosts; - case ModuleType.ImageResizer: return generalSettingsConfig.Enabled.ImageResizer; - case ModuleType.KeyboardManager: return generalSettingsConfig.Enabled.KeyboardManager; - case ModuleType.MouseHighlighter: return generalSettingsConfig.Enabled.MouseHighlighter; - case ModuleType.MouseJump: return generalSettingsConfig.Enabled.MouseJump; - case ModuleType.MousePointerCrosshairs: return generalSettingsConfig.Enabled.MousePointerCrosshairs; - case ModuleType.MouseWithoutBorders: return generalSettingsConfig.Enabled.MouseWithoutBorders; - case ModuleType.NewPlus: return generalSettingsConfig.Enabled.NewPlus; - case ModuleType.Peek: return generalSettingsConfig.Enabled.Peek; - case ModuleType.PowerRename: return generalSettingsConfig.Enabled.PowerRename; - case ModuleType.PowerLauncher: return generalSettingsConfig.Enabled.PowerLauncher; - case ModuleType.PowerAccent: return generalSettingsConfig.Enabled.PowerAccent; - case ModuleType.Workspaces: return generalSettingsConfig.Enabled.Workspaces; - case ModuleType.RegistryPreview: return generalSettingsConfig.Enabled.RegistryPreview; - case ModuleType.MeasureTool: return generalSettingsConfig.Enabled.MeasureTool; - case ModuleType.ShortcutGuide: return generalSettingsConfig.Enabled.ShortcutGuide; - case ModuleType.PowerOCR: return generalSettingsConfig.Enabled.PowerOcr; - case ModuleType.ZoomIt: return generalSettingsConfig.Enabled.ZoomIt; - case ModuleType.GeneralSettings: return generalSettingsConfig.EnableQuickAccess; - default: return false; - } - } - - internal static void SetIsModuleEnabled(GeneralSettings generalSettingsConfig, ModuleType moduleType, bool isEnabled) - { - switch (moduleType) - { - case ModuleType.AdvancedPaste: generalSettingsConfig.Enabled.AdvancedPaste = isEnabled; break; - case ModuleType.AlwaysOnTop: generalSettingsConfig.Enabled.AlwaysOnTop = isEnabled; break; - case ModuleType.Awake: generalSettingsConfig.Enabled.Awake = isEnabled; break; - case ModuleType.CmdPal: generalSettingsConfig.Enabled.CmdPal = isEnabled; break; - case ModuleType.ColorPicker: generalSettingsConfig.Enabled.ColorPicker = isEnabled; break; - case ModuleType.CropAndLock: generalSettingsConfig.Enabled.CropAndLock = isEnabled; break; - case ModuleType.CursorWrap: generalSettingsConfig.Enabled.CursorWrap = isEnabled; break; - case ModuleType.LightSwitch: generalSettingsConfig.Enabled.LightSwitch = isEnabled; break; - case ModuleType.EnvironmentVariables: generalSettingsConfig.Enabled.EnvironmentVariables = isEnabled; break; - case ModuleType.FancyZones: generalSettingsConfig.Enabled.FancyZones = isEnabled; break; - case ModuleType.FileLocksmith: generalSettingsConfig.Enabled.FileLocksmith = isEnabled; break; - case ModuleType.FindMyMouse: generalSettingsConfig.Enabled.FindMyMouse = isEnabled; break; - case ModuleType.Hosts: generalSettingsConfig.Enabled.Hosts = isEnabled; break; - case ModuleType.ImageResizer: generalSettingsConfig.Enabled.ImageResizer = isEnabled; break; - case ModuleType.KeyboardManager: generalSettingsConfig.Enabled.KeyboardManager = isEnabled; break; - case ModuleType.MouseHighlighter: generalSettingsConfig.Enabled.MouseHighlighter = isEnabled; break; - case ModuleType.MouseJump: generalSettingsConfig.Enabled.MouseJump = isEnabled; break; - case ModuleType.MousePointerCrosshairs: generalSettingsConfig.Enabled.MousePointerCrosshairs = isEnabled; break; - case ModuleType.MouseWithoutBorders: generalSettingsConfig.Enabled.MouseWithoutBorders = isEnabled; break; - case ModuleType.NewPlus: generalSettingsConfig.Enabled.NewPlus = isEnabled; break; - case ModuleType.Peek: generalSettingsConfig.Enabled.Peek = isEnabled; break; - case ModuleType.PowerRename: generalSettingsConfig.Enabled.PowerRename = isEnabled; break; - case ModuleType.PowerLauncher: generalSettingsConfig.Enabled.PowerLauncher = isEnabled; break; - case ModuleType.PowerAccent: generalSettingsConfig.Enabled.PowerAccent = isEnabled; break; - case ModuleType.Workspaces: generalSettingsConfig.Enabled.Workspaces = isEnabled; break; - case ModuleType.RegistryPreview: generalSettingsConfig.Enabled.RegistryPreview = isEnabled; break; - case ModuleType.MeasureTool: generalSettingsConfig.Enabled.MeasureTool = isEnabled; break; - case ModuleType.ShortcutGuide: generalSettingsConfig.Enabled.ShortcutGuide = isEnabled; break; - case ModuleType.PowerOCR: generalSettingsConfig.Enabled.PowerOcr = isEnabled; break; - case ModuleType.ZoomIt: generalSettingsConfig.Enabled.ZoomIt = isEnabled; break; - case ModuleType.GeneralSettings: generalSettingsConfig.EnableQuickAccess = isEnabled; break; - } - } - - public static GpoRuleConfigured GetModuleGpoConfiguration(ModuleType moduleType) - { - switch (moduleType) - { - case ModuleType.AdvancedPaste: return GPOWrapper.GetConfiguredAdvancedPasteEnabledValue(); - case ModuleType.AlwaysOnTop: return GPOWrapper.GetConfiguredAlwaysOnTopEnabledValue(); - case ModuleType.Awake: return GPOWrapper.GetConfiguredAwakeEnabledValue(); - case ModuleType.CmdPal: return GPOWrapper.GetConfiguredCmdPalEnabledValue(); - case ModuleType.ColorPicker: return GPOWrapper.GetConfiguredColorPickerEnabledValue(); - case ModuleType.CropAndLock: return GPOWrapper.GetConfiguredCropAndLockEnabledValue(); - case ModuleType.CursorWrap: return GPOWrapper.GetConfiguredCursorWrapEnabledValue(); - case ModuleType.EnvironmentVariables: return GPOWrapper.GetConfiguredEnvironmentVariablesEnabledValue(); - case ModuleType.FancyZones: return GPOWrapper.GetConfiguredFancyZonesEnabledValue(); - case ModuleType.FileLocksmith: return GPOWrapper.GetConfiguredFileLocksmithEnabledValue(); - case ModuleType.FindMyMouse: return GPOWrapper.GetConfiguredFindMyMouseEnabledValue(); - case ModuleType.Hosts: return GPOWrapper.GetConfiguredHostsFileEditorEnabledValue(); - case ModuleType.ImageResizer: return GPOWrapper.GetConfiguredImageResizerEnabledValue(); - case ModuleType.KeyboardManager: return GPOWrapper.GetConfiguredKeyboardManagerEnabledValue(); - case ModuleType.MouseHighlighter: return GPOWrapper.GetConfiguredMouseHighlighterEnabledValue(); - case ModuleType.MouseJump: return GPOWrapper.GetConfiguredMouseJumpEnabledValue(); - case ModuleType.MousePointerCrosshairs: return GPOWrapper.GetConfiguredMousePointerCrosshairsEnabledValue(); - case ModuleType.MouseWithoutBorders: return GPOWrapper.GetConfiguredMouseWithoutBordersEnabledValue(); - case ModuleType.NewPlus: return GPOWrapper.GetConfiguredNewPlusEnabledValue(); - case ModuleType.Peek: return GPOWrapper.GetConfiguredPeekEnabledValue(); - case ModuleType.PowerRename: return GPOWrapper.GetConfiguredPowerRenameEnabledValue(); - case ModuleType.PowerLauncher: return GPOWrapper.GetConfiguredPowerLauncherEnabledValue(); - case ModuleType.PowerAccent: return GPOWrapper.GetConfiguredQuickAccentEnabledValue(); - case ModuleType.Workspaces: return GPOWrapper.GetConfiguredWorkspacesEnabledValue(); - case ModuleType.RegistryPreview: return GPOWrapper.GetConfiguredRegistryPreviewEnabledValue(); - case ModuleType.MeasureTool: return GPOWrapper.GetConfiguredScreenRulerEnabledValue(); - case ModuleType.ShortcutGuide: return GPOWrapper.GetConfiguredShortcutGuideEnabledValue(); - case ModuleType.PowerOCR: return GPOWrapper.GetConfiguredTextExtractorEnabledValue(); - case ModuleType.ZoomIt: return GPOWrapper.GetConfiguredZoomItEnabledValue(); - default: return GpoRuleConfigured.Unavailable; - } - } - - public static System.Type GetModulePageType(ModuleType moduleType) - { - return moduleType switch - { - ModuleType.AdvancedPaste => typeof(AdvancedPastePage), - ModuleType.AlwaysOnTop => typeof(AlwaysOnTopPage), - ModuleType.Awake => typeof(AwakePage), - ModuleType.CmdPal => typeof(CmdPalPage), - ModuleType.ColorPicker => typeof(ColorPickerPage), - ModuleType.CropAndLock => typeof(CropAndLockPage), - ModuleType.CursorWrap => typeof(MouseUtilsPage), - ModuleType.LightSwitch => typeof(LightSwitchPage), - ModuleType.EnvironmentVariables => typeof(EnvironmentVariablesPage), - ModuleType.FancyZones => typeof(FancyZonesPage), - ModuleType.FileLocksmith => typeof(FileLocksmithPage), - ModuleType.FindMyMouse => typeof(MouseUtilsPage), - ModuleType.GeneralSettings => typeof(GeneralPage), - ModuleType.Hosts => typeof(HostsPage), - ModuleType.ImageResizer => typeof(ImageResizerPage), - ModuleType.KeyboardManager => typeof(KeyboardManagerPage), - ModuleType.MouseHighlighter => typeof(MouseUtilsPage), - ModuleType.MouseJump => typeof(MouseUtilsPage), - ModuleType.MousePointerCrosshairs => typeof(MouseUtilsPage), - ModuleType.MouseWithoutBorders => typeof(MouseWithoutBordersPage), - ModuleType.NewPlus => typeof(NewPlusPage), - ModuleType.Peek => typeof(PeekPage), - ModuleType.PowerRename => typeof(PowerRenamePage), - ModuleType.PowerLauncher => typeof(PowerLauncherPage), - ModuleType.PowerAccent => typeof(PowerAccentPage), - ModuleType.Workspaces => typeof(WorkspacesPage), - ModuleType.RegistryPreview => typeof(RegistryPreviewPage), - ModuleType.MeasureTool => typeof(MeasureToolPage), - ModuleType.ShortcutGuide => typeof(ShortcutGuidePage), - ModuleType.PowerOCR => typeof(PowerOcrPage), - ModuleType.ZoomIt => typeof(ZoomItPage), - _ => typeof(DashboardPage), // never called, all values listed above - }; - } - } -} diff --git a/src/settings-ui/Settings.UI/Services/DashboardLauncher.cs b/src/settings-ui/Settings.UI/Services/DashboardLauncher.cs new file mode 100644 index 0000000000..a754e424f1 --- /dev/null +++ b/src/settings-ui/Settings.UI/Services/DashboardLauncher.cs @@ -0,0 +1,122 @@ +// 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.Threading; +using ManagedCommon; +using Microsoft.PowerToys.Settings.UI.Controls; +using Microsoft.PowerToys.Settings.UI.Library; +using PowerToys.Interop; + +namespace Microsoft.PowerToys.Settings.UI.Services +{ + public class DashboardLauncher : IQuickAccessLauncher + { + private readonly bool _isElevated; + + public DashboardLauncher(bool isElevated) + { + _isElevated = isElevated; + } + + public void Launch(ModuleType moduleType) + { + switch (moduleType) + { + case ModuleType.ColorPicker: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowColorPickerSharedEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.EnvironmentVariables: + { + bool launchAdmin = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.LaunchAdministrator; + string eventName = !_isElevated && launchAdmin + ? Constants.ShowEnvironmentVariablesAdminSharedEvent() + : Constants.ShowEnvironmentVariablesSharedEvent(); + + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName)) + { + eventHandle.Set(); + } + } + + break; + case ModuleType.FancyZones: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.FZEToggleEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.Hosts: + { + bool launchAdmin = SettingsRepository.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.LaunchAdministrator; + string eventName = !_isElevated && launchAdmin + ? Constants.ShowHostsAdminSharedEvent() + : Constants.ShowHostsSharedEvent(); + + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName)) + { + eventHandle.Set(); + } + } + + break; + case ModuleType.PowerLauncher: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.PowerLauncherSharedEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.PowerOCR: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowPowerOCRSharedEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.RegistryPreview: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.RegistryPreviewTriggerEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.MeasureTool: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.MeasureToolTriggerEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.ShortcutGuide: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShortcutGuideTriggerEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.CmdPal: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowCmdPalEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.Workspaces: + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.WorkspacesLaunchEditorEvent())) + { + eventHandle.Set(); + } + + break; + default: + break; + } + } + } +} diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/ShortcutConflictWindow.xaml.cs b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/ShortcutConflictWindow.xaml.cs index 19a6cb06ad..672b3b51a4 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/ShortcutConflictWindow.xaml.cs +++ b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/ShortcutConflictWindow.xaml.cs @@ -71,7 +71,7 @@ namespace Microsoft.PowerToys.Settings.UI.SettingsXAML.Controls.Dashboard settingsCard.DataContext is ModuleHotkeyData moduleData) { var moduleType = moduleData.ModuleType; - NavigationService.Navigate(ModuleHelper.GetModulePageType(moduleType)); + NavigationService.Navigate(ModuleGpoHelper.GetModulePageType(moduleType)); this.Close(); } } diff --git a/src/settings-ui/Settings.UI/SettingsXAML/MainWindow.xaml.cs b/src/settings-ui/Settings.UI/SettingsXAML/MainWindow.xaml.cs index e5148d3a06..e67b0efc0a 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/MainWindow.xaml.cs +++ b/src/settings-ui/Settings.UI/SettingsXAML/MainWindow.xaml.cs @@ -8,6 +8,7 @@ using ManagedCommon; using Microsoft.PowerLauncher.Telemetry; using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Library; +using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Views; using Microsoft.PowerToys.Telemetry; using Microsoft.UI; diff --git a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs index e6a0f23da7..ad46a292c4 100644 --- a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation +// 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. @@ -41,7 +41,9 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels public ObservableCollection ActionModules { get; set; } = new ObservableCollection(); - public ObservableCollection QuickAccessItems { get; set; } = new ObservableCollection(); + public ObservableCollection QuickAccessItems => _quickAccessViewModel.Items; + + private readonly QuickAccessViewModel _quickAccessViewModel; // Master list of module items that is sorted and projected into AllModules. private List _moduleItems = new List(); @@ -111,6 +113,12 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels // set the callback functions value to handle outgoing IPC message. SendConfigMSG = ipcMSGCallBackFunc; + _quickAccessViewModel = new QuickAccessViewModel( + _settingsRepository, + new DashboardLauncher(App.IsElevated), + moduleType => Helpers.ModuleGpoHelper.GetModuleGpoConfiguration(moduleType) == global::PowerToys.GPOWrapper.GpoRuleConfigured.Disabled, + resourceLoader); + BuildModuleList(); SortModuleList(); RefreshShortcutModules(); @@ -170,7 +178,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels continue; } - GpoRuleConfigured gpo = ModuleHelper.GetModuleGpoConfiguration(moduleType); + GpoRuleConfigured gpo = ModuleGpoHelper.GetModuleGpoConfiguration(moduleType); var newItem = new DashboardListItem() { Tag = moduleType, @@ -236,7 +244,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { foreach (var item in _moduleItems) { - GpoRuleConfigured gpo = ModuleHelper.GetModuleGpoConfiguration(item.Tag); + GpoRuleConfigured gpo = ModuleGpoHelper.GetModuleGpoConfiguration(item.Tag); // GPO can force-enable (Enabled) or force-disable (Disabled) a module. // If Enabled: module is on and the user cannot disable it. @@ -346,7 +354,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { ShortcutModules.Clear(); ActionModules.Clear(); - QuickAccessItems.Clear(); foreach (var x in AllModules.Where(x => x.IsEnabled)) { @@ -391,18 +398,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels ActionModules.Add(newItem); newItem.EnabledChangedCallback = x.EnabledChangedCallback; - - foreach (DashboardModuleButtonItem item in filteredItems) - { - QuickAccessItems.Add(new QuickAccessItem - { - Title = item.ButtonTitle, - Description = item.ButtonDescription, - Icon = item.ButtonGlyph, - Command = new RelayCommand(() => item.ButtonClickHandler?.Invoke(null, null)), - Tag = x.Tag, - }); - } } } } @@ -744,7 +739,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { if (sender is ModuleType moduleType) { - NavigationService.Navigate(ModuleHelper.GetModulePageType(moduleType)); + NavigationService.Navigate(ModuleGpoHelper.GetModulePageType(moduleType)); } } diff --git a/src/settings-ui/Settings.UI/ViewModels/ShortcutConflictViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/ShortcutConflictViewModel.cs index bf647cf6b8..ebcdfa0d76 100644 --- a/src/settings-ui/Settings.UI/ViewModels/ShortcutConflictViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/ShortcutConflictViewModel.cs @@ -16,6 +16,7 @@ using System.Windows.Threading; using ManagedCommon; using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Library; +using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.HotkeyConflicts; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.SerializationContext;