Skip to content

Commit 633242b

Browse files
committed
Fixed feature to preserve the state (expansions and selection) in the 'Files' tab when switching between commits.
1 parent f716c5e commit 633242b

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
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: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3-
3+
using System.Linq;
44
using Avalonia;
55
using Avalonia.Collections;
66
using Avalonia.Controls;
@@ -9,6 +9,7 @@
99
using Avalonia.Layout;
1010
using Avalonia.Media;
1111
using Avalonia.VisualTree;
12+
using SourceGit.ViewModels;
1213

1314
namespace SourceGit.Views
1415
{
@@ -249,6 +250,17 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
249250

250251
if (change.Property == RevisionProperty)
251252
{
253+
var selectedNode = _revisionFileRowsListBox?.SelectedItem as RevisionFileTreeNode;
254+
255+
var expandedObjects = new List<Models.Object>();
256+
foreach (var node in _rows)
257+
{
258+
if (node.IsExpanded)
259+
{
260+
expandedObjects.Add(node.Backend);
261+
}
262+
}
263+
252264
_tree.Clear();
253265
_rows.Clear();
254266
_searchResult.Clear();
@@ -280,10 +292,51 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
280292
var topTree = new List<ViewModels.RevisionFileTreeNode>();
281293
MakeRows(topTree, _tree, 0);
282294
_rows.AddRange(topTree);
295+
296+
_revisionFileRowsListBox ??= this.Find<RevisionFileRowsListBox>("RevisionFileRowsListBox");
297+
298+
if (_revisionFileRowsListBox is { IsArrangeValid: true })
299+
{
300+
RestoreTreeState(expandedObjects, selectedNode);
301+
}
302+
283303
GC.Collect();
284304
}
285305
}
286306

307+
private void RestoreTreeState(List<Models.Object> expandedObjects, RevisionFileTreeNode selectedNode)
308+
{
309+
for (int i = 0; i < _rows.Count; i++)
310+
{
311+
var revisionFileTreeNode = _rows[i];
312+
313+
if (!revisionFileTreeNode.IsFolder)
314+
continue;
315+
316+
if (expandedObjects.FirstOrDefault(o => o.SHA == revisionFileTreeNode.Backend.SHA || o.Path == revisionFileTreeNode.Backend.Path) != null)
317+
{
318+
ToggleNodeIsExpanded(revisionFileTreeNode);
319+
}
320+
}
321+
322+
if (selectedNode != null)
323+
{
324+
foreach (var node in _rows)
325+
{
326+
if (node.Backend.SHA != selectedNode.Backend.SHA && node.Backend.Path != selectedNode.Backend.Path)
327+
continue;
328+
329+
selectedNode = node;
330+
break;
331+
}
332+
}
333+
334+
if (_revisionFileRowsListBox != null)
335+
{
336+
_revisionFileRowsListBox.SelectedItem = selectedNode;
337+
}
338+
}
339+
287340
private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e)
288341
{
289342
if (DataContext is ViewModels.CommitDetail vm &&
@@ -372,5 +425,6 @@ private void MakeRows(List<ViewModels.RevisionFileTreeNode> rows, List<ViewModel
372425
private AvaloniaList<ViewModels.RevisionFileTreeNode> _rows = [];
373426
private bool _disableSelectionChangingEvent = false;
374427
private List<ViewModels.RevisionFileTreeNode> _searchResult = [];
428+
private RevisionFileRowsListBox _revisionFileRowsListBox;
375429
}
376430
}

0 commit comments

Comments
 (0)