Skip to content

Commit 4d9069b

Browse files
johanw1232goran-w
authored andcommitted
Fixed feature to preserve the state (expansions and selection) in the 'Files' tab when switching between commits.
1 parent a35e252 commit 4d9069b

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

src/Views/RevisionFileTreeView.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
99
x:Class="SourceGit.Views.RevisionFileTreeView"
1010
x:Name="ThisControl">
11-
<v:RevisionFileRowsListBox ItemsSource="{Binding #ThisControl.Rows}"
11+
<v:RevisionFileRowsListBox x:Name="RevisionFileRowsListBox" ItemsSource="{Binding #ThisControl.Rows}"
1212
Background="Transparent"
1313
SelectionMode="Single"
1414
SelectionChanged="OnRowsSelectionChanged"

src/Views/RevisionFileTreeView.axaml.cs

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.IO;
45
using System.Threading.Tasks;
56
using Avalonia;
@@ -11,6 +12,7 @@
1112
using Avalonia.Media;
1213
using Avalonia.Platform.Storage;
1314
using Avalonia.VisualTree;
15+
using SourceGit.ViewModels;
1416

1517
namespace SourceGit.Views
1618
{
@@ -132,7 +134,7 @@ protected override async void OnKeyDown(KeyEventArgs e)
132134

133135
await App.CopyTextAsync(path);
134136
e.Handled = true;
135-
}
137+
}
136138
}
137139
else if (node.Backend is { Type: Models.ObjectType.Blob } file &&
138140
e.Key == Key.S &&
@@ -295,6 +297,17 @@ protected override async void OnPropertyChanged(AvaloniaPropertyChangedEventArgs
295297

296298
if (change.Property == RevisionProperty)
297299
{
300+
var selectedNode = _revisionFileRowsListBox?.SelectedItem as RevisionFileTreeNode;
301+
302+
var expandedObjects = new List<Models.Object>();
303+
foreach (var node in _rows)
304+
{
305+
if (node.IsExpanded)
306+
{
307+
expandedObjects.Add(node.Backend);
308+
}
309+
}
310+
298311
_tree.Clear();
299312
_searchResult.Clear();
300313

@@ -324,10 +337,51 @@ protected override async void OnPropertyChanged(AvaloniaPropertyChangedEventArgs
324337

325338
Rows.Clear();
326339
Rows.AddRange(topTree);
340+
341+
_revisionFileRowsListBox ??= this.Find<RevisionFileRowsListBox>("RevisionFileRowsListBox");
342+
343+
if (_revisionFileRowsListBox is { IsArrangeValid: true })
344+
{
345+
RestoreTreeState(expandedObjects, selectedNode);
346+
}
347+
327348
GC.Collect();
328349
}
329350
}
330351

352+
private void RestoreTreeState(List<Models.Object> expandedObjects, RevisionFileTreeNode selectedNode)
353+
{
354+
for (int i = 0; i < _rows.Count; i++)
355+
{
356+
var revisionFileTreeNode = _rows[i];
357+
358+
if (!revisionFileTreeNode.IsFolder)
359+
continue;
360+
361+
if (expandedObjects.FirstOrDefault(o => o.SHA == revisionFileTreeNode.Backend.SHA || o.Path == revisionFileTreeNode.Backend.Path) != null)
362+
{
363+
ToggleNodeIsExpanded(revisionFileTreeNode);
364+
}
365+
}
366+
367+
if (selectedNode != null)
368+
{
369+
foreach (var node in _rows)
370+
{
371+
if (node.Backend.SHA != selectedNode.Backend.SHA && node.Backend.Path != selectedNode.Backend.Path)
372+
continue;
373+
374+
selectedNode = node;
375+
break;
376+
}
377+
}
378+
379+
if (_revisionFileRowsListBox != null)
380+
{
381+
_revisionFileRowsListBox.SelectedItem = selectedNode;
382+
}
383+
}
384+
331385
private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e)
332386
{
333387
if (DataContext is ViewModels.CommitDetail { Repository: ViewModels.Repository repo, Commit: Models.Commit commit } vm &&
@@ -339,7 +393,7 @@ private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs
339393
_ => CreateRevisionFileContextMenu(repo, vm, commit, obj),
340394
};
341395
menu.Open(grid);
342-
}
396+
}
343397

344398
e.Handled = true;
345399
}
@@ -363,9 +417,9 @@ private async void OnRowsSelectionChanged(object sender, SelectionChangedEventAr
363417

364418
if (sender is ListBox { SelectedItem: ViewModels.RevisionFileTreeNode { IsFolder: false } node })
365419
await vm.ViewRevisionFileAsync(node.Backend);
366-
else
420+
else
367421
await vm.ViewRevisionFileAsync(null);
368-
}
422+
}
369423

370424
private async Task<List<ViewModels.RevisionFileTreeNode>> GetChildrenOfTreeNodeAsync(ViewModels.RevisionFileTreeNode node)
371425
{
@@ -671,5 +725,6 @@ public ContextMenu CreateRevisionFileContextMenu(ViewModels.Repository repo, Vie
671725
private List<ViewModels.RevisionFileTreeNode> _tree = [];
672726
private bool _disableSelectionChangingEvent = false;
673727
private List<ViewModels.RevisionFileTreeNode> _searchResult = [];
728+
private RevisionFileRowsListBox _revisionFileRowsListBox;
674729
}
675730
}

0 commit comments

Comments
 (0)