|
1 | 1 | using System;
|
2 | 2 | using System.Collections.Generic;
|
3 | | - |
| 3 | +usingSystem.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