Skip to content

Commit 02c59fa

Browse files
authored
Merge pull request #135 from KamilDev/strip-menu-mnemonics
Add option to hide access-key markers (&) in menu names
2 parents 3fe7e10 + 811e79c commit 02c59fa

23 files changed

Lines changed: 99 additions & 29 deletions

ContextMenuManager/BluePointLilac.Methods/ResourceString.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,33 @@ public static string GetDirectString(string resStr)
2424
SHLoadIndirectString(resStr, outBuff, 1024, IntPtr.Zero);
2525
return outBuff.ToString();
2626
}
27+
28+
/// <summary>Strips Win32 menu access-key markers so the list matches what Explorer actually renders.</summary>
29+
/// <param name="text">The raw menu text, typically read from the registry.</param>
30+
/// <returns>The input unchanged when the setting is off or no '&amp;' is present; otherwise the text with single '&amp;' removed and '&amp;&amp;' collapsed to a literal '&amp;'.</returns>
31+
/// <remarks>Leaving the setting off preserves the raw registry text for power users who want to see the mnemonic markers.</remarks>
32+
public static string StripMnemonics(string text)
33+
{
34+
if (string.IsNullOrEmpty(text) || !AppConfig.StripMenuMnemonics) return text;
35+
if (text.IndexOf('&') < 0) return text;
36+
37+
var sb = new StringBuilder(text.Length);
38+
for (var i = 0; i < text.Length; i++)
39+
{
40+
if (text[i] == '&')
41+
{
42+
if (i + 1 < text.Length && text[i + 1] == '&')
43+
{
44+
sb.Append('&');
45+
i++;
46+
}
47+
}
48+
else
49+
{
50+
sb.Append(text[i]);
51+
}
52+
}
53+
return sb.ToString();
54+
}
2755
}
2856
}

ContextMenuManager/Controls/DetailedEditDialog.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public bool ShowDialog()
1515
public bool RunDialog(MainWindow owner)
1616
{
1717
var dialog = ContentDialogHost.CreateDialog(
18-
AppString.Dialog.DetailedEdit.Replace("%s", GuidInfo.GetText(GroupGuid)),
18+
AppString.Dialog.DetailedEdit.Replace("%s", ResourceString.StripMnemonics(GuidInfo.GetText(GroupGuid))),
1919
owner);
2020

2121
var list = new DetailedEditList

ContextMenuManager/Controls/DetailedEditList.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ public override void LoadItems()
4343
groupItem = new FoldGroupItem(this, groupXN.SelectSingleNode(attribute)?.InnerText, pathType);
4444
foreach (XmlElement textXE in groupXN.SelectNodes("Text"))
4545
{
46-
if (XmlDicHelper.JudgeCulture(textXE)) groupItem.Text = ResourceString.GetDirectString(textXE.GetAttribute("Value"));
46+
if (XmlDicHelper.JudgeCulture(textXE)) groupItem.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.GetAttribute("Value")));
4747
}
4848
if (guids.Count > 0)
4949
{
5050
groupItem.Control.Tag = guids;
51-
if (string.IsNullOrWhiteSpace(groupItem.Text)) groupItem.Text = GuidInfo.GetText(guids[0]);
51+
if (string.IsNullOrWhiteSpace(groupItem.Text)) groupItem.Text = ResourceString.StripMnemonics(GuidInfo.GetText(guids[0]));
5252
groupItem.Image = GuidInfo.GetImage(guids[0]);
5353
var filePath = GuidInfo.GetFilePath(guids[0]);
5454
var clsidPath = GuidInfo.GetClsidPath(guids[0]);
@@ -95,7 +95,7 @@ string GetRuleFullRegPath(string regPath)
9595
// 获取文本、提示文本
9696
foreach (XmlElement textXE in itemXE.SelectNodes("Text"))
9797
{
98-
if (XmlDicHelper.JudgeCulture(textXE)) info.Text = ResourceString.GetDirectString(textXE.GetAttribute("Value"));
98+
if (XmlDicHelper.JudgeCulture(textXE)) info.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.GetAttribute("Value")));
9999
}
100100
foreach (XmlElement tipXE in itemXE.SelectNodes("Tip"))
101101
{

ContextMenuManager/Controls/EnhanceMenuList.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public override void LoadItems()
2626
{
2727
if (XmlDicHelper.JudgeCulture(textXE))
2828
{
29-
text = ResourceString.GetDirectString(textXE.GetAttribute("Value"));
29+
text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.GetAttribute("Value")));
3030
}
3131
}
3232
if (string.IsNullOrEmpty(path) || string.IsNullOrEmpty(text)) continue;
@@ -72,7 +72,7 @@ private void LoadShellItems(XmlNode shellXN, FoldGroupItem groupItem)
7272
foreach (XmlElement szXE in itemXE.SelectNodes("Value/REG_SZ"))
7373
{
7474
if (!XmlDicHelper.JudgeCulture(szXE)) continue;
75-
if (szXE.HasAttribute("MUIVerb")) item.Text = ResourceString.GetDirectString(szXE.GetAttribute("MUIVerb"));
75+
if (szXE.HasAttribute("MUIVerb")) item.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(szXE.GetAttribute("MUIVerb")));
7676
if (szXE.HasAttribute("Icon")) item.Image = ResourceIcon.GetIcon(szXE.GetAttribute("Icon"))?.ToBitmap();
7777
else if (szXE.HasAttribute("HasLUAShield")) item.Image = AppImage.Shield;
7878
}
@@ -101,7 +101,7 @@ private void LoadShellItems(XmlNode shellXN, FoldGroupItem groupItem)
101101
}
102102
}
103103
item.Image ??= AppImage.NotFound;
104-
if (string.IsNullOrWhiteSpace(item.Text)) item.Text = keyName;
104+
if (string.IsNullOrWhiteSpace(item.Text)) item.Text = ResourceString.StripMnemonics(keyName);
105105
var tip = "";
106106
foreach (XmlElement tipXE in itemXE.SelectNodes("Tip"))
107107
{
@@ -137,10 +137,10 @@ private void LoadShellExItems(XmlNode shellExXN, FoldGroupItem groupItem)
137137
{
138138
if (XmlDicHelper.JudgeCulture(textXE))
139139
{
140-
item.Text = ResourceString.GetDirectString(textXE.InnerText);
140+
item.Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(textXE.InnerText));
141141
}
142142
}
143-
if (string.IsNullOrWhiteSpace(item.Text)) item.Text = GuidInfo.GetText(guid);
143+
if (string.IsNullOrWhiteSpace(item.Text)) item.Text = ResourceString.StripMnemonics(GuidInfo.GetText(guid));
144144
if (string.IsNullOrWhiteSpace(item.DefaultKeyName)) item.DefaultKeyName = guid.ToString("B");
145145
var tip = "";
146146
foreach (XmlElement tipXE in itemXN.SelectNodes("Tip"))

ContextMenuManager/Controls/GuidBlockedItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public GuidBlockedItem(GuidBlockedList list, string value) : base(list)
3838
if (list != null) Image = AppImage.SystemFile;
3939
}
4040

41-
Text = ItemText;
41+
Text = ResourceString.StripMnemonics(ItemText);
4242
}
4343

4444
public string Value { get; set; }

ContextMenuManager/Controls/IEItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public string RegPath
3131
set
3232
{
3333
regPath = value;
34-
Text = ItemText;
34+
Text = ResourceString.StripMnemonics(ItemText);
3535
if (List != null) Image = ItemImage;
3636
}
3737
}

ContextMenuManager/Controls/Interfaces/ITsiGuidItem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ private void AddGuidDic()
9696
{
9797
writer.DeleteSection(section);
9898
GuidInfo.RemoveDic(Item.Guid);
99-
listItem.Text = Item.ItemText;
99+
listItem.Text = ResourceString.StripMnemonics(Item.ItemText);
100100
listItem.Image = GuidInfo.GetImage(Item.Guid);
101101
}
102102
return;
@@ -117,7 +117,7 @@ private void AddGuidDic()
117117
GuidInfo.RemoveDic(Item.Guid);
118118
writer.SetValue(section, "Text", dlg.ItemText);
119119
writer.SetValue(section, "Icon", dlg.ItemIconLocation);
120-
listItem.Text = dlg.ItemText;
120+
listItem.Text = ResourceString.StripMnemonics(dlg.ItemText);
121121
listItem.Image = dlg.ItemIcon;
122122
}
123123
}

ContextMenuManager/Controls/Interfaces/ITsiTextItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public ChangeTextMenuItem(ITsiTextItem item) : base(AppString.Menu.ChangeText)
1515
{
1616
Click += (sender, e) =>
1717
{
18-
var name = ChangeText(item.Text);
18+
var name = ChangeText(item.ItemText ?? item.Text);
1919
if (name != null) item.ItemText = name;
2020
};
2121
}

ContextMenuManager/Controls/OpenWithItem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public string RegPath
3333
{
3434
regPath = value;
3535
ItemFilePath = ObjectPath.ExtractFilePath(ItemCommand);
36-
Text = ItemText;
36+
Text = ResourceString.StripMnemonics(ItemText);
3737
if (List != null) Image = ItemIcon.ToBitmap();
3838
}
3939
}
@@ -60,7 +60,7 @@ public string ItemText
6060
set
6161
{
6262
Registry.SetValue(AppPath, "FriendlyAppName", value);
63-
Text = ResourceString.GetDirectString(value);
63+
Text = ResourceString.StripMnemonics(ResourceString.GetDirectString(value));
6464
}
6565
}
6666

ContextMenuManager/Controls/RuleItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public RuleItem(MyList list, ItemInfo info) : base(list)
1616
RestartExplorer = info.RestartExplorer;
1717
if (list != null)
1818
{
19-
Text = info.Text;
19+
Text = ResourceString.StripMnemonics(info.Text);
2020
Image = info.Image;
2121
BtnShowMenu = new MenuButton(this);
2222
TsiSearch = new WebSearchMenuItem(this);

0 commit comments

Comments
 (0)