/ src / settings-ui / Settings.UI.Controls / QuickAccess / QuickAccessViewModel.cs
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  }