@@ -27,7 +27,7 @@ import { IThemeService, IFileIconTheme } from 'vs/platform/theme/common/themeSer
27
27
import { isSCMResource , isSCMResourceGroup , connectPrimaryMenuToInlineActionBar , isSCMRepository , isSCMInput , collectContextMenuActions , getActionViewItemProvider , isSCMActionButton , isSCMViewService , isSCMHistoryItemGroupTreeElement , isSCMHistoryItemTreeElement , isSCMHistoryItemChangeTreeElement , toDiffEditorArguments , isSCMResourceNode , isSCMHistoryItemChangeNode , isSCMViewSeparator } from './util' ;
28
28
import { WorkbenchCompressibleAsyncDataTree , IOpenEvent } from 'vs/platform/list/browser/listService' ;
29
29
import { IConfigurationService , ConfigurationTarget , IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration' ;
30
- import { disposableTimeout , ThrottledDelayer , Sequencer } from 'vs/base/common/async' ;
30
+ import { disposableTimeout , Sequencer , ThrottledDelayer , Throttler } from 'vs/base/common/async' ;
31
31
import { ITreeNode , ITreeFilter , ITreeSorter , ITreeContextMenuEvent , ITreeDragAndDrop , ITreeDragOverReaction , IAsyncDataSource } from 'vs/base/browser/ui/tree/tree' ;
32
32
import { ResourceTree , IResourceNode } from 'vs/base/common/resourceTree' ;
33
33
import { ICompressibleTreeRenderer , ICompressibleKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/tree/objectTree' ;
@@ -2504,6 +2504,7 @@ export class SCMViewPane extends ViewPane {
2504
2504
private treeScrollTop : number | undefined ;
2505
2505
private treeContainer ! : HTMLElement ;
2506
2506
private tree ! : WorkbenchCompressibleAsyncDataTree < ISCMViewService , TreeElement , FuzzyScore > ;
2507
+ private treeIdentityProvider ! : IIdentityProvider < TreeElement > ;
2507
2508
2508
2509
private listLabels ! : ResourceLabels ;
2509
2510
private inputRenderer ! : InputRenderer ;
@@ -2568,7 +2569,10 @@ export class SCMViewPane extends ViewPane {
2568
2569
2569
2570
private readonly items = new DisposableMap < ISCMRepository , IDisposable > ( ) ;
2570
2571
private readonly visibilityDisposables = new DisposableStore ( ) ;
2571
- private readonly asyncOperationSequencer = new Sequencer ( ) ;
2572
+
2573
+ private readonly treeOperationSequencer = new Sequencer ( ) ;
2574
+ private readonly revealResourceThrottler = new Throttler ( ) ;
2575
+ private readonly updateChildrenThrottler = new Throttler ( ) ;
2572
2576
2573
2577
private viewModeContextKey : IContextKey < ViewMode > ;
2574
2578
private viewSortKeyContextKey : IContextKey < ViewSortKey > ;
@@ -2633,6 +2637,9 @@ export class SCMViewPane extends ViewPane {
2633
2637
2634
2638
this . disposables . add ( this . instantiationService . createInstance ( ScmInputContentProvider ) ) ;
2635
2639
Event . any ( this . scmService . onDidAddRepository , this . scmService . onDidRemoveRepository ) ( ( ) => this . _onDidChangeViewWelcomeState . fire ( ) , this , this . disposables ) ;
2640
+
2641
+ this . disposables . add ( this . revealResourceThrottler ) ;
2642
+ this . disposables . add ( this . updateChildrenThrottler ) ;
2636
2643
}
2637
2644
2638
2645
protected override layoutBody ( height : number | undefined = this . layoutCache . height , width : number | undefined = this . layoutCache . width ) : void {
@@ -2741,6 +2748,8 @@ export class SCMViewPane extends ViewPane {
2741
2748
const treeDataSource = this . instantiationService . createInstance ( SCMTreeDataSource , ( ) => this . viewMode , ( ) => this . alwaysShowRepositories , ( ) => this . showActionButton , ( ) => this . showIncomingChanges , ( ) => this . showOutgoingChanges ) ;
2742
2749
this . disposables . add ( treeDataSource ) ;
2743
2750
2751
+ this . treeIdentityProvider = new SCMResourceIdentityProvider ( ) ;
2752
+
2744
2753
this . tree = this . instantiationService . createInstance (
2745
2754
WorkbenchCompressibleAsyncDataTree ,
2746
2755
'SCM Tree Repo' ,
@@ -2765,7 +2774,7 @@ export class SCMViewPane extends ViewPane {
2765
2774
transformOptimization : false ,
2766
2775
filter : new SCMTreeFilter ( ) ,
2767
2776
dnd : new SCMTreeDragAndDrop ( this . instantiationService ) ,
2768
- identityProvider : new SCMResourceIdentityProvider ( ) ,
2777
+ identityProvider : this . treeIdentityProvider ,
2769
2778
sorter : new SCMTreeSorter ( ( ) => this . viewMode , ( ) => this . viewSortKey ) ,
2770
2779
keyboardNavigationLabelProvider : this . instantiationService . createInstance ( SCMTreeKeyboardNavigationLabelProvider , ( ) => this . viewMode ) ,
2771
2780
overrideStyles : {
@@ -2889,30 +2898,32 @@ export class SCMViewPane extends ViewPane {
2889
2898
return ;
2890
2899
}
2891
2900
2892
- this . asyncOperationSequencer . queue ( async ( ) => {
2893
- for ( const repository of this . scmViewService . visibleRepositories ) {
2894
- const item = this . items . get ( repository ) ;
2901
+ this . revealResourceThrottler . queue (
2902
+ ( ) => this . treeOperationSequencer . queue (
2903
+ async ( ) => {
2904
+ for ( const repository of this . scmViewService . visibleRepositories ) {
2905
+ const item = this . items . get ( repository ) ;
2895
2906
2896
- if ( ! item ) {
2897
- continue ;
2898
- }
2907
+ if ( ! item ) {
2908
+ continue ;
2909
+ }
2899
2910
2900
- // go backwards from last group
2901
- for ( let j = repository . provider . groups . length - 1 ; j >= 0 ; j -- ) {
2902
- const groupItem = repository . provider . groups [ j ] ;
2903
- const resource = this . viewMode === ViewMode . Tree
2904
- ? groupItem . resourceTree . getNode ( uri ) ?. element
2905
- : groupItem . resources . find ( r => this . uriIdentityService . extUri . isEqual ( r . sourceUri , uri ) ) ;
2906
-
2907
- if ( resource ) {
2908
- await this . tree . expandTo ( resource ) ;
2909
- this . tree . setSelection ( [ resource ] ) ;
2910
- this . tree . setFocus ( [ resource ] ) ;
2911
- return ;
2911
+ // go backwards from last group
2912
+ for ( let j = repository . provider . groups . length - 1 ; j >= 0 ; j -- ) {
2913
+ const groupItem = repository . provider . groups [ j ] ;
2914
+ const resource = this . viewMode === ViewMode . Tree
2915
+ ? groupItem . resourceTree . getNode ( uri ) ?. element
2916
+ : groupItem . resources . find ( r => this . uriIdentityService . extUri . isEqual ( r . sourceUri , uri ) ) ;
2917
+
2918
+ if ( resource ) {
2919
+ await this . tree . expandTo ( resource ) ;
2920
+ this . tree . setSelection ( [ resource ] ) ;
2921
+ this . tree . setFocus ( [ resource ] ) ;
2922
+ return ;
2923
+ }
2924
+ }
2912
2925
}
2913
- }
2914
- }
2915
- } ) ;
2926
+ } ) ) ;
2916
2927
}
2917
2928
2918
2929
private onDidChangeVisibleRepositories ( { added, removed } : ISCMViewVisibleRepositoryChangeEvent ) : void {
@@ -3084,23 +3095,31 @@ export class SCMViewPane extends ViewPane {
3084
3095
}
3085
3096
3086
3097
private updateChildren ( element ?: ISCMRepository ) {
3087
- this . asyncOperationSequencer . queue ( async ( ) => {
3088
- const focusedInput = this . inputRenderer . getFocusedInput ( ) ;
3089
-
3090
- if ( element && this . tree . hasNode ( element ) ) {
3091
- // Refresh specific repository
3092
- await this . tree . updateChildren ( element ) ;
3093
- } else {
3094
- // Refresh the entire tree
3095
- await this . tree . updateChildren ( ) ;
3096
- }
3098
+ this . updateChildrenThrottler . queue (
3099
+ ( ) => this . treeOperationSequencer . queue (
3100
+ async ( ) => {
3101
+ const focusedInput = this . inputRenderer . getFocusedInput ( ) ;
3102
+
3103
+ if ( element && this . tree . hasNode ( element ) ) {
3104
+ // Refresh specific repository
3105
+ await this . tree . updateChildren ( element , true , false , {
3106
+ diffDepth : Infinity ,
3107
+ diffIdentityProvider : this . treeIdentityProvider
3108
+ } ) ;
3109
+ } else {
3110
+ // Refresh the entire tree
3111
+ await this . tree . updateChildren ( undefined , true , false , {
3112
+ diffDepth : Infinity ,
3113
+ diffIdentityProvider : this . treeIdentityProvider
3114
+ } ) ;
3115
+ }
3097
3116
3098
- if ( focusedInput ) {
3099
- this . inputRenderer . getRenderedInputWidget ( focusedInput ) ?. forEach ( widget => widget . focus ( ) ) ;
3100
- }
3117
+ if ( focusedInput ) {
3118
+ this . inputRenderer . getRenderedInputWidget ( focusedInput ) ?. forEach ( widget => widget . focus ( ) ) ;
3119
+ }
3101
3120
3102
- this . updateRepositoryCollapseAllContextKeys ( ) ;
3103
- } ) ;
3121
+ this . updateRepositoryCollapseAllContextKeys ( ) ;
3122
+ } ) ) ;
3104
3123
}
3105
3124
3106
3125
private updateIndentStyles ( theme : IFileIconTheme ) : void {
0 commit comments