diff --git a/src/Views/RevisionFileTreeView.axaml b/src/Views/RevisionFileTreeView.axaml index 7266c4295..4cebde283 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(); _searchResult.Clear(); @@ -324,10 +339,51 @@ protected override async void OnPropertyChanged(AvaloniaPropertyChangedEventArgs Rows.Clear(); Rows.AddRange(topTree); + + _revisionFileRowsListBox ??= this.Find("RevisionFileRowsListBox"); + + if (_revisionFileRowsListBox is { IsArrangeValid: true }) + { + RestoreTreeState(expandedObjects, selectedNode); + } + GC.Collect(); } } + private async 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) + { + await ToggleNodeIsExpandedAsync(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 { Repository: ViewModels.Repository repo, Commit: Models.Commit commit } vm && @@ -671,5 +727,6 @@ public ContextMenu CreateRevisionFileContextMenu(ViewModels.Repository repo, Vie private List _tree = []; private bool _disableSelectionChangingEvent = false; private List _searchResult = []; + private RevisionFileRowsListBox _revisionFileRowsListBox; } }