@@ -34,6 +34,10 @@ export class ScmGroupedView implements Disposable {
3434 private _cleared : Deferred < void > | undefined ;
3535 private _clearLoadingTimer : ReturnType < typeof setTimeout > | undefined ;
3636 private readonly _disposable : Disposable ;
37+ private _lastSelectedByView = new Map <
38+ GroupableTreeViewTypes ,
39+ { node : ViewNode ; parents : ViewNode [ ] | undefined ; expanded : boolean }
40+ > ( ) ;
3741 private _loaded : Deferred < void > | undefined ;
3842 private _onDidChangeTreeData : EventEmitter < ViewNode | undefined > | undefined ;
3943 private _tree : TreeView < ViewNode > | undefined ;
@@ -63,6 +67,26 @@ export class ScmGroupedView implements Disposable {
6367 async clearView < T extends GroupableTreeViewTypes > ( type : T ) : Promise < void > {
6468 if ( this . _view == null || this . _view . type === type ) return ;
6569
70+ // Save current selection before switching views
71+ const node : ViewNode | undefined = this . _view . selection ?. [ 0 ] ;
72+ if ( node != null ) {
73+ const parents : ViewNode [ ] = [ ] ;
74+
75+ let parent : ViewNode | undefined = node ;
76+ while ( true ) {
77+ parent = parent . getParent ( ) ;
78+ if ( parent == null ) break ;
79+
80+ parents . unshift ( parent ) ;
81+ }
82+
83+ this . _lastSelectedByView . set ( this . _view . type , {
84+ node : node ,
85+ parents : parents ,
86+ expanded : this . _view . isNodeExpanded ( node ) ,
87+ } ) ;
88+ }
89+
6690 void setContext ( 'gitlens:views:scm:grouped:loading' , true ) ;
6791 clearTimeout ( this . _clearLoadingTimer ) ;
6892
@@ -114,11 +138,39 @@ export class ScmGroupedView implements Disposable {
114138 this . _loaded ?. cancel ( ) ;
115139 this . _loaded = defer < void > ( ) ;
116140 void this . _loaded . promise . then (
117- ( ) => {
141+ async ( ) => {
118142 this . _loaded = undefined ;
119143
120- if ( focus ) {
121- setTimeout ( ( ) => void this . _view ?. show ( { preserveFocus : false } ) , 50 ) ;
144+ const view = this . _view ;
145+ if ( view != null ) {
146+ if ( ! view . visible ) {
147+ await view . show ( { preserveFocus : ! focus } ) ;
148+ }
149+
150+ let selection = this . _lastSelectedByView . get ( type ) ;
151+
152+ setTimeout ( async ( ) => {
153+ if ( selection == null && view . selection ?. length ) {
154+ selection = { node : view . selection [ 0 ] , parents : undefined , expanded : false } ;
155+ }
156+ if ( selection == null ) {
157+ if ( focus ) {
158+ await view . show ( { preserveFocus : false } ) ;
159+ }
160+ return ;
161+ }
162+
163+ const { node, parents, expanded } = selection ;
164+ if ( parents == null ) {
165+ await view . revealDeep ( node , { expand : expanded , focus : focus ?? false , select : true } ) ;
166+ } else {
167+ await view . revealDeep ( node , parents , {
168+ expand : expanded ,
169+ focus : focus ?? false ,
170+ select : true ,
171+ } ) ;
172+ }
173+ } , 50 ) ;
122174 }
123175
124176 this . _clearLoadingTimer = setTimeout (
0 commit comments