Skip to content

Commit b9a24ce

Browse files
committed
feature: add hotkeys to move interactive rebase item up and down (sourcegit-scm#557)
1 parent adca61c commit b9a24ce

File tree

10 files changed

+83
-45
lines changed

10 files changed

+83
-45
lines changed

src/Resources/Locales/de_DE.axaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,6 @@
359359
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">Interaktiver Rebase</x:String>
360360
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">Ziel Branch:</x:String>
361361
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">Auf:</x:String>
362-
<x:String x:Key="Text.InteractiveRebase.MoveUp" xml:space="preserve">Hochschieben</x:String>
363-
<x:String x:Key="Text.InteractiveRebase.MoveDown" xml:space="preserve">Runterschieben</x:String>
364362
<x:String x:Key="Text.Launcher" xml:space="preserve">Source Git</x:String>
365363
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">FEHLER</x:String>
366364
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">INFO</x:String>

src/Resources/Locales/en_US.axaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,6 @@
357357
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">Interactive Rebase</x:String>
358358
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">Target Branch:</x:String>
359359
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">On:</x:String>
360-
<x:String x:Key="Text.InteractiveRebase.MoveUp" xml:space="preserve">Move Up</x:String>
361-
<x:String x:Key="Text.InteractiveRebase.MoveDown" xml:space="preserve">Move Down</x:String>
362360
<x:String x:Key="Text.Launcher" xml:space="preserve">Source Git</x:String>
363361
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ERROR</x:String>
364362
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">NOTICE</x:String>

src/Resources/Locales/fr_FR.axaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,6 @@
345345
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">Interactive Rebase</x:String>
346346
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">Target Branch:</x:String>
347347
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">On:</x:String>
348-
<x:String x:Key="Text.InteractiveRebase.MoveUp" xml:space="preserve">Move Up</x:String>
349-
<x:String x:Key="Text.InteractiveRebase.MoveDown" xml:space="preserve">Move Down</x:String>
350348
<x:String x:Key="Text.Launcher" xml:space="preserve">Source Git</x:String>
351349
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ERROR</x:String>
352350
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">NOTICE</x:String>

src/Resources/Locales/pt_BR.axaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,8 +340,6 @@
340340
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">Rebase Interativo</x:String>
341341
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">Ramo Alvo:</x:String>
342342
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">Em:</x:String>
343-
<x:String x:Key="Text.InteractiveRebase.MoveUp" xml:space="preserve">Mover Para Cima</x:String>
344-
<x:String x:Key="Text.InteractiveRebase.MoveDown" xml:space="preserve">Mover Para Baixo</x:String>
345343
<x:String x:Key="Text.Launcher" xml:space="preserve">Source Git</x:String>
346344
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ERRO</x:String>
347345
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">AVISO</x:String>

src/Resources/Locales/ru_RU.axaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,6 @@
359359
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">Интерактивное перемещение</x:String>
360360
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">Целевая ветка:</x:String>
361361
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">На:</x:String>
362-
<x:String x:Key="Text.InteractiveRebase.MoveUp" xml:space="preserve">Вверх</x:String>
363-
<x:String x:Key="Text.InteractiveRebase.MoveDown" xml:space="preserve">Вниз</x:String>
364362
<x:String x:Key="Text.Launcher" xml:space="preserve">Source Git</x:String>
365363
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ОШИБКА</x:String>
366364
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">УВЕДОМЛЕНИЕ</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,6 @@
360360
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">交互式变基</x:String>
361361
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">目标分支 :</x:String>
362362
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">起始提交 :</x:String>
363-
<x:String x:Key="Text.InteractiveRebase.MoveUp" xml:space="preserve">向上移动</x:String>
364-
<x:String x:Key="Text.InteractiveRebase.MoveDown" xml:space="preserve">向下移动</x:String>
365363
<x:String x:Key="Text.Launcher" xml:space="preserve">Source Git</x:String>
366364
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">出错了</x:String>
367365
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系统提示</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,6 @@
360360
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">互動式重定基底</x:String>
361361
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">目標分支:</x:String>
362362
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">起始提交:</x:String>
363-
<x:String x:Key="Text.InteractiveRebase.MoveUp" xml:space="preserve">向上移動</x:String>
364-
<x:String x:Key="Text.InteractiveRebase.MoveDown" xml:space="preserve">向下移動</x:String>
365363
<x:String x:Key="Text.Launcher" xml:space="preserve">Source Git</x:String>
366364
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">發生錯誤</x:String>
367365
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系統提示</x:String>

src/ViewModels/InteractiveRebase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public void MoveItemUp(InteractiveRebaseItem item)
140140
var prev = Items[idx - 1];
141141
Items.RemoveAt(idx - 1);
142142
Items.Insert(idx, prev);
143+
SelectedItem = item;
143144
}
144145
}
145146

@@ -151,6 +152,7 @@ public void MoveItemDown(InteractiveRebaseItem item)
151152
var next = Items[idx + 1];
152153
Items.RemoveAt(idx + 1);
153154
Items.Insert(idx, next);
155+
SelectedItem = item;
154156
}
155157
}
156158

src/Views/InteractiveRebase.axaml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@
5959
<!-- Body -->
6060
<Border Grid.Row="2" Margin="8,0,8,8" BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}">
6161
<Grid RowDefinitions="*,3,*">
62-
<ListBox Grid.Row="0"
63-
Background="{DynamicResource Brush.Contents}"
64-
ItemsSource="{Binding Items}"
65-
SelectionMode="Single"
66-
SelectedItem="{Binding SelectedItem, Mode=OneWayToSource}"
67-
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
68-
ScrollViewer.VerticalScrollBarVisibility="Auto"
69-
KeyDown="OnItemsListBoxKeyDown">
62+
<v:InteractiveRebaseListBox Grid.Row="0"
63+
Focusable="True"
64+
Background="{DynamicResource Brush.Contents}"
65+
ItemsSource="{Binding Items}"
66+
SelectionMode="Single"
67+
SelectedItem="{Binding SelectedItem, Mode=OneWayToSource}"
68+
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
69+
ScrollViewer.VerticalScrollBarVisibility="Auto">
7070
<ListBox.Styles>
7171
<Style Selector="ListBoxItem">
7272
<Setter Property="Margin" Value="0"/>
@@ -213,18 +213,18 @@
213213
<TextBlock Grid.Column="6" Classes="primary" Text="{Binding Commit.CommitterTimeStr}" Margin="8,0"/>
214214

215215
<!-- MoveUp Button -->
216-
<Button Grid.Column="7" Classes="icon_button" Click="OnMoveItemUp" ToolTip.Tip="{DynamicResource Text.InteractiveRebase.MoveUp}">
216+
<Button Grid.Column="7" Classes="icon_button" Click="OnMoveItemUp" ToolTip.Tip="Alt+Up">
217217
<Path Width="14" Height="14" Margin="0,4,0,0" Data="{StaticResource Icons.Up}"/>
218218
</Button>
219219

220220
<!-- MoveDown Button -->
221-
<Button Grid.Column="8" Classes="icon_button" Click="OnMoveItemDown" ToolTip.Tip="{DynamicResource Text.InteractiveRebase.MoveDown}">
221+
<Button Grid.Column="8" Classes="icon_button" Click="OnMoveItemDown" ToolTip.Tip="Alt+Down">
222222
<Path Width="14" Height="14" Margin="0,4,0,0" Data="{StaticResource Icons.Down}"/>
223223
</Button>
224224
</Grid>
225225
</DataTemplate>
226226
</ListBox.ItemTemplate>
227-
</ListBox>
227+
</v:InteractiveRebaseListBox>
228228

229229
<v:LoadingIcon Grid.Row="0" Width="48" Height="48" HorizontalAlignment="Center" VerticalAlignment="Center" IsVisible="{Binding IsLoading}"/>
230230

src/Views/InteractiveRebase.axaml.cs

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,79 @@
1+
using System;
2+
13
using Avalonia.Controls;
24
using Avalonia.Input;
35
using Avalonia.Interactivity;
46

57
namespace SourceGit.Views
68
{
9+
public class InteractiveRebaseListBox : ListBox
10+
{
11+
protected override Type StyleKeyOverride => typeof(ListBox);
12+
13+
/// <summary>
14+
/// Prevent ListBox handle the arrow keys.
15+
/// </summary>
16+
/// <param name="e"></param>
17+
protected override void OnKeyDown(KeyEventArgs e)
18+
{
19+
var vm = DataContext as ViewModels.InteractiveRebase;
20+
if (vm == null)
21+
return;
22+
23+
var item = vm.SelectedItem;
24+
if (item == null)
25+
{
26+
base.OnKeyDown(e);
27+
return;
28+
}
29+
30+
if (e.Key == Key.P)
31+
{
32+
item.SetAction(Models.InteractiveRebaseAction.Pick);
33+
e.Handled = true;
34+
}
35+
else if (e.Key == Key.E)
36+
{
37+
item.SetAction(Models.InteractiveRebaseAction.Edit);
38+
e.Handled = true;
39+
}
40+
else if (e.Key == Key.R)
41+
{
42+
item.SetAction(Models.InteractiveRebaseAction.Reword);
43+
e.Handled = true;
44+
}
45+
else if (e.Key == Key.S)
46+
{
47+
item.SetAction(Models.InteractiveRebaseAction.Squash);
48+
e.Handled = true;
49+
}
50+
else if (e.Key == Key.F)
51+
{
52+
item.SetAction(Models.InteractiveRebaseAction.Fixup);
53+
e.Handled = true;
54+
}
55+
else if (e.Key == Key.D)
56+
{
57+
item.SetAction(Models.InteractiveRebaseAction.Drop);
58+
e.Handled = true;
59+
}
60+
else if (e.KeyModifiers == KeyModifiers.Alt && e.Key == Key.Up)
61+
{
62+
vm.MoveItemUp(item);
63+
e.Handled = true;
64+
}
65+
else if (e.KeyModifiers == KeyModifiers.Alt && e.Key == Key.Down)
66+
{
67+
vm.MoveItemDown(item);
68+
e.Handled = true;
69+
}
70+
else
71+
{
72+
base.OnKeyDown(e);
73+
}
74+
}
75+
}
76+
777
public partial class InteractiveRebase : ChromelessWindow
878
{
979
public InteractiveRebase()
@@ -89,26 +159,6 @@ private void OnMoveItemDown(object sender, RoutedEventArgs e)
89159
}
90160
}
91161

92-
private void OnItemsListBoxKeyDown(object sender, KeyEventArgs e)
93-
{
94-
var item = (sender as ListBox)?.SelectedItem as ViewModels.InteractiveRebaseItem;
95-
if (item == null)
96-
return;
97-
98-
if (e.Key == Key.P)
99-
item.SetAction(Models.InteractiveRebaseAction.Pick);
100-
else if (e.Key == Key.E)
101-
item.SetAction(Models.InteractiveRebaseAction.Edit);
102-
else if (e.Key == Key.R)
103-
item.SetAction(Models.InteractiveRebaseAction.Reword);
104-
else if (e.Key == Key.S)
105-
item.SetAction(Models.InteractiveRebaseAction.Squash);
106-
else if (e.Key == Key.F)
107-
item.SetAction(Models.InteractiveRebaseAction.Fixup);
108-
else if (e.Key == Key.D)
109-
item.SetAction(Models.InteractiveRebaseAction.Drop);
110-
}
111-
112162
private async void StartJobs(object _1, RoutedEventArgs _2)
113163
{
114164
var vm = DataContext as ViewModels.InteractiveRebase;

0 commit comments

Comments
 (0)