1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Linq ;
3
4
using System . IO ;
4
5
using System . Threading . Tasks ;
5
6
using Avalonia ;
11
12
using Avalonia . Media ;
12
13
using Avalonia . Platform . Storage ;
13
14
using Avalonia . VisualTree ;
15
+ using SourceGit . ViewModels ;
14
16
15
17
namespace SourceGit . Views
16
18
{
@@ -132,7 +134,7 @@ protected override async void OnKeyDown(KeyEventArgs e)
132
134
133
135
await App . CopyTextAsync ( path ) ;
134
136
e . Handled = true ;
135
- }
137
+ }
136
138
}
137
139
else if ( node . Backend is { Type : Models . ObjectType . Blob } file &&
138
140
e . Key == Key . S &&
@@ -295,6 +297,17 @@ protected override async void OnPropertyChanged(AvaloniaPropertyChangedEventArgs
295
297
296
298
if ( change . Property == RevisionProperty )
297
299
{
300
+ var selectedNode = _revisionFileRowsListBox ? . SelectedItem as RevisionFileTreeNode ;
301
+
302
+ var expandedObjects = new List < Models . Object > ( ) ;
303
+ foreach ( var node in _rows )
304
+ {
305
+ if ( node . IsExpanded )
306
+ {
307
+ expandedObjects . Add ( node . Backend ) ;
308
+ }
309
+ }
310
+
298
311
_tree . Clear ( ) ;
299
312
_searchResult . Clear ( ) ;
300
313
@@ -324,10 +337,51 @@ protected override async void OnPropertyChanged(AvaloniaPropertyChangedEventArgs
324
337
325
338
Rows . Clear ( ) ;
326
339
Rows . AddRange ( topTree ) ;
340
+
341
+ _revisionFileRowsListBox ??= this . Find < RevisionFileRowsListBox > ( "RevisionFileRowsListBox" ) ;
342
+
343
+ if ( _revisionFileRowsListBox is { IsArrangeValid : true } )
344
+ {
345
+ RestoreTreeState ( expandedObjects , selectedNode ) ;
346
+ }
347
+
327
348
GC . Collect ( ) ;
328
349
}
329
350
}
330
351
352
+ private void RestoreTreeState ( List < Models . Object > expandedObjects , RevisionFileTreeNode selectedNode )
353
+ {
354
+ for ( int i = 0 ; i < _rows . Count ; i ++ )
355
+ {
356
+ var revisionFileTreeNode = _rows [ i ] ;
357
+
358
+ if ( ! revisionFileTreeNode . IsFolder )
359
+ continue ;
360
+
361
+ if ( expandedObjects . FirstOrDefault ( o => o . SHA == revisionFileTreeNode . Backend . SHA || o . Path == revisionFileTreeNode . Backend . Path ) != null )
362
+ {
363
+ ToggleNodeIsExpanded ( revisionFileTreeNode ) ;
364
+ }
365
+ }
366
+
367
+ if ( selectedNode != null )
368
+ {
369
+ foreach ( var node in _rows )
370
+ {
371
+ if ( node . Backend . SHA != selectedNode . Backend . SHA && node . Backend . Path != selectedNode . Backend . Path )
372
+ continue ;
373
+
374
+ selectedNode = node ;
375
+ break ;
376
+ }
377
+ }
378
+
379
+ if ( _revisionFileRowsListBox != null )
380
+ {
381
+ _revisionFileRowsListBox . SelectedItem = selectedNode ;
382
+ }
383
+ }
384
+
331
385
private void OnTreeNodeContextRequested ( object sender , ContextRequestedEventArgs e )
332
386
{
333
387
if ( DataContext is ViewModels . CommitDetail { Repository : ViewModels . Repository repo , Commit : Models . Commit commit } vm &&
@@ -339,7 +393,7 @@ private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs
339
393
_ => CreateRevisionFileContextMenu ( repo , vm , commit , obj ) ,
340
394
} ;
341
395
menu . Open ( grid ) ;
342
- }
396
+ }
343
397
344
398
e . Handled = true ;
345
399
}
@@ -363,9 +417,9 @@ private async void OnRowsSelectionChanged(object sender, SelectionChangedEventAr
363
417
364
418
if ( sender is ListBox { SelectedItem : ViewModels . RevisionFileTreeNode { IsFolder : false } node } )
365
419
await vm . ViewRevisionFileAsync ( node . Backend ) ;
366
- else
420
+ else
367
421
await vm . ViewRevisionFileAsync ( null ) ;
368
- }
422
+ }
369
423
370
424
private async Task < List < ViewModels . RevisionFileTreeNode > > GetChildrenOfTreeNodeAsync ( ViewModels . RevisionFileTreeNode node )
371
425
{
@@ -671,5 +725,6 @@ public ContextMenu CreateRevisionFileContextMenu(ViewModels.Repository repo, Vie
671
725
private List < ViewModels . RevisionFileTreeNode > _tree = [ ] ;
672
726
private bool _disableSelectionChangingEvent = false ;
673
727
private List < ViewModels . RevisionFileTreeNode > _searchResult = [ ] ;
728
+ private RevisionFileRowsListBox _revisionFileRowsListBox ;
674
729
}
675
730
}
0 commit comments