diff --git a/src/Views/RevisionFileTreeView.axaml b/src/Views/RevisionFileTreeView.axaml index 7266c429..4cebde28 100644 --- a/src/Views/RevisionFileTreeView.axaml +++ b/src/Views/RevisionFileTreeView.axaml @@ -8,7 +8,7 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="SourceGit.Views.RevisionFileTreeView" x:Name="ThisControl"> - (); + foreach (var node in _rows) + { + if (node.IsExpanded) + { + expandedObjects.Add(node.Backend); + } + } + _tree.Clear(); _rows.Clear(); _searchResult.Clear(); @@ -280,10 +292,51 @@ namespace SourceGit.Views var topTree = new List(); MakeRows(topTree, _tree, 0); _rows.AddRange(topTree); + + _revisionFileRowsListBox ??= this.Find("RevisionFileRowsListBox"); + + if (_revisionFileRowsListBox is { IsArrangeValid: true }) + { + RestoreTreeState(expandedObjects, selectedNode); + } + GC.Collect(); } } + private void RestoreTreeState(List expandedObjects, RevisionFileTreeNode selectedNode) + { + for (int i = 0; i < _rows.Count; i++) + { + var revisionFileTreeNode = _rows[i]; + + if (!revisionFileTreeNode.IsFolder) + continue; + + if (expandedObjects.FirstOrDefault(o => o.SHA == revisionFileTreeNode.Backend.SHA || o.Path == revisionFileTreeNode.Backend.Path) != null) + { + ToggleNodeIsExpanded(revisionFileTreeNode); + } + } + + if (selectedNode != null) + { + foreach (var node in _rows) + { + if (node.Backend.SHA != selectedNode.Backend.SHA && node.Backend.Path != selectedNode.Backend.Path) + continue; + + selectedNode = node; + break; + } + } + + if (_revisionFileRowsListBox != null) + { + _revisionFileRowsListBox.SelectedItem = selectedNode; + } + } + private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e) { if (DataContext is ViewModels.CommitDetail vm && @@ -372,5 +425,6 @@ namespace SourceGit.Views private AvaloniaList _rows = []; private bool _disableSelectionChangingEvent = false; private List _searchResult = []; + private RevisionFileRowsListBox _revisionFileRowsListBox; } }