Skip to content

Commit 2c3256a

Browse files
committed
Add optional display of Hg terminology in context menus and tooltips
1 parent b9bed63 commit 2c3256a

24 files changed

Lines changed: 418 additions & 78 deletions

‎HG-CONTEXT-MENUS.md‎

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
# Hg context-menu terminology inventory
2+
3+
The Appearance preference is off by default, persists in preference.json, and is read when a menu is built. Reopening a menu applies a changed preference immediately. Existing translated labels and arguments stay intact; only mapped menu labels gain ` { Hg: ... }`. The same preference also extends selected tooltips. Tooltip bindings respond to preference and locale changes, preserving shortcuts, formatting, literal flags, and dynamic descriptions. Dialog titles, native application menus, and user-defined labels are unchanged.
4+
5+
## Candidates implemented
6+
7+
Git branches are compared with Mercurial bookmarks (movable pointers), rather than permanent named branches. These hints describe corresponding functionality, not commands executed by SourceGit. Histedit requires the Mercurial histedit extension; it edits linear history and is not identical to every Git rebase scenario.
8+
9+
| Resource key | Existing English label | Hg postfix |
10+
| --- | --- | --- |
11+
| `BranchCM.Checkout` | Checkout ${0}$... | `{ Hg: update }` |
12+
| `CommitCM.Checkout` | Checkout Commit... | `{ Hg: update }` |
13+
| `TagCM.Checkout` | Checkout Tag... | `{ Hg: update }` |
14+
| `CreateBranch` | Create Branch... | `{ Hg: bookmark }` |
15+
| `BranchCM.Rename` | Rename ${0}$... | `{ Hg: rename bookmark }` |
16+
| `BranchCM.Delete` | Delete ${0}$... | `{ Hg: delete bookmark }` |
17+
| `BranchCM.DeleteMultiBranches` | Delete selected {0} branches... | `{ Hg: delete bookmark }` |
18+
| `BranchCM.ResetToSelectedCommit` | Reset ${0}$ to ${1}$... | `{ Hg: move bookmark }` |
19+
| `BranchCM.FastForward` | Fast-Forward to ${0}$ | `{ Hg: update bookmark }` |
20+
| `RemoteCM.Fetch` | Fetch | `{ Hg: pull }` |
21+
| `BranchCM.FetchInto` | Fetch ${0}$ into ${1}$ | `{ Hg: pull }` |
22+
| `RemoteCM.EnableAutoFetch` | Enable Auto-Fetch | `{ Hg: pull }` |
23+
| `CommitCM.CherryPick` | Cherry-Pick Commit... | `{ Hg: graft }` |
24+
| `CommitCM.CherryPickMultiple` | Cherry-Pick... | `{ Hg: graft }` |
25+
| `CommitCM.Revert` | Revert Commit... | `{ Hg: backout }` |
26+
| `CommitCM.InteractiveRebase` | Interactive Rebase | `{ Hg: histedit }` |
27+
| `CommitCM.InteractiveRebase.Manually` | Interactively Rebase ${0}$ on ${1}$ | `{ Hg: histedit }` |
28+
| `BranchCM.InteractiveRebase.Manually` | Interactively Rebase ${0}$ on ${1}$ | `{ Hg: histedit }` |
29+
| `CommitCM.InteractiveRebase.Reword` | Reword... | `{ Hg: histedit mess }` |
30+
| `CommitCM.InteractiveRebase.Squash` | Squash into Parent... | `{ Hg: histedit fold }` |
31+
| `CommitCM.InteractiveRebase.Fixup` | Fixup into Parent... | `{ Hg: histedit roll }` |
32+
| `ChangeCM.CheckoutThisRevision` | Reset to This Revision | `{ Hg: revert }` |
33+
| `ChangeCM.CheckoutFirstParentRevision` | Reset to Parent Revision | `{ Hg: revert }` |
34+
| `ChangeCM.ResetFileTo` | Reset File(s) to ${0}$ | `{ Hg: revert }` |
35+
| `FileCM.Discard` | Discard... | `{ Hg: revert }` |
36+
| `FileCM.DiscardMulti` | Discard {0} files... | `{ Hg: revert }` |
37+
| `FileCM.Stash` | Stash... | `{ Hg: shelve }` |
38+
| `FileCM.StashMulti` | Stash {0} files... | `{ Hg: shelve }` |
39+
| `StashCM.Apply` | Apply | `{ Hg: unshelve --keep }` |
40+
| `StashCM.Drop` | Drop | `{ Hg: shelve --delete }` |
41+
| `Blame` | Blame | `{ Hg: annotate }` |
42+
| `WorkingCopy.AddToGitIgnore` | Git Ignore | `{ Hg: .hgignore }` |
43+
44+
The interactive-rebase action flyout also adds the Reword/mess, Squash/fold, and Fixup/roll hints to its structured descriptions. Pick, Edit, and Drop retain their shared action names. Working-copy blame keeps its HEAD-only qualifier before the postfix.
45+
46+
## Candidates deliberately left unchanged
47+
48+
| Candidates | Reason |
49+
| --- | --- |
50+
| Push, pull, merge, rebase, tag, archive, patch export, file history | Terminology already exists in Hg. |
51+
| Stage / unstage; assume unchanged | Hg has no Git index or direct equivalent of assume-unchanged. In particular, hg add/forget would misrepresent staging tracked edits. |
52+
| Discard untracked/added files or a selection including them | Removes files; hg revert would misrepresent the action. Only tracked-file discard gets the revert hint. |
53+
| Reset current branch to a commit | The dialog offers soft, mixed, and hard modes; no single Hg operation describes all three. Moving a non-current branch pointer can be described as moving a bookmark. |
54+
| Checkout as worktree; switch/open/lock/unlock/remove worktree | Hg share is related but has different lifecycle and state; no direct operation mapping. |
55+
| Remote prune, tracking branches, push URL; Git Flow; Git LFS | Git-specific configuration, workflows, or extension behavior without a reliable universal mapping. |
56+
| Submodule add/remove/update/deinit/move/configure | Hg subrepositories differ in lifecycle and configuration; avoid claiming identical commands. |
57+
| Apply selected stash file changes; checkout branch from stash | Compositions or partial operations; a plain unshelve hint would omit important behavior. |
58+
| Resolve using / use mine / use theirs | Resolution concepts are shared; Git rebase can swap ours/theirs roles, making a direct Hg local/other command hint misleading. |
59+
| Compare with HEAD / worktree; SHA and commit metadata | General comparisons or metadata labels, rather than different operation names; retain the existing wording. |
60+
| Ignore-file pattern submenu entries | Ignore terminology is shared; the parent identifies .hgignore. |
61+
| Copy, cut, paste, open, save, reveal, sort, filter, layouts, browser links, tabs/workspaces, AI, avatars, logs, custom actions/templates | Application/editor actions or user-supplied labels, not differing Git/Hg operations. |
62+
63+
## Complete menu source inventory
64+
65+
This includes context menus and button-triggered menu flyouts. Shared factories cover multiple selection and single selection, local/current/remote branches, graph labels, and file/folder variants. Each source below was reviewed; only sources with mapped actions changed.
66+
67+
| Source | Mapped resource keys present |
68+
| --- | --- |
69+
| `src/Resources/Styles.axaml` | None |
70+
| `src/Views/AIAssistant.axaml.cs` | None |
71+
| `src/Views/Avatar.cs` | None |
72+
| `src/Views/Blame.axaml.cs` | None |
73+
| `src/Views/BranchTree.axaml.cs` | `BranchCM.Checkout`, `CreateBranch`, `BranchCM.Rename`, `BranchCM.Delete`, `BranchCM.DeleteMultiBranches`, `BranchCM.ResetToSelectedCommit`, `BranchCM.FastForward`, `RemoteCM.Fetch`, `BranchCM.FetchInto`, `RemoteCM.EnableAutoFetch`, `BranchCM.InteractiveRebase.Manually` |
74+
| `src/Views/ChangeViewModeSwitcher.axaml` | None |
75+
| `src/Views/CommitBaseInfo.axaml` | None |
76+
| `src/Views/CommitBaseInfo.axaml.cs` | None |
77+
| `src/Views/CommitChanges.axaml.cs` | `ChangeCM.CheckoutThisRevision`, `ChangeCM.CheckoutFirstParentRevision` |
78+
| `src/Views/CommitDetail.axaml.cs` | `ChangeCM.CheckoutThisRevision`, `ChangeCM.CheckoutFirstParentRevision`, `Blame` |
79+
| `src/Views/CommitMessagePresenter.cs` | None |
80+
| `src/Views/CommitMessageToolBox.axaml.cs` | None |
81+
| `src/Views/Compare.axaml.cs` | `CommitCM.CherryPickMultiple`, `ChangeCM.ResetFileTo` |
82+
| `src/Views/Conflict.axaml` | None |
83+
| `src/Views/FileHistories.axaml.cs` | None |
84+
| `src/Views/FilterModeSwitchButton.axaml.cs` | None |
85+
| `src/Views/Histories.axaml.cs` | `BranchCM.Checkout`, `CommitCM.Checkout`, `CreateBranch`, `BranchCM.Rename`, `BranchCM.Delete`, `BranchCM.FastForward`, `CommitCM.CherryPick`, `CommitCM.CherryPickMultiple`, `CommitCM.Revert`, `CommitCM.InteractiveRebase`, `CommitCM.InteractiveRebase.Manually`, `CommitCM.InteractiveRebase.Reword`, `CommitCM.InteractiveRebase.Squash`, `CommitCM.InteractiveRebase.Fixup` |
86+
| `src/Views/InteractiveRebase.axaml.cs` | `CommitCM.InteractiveRebase.{Reword,Squash,Fixup}` |
87+
| `src/Views/Launcher.axaml` | None |
88+
| `src/Views/Launcher.axaml.cs` | None |
89+
| `src/Views/LauncherTabBar.axaml.cs` | None |
90+
| `src/Views/MergeConflictEditor.axaml` | None |
91+
| `src/Views/MergeConflictEditor.axaml.cs` | None |
92+
| `src/Views/RemoteProtocolSwitcher.axaml.cs` | None |
93+
| `src/Views/Repository.axaml.cs` | None |
94+
| `src/Views/RepositoryConfigure.axaml` | None |
95+
| `src/Views/RepositoryToolbar.axaml.cs` | None |
96+
| `src/Views/RevisionCompare.axaml.cs` | `ChangeCM.ResetFileTo` |
97+
| `src/Views/RevisionFileContentViewer.axaml.cs` | None |
98+
| `src/Views/RevisionFileTreeView.axaml.cs` | `ChangeCM.CheckoutThisRevision`, `Blame` |
99+
| `src/Views/StashesPage.axaml.cs` | `ChangeCM.CheckoutThisRevision`, `StashCM.Apply`, `StashCM.Drop` |
100+
| `src/Views/SubmoduleRevisionCompare.axaml.cs` | None |
101+
| `src/Views/SubmodulesView.axaml.cs` | None |
102+
| `src/Views/TagsView.axaml.cs` | `TagCM.Checkout`, `CreateBranch` |
103+
| `src/Views/TextDiffView.axaml.cs` | None |
104+
| `src/Views/ViewLogs.axaml.cs` | None |
105+
| `src/Views/Welcome.axaml` | None |
106+
| `src/Views/Welcome.axaml.cs` | None |
107+
| `src/Views/WorkingCopy.axaml` | None |
108+
| `src/Views/WorkingCopy.axaml.cs` | `FileCM.Discard`, `FileCM.DiscardMulti`, `FileCM.Stash`, `FileCM.StashMulti`, `Blame`, `WorkingCopy.AddToGitIgnore` |
109+
110+
## Tooltip candidates implemented
111+
112+
| Source | Tooltip | Hg postfix |
113+
| --- | --- | --- |
114+
| `RepositoryToolbar.axaml` | Fetch | `{ Hg: pull }` |
115+
| `RepositoryToolbar.axaml` | Stash | `{ Hg: shelve }` |
116+
| `RepositoryToolbar.axaml` | Create Branch (shortcut retained) | `{ Hg: bookmark }` |
117+
| `RepositoryToolbar.axaml` | Apply Patch | `{ Hg: import --no-commit }` |
118+
| `Repository.axaml` | Stashes (shortcut retained) | `{ Hg: shelves }` |
119+
| `StashesPage.axaml` | Clear all stashes | `{ Hg: shelve --cleanup }` |
120+
| `Blame.axaml` | Blame on Previous Revision | `{ Hg: annotate }` |
121+
| `StashChanges.axaml` | `--include-untracked` | `{ Hg: shelve --unknown }` |
122+
| `CreateBranch.axaml` | Overwrite existing branch (bound `OverrideTip`) | `{ Hg: bookmark --force }` |
123+
124+
The checkbox tooltip explains that this option applies to tooltips as well as context menus. `HgTextExtension` binds the original label (dynamic resource, literal text, or an existing binding) and the preference to the shared formatter. Only opted-in tooltip fields use this extension; translated labels are never scanned for Git words.
125+
126+
## Tooltip candidates left unchanged
127+
128+
- Push, pull, bisect, commit/amend, merge/rebase and their shared command options already use Hg terminology.
129+
- Stage/unstage, staged-only stash, assume-unchanged, Git index restoration, Git Flow, Git LFS, worktrees, submodules, remote tracking and Git-specific configuration/flags lack a reliable direct equivalent.
130+
- Discard-all can include deletion of untracked/ignored files, so `revert` would not describe every mode.
131+
- GC/prune cleanup, force-with-lease, signoff, reset-author, hook bypass, cherry-pick mainline selection and autostash have Git-specific semantics; no misleading command substitutions are added.
132+
- Blame instructions, search hints, author/commit metadata, branch/tag/worktree details, paths, URLs, logs, keyboard shortcuts, AI/custom-action descriptions and editor/display controls retain their content.
133+
134+
### Complete tooltip source inventory
135+
136+
The following files contain tooltip assignments or tooltip content. All were reviewed, including literal flags, resource labels, bound data, structured controls and programmatic `ToolTip.SetTip` calls. Most present application help or user/repository data and do not need terminology hints.
137+
138+
- `src/Resources/Styles.axaml`
139+
- `src/Views/About.axaml`
140+
- `src/Views/Apply.axaml`
141+
- `src/Views/ApplyStash.axaml`
142+
- `src/Views/Blame.axaml`
143+
- `src/Views/Blame.axaml.cs`
144+
- `src/Views/BlameCommandPalette.axaml`
145+
- `src/Views/BranchTree.axaml`
146+
- `src/Views/ChangeCollectionView.axaml.cs`
147+
- `src/Views/ChangeViewModeSwitcher.axaml`
148+
- `src/Views/Chart.cs`
149+
- `src/Views/CherryPick.axaml`
150+
- `src/Views/Clone.axaml`
151+
- `src/Views/CommitBaseInfo.axaml`
152+
- `src/Views/CommitBaseInfo.axaml.cs`
153+
- `src/Views/CommitDetail.axaml`
154+
- `src/Views/CommitMessagePresenter.cs`
155+
- `src/Views/CommitMessageToolBox.axaml`
156+
- `src/Views/CommitSearchView.axaml`
157+
- `src/Views/CommitSubjectPresenter.cs`
158+
- `src/Views/Compare.axaml`
159+
- `src/Views/ConventionalCommitMessageBuilder.axaml`
160+
- `src/Views/CreateBranch.axaml`
161+
- `src/Views/DeinitSubmodule.axaml`
162+
- `src/Views/DeleteBranch.axaml`
163+
- `src/Views/DeleteMultipleBranches.axaml`
164+
- `src/Views/DiffView.axaml`
165+
- `src/Views/DirHistories.axaml.cs`
166+
- `src/Views/ExecuteCustomAction.axaml`
167+
- `src/Views/Fetch.axaml`
168+
- `src/Views/FileHistories.axaml`
169+
- `src/Views/FileHistories.axaml.cs`
170+
- `src/Views/FileHistoryCommandPalette.axaml`
171+
- `src/Views/FileModeChange.cs`
172+
- `src/Views/FilterModeSwitchButton.axaml`
173+
- `src/Views/GitFlowFinish.axaml`
174+
- `src/Views/Histories.axaml`
175+
- `src/Views/InteractiveRebase.axaml`
176+
- `src/Views/Launcher.axaml`
177+
- `src/Views/LauncherPage.axaml`
178+
- `src/Views/LauncherPagesCommandPalette.axaml`
179+
- `src/Views/LauncherTabBar.axaml`
180+
- `src/Views/LFSLocks.axaml`
181+
- `src/Views/Merge.axaml`
182+
- `src/Views/MergeConflictEditor.axaml`
183+
- `src/Views/OpenFileCommandPalette.axaml`
184+
- `src/Views/Preferences.axaml`
185+
- `src/Views/Pull.axaml`
186+
- `src/Views/Push.axaml`
187+
- `src/Views/PushRevision.axaml`
188+
- `src/Views/Rebase.axaml`
189+
- `src/Views/Repository.axaml`
190+
- `src/Views/RepositoryConfigure.axaml`
191+
- `src/Views/RepositoryToolbar.axaml`
192+
- `src/Views/RevisionCompare.axaml`
193+
- `src/Views/RevisionFiles.axaml`
194+
- `src/Views/StashChanges.axaml`
195+
- `src/Views/StashesPage.axaml`
196+
- `src/Views/Statistics.axaml`
197+
- `src/Views/SubmoduleRevisionCompare.axaml`
198+
- `src/Views/SubmodulesView.axaml`
199+
- `src/Views/TagsView.axaml`
200+
- `src/Views/UpdateSubmodules.axaml`
201+
- `src/Views/WelcomeToolbar.axaml`
202+
- `src/Views/WorkingCopy.axaml`
203+
204+
## References
205+
206+
- [Mercurial glossary](https://www.mercurial-scm.org/help/topics/glossary): bookmarks and working-directory updates.
207+
- [Graft](https://www.mercurial-scm.org/help/commands/graft) and [backout](https://www.mercurial-scm.org/help/commands/backout): copying and reversing changesets.
208+
- [Histedit](https://www.mercurial-scm.org/help/commands/histedit): mess, fold, and roll actions.
209+
- [Revert](https://www.mercurial-scm.org/help/commands/revert) and [annotate](https://www.mercurial-scm.org/help/commands/annotate): restoring files and line attribution.
210+
- [Shelve](https://www.mercurial-scm.org/help/commands/shelve) and [unshelve](https://www.mercurial-scm.org/help/commands/unshelve): saving, keeping, and deleting shelved changes.
211+
212+
- [Import](https://mercurial-scm.org/help/commands/import): `--no-commit` applies the patch without committing.

‎src/App.axaml.cs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ public static string Text(string key, params object[] args)
222222
return string.Format(fmt, args);
223223
}
224224

225+
public static string ContextMenuText(string key, params object[] args)
226+
{
227+
return Models.HgTerminology.Extend(key, Text(key, args), ViewModels.Preferences.Instance.ExtendContextMenusWithHgTerminology);
228+
}
229+
225230
public static ViewModels.Launcher GetLauncher()
226231
{
227232
return Current is App app ? app._launcher : null;

‎src/Models/HgTerminology.cs‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
namespace SourceGit.Models
2+
{
3+
public static class HgTerminology
4+
{
5+
public static string Extend(string key, string label, bool enabled)
6+
{
7+
if (!enabled)
8+
return label;
9+
10+
var equivalent = key switch
11+
{
12+
"BranchCM.Checkout" or "CommitCM.Checkout" or "TagCM.Checkout" => "update",
13+
"CreateBranch" or "Repository.NewBranch" => "bookmark",
14+
"BranchCM.Rename" => "rename bookmark",
15+
"BranchCM.Delete" or "BranchCM.DeleteMultiBranches" => "delete bookmark",
16+
"BranchCM.ResetToSelectedCommit" => "move bookmark",
17+
"BranchCM.FastForward" => "update bookmark",
18+
"Fetch" or "RemoteCM.Fetch" or "BranchCM.FetchInto" or "RemoteCM.EnableAutoFetch" => "pull",
19+
"CommitCM.CherryPick" or "CommitCM.CherryPickMultiple" => "graft",
20+
"CommitCM.Revert" => "backout",
21+
"CommitCM.InteractiveRebase" or "CommitCM.InteractiveRebase.Manually" or "BranchCM.InteractiveRebase.Manually" => "histedit",
22+
"CommitCM.InteractiveRebase.Reword" => "histedit mess",
23+
"CommitCM.InteractiveRebase.Squash" => "histedit fold",
24+
"CommitCM.InteractiveRebase.Fixup" => "histedit roll",
25+
"ChangeCM.CheckoutThisRevision" or "ChangeCM.CheckoutFirstParentRevision" or "ChangeCM.ResetFileTo" or "FileCM.Discard" or "FileCM.DiscardMulti" => "revert",
26+
"Stash" or "FileCM.Stash" or "FileCM.StashMulti" => "shelve",
27+
"StashCM.Apply" => "unshelve --keep",
28+
"StashCM.Drop" => "shelve --delete",
29+
"Blame" or "Blame.BlameOnPreviousRevision" => "annotate",
30+
"Stashes" => "shelves",
31+
"Repository.ClearStashes" => "shelve --cleanup",
32+
"Stash.IncludeUntracked" => "shelve --unknown",
33+
"CreateBranch.OverwriteExisting" => "bookmark --force",
34+
"Apply.Title" => "import --no-commit",
35+
"WorkingCopy.AddToGitIgnore" => ".hgignore",
36+
_ => null,
37+
};
38+
39+
return equivalent == null ? label : $"{label} {{ Hg: {equivalent} }}";
40+
}
41+
}
42+
}

‎src/Resources/Locales/en_US.axaml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,8 @@
677677
<x:String x:Key="Text.Preferences.Appearance" xml:space="preserve">APPEARANCE</x:String>
678678
<x:String x:Key="Text.Preferences.Appearance.DefaultFont" xml:space="preserve">Default Font</x:String>
679679
<x:String x:Key="Text.Preferences.Appearance.EditorTabWidth" xml:space="preserve">Editor Tab Width</x:String>
680+
<x:String x:Key="Text.Preferences.Appearance.ExtendContextMenusWithHgTerminology" xml:space="preserve">Extend context menus with Hg terminology</x:String>
681+
<x:String x:Key="Text.Preferences.Appearance.ExtendContextMenusWithHgTerminology.Tip" xml:space="preserve">Also extend tooltips with equivalent Hg terminology.</x:String>
680682
<x:String x:Key="Text.Preferences.Appearance.FontSize" xml:space="preserve">Font Size</x:String>
681683
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Default</x:String>
682684
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Editor</x:String>

‎src/ViewModels/Preferences.cs‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,12 @@ public bool UseAutoHideScrollBars
181181
set => SetProperty(ref _useAutoHideScrollBars, value);
182182
}
183183

184+
public bool ExtendContextMenusWithHgTerminology
185+
{
186+
get => _extendContextMenusWithHgTerminology;
187+
set => SetProperty(ref _extendContextMenusWithHgTerminology, value);
188+
}
189+
184190
public bool UseGitHubStyleAvatar
185191
{
186192
get => _useGitHubStyleAvatar;
@@ -822,6 +828,7 @@ private bool RemoveInvalidRepositoriesRecursive(List<RepositoryNode> collection)
822828
private int _subjectGuideLength = 50;
823829
private bool _useFixedTabWidth = true;
824830
private bool _useAutoHideScrollBars = true;
831+
private bool _extendContextMenusWithHgTerminology = false;
825832
private bool _useGitHubStyleAvatar = true;
826833
private bool _useCompactBranchNamesInGraph = true;
827834

‎src/Views/Blame.axaml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
IsEnabled="{Binding PrevRevision, Converter={x:Static ObjectConverters.IsNotNull}}"
145145
Width="28" Margin="4,0"
146146
Command="{Binding GotoPrevRevision}"
147-
ToolTip.Tip="{DynamicResource Text.Blame.BlameOnPreviousRevision}">
147+
ToolTip.Tip="{v:HgText Blame.BlameOnPreviousRevision}">
148148
<Path Width="14" Height="14" Data="{StaticResource Icons.GotoParent}"/>
149149
</Button>
150150
</Grid>

0 commit comments

Comments
 (0)