// 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 global::PowerToys.GPOWrapper; 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.Views; namespace Microsoft.PowerToys.Settings.UI.ViewModels { public class LauncherViewModel : Observable { public bool IsUpdateAvailable { get; set; } public ObservableCollection FlyoutMenuItems { get; set; } private GeneralSettings generalSettingsConfig; private UpdatingSettings updatingSettingsConfig; private ISettingsRepository _settingsRepository; private Func SendIPCMessage { get; } public LauncherViewModel(ISettingsRepository settingsRepository, Func ipcMSGCallBackFunc) { _settingsRepository = settingsRepository; generalSettingsConfig = settingsRepository.SettingsConfig; generalSettingsConfig.AddEnabledModuleChangeNotification(ModuleEnabledChanged); // set the callback functions value to hangle outgoing IPC message. SendIPCMessage = ipcMSGCallBackFunc; var resourceLoader = Helpers.ResourceLoaderInstance.ResourceLoader; FlyoutMenuItems = new ObservableCollection(); if (GPOWrapper.GetConfiguredColorPickerEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("ColorPicker/ModuleTitle"), Tag = "ColorPicker", Visible = generalSettingsConfig.Enabled.ColorPicker, ToolTip = SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.ActivationShortcut.ToString(), Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsColorPicker.png", }); } if (GPOWrapper.GetConfiguredFancyZonesEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("FZEditorString"), Tag = "FancyZones", Visible = generalSettingsConfig.Enabled.FancyZones, ToolTip = SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.FancyzonesEditorHotkey.Value.ToString(), Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsFancyZones.png", }); } if (GPOWrapper.GetConfiguredHostsFileEditorEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("Hosts/ModuleTitle"), Tag = "Hosts", Visible = generalSettingsConfig.Enabled.Hosts, Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsHosts.png", }); } if (GPOWrapper.GetConfiguredPowerLauncherEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("PowerLauncher/ModuleTitle"), Tag = "PowerLauncher", Visible = generalSettingsConfig.Enabled.PowerLauncher, ToolTip = SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.OpenPowerLauncher.ToString(), Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsPowerToysRun.png", }); } if (GPOWrapper.GetConfiguredTextExtractorEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("TextExtractor/ModuleTitle"), Tag = "PowerOCR", Visible = generalSettingsConfig.Enabled.PowerOCR, ToolTip = SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.ActivationShortcut.ToString(), Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsPowerOcr.png", }); } if (GPOWrapper.GetConfiguredRegistryPreviewEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("RegistryPreview/ModuleTitle"), Tag = "RegistryPreview", Visible = generalSettingsConfig.Enabled.RegistryPreview, Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsRegistryPreview.png", }); } if (GPOWrapper.GetConfiguredScreenRulerEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("MeasureTool/ModuleTitle"), Tag = "MeasureTool", Visible = generalSettingsConfig.Enabled.MeasureTool, ToolTip = SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.ActivationShortcut.ToString(), Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsScreenRuler.png", }); } if (GPOWrapper.GetConfiguredShortcutGuideEnabledValue() != GpoRuleConfigured.Disabled) { FlyoutMenuItems.Add(new FlyoutMenuItem() { Label = resourceLoader.GetString("ShortcutGuide/ModuleTitle"), Tag = "ShortcutGuide", Visible = generalSettingsConfig.Enabled.ShortcutGuide, ToolTip = SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.OpenShortcutGuide.ToString(), Icon = "ms-appx:///Assets/Settings/FluentIcons/FluentIconsShortcutGuide.png", }); } if (updatingSettingsConfig == null) { updatingSettingsConfig = new UpdatingSettings(); } updatingSettingsConfig = UpdatingSettings.LoadSettings(); if (updatingSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToInstall || updatingSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToDownload) { IsUpdateAvailable = true; } else { IsUpdateAvailable = false; } } private void ModuleEnabledChanged() { generalSettingsConfig = _settingsRepository.SettingsConfig; generalSettingsConfig.AddEnabledModuleChangeNotification(ModuleEnabledChanged); foreach (FlyoutMenuItem item in FlyoutMenuItems) { switch (item.Tag) { case "ColorPicker": item.Visible = generalSettingsConfig.Enabled.ColorPicker; break; case "FancyZones": item.Visible = generalSettingsConfig.Enabled.FancyZones; break; case "Hosts": item.Visible = generalSettingsConfig.Enabled.Hosts; break; case "PowerLauncher": item.Visible = generalSettingsConfig.Enabled.PowerLauncher; break; case "PowerOCR": item.Visible = generalSettingsConfig.Enabled.PowerOCR; break; case "RegistryPreview": item.Visible = generalSettingsConfig.Enabled.RegistryPreview; break; case "MeasureTool": item.Visible = generalSettingsConfig.Enabled.MeasureTool; break; case "ShortcutGuide": item.Visible = generalSettingsConfig.Enabled.ShortcutGuide; break; } } } internal void StartBugReport() { SendIPCMessage("{\"bugreport\": 0 }"); } internal void KillRunner() { SendIPCMessage("{\"killrunner\": 0 }"); } } }