Skip to content

Commit b85f100

Browse files
committed
code_review: PR #1532
- remove `MenuItemExtension` - display `Tag` as hotkey tips when `InputGesture` is null - remove `Avalonia.Input` reference in `ViewModels` - rewrite `InteractiveRebase` view to avoid using `Tag` in menu item Signed-off-by: leo <[email protected]>
1 parent dd3c658 commit b85f100

File tree

8 files changed

+86
-124
lines changed

8 files changed

+86
-124
lines changed

src/Resources/Styles.axaml

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -855,27 +855,24 @@
855855
</ContentPresenter.DataTemplates>
856856
</ContentPresenter>
857857

858-
<TextBlock x:Name="PART_InputGestureText"
859-
Grid.Column="2"
858+
<TextBlock Grid.Column="2"
860859
Classes="CaptionTextBlockStyle"
861860
Margin="{DynamicResource MenuInputGestureTextMargin}"
862861
Text="{TemplateBinding InputGesture, Converter={StaticResource KeyGestureConverter}}"
863862
HorizontalAlignment="Right"
864863
VerticalAlignment="Center"
865864
Foreground="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"
866-
FontSize="11"
867-
IsVisible="{TemplateBinding (v:MenuItemExtension.Command), Converter={x:Static StringConverters.IsNullOrEmpty}}"/>
865+
FontSize="11"/>
868866

869-
<TextBlock x:Name="PART_CommandTip"
870-
Grid.Column="2"
867+
<TextBlock Grid.Column="2"
871868
Classes="CaptionTextBlockStyle"
872869
Margin="{DynamicResource MenuInputGestureTextMargin}"
873-
Text="{TemplateBinding (v:MenuItemExtension.Command)}"
870+
Text="{TemplateBinding Tag}"
874871
HorizontalAlignment="Right"
875872
VerticalAlignment="Center"
876873
Foreground="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"
877874
FontSize="11"
878-
IsVisible="{TemplateBinding (v:MenuItemExtension.Command), Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
875+
IsVisible="{TemplateBinding InputGesture, Converter={x:Static ObjectConverters.IsNull}}"/>
879876

880877
<Path Name="PART_ChevronPath"
881878
Width="6"
@@ -931,9 +928,6 @@
931928
<Style Selector="^ /template/ ContentPresenter#PART_HeaderPresenter">
932929
<Setter Property="Foreground" Value="{DynamicResource MenuFlyoutItemForegroundPointerOver}" />
933930
</Style>
934-
<Style Selector="^ /template/ TextBlock#PART_InputGestureText">
935-
<Setter Property="Foreground" Value="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForegroundPointerOver}" />
936-
</Style>
937931
<Style Selector="^ /template/ Path#PART_ChevronPath">
938932
<Setter Property="Fill" Value="{DynamicResource MenuFlyoutSubItemChevronPointerOver}" />
939933
</Style>

src/ViewModels/Histories.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
using System;
1+
using System;
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.IO;
55
using System.Text;
66

77
using Avalonia.Controls;
8-
using Avalonia.Input;
98
using Avalonia.Platform.Storage;
109

1110
using CommunityToolkit.Mvvm.ComponentModel;
@@ -429,7 +428,7 @@ public ContextMenu MakeContextMenu(DataGrid list)
429428
var copyMultipleInfo = new MenuItem();
430429
copyMultipleInfo.Header = App.Text("CommitCM.CopySHA") + " - " + App.Text("CommitCM.CopySubject");
431430
copyMultipleInfo.Icon = App.CreateMenuIcon("Icons.Info");
432-
copyMultipleInfo.InputGesture = new KeyGesture(Key.C, OperatingSystem.IsMacOS() ? KeyModifiers.Meta : KeyModifiers.Control);
431+
copyMultipleInfo.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
433432
copyMultipleInfo.Click += async (_, e) =>
434433
{
435434
var builder = new StringBuilder();
@@ -726,7 +725,7 @@ public ContextMenu MakeContextMenu(DataGrid list)
726725
var createBranch = new MenuItem();
727726
createBranch.Icon = App.CreateMenuIcon("Icons.Branch.Add");
728727
createBranch.Header = App.Text("CreateBranch");
729-
createBranch.InputGesture = new KeyGesture(Key.B, OperatingSystem.IsMacOS() ? KeyModifiers.Meta : KeyModifiers.Control);
728+
createBranch.Tag = OperatingSystem.IsMacOS() ? "⌘+B" : "Ctrl+B";
730729
createBranch.Click += (_, e) =>
731730
{
732731
if (_repo.CanCreatePopup())
@@ -842,7 +841,7 @@ public ContextMenu MakeContextMenu(DataGrid list)
842841
var copyInfo = new MenuItem();
843842
copyInfo.Header = App.Text("CommitCM.CopySHA") + " - " + App.Text("CommitCM.CopySubject");
844843
copyInfo.Icon = App.CreateMenuIcon("Icons.Info");
845-
copyInfo.InputGesture = new KeyGesture(Key.C, OperatingSystem.IsMacOS() ? KeyModifiers.Meta : KeyModifiers.Control);
844+
copyInfo.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
846845
copyInfo.Click += async (_, e) =>
847846
{
848847
await App.CopyTextAsync($"{commit.SHA.AsSpan(0, 10)} - {commit.Subject}");

src/ViewModels/Launcher.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using Avalonia.Collections;
55
using Avalonia.Controls;
6-
using Avalonia.Input;
76
using Avalonia.Threading;
87

98
using CommunityToolkit.Mvvm.ComponentModel;
@@ -468,7 +467,7 @@ public ContextMenu CreateContextForPageTab(LauncherPage page)
468467
var menu = new ContextMenu();
469468
var close = new MenuItem();
470469
close.Header = App.Text("PageTabBar.Tab.Close");
471-
close.InputGesture = KeyGesture.Parse(OperatingSystem.IsMacOS() ? "⌘+W" : "Ctrl+W");
470+
close.Tag = OperatingSystem.IsMacOS() ? "⌘+W" : "Ctrl+W";
472471
close.Click += (_, e) =>
473472
{
474473
CloseTab(page);

src/ViewModels/Repository.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,7 +1775,7 @@ public ContextMenu CreateContextMenuForHistoriesPage()
17751775

17761776
var dateOrder = new MenuItem();
17771777
dateOrder.Header = App.Text("Repository.HistoriesOrder.ByDate");
1778-
dateOrder.SetValue(Views.MenuItemExtension.CommandProperty, "--date-order");
1778+
dateOrder.Tag = "--date-order";
17791779
if (!_settings.EnableTopoOrderInHistories)
17801780
dateOrder.Icon = App.CreateMenuIcon("Icons.Check");
17811781
dateOrder.Click += (_, ev) =>
@@ -1791,7 +1791,7 @@ public ContextMenu CreateContextMenuForHistoriesPage()
17911791

17921792
var topoOrder = new MenuItem();
17931793
topoOrder.Header = App.Text("Repository.HistoriesOrder.Topo");
1794-
topoOrder.SetValue(Views.MenuItemExtension.CommandProperty, "--top-order");
1794+
topoOrder.Tag = "--topo-order";
17951795
if (_settings.EnableTopoOrderInHistories)
17961796
topoOrder.Icon = App.CreateMenuIcon("Icons.Check");
17971797
topoOrder.Click += (_, ev) =>

src/ViewModels/WorkingCopy.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Threading.Tasks;
55

66
using Avalonia.Controls;
7-
using Avalonia.Input;
87
using Avalonia.Platform.Storage;
98
using Avalonia.Threading;
109

@@ -677,7 +676,7 @@ public ContextMenu CreateContextMenuForUnstagedChanges(string selectedSingleFold
677676
var stage = new MenuItem();
678677
stage.Header = App.Text("FileCM.Stage");
679678
stage.Icon = App.CreateMenuIcon("Icons.File.Add");
680-
stage.InputGesture = new KeyGesture(Key.Enter);
679+
stage.Tag = "Enter/Space";
681680
stage.Click += (_, e) =>
682681
{
683682
StageChanges(_selectedUnstaged, null);
@@ -687,7 +686,7 @@ public ContextMenu CreateContextMenuForUnstagedChanges(string selectedSingleFold
687686
var discard = new MenuItem();
688687
discard.Header = App.Text("FileCM.Discard");
689688
discard.Icon = App.CreateMenuIcon("Icons.Undo");
690-
discard.InputGesture = new KeyGesture(Key.Delete);
689+
discard.Tag = "Back/Delete";
691690
discard.Click += (_, e) =>
692691
{
693692
Discard(_selectedUnstaged);
@@ -1082,7 +1081,7 @@ public ContextMenu CreateContextMenuForUnstagedChanges(string selectedSingleFold
10821081
var stage = new MenuItem();
10831082
stage.Header = App.Text("FileCM.StageMulti", _selectedUnstaged.Count);
10841083
stage.Icon = App.CreateMenuIcon("Icons.File.Add");
1085-
stage.InputGesture = new KeyGesture(Key.Enter);
1084+
stage.Tag = "Enter/Space";
10861085
stage.Click += (_, e) =>
10871086
{
10881087
StageChanges(_selectedUnstaged, null);
@@ -1092,7 +1091,7 @@ public ContextMenu CreateContextMenuForUnstagedChanges(string selectedSingleFold
10921091
var discard = new MenuItem();
10931092
discard.Header = App.Text("FileCM.DiscardMulti", _selectedUnstaged.Count);
10941093
discard.Icon = App.CreateMenuIcon("Icons.Undo");
1095-
discard.InputGesture = new KeyGesture(Key.Delete);
1094+
discard.Tag = "Back/Delete";
10961095
discard.Click += (_, e) =>
10971096
{
10981097
Discard(_selectedUnstaged);
@@ -1268,7 +1267,7 @@ public ContextMenu CreateContextMenuForStagedChanges(string selectedSingleFolder
12681267
var unstage = new MenuItem();
12691268
unstage.Header = App.Text("FileCM.Unstage");
12701269
unstage.Icon = App.CreateMenuIcon("Icons.File.Remove");
1271-
unstage.InputGesture = new KeyGesture(Key.Enter);
1270+
unstage.Tag = "Enter/Space";
12721271
unstage.Click += (_, e) =>
12731272
{
12741273
UnstageChanges(_selectedStaged, null);
@@ -1472,7 +1471,7 @@ public ContextMenu CreateContextMenuForStagedChanges(string selectedSingleFolder
14721471
var unstage = new MenuItem();
14731472
unstage.Header = App.Text("FileCM.UnstageMulti", _selectedStaged.Count);
14741473
unstage.Icon = App.CreateMenuIcon("Icons.File.Remove");
1475-
unstage.InputGesture = new KeyGesture(Key.Enter);
1474+
unstage.Tag = "Enter/Space";
14761475
unstage.Click += (_, e) =>
14771476
{
14781477
UnstageChanges(_selectedStaged, null);

src/Views/InteractiveRebase.axaml

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -102,83 +102,7 @@
102102
</Border>
103103

104104
<!-- Action -->
105-
<Button Grid.Column="1" Opacity="1" Margin="4,0,0,0" Padding="8,2" Background="Transparent">
106-
<Button.Flyout>
107-
<MenuFlyout Placement="BottomEdgeAlignedLeft" VerticalOffset="-4">
108-
<MenuItem InputGesture="P" Click="OnChangeRebaseAction" Tag="{x:Static m:InteractiveRebaseAction.Pick}">
109-
<MenuItem.Icon>
110-
<Ellipse Width="14" Height="14" Fill="Green"/>
111-
</MenuItem.Icon>
112-
<MenuItem.Header>
113-
<Grid ColumnDefinitions="64,240">
114-
<TextBlock Grid.Column="0" Classes="primary" Margin="4,0" Text="Pick"/>
115-
<TextBlock Grid.Column="1" Text="Use this commit" Foreground="{DynamicResource Brush.FG2}"/>
116-
</Grid>
117-
</MenuItem.Header>
118-
</MenuItem>
119-
120-
<MenuItem InputGesture="E" Click="OnChangeRebaseAction" Tag="{x:Static m:InteractiveRebaseAction.Edit}">
121-
<MenuItem.Icon>
122-
<Ellipse Width="14" Height="14" Fill="Orange"/>
123-
</MenuItem.Icon>
124-
<MenuItem.Header>
125-
<Grid ColumnDefinitions="64,240">
126-
<TextBlock Grid.Column="0" Classes="primary" Margin="4,0" Text="Edit"/>
127-
<TextBlock Grid.Column="1" Text="Stop for amending" Foreground="{DynamicResource Brush.FG2}"/>
128-
</Grid>
129-
</MenuItem.Header>
130-
</MenuItem>
131-
132-
<MenuItem InputGesture="R" Click="OnChangeRebaseAction" Tag="{x:Static m:InteractiveRebaseAction.Reword}">
133-
<MenuItem.Icon>
134-
<Ellipse Width="14" Height="14" Fill="Orange"/>
135-
</MenuItem.Icon>
136-
<MenuItem.Header>
137-
<Grid ColumnDefinitions="64,240">
138-
<TextBlock Grid.Column="0" Classes="primary" Margin="4,0" Text="Reword"/>
139-
<TextBlock Grid.Column="1" Text="Edit the commit message" Foreground="{DynamicResource Brush.FG2}"/>
140-
</Grid>
141-
</MenuItem.Header>
142-
</MenuItem>
143-
144-
<MenuItem InputGesture="S" Click="OnChangeRebaseAction" Tag="{x:Static m:InteractiveRebaseAction.Squash}" IsVisible="{Binding CanSquashOrFixup}">
145-
<MenuItem.Icon>
146-
<Ellipse Width="14" Height="14" Fill="LightGray"/>
147-
</MenuItem.Icon>
148-
<MenuItem.Header>
149-
<Grid ColumnDefinitions="64,240">
150-
<TextBlock Grid.Column="0" Classes="primary" Margin="4,0" Text="Squash"/>
151-
<TextBlock Grid.Column="1" Text="Meld into previous commit" Foreground="{DynamicResource Brush.FG2}"/>
152-
</Grid>
153-
</MenuItem.Header>
154-
</MenuItem>
155-
156-
<MenuItem InputGesture="F" Click="OnChangeRebaseAction" Tag="{x:Static m:InteractiveRebaseAction.Fixup}" IsVisible="{Binding CanSquashOrFixup}">
157-
<MenuItem.Icon>
158-
<Ellipse Width="14" Height="14" Fill="LightGray"/>
159-
</MenuItem.Icon>
160-
<MenuItem.Header>
161-
<Grid ColumnDefinitions="64,240">
162-
<TextBlock Grid.Column="0" Classes="primary" Margin="4,0" Text="Fixup"/>
163-
<TextBlock Grid.Column="1" Text="Like 'Squash' but discard message" Foreground="{DynamicResource Brush.FG2}"/>
164-
</Grid>
165-
</MenuItem.Header>
166-
</MenuItem>
167-
168-
<MenuItem InputGesture="D" Click="OnChangeRebaseAction" Tag="{x:Static m:InteractiveRebaseAction.Drop}">
169-
<MenuItem.Icon>
170-
<Ellipse Width="14" Height="14" Fill="Red"/>
171-
</MenuItem.Icon>
172-
<MenuItem.Header>
173-
<Grid ColumnDefinitions="64,240">
174-
<TextBlock Grid.Column="0" Classes="primary" Margin="4,0" Text="Drop"/>
175-
<TextBlock Grid.Column="1" Text="Remove commit" Foreground="{DynamicResource Brush.FG2}"/>
176-
</Grid>
177-
</MenuItem.Header>
178-
</MenuItem>
179-
</MenuFlyout>
180-
</Button.Flyout>
181-
105+
<Button Grid.Column="1" Opacity="1" Margin="4,0,0,0" Padding="8,2" Background="Transparent" Click="OnButtonActionClicked">
182106
<StackPanel Orientation="Horizontal">
183107
<Ellipse Width="14" Height="14" Fill="{Binding Action, Converter={x:Static c:InteractiveRebaseActionConverters.ToIconBrush}}"/>
184108
<TextBlock Classes="primary" Margin="8,0" Text="{Binding Action, Converter={x:Static c:InteractiveRebaseActionConverters.ToName}}"/>

src/Views/InteractiveRebase.axaml.cs

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System;
2-
2+
using Avalonia;
33
using Avalonia.Controls;
4+
using Avalonia.Controls.Shapes;
45
using Avalonia.Input;
56
using Avalonia.Interactivity;
7+
using Avalonia.Media;
68

79
namespace SourceGit.Views
810
{
@@ -126,16 +128,31 @@ private void OnRowHeaderDragOver(object sender, DragEventArgs e)
126128
}
127129
}
128130

129-
private void OnChangeRebaseAction(object sender, RoutedEventArgs e)
131+
private void OnButtonActionClicked(object sender, RoutedEventArgs e)
130132
{
131-
if (DataContext is ViewModels.InteractiveRebase vm &&
132-
sender is Control
133-
{
134-
DataContext: ViewModels.InteractiveRebaseItem item,
135-
Tag: Models.InteractiveRebaseAction action
136-
})
137-
vm.ChangeAction(item, action);
133+
if (DataContext is not ViewModels.InteractiveRebase vm)
134+
return;
135+
136+
if (sender is not Button { DataContext: ViewModels.InteractiveRebaseItem item } button)
137+
return;
138138

139+
var flyout = new MenuFlyout();
140+
flyout.Placement = PlacementMode.BottomEdgeAlignedLeft;
141+
flyout.VerticalOffset = -4;
142+
143+
CreateActionMenuItem(flyout, Brushes.Green, "Pick", "Use this commit", "P", item, Models.InteractiveRebaseAction.Pick);
144+
CreateActionMenuItem(flyout, Brushes.Orange, "Edit", "Stop for amending", "E", item, Models.InteractiveRebaseAction.Edit);
145+
CreateActionMenuItem(flyout, Brushes.Orange, "Reword", "Edit the commit message", "R", item, Models.InteractiveRebaseAction.Reword);
146+
147+
if (item.CanSquashOrFixup)
148+
{
149+
CreateActionMenuItem(flyout, Brushes.LightGray, "Squash", "Meld into previous commit", "S", item, Models.InteractiveRebaseAction.Squash);
150+
CreateActionMenuItem(flyout, Brushes.LightGray, "Fixup", "Like 'Squash' but discard message", "F", item, Models.InteractiveRebaseAction.Fixup);
151+
}
152+
153+
CreateActionMenuItem(flyout, Brushes.Red, "Drop", "Remove commit", "D", item, Models.InteractiveRebaseAction.Drop);
154+
155+
flyout.ShowAt(button);
139156
e.Handled = true;
140157
}
141158

@@ -163,5 +180,46 @@ private async void OnStartJobs(object _1, RoutedEventArgs _2)
163180
Running.IsVisible = false;
164181
Close();
165182
}
183+
184+
private void CreateActionMenuItem(MenuFlyout flyout, IBrush iconBrush, string label, string desc, string hotkey, ViewModels.InteractiveRebaseItem item, Models.InteractiveRebaseAction action)
185+
{
186+
var header = new Grid()
187+
{
188+
ColumnDefinitions =
189+
[
190+
new ColumnDefinition(64, GridUnitType.Pixel),
191+
new ColumnDefinition(240, GridUnitType.Pixel),
192+
],
193+
Children =
194+
{
195+
new TextBlock()
196+
{
197+
[Grid.ColumnProperty] = 0,
198+
Margin = new Thickness(4, 0),
199+
Text = label
200+
},
201+
new TextBlock()
202+
{
203+
[Grid.ColumnProperty] = 1,
204+
Text = desc,
205+
Foreground = this.FindResource("Brush.FG2") as SolidColorBrush,
206+
}
207+
}
208+
};
209+
210+
var menuItem = new MenuItem();
211+
menuItem.Icon = new Ellipse() { Width = 14, Height = 14, Fill = iconBrush };
212+
menuItem.Header = header;
213+
menuItem.Tag = hotkey;
214+
menuItem.Click += (_, e) =>
215+
{
216+
if (DataContext is ViewModels.InteractiveRebase vm)
217+
vm.ChangeAction(item, action);
218+
219+
e.Handled = true;
220+
};
221+
222+
flyout.Items.Add(menuItem);
223+
}
166224
}
167225
}

src/Views/MenuItemExtension.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)