Skip to content

Commit 33cc612

Browse files
authored
[CmdPal] Fixes for Exts: All Apps, System Commands, Time And Date (#38103)
<!-- 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 All apps: - Fix missing second command for opnening settings page Time and Date plugin: - fix for missing settings list in global plugin manager - fix for wrong page title system plugin - fix for missing settings page in global plugin manager - fix for missing open button on plugin list - ~fix for wrong icon for firmware boot~ - fix for wrong subtitle for ipv6 - fix for wrong details for mac address - fix for wrong layout of network details - layout improvements for network details - change default value for "hide disconected networks" to $false - rename empty recycle bin setting to "Hide Empty Recycle Bin command" ![image](https://github.com/user-attachments/assets/fba608ca-3229-408e-9efb-596ead03ac19) ![image](https://github.com/user-attachments/assets/8b3a4ab1-499a-4e3c-8c2e-be19162d971b) ![image](https://github.com/user-attachments/assets/fd5d2a3c-6a9a-4990-a006-70646405d165) <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] **Closes:** #xxx - [ ] **Communication:** I've discussed this with core contributors already. If work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **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
1 parent a9a41ca commit 33cc612

File tree

12 files changed

+87
-59
lines changed

12 files changed

+87
-59
lines changed

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.Apps/AllAppsCommandProvider.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ public AllAppsCommandProvider()
2222
Icon = IconHelpers.FromRelativePath("Assets\\AllApps.svg");
2323
Settings = AllAppsSettings.Instance.Settings;
2424

25-
_listItem = new(Page) { Subtitle = Resources.search_installed_apps };
25+
_listItem = new(Page)
26+
{
27+
Subtitle = Resources.search_installed_apps,
28+
MoreCommands = [new CommandContextItem(AllAppsSettings.Instance.Settings.SettingsPage)],
29+
};
2630
}
2731

2832
public override ICommandItem[] TopLevelCommands() => [_listItem];

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/Helpers/Commands.cs

+8-7
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ internal static class Commands
3333
/// Returns a list with all system command results
3434
/// </summary>
3535
/// <param name="isUefi">Value indicating if the system is booted in uefi mode</param>
36-
/// <param name="splitRecycleBinResults">Value indicating if we should show two results for Recycle Bin.</param>
36+
/// <param name="hideEmptyRecycleBin">Value indicating if we should hide the Empty Recycle Bin command.</param>
3737
/// <param name="confirmCommands">A value indicating if the user should confirm the system commands</param>
3838
/// <param name="emptyRBSuccessMessage">Show a success message after empty Recycle Bin.</param>
3939
/// <returns>A list of all results</returns>
40-
public static List<IListItem> GetSystemCommands(bool isUefi, bool splitRecycleBinResults, bool confirmCommands, bool emptyRBSuccessMessage)
40+
public static List<IListItem> GetSystemCommands(bool isUefi, bool hideEmptyRecycleBin, bool confirmCommands, bool emptyRBSuccessMessage)
4141
{
4242
var results = new List<IListItem>();
4343
results.AddRange(new[]
@@ -81,7 +81,7 @@ public static List<IListItem> GetSystemCommands(bool isUefi, bool splitRecycleBi
8181
});
8282

8383
// Show Recycle Bin results based on setting.
84-
if (splitRecycleBinResults)
84+
if (!hideEmptyRecycleBin)
8585
{
8686
results.AddRange(new[]
8787
{
@@ -142,6 +142,7 @@ public static List<IListItem> GetNetworkConnectionResults(SettingsManager manage
142142
}
143143

144144
CompositeFormat sysIpv4DescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_ip4_description);
145+
CompositeFormat sysIpv6DescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_ip6_description);
145146
CompositeFormat sysMacDescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_mac_description);
146147
var hideDisconnectedNetworkInfo = manager.HideDisconnectedNetworkInfo;
147148

@@ -171,7 +172,7 @@ public static List<IListItem> GetNetworkConnectionResults(SettingsManager manage
171172
results.Add(new ListItem(new CopyTextCommand(intInfo.GetConnectionDetails()))
172173
{
173174
Title = intInfo.IPv6Primary,
174-
Subtitle = string.Format(CultureInfo.InvariantCulture, sysIpv4DescriptionCompositeFormate, intInfo.ConnectionName),
175+
Subtitle = string.Format(CultureInfo.InvariantCulture, sysIpv6DescriptionCompositeFormate, intInfo.ConnectionName),
175176
Icon = Icons.NetworkAdapterIcon,
176177
Details = new Details() { Title = Resources.Microsoft_plugin_ext_connection_details, Body = intInfo.GetConnectionDetails() },
177178
});
@@ -184,7 +185,7 @@ public static List<IListItem> GetNetworkConnectionResults(SettingsManager manage
184185
Title = intInfo.PhysicalAddress,
185186
Subtitle = string.Format(CultureInfo.InvariantCulture, sysMacDescriptionCompositeFormate, intInfo.Adapter, intInfo.ConnectionName),
186187
Icon = Icons.NetworkAdapterIcon,
187-
Details = new Details() { Title = Resources.Microsoft_plugin_ext_connection_details, Body = intInfo.GetConnectionDetails() },
188+
Details = new Details() { Title = Resources.Microsoft_plugin_ext_adapter_details, Body = intInfo.GetAdapterDetails() },
188189
});
189190
}
190191
}
@@ -203,12 +204,12 @@ public static List<IListItem> GetAllCommands(SettingsManager manager)
203204

204205
var isBootedInUefiMode = Win32Helpers.GetSystemFirmwareType() == FirmwareType.Uefi;
205206

206-
var separateEmptyRB = manager.ShowSeparateResultForEmptyRecycleBin;
207+
var hideEmptyRB = manager.HideEmptyRecycleBin;
207208
var confirmSystemCommands = manager.ShowDialogToConfirmCommand;
208209
var showSuccessOnEmptyRB = manager.ShowSuccessMessageAfterEmptyingRecycleBin;
209210

210211
// normal system commands are fast and can be returned immediately
211-
var systemCommands = Commands.GetSystemCommands(isBootedInUefiMode, separateEmptyRB, confirmSystemCommands, showSuccessOnEmptyRB);
212+
var systemCommands = Commands.GetSystemCommands(isBootedInUefiMode, hideEmptyRB, confirmSystemCommands, showSuccessOnEmptyRB);
212213
list.AddRange(systemCommands);
213214
list.AddRange(networkConnectionResults);
214215

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/Helpers/NetworkConnectionProperties.cs

+36-28
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ namespace Microsoft.CmdPal.Ext.System.Helpers;
1919
/// </summary>
2020
internal sealed class NetworkConnectionProperties
2121
{
22+
/// <summary>
23+
/// Decimal unicode value for green circle emoji.
24+
/// We need to generate it in the code because it does not render using Markdown emoji syntax or Unicode character syntax.
25+
/// </summary>
26+
/// <seealso cref="https://github.com/CommunityToolkit/Labs-Windows/blob/main/components/MarkdownTextBlock/samples/MarkdownTextBlock.md"/>
27+
/// <seealso cref="https://github.com/xoofx/markdig/blob/master/src/Markdig/Extensions/Emoji/EmojiMapping.cs"/>
28+
private const int GreenCircleCharacter = 128994;
29+
2230
/// <summary>
2331
/// Gets the name of the adapter
2432
/// </summary>
@@ -161,12 +169,12 @@ internal static List<NetworkConnectionProperties> GetList()
161169
/// <returns>String with the details</returns>
162170
internal string GetAdapterDetails()
163171
{
164-
return $"{Resources.Microsoft_plugin_sys_AdapterName}: {Adapter}" +
165-
$"\n{Resources.Microsoft_plugin_sys_PhysicalAddress}: {PhysicalAddress}" +
166-
$"\n{Resources.Microsoft_plugin_sys_Speed}: {GetFormattedSpeedValue(Speed)}" +
167-
$"\n{Resources.Microsoft_plugin_sys_Type}: {GetAdapterTypeAsString(Type)}" +
168-
$"\n{Resources.Microsoft_plugin_sys_State}: " + (State == OperationalStatus.Up ? Resources.Microsoft_plugin_sys_Connected : Resources.Microsoft_plugin_sys_Disconnected) +
169-
$"\n{Resources.Microsoft_plugin_sys_ConnectionName}: {ConnectionName}";
172+
return $"**{Resources.Microsoft_plugin_sys_AdapterName}:** {Adapter}" +
173+
$"\n\n**{Resources.Microsoft_plugin_sys_State}:** " + (State == OperationalStatus.Up ? char.ConvertFromUtf32(GreenCircleCharacter) + " " + Resources.Microsoft_plugin_sys_Connected : ":red_circle: " + Resources.Microsoft_plugin_sys_Disconnected) +
174+
$"\n\n**{Resources.Microsoft_plugin_sys_PhysicalAddress}:** {PhysicalAddress}" +
175+
$"\n\n**{Resources.Microsoft_plugin_sys_Speed}:** {GetFormattedSpeedValue(Speed)}" +
176+
$"\n\n**{Resources.Microsoft_plugin_sys_Type}:** {GetAdapterTypeAsString(Type)}" +
177+
$"\n\n**{Resources.Microsoft_plugin_sys_ConnectionName}:** {ConnectionName}";
170178
}
171179

172180
/// <summary>
@@ -175,24 +183,24 @@ internal string GetAdapterDetails()
175183
/// <returns>String with the details</returns>
176184
internal string GetConnectionDetails()
177185
{
178-
return $"{Resources.Microsoft_plugin_sys_ConnectionName}: {ConnectionName}" +
179-
$"\n{Resources.Microsoft_plugin_sys_State}: " + (State == OperationalStatus.Up ? Resources.Microsoft_plugin_sys_Connected : Resources.Microsoft_plugin_sys_Disconnected) +
180-
$"\n{Resources.Microsoft_plugin_sys_Type}: {GetAdapterTypeAsString(Type)}" +
181-
$"\n{Resources.Microsoft_plugin_sys_Suffix}: {Suffix}" +
182-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Ip4Address}: ", IPv4) +
183-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Ip4SubnetMask}: ", IPv4Mask) +
184-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Ip6Address}:\n\t", IPv6Global) +
185-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Ip6Temp}:\n\t", IPv6Temporary) +
186-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Ip6Link}:\n\t", IPv6LinkLocal) +
187-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Ip6Site}:\n\t", IPv6SiteLocal) +
188-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Ip6Unique}:\n\t", IPv6UniqueLocal) +
189-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Gateways}:\n\t", Gateways) +
190-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Dhcp}:\n\t", DhcpServers == null ? string.Empty : DhcpServers) +
191-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Dns}:\n\t", DnsServers == null ? string.Empty : DnsServers) +
192-
CreateIpInfoForDetailsText($"{Resources.Microsoft_plugin_sys_Wins}:\n\t", WinsServers == null ? string.Empty : WinsServers) +
193-
$"\n\n{Resources.Microsoft_plugin_sys_AdapterName}: {Adapter}" +
194-
$"\n{Resources.Microsoft_plugin_sys_PhysicalAddress}: {PhysicalAddress}" +
195-
$"\n{Resources.Microsoft_plugin_sys_Speed}: {GetFormattedSpeedValue(Speed)}";
186+
return $"**{Resources.Microsoft_plugin_sys_ConnectionName}:** {ConnectionName}" +
187+
$"\n\n**{Resources.Microsoft_plugin_sys_State}:** " + (State == OperationalStatus.Up ? char.ConvertFromUtf32(GreenCircleCharacter) + " " + Resources.Microsoft_plugin_sys_Connected : ":red_circle: " + Resources.Microsoft_plugin_sys_Disconnected) +
188+
$"\n\n**{Resources.Microsoft_plugin_sys_Type}:** {GetAdapterTypeAsString(Type)}" +
189+
$"\n\n**{Resources.Microsoft_plugin_sys_Suffix}:** {Suffix}" +
190+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Ip4Address}:** ", IPv4) +
191+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Ip4SubnetMask}:** ", IPv4Mask) +
192+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Ip6Address}:**\n\n* ", IPv6Global) +
193+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Ip6Temp}:**\n\n* ", IPv6Temporary) +
194+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Ip6Link}:**\n\n* ", IPv6LinkLocal) +
195+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Ip6Site}:**\n\n* ", IPv6SiteLocal) +
196+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Ip6Unique}:**\n\n* ", IPv6UniqueLocal) +
197+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Gateways}:**\n\n* ", Gateways) +
198+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Dhcp}:**\n\n* ", DhcpServers == null ? string.Empty : DhcpServers) +
199+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Dns}:**\n\n* ", DnsServers == null ? string.Empty : DnsServers) +
200+
CreateIpInfoForDetailsText($"**{Resources.Microsoft_plugin_sys_Wins}:**\n\n* ", WinsServers == null ? string.Empty : WinsServers) +
201+
$"\n\n**{Resources.Microsoft_plugin_sys_AdapterName}:** {Adapter}" +
202+
$"\n\n**{Resources.Microsoft_plugin_sys_PhysicalAddress}:** {PhysicalAddress}" +
203+
$"\n\n**{Resources.Microsoft_plugin_sys_Speed}:** {GetFormattedSpeedValue(Speed)}";
196204
}
197205

198206
/// <summary>
@@ -304,13 +312,13 @@ private static string CreateIpInfoForDetailsText(string title, dynamic property)
304312
switch (property)
305313
{
306314
case string:
307-
return $"\n{title}{property}";
315+
return string.IsNullOrWhiteSpace(property) ? string.Empty : $"\n\n{title}{property}";
308316
case List<string> listString:
309-
return listString.Count == 0 ? string.Empty : $"\n{title}{string.Join("\n\t", property)}";
317+
return listString.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", property)}";
310318
case List<IPAddress> listIP:
311-
return listIP.Count == 0 ? string.Empty : $"\n{title}{string.Join("\n\t", property)}";
319+
return listIP.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", property)}";
312320
case IPAddressCollection collectionIP:
313-
return collectionIP.Count == 0 ? string.Empty : $"\n{title}{string.Join("\n\t", property)}";
321+
return collectionIP.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", property)}";
314322
case null:
315323
return string.Empty;
316324
default:

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/Helpers/SettingsManager.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,23 @@ public class SettingsManager : JsonSettingsManager
2525
Resources.Microsoft_plugin_sys_RecycleBin_ShowEmptySuccessMessage,
2626
false); // TODO -- double check default value
2727

28-
private readonly ToggleSetting _showSeparateResultForEmptyRecycleBin = new(
29-
Namespaced(nameof(ShowSeparateResultForEmptyRecycleBin)),
30-
Resources.Microsoft_plugin_sys_RecycleBin_ShowEmptySeparate,
31-
Resources.Microsoft_plugin_sys_RecycleBin_ShowEmptySeparate,
32-
true); // TODO -- double check default value
28+
private readonly ToggleSetting _hideEmptyRecycleBin = new(
29+
Namespaced(nameof(HideEmptyRecycleBin)),
30+
Resources.Microsoft_plugin_sys_RecycleBin_HideEmpty,
31+
Resources.Microsoft_plugin_sys_RecycleBin_HideEmpty,
32+
false);
3333

3434
private readonly ToggleSetting _hideDisconnectedNetworkInfo = new(
3535
Namespaced(nameof(HideDisconnectedNetworkInfo)),
3636
Resources.Microsoft_plugin_ext_settings_hideDisconnectedNetworkInfo,
3737
Resources.Microsoft_plugin_ext_settings_hideDisconnectedNetworkInfo,
38-
true); // TODO -- double check default value
38+
false);
3939

4040
public bool ShowDialogToConfirmCommand => _showDialogToConfirmCommand.Value;
4141

4242
public bool ShowSuccessMessageAfterEmptyingRecycleBin => _showSuccessMessageAfterEmptyingRecycleBin.Value;
4343

44-
public bool ShowSeparateResultForEmptyRecycleBin => _showSeparateResultForEmptyRecycleBin.Value;
44+
public bool HideEmptyRecycleBin => _hideEmptyRecycleBin.Value;
4545

4646
public bool HideDisconnectedNetworkInfo => _hideDisconnectedNetworkInfo.Value;
4747

@@ -60,7 +60,7 @@ public SettingsManager()
6060

6161
Settings.Add(_showDialogToConfirmCommand);
6262
Settings.Add(_showSuccessMessageAfterEmptyingRecycleBin);
63-
Settings.Add(_showSeparateResultForEmptyRecycleBin);
63+
Settings.Add(_hideEmptyRecycleBin);
6464
Settings.Add(_hideDisconnectedNetworkInfo);
6565

6666
// Load settings from file upon initialization

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/Pages/SystemCommandPage.cs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public sealed partial class SystemCommandPage : ListPage
1515
public SystemCommandPage(SettingsManager settingsManager)
1616
{
1717
Title = Resources.Microsoft_plugin_ext_system_page_name;
18+
Name = Resources.Microsoft_plugin_ext_system_page_name;
1819
Icon = IconHelpers.FromRelativePath("Assets\\SystemCommand.svg");
1920
_settingsManager = settingsManager;
2021
ShowDetails = true;

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/Properties/Resources.Designer.cs

+18-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/Properties/Resources.resx

+5-2
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@
151151
<data name="Microsoft_plugin_ext_connection_details" xml:space="preserve">
152152
<value>Connection Details</value>
153153
</data>
154+
<data name="Microsoft_plugin_ext_adapter_details" xml:space="preserve">
155+
<value>Adapter Details</value>
156+
</data>
154157
<data name="Microsoft_plugin_ext_copy" xml:space="preserve">
155158
<value>Copy to clipboard</value>
156159
</data>
@@ -309,8 +312,8 @@
309312
<value>Empty Recycle Bin</value>
310313
<comment>This should align to the action in Windows of emptying the recycle bin on your computer.</comment>
311314
</data>
312-
<data name="Microsoft_plugin_sys_RecycleBin_ShowEmptySeparate" xml:space="preserve">
313-
<value>Show separate result for Empty Recycle Bin command</value>
315+
<data name="Microsoft_plugin_sys_RecycleBin_HideEmpty" xml:space="preserve">
316+
<value>Hide the Empty Recycle Bin command</value>
314317
</data>
315318
<data name="Microsoft_plugin_sys_RecycleBin_ShowEmptySuccessMessage" xml:space="preserve">
316319
<value>Show a success message after emptying the Recycle Bin</value>

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/SystemCommandExtensionProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ public SystemCommandExtensionProvider()
2222
_commands = [
2323
new CommandItem(Page)
2424
{
25-
Title = DisplayName,
25+
Title = Resources.Microsoft_plugin_ext_system_page_name,
2626
Icon = Page.Icon,
2727
MoreCommands = [new CommandContextItem(_settingsManager.Settings.SettingsPage)],
2828
},
2929
];
3030

3131
Icon = Page.Icon;
32+
Settings = _settingsManager.Settings;
3233
}
3334

3435
public override ICommandItem[] TopLevelCommands()

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/SystemCommandsCache.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public SystemCommandsCache(SettingsManager manager)
2020
{
2121
var isBootedInUefiMode = Win32Helpers.GetSystemFirmwareType() == FirmwareType.Uefi;
2222

23-
var separateEmptyRB = manager.ShowSeparateResultForEmptyRecycleBin;
23+
var separateEmptyRB = manager.HideEmptyRecycleBin;
2424
var confirmSystemCommands = manager.ShowDialogToConfirmCommand;
2525
var showSuccessOnEmptyRB = manager.ShowSuccessMessageAfterEmptyingRecycleBin;
2626

src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.TimeDate/Properties/Resources.Designer.cs

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)