QuickAccessViewModel.cs
1 // Copyright (c) Microsoft Corporation 2 // The Microsoft Corporation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System; 6 using System.Collections.ObjectModel; 7 using ManagedCommon; 8 using Microsoft.PowerToys.Settings.UI.Library; 9 using Microsoft.PowerToys.Settings.UI.Library.Helpers; 10 using Microsoft.PowerToys.Settings.UI.Library.Interfaces; 11 using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; 12 using Microsoft.UI.Dispatching; 13 using Microsoft.Windows.ApplicationModel.Resources; 14 15 namespace Microsoft.PowerToys.Settings.UI.Controls 16 { 17 public partial class QuickAccessViewModel : Observable 18 { 19 private readonly ISettingsRepository<GeneralSettings> _settingsRepository; 20 private readonly IQuickAccessLauncher _launcher; 21 private readonly Func<ModuleType, bool> _isModuleGpoDisabled; 22 private readonly ResourceLoader _resourceLoader; 23 private readonly DispatcherQueue _dispatcherQueue; 24 private GeneralSettings _generalSettings; 25 26 public ObservableCollection<QuickAccessItem> Items { get; } = new(); 27 28 public QuickAccessViewModel( 29 ISettingsRepository<GeneralSettings> settingsRepository, 30 IQuickAccessLauncher launcher, 31 Func<ModuleType, bool> isModuleGpoDisabled, 32 ResourceLoader resourceLoader) 33 { 34 _settingsRepository = settingsRepository; 35 _launcher = launcher; 36 _isModuleGpoDisabled = isModuleGpoDisabled; 37 _resourceLoader = resourceLoader; 38 _dispatcherQueue = DispatcherQueue.GetForCurrentThread(); 39 40 _generalSettings = _settingsRepository.SettingsConfig; 41 _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); 42 _settingsRepository.SettingsChanged += OnSettingsChanged; 43 44 InitializeItems(); 45 } 46 47 private void OnSettingsChanged(GeneralSettings newSettings) 48 { 49 if (_dispatcherQueue != null) 50 { 51 _dispatcherQueue.TryEnqueue(() => 52 { 53 _generalSettings = newSettings; 54 _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); 55 RefreshItemsVisibility(); 56 }); 57 } 58 } 59 60 private void InitializeItems() 61 { 62 AddFlyoutMenuItem(ModuleType.ColorPicker); 63 AddFlyoutMenuItem(ModuleType.CmdPal); 64 AddFlyoutMenuItem(ModuleType.EnvironmentVariables); 65 AddFlyoutMenuItem(ModuleType.FancyZones); 66 AddFlyoutMenuItem(ModuleType.Hosts); 67 AddFlyoutMenuItem(ModuleType.LightSwitch); 68 AddFlyoutMenuItem(ModuleType.PowerDisplay); 69 AddFlyoutMenuItem(ModuleType.PowerLauncher); 70 AddFlyoutMenuItem(ModuleType.PowerOCR); 71 AddFlyoutMenuItem(ModuleType.RegistryPreview); 72 AddFlyoutMenuItem(ModuleType.MeasureTool); 73 AddFlyoutMenuItem(ModuleType.ShortcutGuide); 74 AddFlyoutMenuItem(ModuleType.Workspaces); 75 } 76 77 private void AddFlyoutMenuItem(ModuleType moduleType) 78 { 79 if (_isModuleGpoDisabled(moduleType)) 80 { 81 return; 82 } 83 84 Items.Add(new QuickAccessItem 85 { 86 Title = _resourceLoader.GetString(Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleLabelResourceName(moduleType)), 87 Tag = moduleType, 88 Visible = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType), 89 Description = GetModuleToolTip(moduleType), 90 Icon = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetModuleTypeFluentIconName(moduleType), 91 Command = new RelayCommand(() => _launcher.Launch(moduleType)), 92 }); 93 } 94 95 private void ModuleEnabledChanged() 96 { 97 if (_dispatcherQueue != null) 98 { 99 _dispatcherQueue.TryEnqueue(() => 100 { 101 _generalSettings = _settingsRepository.SettingsConfig; 102 _generalSettings.AddEnabledModuleChangeNotification(ModuleEnabledChanged); 103 RefreshItemsVisibility(); 104 }); 105 } 106 } 107 108 private void RefreshItemsVisibility() 109 { 110 foreach (var item in Items) 111 { 112 if (item.Tag is ModuleType moduleType) 113 { 114 item.Visible = Microsoft.PowerToys.Settings.UI.Library.Helpers.ModuleHelper.GetIsModuleEnabled(_generalSettings, moduleType); 115 } 116 } 117 } 118 119 private string GetModuleToolTip(ModuleType moduleType) 120 { 121 return moduleType switch 122 { 123 ModuleType.ColorPicker => SettingsRepository<ColorPickerSettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), 124 ModuleType.FancyZones => SettingsRepository<FancyZonesSettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.FancyzonesEditorHotkey.Value.ToString(), 125 ModuleType.PowerDisplay => SettingsRepository<PowerDisplaySettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), 126 ModuleType.LightSwitch => SettingsRepository<LightSwitchSettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ToggleThemeHotkey.Value.ToString(), 127 ModuleType.PowerLauncher => SettingsRepository<PowerLauncherSettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.OpenPowerLauncher.ToString(), 128 ModuleType.PowerOCR => SettingsRepository<PowerOcrSettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), 129 ModuleType.Workspaces => SettingsRepository<WorkspacesSettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.Hotkey.Value.ToString(), 130 ModuleType.MeasureTool => SettingsRepository<MeasureToolSettings>.GetInstance(SettingsUtils.Default).SettingsConfig.Properties.ActivationShortcut.ToString(), 131 ModuleType.ShortcutGuide => GetShortcutGuideToolTip(), 132 _ => string.Empty, 133 }; 134 } 135 136 private string GetShortcutGuideToolTip() 137 { 138 var shortcutGuideSettings = SettingsRepository<ShortcutGuideSettings>.GetInstance(SettingsUtils.Default).SettingsConfig; 139 return shortcutGuideSettings.Properties.UseLegacyPressWinKeyBehavior.Value 140 ? "Win" 141 : shortcutGuideSettings.Properties.OpenShortcutGuide.ToString(); 142 } 143 } 144 }