From 2a5062d7524fbd0eb9c45e20887bfc8b32b3689a Mon Sep 17 00:00:00 2001 From: Kai Tao Date: Thu, 27 Nov 2025 14:27:21 +0800 Subject: [PATCH] wire things up --- .../Assets/FileLocksmith.png | Bin 1619 -> 12019 bytes .../Commands/CopyColorCommand.cs | 70 ++++++++++++++++++ .../{Helper => Helpers}/ModuleItemsHelper.cs | 14 ++-- .../PowerToysResourcesHelper.cs | 4 +- .../Helpers/WorkspaceItemsHelper.cs | 2 + .../Microsoft.CmdPal.Ext.PowerToys.csproj | 4 + .../Pages/PowerToysListPage.cs | 2 +- .../Pages/WorkspacesListPage.cs | 29 +++----- .../app.manifest | 6 -- 9 files changed, 96 insertions(+), 35 deletions(-) create mode 100644 src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Commands/CopyColorCommand.cs rename src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/{Helper => Helpers}/ModuleItemsHelper.cs (89%) rename src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/{Helper => Helpers}/PowerToysResourcesHelper.cs (97%) diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Assets/FileLocksmith.png b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Assets/FileLocksmith.png index ff20dfb146bccefc6b14928ee843b88d4ddfb214..7c2fcbdd3dcec1e2cc88277b204b33b209fc1c7d 100644 GIT binary patch literal 12019 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 R92fuq002ovPDHLkV1i-lB`W{` delta 1609 zcmV-P2DbV0UDFIUiBL{Q4GJ0x0000DNk~Le0000a0000a2nGNE0O0_bm;e9(32;bR za{vGf6951U69E94oEVWdAAbetNklK8-pYNcX!Nycw zPzlr=y?yybz+}pMgMU;J#N-YmJLg<+Jb~gcx#SH-GlPghTQS}K4VTR>U+Q$~$f;$a z-j@@nI6l4#u2I7jba~HP_s$Pmzw$}v7_XV-RUIgJg9H_?-+ylP{4iOyEX2WZ7FAzX zo%Gi9lfcN>_kQ;VKyg~u$_{ZI&u8mcX(*tzFAhvP;A~>!2!ArxdOm-1aeCOkkuxjb za8P|D_*D(QNNMxbuzf=TWvxUxM$9f2LPyu2=GfY7O!Ky`ssYr^n#Js}JwpL)ZsC~f z2!;t@4r-3E^WAQ-)i};<@UElgb9FMUF>FD>KbiOnb~hN*JWn%q*AKN&3Thb7F|cb~ zwMR`JB2sSQzkdbW|Nk5VdFbO$KaDo1;MGPk+5YD8XSw=~sK0%4t&Sycc!^ zWJV2w&@-(ZO!2-uB|7K9x9YGsZH1m+ulR@dx7!0Ul476ezYz`GP;nD;>YG5yX-=#90u% zu`?i_EPoa{1KkzDNM=!|Glt{i<7&mF`ww7g`GNVy`$)~D+2x}3F`ktS2P9i9EWF~S z-w~tPf%1G09zSsc+U*=dk96qJVR*E<3fHfH54~Q`V5^;CkVEARaQ!^{Bw~z4@kfIB z-5-!OGI;5gSE1EvgAk<)AAa6yx8cOguR){HAb(eS7h+ac;$ct>^#KY5M`eOQ#clj% zQP7J=kBY$Hwh+|ZJQjLSo*jAq1{dOf*9Rle@qZ10uNZ zRwC8VtKr$!z-U;rY7aQAdmFtnkevrZ`sP|hFb})Su)L%cputU4VGYh=b#X1Gc3{k` z_OawZ0|(g3ns{UGM+H(?AiL^p7Ft;NgMY-m!RrBuwX;gtgSfgs%Y=vg!I5{^B^YW) zv(=)z^LOay8$Xc-wFs(a8h?KK^%uB(^Co0j(}M`~Vf<$54dk4DViX~sqpfrUd2qfg z$)l0c5xjlt7Il}G;Naw8n3#AL*47@uy~RaX`13B^U;G!bS)XSqTYpx+ z9RR7vEHOjYfaSd}m_S*U(a7j1{MWqB1WYxGtIr&Y=CI`V4VAHRr6UY_S9@z90~r)Eq<|IWy!50NpsVta zCJJqE2?D)aqUHeAH5D*^i^Bj^XIEu*?Q7 +/// Copies the most recently picked color from the PowerToys Color Picker history if available. +/// +internal sealed partial class CopyColorCommand : InvokableCommand +{ + public CopyColorCommand() + { + Name = "Copy last picked color"; + } + + public override CommandResult Invoke() + { + try + { + var color = TryGetLastColor(); + if (string.IsNullOrEmpty(color)) + { + return CommandResult.ShowToast("No color found in Color Picker history."); + } + + System.Windows.Forms.Clipboard.SetText(color); + return CommandResult.ShowToast($"Copied {color}"); + } + catch (Exception ex) + { + return CommandResult.ShowToast($"Failed to copy color: {ex.Message}"); + } + } + + private static string? TryGetLastColor() + { + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + var historyPath = Path.Combine(localAppData, "Microsoft", "PowerToys", "ColorPicker", "colorHistory.json"); + if (!File.Exists(historyPath)) + { + return null; + } + + var lines = File.ReadAllLines(historyPath); + + // crude parse: look for last occurrence of "#RRGGBB" in the file + for (var i = lines.Length - 1; i >= 0; i--) + { + var line = lines[i]; + var idx = line.IndexOf('#'); + if (idx >= 0 && line.Length >= idx + 7) + { + var candidate = line.Substring(idx, 7); + if (candidate.Length == 7 && candidate[0] == '#') + { + return candidate.ToUpper(CultureInfo.InvariantCulture); + } + } + } + + return null; + } +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helper/ModuleItemsHelper.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/ModuleItemsHelper.cs similarity index 89% rename from src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helper/ModuleItemsHelper.cs rename to src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/ModuleItemsHelper.cs index 9477768ba5..e063aae4c1 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helper/ModuleItemsHelper.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/ModuleItemsHelper.cs @@ -10,9 +10,9 @@ using Common.UI; using Microsoft.CommandPalette.Extensions; using Microsoft.CommandPalette.Extensions.Toolkit; using PowerToysExtension.Commands; -using PowerToysExtension.Helper; +using PowerToysExtension.Pages; -namespace PowerToysExtension.Helper; +namespace PowerToysExtension.Helpers; /// /// Builds the list of PowerToys module entries and supports basic fuzzy filtering. @@ -77,8 +77,8 @@ internal static class ModuleItemsHelper var settingsCommand = new OpenInSettingsCommand(module, $"Open {title} settings"); - // Module-specific extras - var more = new List(); + var more = new List(); + switch (module) { case SettingsDeepLink.SettingsWindow.Awake: @@ -89,12 +89,12 @@ internal static class ModuleItemsHelper break; case SettingsDeepLink.SettingsWindow.Workspaces: + more.Add(new CommandContextItem(new WorkspacesListPage())); more.Add(new CommandContextItem(new OpenWorkspaceEditorCommand())); - more.Add(new CommandContextItem(new OpenPowerToysSettingsCommand("Workspaces", "Workspaces"))); break; - case SettingsDeepLink.SettingsWindow.Overview: - // Overview just opens main settings + case SettingsDeepLink.SettingsWindow.ColorPicker: + more.Add(new CommandContextItem(new CopyColorCommand())); break; default: diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helper/PowerToysResourcesHelper.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/PowerToysResourcesHelper.cs similarity index 97% rename from src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helper/PowerToysResourcesHelper.cs rename to src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/PowerToysResourcesHelper.cs index d781efb25a..bdf1ed2c39 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helper/PowerToysResourcesHelper.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/PowerToysResourcesHelper.cs @@ -5,7 +5,7 @@ using Microsoft.CommandPalette.Extensions.Toolkit; using static Common.UI.SettingsDeepLink; -namespace PowerToysExtension.Helper; +namespace PowerToysExtension.Helpers; internal static class PowerToysResourcesHelper { @@ -18,7 +18,7 @@ internal static class PowerToysResourcesHelper SettingsWindow.ColorPicker => "Assets\\ColorPicker.png", SettingsWindow.FancyZones => "Assets\\FancyZones.png", SettingsWindow.Hosts => "Assets\\Hosts.png", - SettingsWindow.PowerOCR => "Assets\\PowerOcr.png", + SettingsWindow.PowerOCR => "Assets\\TextExtractor.png", SettingsWindow.RegistryPreview => "Assets\\RegistryPreview.png", SettingsWindow.MeasureTool => "Assets\\ScreenRuler.png", SettingsWindow.ShortcutGuide => "Assets\\ShortcutGuide.png", diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/WorkspaceItemsHelper.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/WorkspaceItemsHelper.cs index 8c282e5b90..865b0ebf65 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/WorkspaceItemsHelper.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Helpers/WorkspaceItemsHelper.cs @@ -78,6 +78,8 @@ internal static class WorkspaceItemsHelper return items.ToArray(); } + internal static IListItem[] FilteredItems(string searchText) => GetWorkspaceItems(searchText); + private static List LoadWorkspaces() { try diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Microsoft.CmdPal.Ext.PowerToys.csproj b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Microsoft.CmdPal.Ext.PowerToys.csproj index 77da19bc3f..6a27e8c08a 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Microsoft.CmdPal.Ext.PowerToys.csproj +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Microsoft.CmdPal.Ext.PowerToys.csproj @@ -8,6 +8,7 @@ app.manifest win-$(Platform).pubxml false + true true true $(SolutionDir)$(Platform)\$(Configuration)\WinUI3Apps\CmdPalExtensions\$(MSBuildProjectName)\ @@ -25,6 +26,7 @@ + @@ -56,6 +58,8 @@ + + true true diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/PowerToysListPage.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/PowerToysListPage.cs index d43a2d373c..d7163862e9 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/PowerToysListPage.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/PowerToysListPage.cs @@ -4,7 +4,7 @@ using Microsoft.CommandPalette.Extensions; using Microsoft.CommandPalette.Extensions.Toolkit; -using PowerToysExtension.Helper; +using PowerToysExtension.Helpers; namespace PowerToysExtension.Pages; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/WorkspacesListPage.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/WorkspacesListPage.cs index 79d3c19337..d5de42f19f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/WorkspacesListPage.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Pages/WorkspacesListPage.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. @@ -10,36 +10,27 @@ namespace PowerToysExtension.Pages; internal sealed partial class WorkspacesListPage : DynamicListPage { - private readonly CommandItem _emptyContent; + private readonly CommandItem _emptyMessage; public WorkspacesListPage() { Icon = IconHelpers.FromRelativePath("Assets\\Workspaces.png"); - Title = "Workspaces"; - Name = "Workspaces"; - Id = "com.microsoft.powertoys.workspaces"; - - _emptyContent = new CommandItem() + Name = Title = "Workspaces"; + Id = "com.microsoft.cmdpal.powertoys.workspaces"; + _emptyMessage = new CommandItem() { - Title = "No workspaces found", - Subtitle = "Create a workspace in PowerToys to get started.", Icon = IconHelpers.FromRelativePath("Assets\\Workspaces.png"), + Title = "No workspaces found", + Subtitle = SearchText, }; - - EmptyContent = _emptyContent; + EmptyContent = _emptyMessage; } public override void UpdateSearchText(string oldSearch, string newSearch) { - _emptyContent.Subtitle = string.IsNullOrWhiteSpace(newSearch) - ? "Create a workspace in PowerToys to get started." - : $"No workspaces matching '{newSearch}'"; - + _emptyMessage.Subtitle = newSearch; RaiseItemsChanged(0); } - public override IListItem[] GetItems() - { - return WorkspaceItemsHelper.GetWorkspaceItems(SearchText); - } + public override IListItem[] GetItems() => WorkspaceItemsHelper.FilteredItems(SearchText); } diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/app.manifest b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/app.manifest index 5e5e6201a2..0d1318e5eb 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/app.manifest +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/app.manifest @@ -8,10 +8,4 @@ - - - true/PM - PerMonitorV2 - -