1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
3
4
using Avalonia ;
4
5
using Avalonia . Controls ;
@@ -14,60 +15,67 @@ public class InteractiveRebaseListBox : ListBox
14
15
{
15
16
protected override Type StyleKeyOverride => typeof ( ListBox ) ;
16
17
17
- /// <summary>
18
- /// Prevent ListBox handle the arrow keys.
19
- /// </summary>
20
- /// <param name="e"></param>
21
18
protected override void OnKeyDown ( KeyEventArgs e )
22
19
{
23
- if ( DataContext is not ViewModels . InteractiveRebase vm )
20
+ if ( DataContext is not ViewModels . InteractiveRebase vm || SelectedItems == null )
24
21
return ;
25
22
26
- var item = vm . SelectedItem ;
27
- if ( item == null )
23
+ var items = new List < ViewModels . InteractiveRebaseItem > ( ) ;
24
+ foreach ( var item in SelectedItems )
25
+ {
26
+ if ( item is ViewModels . InteractiveRebaseItem rebaseItem )
27
+ items . Add ( rebaseItem ) ;
28
+ }
29
+
30
+ if ( items . Count == 0 )
28
31
{
29
32
base . OnKeyDown ( e ) ;
30
33
return ;
31
34
}
32
35
33
36
if ( e . Key == Key . P )
34
37
{
35
- vm . ChangeAction ( item , Models . InteractiveRebaseAction . Pick ) ;
38
+ vm . ChangeAction ( items , Models . InteractiveRebaseAction . Pick ) ;
36
39
MoveSelection ( NavigationDirection . Next ) ;
37
40
e . Handled = true ;
38
41
}
39
42
else if ( e . Key == Key . E )
40
43
{
41
- vm . ChangeAction ( item , Models . InteractiveRebaseAction . Edit ) ;
44
+ vm . ChangeAction ( items , Models . InteractiveRebaseAction . Edit ) ;
42
45
MoveSelection ( NavigationDirection . Next ) ;
43
46
e . Handled = true ;
44
47
}
45
48
else if ( e . Key == Key . R )
46
49
{
47
- vm . ChangeAction ( item , Models . InteractiveRebaseAction . Reword ) ;
48
- MoveSelection ( NavigationDirection . Next ) ;
50
+ vm . ChangeAction ( items , Models . InteractiveRebaseAction . Reword ) ;
51
+ if ( items . Count == 1 )
52
+ this . FindAncestorOfType < InteractiveRebase > ( ) ? . OpenCommitMessageEditor ( items [ 0 ] ) ;
53
+ else
54
+ MoveSelection ( NavigationDirection . Next ) ;
55
+
49
56
e . Handled = true ;
50
57
}
51
58
else if ( e . Key == Key . S )
52
59
{
53
- vm . ChangeAction ( item , Models . InteractiveRebaseAction . Squash ) ;
60
+ vm . ChangeAction ( items , Models . InteractiveRebaseAction . Squash ) ;
54
61
MoveSelection ( NavigationDirection . Next ) ;
55
62
e . Handled = true ;
56
63
}
57
64
else if ( e . Key == Key . F )
58
65
{
59
- vm . ChangeAction ( item , Models . InteractiveRebaseAction . Fixup ) ;
66
+ vm . ChangeAction ( items , Models . InteractiveRebaseAction . Fixup ) ;
60
67
MoveSelection ( NavigationDirection . Next ) ;
61
68
e . Handled = true ;
62
69
}
63
70
else if ( e . Key == Key . D )
64
71
{
65
- vm . ChangeAction ( item , Models . InteractiveRebaseAction . Drop ) ;
72
+ vm . ChangeAction ( items , Models . InteractiveRebaseAction . Drop ) ;
66
73
MoveSelection ( NavigationDirection . Next ) ;
67
74
e . Handled = true ;
68
75
}
69
- else if ( e . KeyModifiers . HasFlag ( OperatingSystem . IsMacOS ( ) ? KeyModifiers . Meta : KeyModifiers . Control ) )
76
+ else if ( e . KeyModifiers . HasFlag ( OperatingSystem . IsMacOS ( ) ? KeyModifiers . Meta : KeyModifiers . Control ) && items . Count == 1 )
70
77
{
78
+ var item = items [ 0 ] ;
71
79
if ( e . Key == Key . Up )
72
80
{
73
81
vm . MoveItemUp ( item ) ;
@@ -93,6 +101,13 @@ public InteractiveRebase()
93
101
InitializeComponent ( ) ;
94
102
}
95
103
104
+ public void OpenCommitMessageEditor ( ViewModels . InteractiveRebaseItem item )
105
+ {
106
+ var dialog = new CommitMessageEditor ( ) ;
107
+ dialog . AsBuiltin ( item . FullMessage , msg => item . FullMessage = msg ) ;
108
+ dialog . ShowDialog ( this ) ;
109
+ }
110
+
96
111
protected override void OnLoaded ( RoutedEventArgs e )
97
112
{
98
113
base . OnLoaded ( e ) ;
@@ -108,19 +123,25 @@ private void CloseWindow(object _1, RoutedEventArgs _2)
108
123
109
124
private void OnRowsSelectionChanged ( object sender , SelectionChangedEventArgs e )
110
125
{
111
- if ( ! _firstSelectionChangedHandled &&
112
- sender is InteractiveRebaseListBox list &&
113
- list . SelectedItem is ViewModels . InteractiveRebaseItem item )
114
- {
126
+ if ( DataContext is not ViewModels . InteractiveRebase vm || sender is not InteractiveRebaseListBox listBox )
127
+ return ;
128
+
129
+ var isFirstTimeHere = ! _firstSelectionChangedHandled ;
130
+ if ( isFirstTimeHere )
115
131
_firstSelectionChangedHandled = true ;
116
132
117
- if ( item . Action == Models . InteractiveRebaseAction . Reword )
118
- {
119
- var dialog = new CommitMessageEditor ( ) ;
120
- dialog . AsBuiltin ( item . FullMessage , msg => item . FullMessage = msg ) ;
121
- dialog . ShowDialog ( this ) ;
122
- }
133
+ var selected = listBox . SelectedItems ?? new List < object > ( ) ;
134
+ var items = new List < ViewModels . InteractiveRebaseItem > ( ) ;
135
+ foreach ( var item in selected )
136
+ {
137
+ if ( item is ViewModels . InteractiveRebaseItem rebaseItem )
138
+ items . Add ( rebaseItem ) ;
123
139
}
140
+
141
+ vm . SelectCommits ( items ) ;
142
+
143
+ if ( items . Count == 1 && isFirstTimeHere && items [ 0 ] . Action == Models . InteractiveRebaseAction . Reword )
144
+ OpenCommitMessageEditor ( items [ 0 ] ) ;
124
145
}
125
146
126
147
private void OnSetupRowHeaderDragDrop ( object sender , RoutedEventArgs e )
@@ -201,11 +222,7 @@ private void OnButtonActionClicked(object sender, RoutedEventArgs e)
201
222
private void OnOpenCommitMessageEditor ( object sender , RoutedEventArgs e )
202
223
{
203
224
if ( sender is Button { DataContext : ViewModels . InteractiveRebaseItem item } )
204
- {
205
- var dialog = new CommitMessageEditor ( ) ;
206
- dialog . AsBuiltin ( item . FullMessage , msg => item . FullMessage = msg ) ;
207
- dialog . ShowDialog ( this ) ;
208
- }
225
+ OpenCommitMessageEditor ( item ) ;
209
226
210
227
e . Handled = true ;
211
228
}
@@ -256,7 +273,12 @@ private void CreateActionMenuItem(MenuFlyout flyout, ViewModels.InteractiveRebas
256
273
menuItem . Click += ( _ , e ) =>
257
274
{
258
275
if ( DataContext is ViewModels . InteractiveRebase vm )
259
- vm . ChangeAction ( item , action ) ;
276
+ {
277
+ vm . ChangeAction ( [ item ] , action ) ;
278
+
279
+ if ( action == Models . InteractiveRebaseAction . Reword )
280
+ OpenCommitMessageEditor ( item ) ;
281
+ }
260
282
261
283
e . Handled = true ;
262
284
} ;
0 commit comments