Skip to content

Commit 07cba1c

Browse files
committed
feature: support using left/right arrow to expand/collapse tree node (#463)
1 parent 01380ff commit 07cba1c

File tree

5 files changed

+82
-37
lines changed

5 files changed

+82
-37
lines changed

src/Views/ChangeCollectionView.axaml.cs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,16 @@ public class ChangeCollectionContainer : ListBox
3333

3434
protected override void OnKeyDown(KeyEventArgs e)
3535
{
36-
if (e.Key != Key.Space)
36+
if (SelectedItems is [ViewModels.ChangeTreeNode { IsFolder: true } node] && e.KeyModifiers == KeyModifiers.None)
37+
{
38+
if ((node.IsExpanded && e.Key == Key.Left) || (!node.IsExpanded && e.Key == Key.Right))
39+
{
40+
this.FindAncestorOfType<ChangeCollectionView>()?.ToggleNodeIsExpanded(node);
41+
e.Handled = true;
42+
}
43+
}
44+
45+
if (!e.Handled && e.Key != Key.Space)
3746
base.OnKeyDown(e);
3847
}
3948
}
@@ -157,13 +166,11 @@ public Models.Change GetNextChangeWithoutSelection()
157166
{
158167
if (lastUnselected == -1)
159168
continue;
160-
else
161-
break;
162-
}
163-
else
164-
{
165-
lastUnselected = i;
169+
170+
break;
166171
}
172+
173+
lastUnselected = i;
167174
}
168175
}
169176

@@ -179,13 +186,11 @@ public Models.Change GetNextChangeWithoutSelection()
179186
{
180187
if (lastUnselected == -1)
181188
continue;
182-
else
183-
break;
184-
}
185-
else
186-
{
187-
lastUnselected = i;
189+
190+
break;
188191
}
192+
193+
lastUnselected = i;
189194
}
190195

191196
if (lastUnselected != -1)
@@ -239,9 +244,9 @@ private void OnRowSelectionChanged(object sender, SelectionChangedEventArgs _)
239244
_disableSelectionChangingEvent = true;
240245

241246
var selected = new List<Models.Change>();
242-
if (sender is ListBox list)
247+
if (sender is ListBox { SelectedItems: {} selectedItems })
243248
{
244-
foreach (var item in list.SelectedItems)
249+
foreach (var item in selectedItems)
245250
{
246251
if (item is Models.Change c)
247252
selected.Add(c);

src/Views/RevisionFileTreeView.axaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
99
x:Class="SourceGit.Views.RevisionFileTreeView"
1010
x:Name="ThisControl">
11-
<ListBox ItemsSource="{Binding #ThisControl.Rows}"
12-
Background="Transparent"
13-
SelectionMode="Single"
14-
SelectionChanged="OnRowsSelectionChanged"
15-
ScrollViewer.HorizontalScrollBarVisibility="Auto"
16-
ScrollViewer.VerticalScrollBarVisibility="Auto">
11+
<v:RevisionFileRowsListBox ItemsSource="{Binding #ThisControl.Rows}"
12+
Background="Transparent"
13+
SelectionMode="Single"
14+
SelectionChanged="OnRowsSelectionChanged"
15+
ScrollViewer.HorizontalScrollBarVisibility="Auto"
16+
ScrollViewer.VerticalScrollBarVisibility="Auto">
1717
<ListBox.ItemsPanel>
1818
<ItemsPanelTemplate>
1919
<VirtualizingStackPanel Orientation="Vertical"/>
@@ -46,5 +46,5 @@
4646
</Grid>
4747
</DataTemplate>
4848
</ListBox.ItemTemplate>
49-
</ListBox>
49+
</v:RevisionFileRowsListBox>
5050
</UserControl>

src/Views/RevisionFileTreeView.axaml.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,26 @@ private void CreateContent(string iconKey, Thickness margin, IBrush fill = null)
103103
}
104104
}
105105

106+
public class RevisionFileRowsListBox : ListBox
107+
{
108+
protected override Type StyleKeyOverride => typeof(ListBox);
109+
110+
protected override void OnKeyDown(KeyEventArgs e)
111+
{
112+
if (SelectedItems is [ViewModels.RevisionFileTreeNode { IsFolder: true } node] && e.KeyModifiers == KeyModifiers.None)
113+
{
114+
if ((node.IsExpanded && e.Key == Key.Left) || (!node.IsExpanded && e.Key == Key.Right))
115+
{
116+
this.FindAncestorOfType<RevisionFileTreeView>()?.ToggleNodeIsExpanded(node);
117+
e.Handled = true;
118+
}
119+
}
120+
121+
if (!e.Handled)
122+
base.OnKeyDown(e);
123+
}
124+
}
125+
106126
public partial class RevisionFileTreeView : UserControl
107127
{
108128
public static readonly StyledProperty<string> RevisionProperty =
@@ -285,8 +305,8 @@ private void MakeRows(List<ViewModels.RevisionFileTreeNode> rows, List<ViewModel
285305
}
286306
}
287307

288-
private List<ViewModels.RevisionFileTreeNode> _tree = new List<ViewModels.RevisionFileTreeNode>();
289-
private AvaloniaList<ViewModels.RevisionFileTreeNode> _rows = new AvaloniaList<ViewModels.RevisionFileTreeNode>();
308+
private List<ViewModels.RevisionFileTreeNode> _tree = [];
309+
private AvaloniaList<ViewModels.RevisionFileTreeNode> _rows = [];
290310
private bool _disableSelectionChangingEvent = false;
291311
}
292312
}

src/Views/Welcome.axaml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,18 @@
4545
</TextBox>
4646

4747
<!-- Repository Tree -->
48-
<ListBox Grid.Row="1"
49-
x:Name="TreeContainer"
50-
Margin="0,8,8,0"
51-
Focusable="True"
52-
Background="Transparent"
53-
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
54-
ScrollViewer.VerticalScrollBarVisibility="Auto"
55-
ItemsSource="{Binding Rows}"
56-
SelectionMode="Single"
57-
Loaded="SetupTreeViewDragAndDrop"
58-
LostFocus="OnTreeViewLostFocus"
59-
KeyDown="OnTreeViewKeyDown">
48+
<v:RepositoryListBox Grid.Row="1"
49+
x:Name="TreeContainer"
50+
Margin="0,8,8,0"
51+
Focusable="True"
52+
Background="Transparent"
53+
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
54+
ScrollViewer.VerticalScrollBarVisibility="Auto"
55+
ItemsSource="{Binding Rows}"
56+
SelectionMode="Single"
57+
Loaded="SetupTreeViewDragAndDrop"
58+
LostFocus="OnTreeViewLostFocus"
59+
KeyDown="OnTreeViewKeyDown">
6060
<ListBox.Styles>
6161
<Style Selector="ListBox">
6262
<Setter Property="FocusAdorner">
@@ -145,7 +145,7 @@
145145
</Grid>
146146
</DataTemplate>
147147
</ListBox.ItemTemplate>
148-
</ListBox>
148+
</v:RepositoryListBox>
149149
</Grid>
150150
</Grid>
151151

src/Views/Welcome.axaml.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,26 @@ protected override void OnPointerPressed(PointerPressedEventArgs e)
2525
e.Handled = true;
2626
}
2727
}
28+
29+
public class RepositoryListBox : ListBox
30+
{
31+
protected override Type StyleKeyOverride => typeof(ListBox);
32+
33+
protected override void OnKeyDown(KeyEventArgs e)
34+
{
35+
if (SelectedItems is [ViewModels.RepositoryNode { IsRepository: false } node] && e.KeyModifiers == KeyModifiers.None)
36+
{
37+
if ((node.IsExpanded && e.Key == Key.Left) || (!node.IsExpanded && e.Key == Key.Right))
38+
{
39+
ViewModels.Welcome.Instance.ToggleNodeIsExpanded(node);
40+
e.Handled = true;
41+
}
42+
}
43+
44+
if (!e.Handled)
45+
base.OnKeyDown(e);
46+
}
47+
}
2848

2949
public partial class Welcome : UserControl
3050
{

0 commit comments

Comments
 (0)