|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
3 | | - |
| 3 | +using System.Linq; |
4 | 4 | using Avalonia; |
5 | 5 | using Avalonia.Collections; |
6 | 6 | using Avalonia.Controls; |
|
9 | 9 | using Avalonia.Layout; |
10 | 10 | using Avalonia.Media; |
11 | 11 | using Avalonia.VisualTree; |
| 12 | +using SourceGit.ViewModels; |
12 | 13 |
|
13 | 14 | namespace SourceGit.Views |
14 | 15 | { |
@@ -249,6 +250,17 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang |
249 | 250 |
|
250 | 251 | if (change.Property == RevisionProperty) |
251 | 252 | { |
| 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 | + |
252 | 264 | _tree.Clear(); |
253 | 265 | _rows.Clear(); |
254 | 266 | _searchResult.Clear(); |
@@ -280,10 +292,51 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang |
280 | 292 | var topTree = new List<ViewModels.RevisionFileTreeNode>(); |
281 | 293 | MakeRows(topTree, _tree, 0); |
282 | 294 | _rows.AddRange(topTree); |
| 295 | + |
| 296 | + _revisionFileRowsListBox ??= this.Find<RevisionFileRowsListBox>("RevisionFileRowsListBox"); |
| 297 | + |
| 298 | + if (_revisionFileRowsListBox is { IsArrangeValid: true }) |
| 299 | + { |
| 300 | + RestoreTreeState(expandedObjects, selectedNode); |
| 301 | + } |
| 302 | + |
283 | 303 | GC.Collect(); |
284 | 304 | } |
285 | 305 | } |
286 | 306 |
|
| 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 | + |
287 | 340 | private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e) |
288 | 341 | { |
289 | 342 | if (DataContext is ViewModels.CommitDetail vm && |
@@ -372,5 +425,6 @@ private void MakeRows(List<ViewModels.RevisionFileTreeNode> rows, List<ViewModel |
372 | 425 | private AvaloniaList<ViewModels.RevisionFileTreeNode> _rows = []; |
373 | 426 | private bool _disableSelectionChangingEvent = false; |
374 | 427 | private List<ViewModels.RevisionFileTreeNode> _searchResult = []; |
| 428 | + private RevisionFileRowsListBox _revisionFileRowsListBox; |
375 | 429 | } |
376 | 430 | } |
0 commit comments