mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-02-23 19:49:43 +01:00
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request - Refactored the runner logic for handling individual module enable/disable updates. Instead of receiving the entire settings.json via IPC, it now processes only single-module state updates, which avoids race conditions and fixes a bug where modules could end up being skipped. - Fixed an issue where the sort order option could be deselected — it is now enforced as a mutually exclusive choice. - Fixed a potential race condition when updating the AppList control’s sorting. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #44697 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [x] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
164 lines
11 KiB
C#
164 lines
11 KiB
C#
// 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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the module key name used in IPC messages and settings JSON.
|
|
/// These names match the JsonPropertyName attributes in EnabledModules class.
|
|
/// </summary>
|
|
public static string GetModuleKey(ModuleType moduleType)
|
|
{
|
|
return moduleType switch
|
|
{
|
|
ModuleType.AdvancedPaste => AdvancedPasteSettings.ModuleName,
|
|
ModuleType.AlwaysOnTop => AlwaysOnTopSettings.ModuleName,
|
|
ModuleType.Awake => AwakeSettings.ModuleName,
|
|
ModuleType.CmdPal => "CmdPal", // No dedicated settings class
|
|
ModuleType.ColorPicker => ColorPickerSettings.ModuleName,
|
|
ModuleType.CropAndLock => CropAndLockSettings.ModuleName,
|
|
ModuleType.CursorWrap => CursorWrapSettings.ModuleName,
|
|
ModuleType.EnvironmentVariables => EnvironmentVariablesSettings.ModuleName,
|
|
ModuleType.FancyZones => FancyZonesSettings.ModuleName,
|
|
ModuleType.FileLocksmith => FileLocksmithSettings.ModuleName,
|
|
ModuleType.FindMyMouse => FindMyMouseSettings.ModuleName,
|
|
ModuleType.Hosts => HostsSettings.ModuleName,
|
|
ModuleType.ImageResizer => ImageResizerSettings.ModuleName,
|
|
ModuleType.KeyboardManager => KeyboardManagerSettings.ModuleName,
|
|
ModuleType.LightSwitch => LightSwitchSettings.ModuleName,
|
|
ModuleType.MouseHighlighter => MouseHighlighterSettings.ModuleName,
|
|
ModuleType.MouseJump => MouseJumpSettings.ModuleName,
|
|
ModuleType.MousePointerCrosshairs => MousePointerCrosshairsSettings.ModuleName,
|
|
ModuleType.MouseWithoutBorders => MouseWithoutBordersSettings.ModuleName,
|
|
ModuleType.NewPlus => NewPlusSettings.ModuleName,
|
|
ModuleType.Peek => PeekSettings.ModuleName,
|
|
ModuleType.PowerRename => PowerRenameSettings.ModuleName,
|
|
ModuleType.PowerLauncher => PowerLauncherSettings.ModuleName,
|
|
ModuleType.PowerAccent => PowerAccentSettings.ModuleName,
|
|
ModuleType.RegistryPreview => RegistryPreviewSettings.ModuleName,
|
|
ModuleType.MeasureTool => MeasureToolSettings.ModuleName,
|
|
ModuleType.ShortcutGuide => ShortcutGuideSettings.ModuleName,
|
|
ModuleType.PowerOCR => PowerOcrSettings.ModuleName,
|
|
ModuleType.Workspaces => WorkspacesSettings.ModuleName,
|
|
ModuleType.ZoomIt => ZoomItSettings.ModuleName,
|
|
_ => moduleType.ToString(),
|
|
};
|
|
}
|
|
}
|
|
}
|