@@ -165,7 +165,7 @@ class ActionButtonRenderer implements ICompressibleTreeRenderer<ISCMActionButton
165
165
166
166
interface InputTemplate {
167
167
readonly inputWidget : SCMInputWidget ;
168
- disposable : IDisposable ;
168
+ readonly elementDisposables : DisposableStore ;
169
169
readonly templateDisposable : IDisposable ;
170
170
}
171
171
@@ -194,24 +194,21 @@ class InputRenderer implements ICompressibleTreeRenderer<ISCMInput, FuzzyScore,
194
194
// Disable hover for list item
195
195
container . parentElement ! . parentElement ! . classList . add ( 'force-no-hover' ) ;
196
196
197
- const disposables = new DisposableStore ( ) ;
197
+ const templateDisposable = new DisposableStore ( ) ;
198
198
const inputElement = append ( container , $ ( '.scm-input' ) ) ;
199
199
const inputWidget = this . instantiationService . createInstance ( SCMInputWidget , inputElement , this . overflowWidgetsDomNode ) ;
200
- disposables . add ( inputWidget ) ;
200
+ templateDisposable . add ( inputWidget ) ;
201
201
202
- return { inputWidget, disposable : Disposable . None , templateDisposable : disposables } ;
202
+ return { inputWidget, elementDisposables : templateDisposable . add ( new DisposableStore ( ) ) , templateDisposable } ;
203
203
}
204
204
205
205
renderElement ( node : ITreeNode < ISCMInput , FuzzyScore > , index : number , templateData : InputTemplate ) : void {
206
- templateData . disposable . dispose ( ) ;
207
-
208
- const disposables = new DisposableStore ( ) ;
209
206
const input = node . element ;
210
207
templateData . inputWidget . input = input ;
211
208
212
209
// Remember widget
213
210
this . inputWidgets . set ( input , templateData . inputWidget ) ;
214
- disposables . add ( { dispose : ( ) => this . inputWidgets . delete ( input ) } ) ;
211
+ templateData . elementDisposables . add ( { dispose : ( ) => this . inputWidgets . delete ( input ) } ) ;
215
212
216
213
// Widget cursor selections
217
214
const selections = this . editorSelections . get ( input ) ;
@@ -220,7 +217,7 @@ class InputRenderer implements ICompressibleTreeRenderer<ISCMInput, FuzzyScore,
220
217
templateData . inputWidget . selections = selections ;
221
218
}
222
219
223
- disposables . add ( toDisposable ( ( ) => {
220
+ templateData . elementDisposables . add ( toDisposable ( ( ) => {
224
221
const selections = templateData . inputWidget . selections ;
225
222
226
223
if ( selections ) {
@@ -241,32 +238,29 @@ class InputRenderer implements ICompressibleTreeRenderer<ISCMInput, FuzzyScore,
241
238
} ;
242
239
243
240
const startListeningContentHeightChange = ( ) => {
244
- disposables . add ( templateData . inputWidget . onDidChangeContentHeight ( onDidChangeContentHeight ) ) ;
241
+ templateData . elementDisposables . add ( templateData . inputWidget . onDidChangeContentHeight ( onDidChangeContentHeight ) ) ;
245
242
onDidChangeContentHeight ( ) ;
246
243
} ;
247
244
248
245
// Setup height change listener on next tick
249
246
const timeout = disposableTimeout ( startListeningContentHeightChange , 0 ) ;
250
- disposables . add ( timeout ) ;
247
+ templateData . elementDisposables . add ( timeout ) ;
251
248
252
249
// Layout the editor whenever the outer layout happens
253
250
const layoutEditor = ( ) => templateData . inputWidget . layout ( ) ;
254
- disposables . add ( this . outerLayout . onDidChange ( layoutEditor ) ) ;
251
+ templateData . elementDisposables . add ( this . outerLayout . onDidChange ( layoutEditor ) ) ;
255
252
layoutEditor ( ) ;
256
-
257
- templateData . disposable = disposables ;
258
253
}
259
254
260
255
renderCompressedElements ( ) : void {
261
256
throw new Error ( 'Should never happen since node is incompressible' ) ;
262
257
}
263
258
264
259
disposeElement ( group : ITreeNode < ISCMInput , FuzzyScore > , index : number , template : InputTemplate ) : void {
265
- template . disposable . dispose ( ) ;
260
+ template . elementDisposables . clear ( ) ;
266
261
}
267
262
268
263
disposeTemplate ( templateData : InputTemplate ) : void {
269
- templateData . disposable . dispose ( ) ;
270
264
templateData . templateDisposable . dispose ( ) ;
271
265
}
272
266
@@ -299,7 +293,7 @@ interface ResourceGroupTemplate {
299
293
readonly name : HTMLElement ;
300
294
readonly count : CountBadge ;
301
295
readonly actionBar : ActionBar ;
302
- elementDisposables : IDisposable ;
296
+ readonly elementDisposables : DisposableStore ;
303
297
readonly disposables : IDisposable ;
304
298
}
305
299
@@ -325,34 +319,28 @@ class ResourceGroupRenderer implements ICompressibleTreeRenderer<ISCMResourceGro
325
319
const countContainer = append ( element , $ ( '.count' ) ) ;
326
320
const count = new CountBadge ( countContainer ) ;
327
321
const styler = attachBadgeStyler ( count , this . themeService ) ;
328
- const elementDisposables = Disposable . None ;
329
322
const disposables = combinedDisposable ( actionBar , styler ) ;
330
323
331
- return { name, count, actionBar, elementDisposables, disposables } ;
324
+ return { name, count, actionBar, elementDisposables : new DisposableStore ( ) , disposables } ;
332
325
}
333
326
334
327
renderElement ( node : ITreeNode < ISCMResourceGroup , FuzzyScore > , index : number , template : ResourceGroupTemplate ) : void {
335
- template . elementDisposables . dispose ( ) ;
336
-
337
328
const group = node . element ;
338
329
template . name . textContent = group . label ;
339
330
template . actionBar . clear ( ) ;
340
331
template . actionBar . context = group ;
341
332
template . count . setCount ( group . elements . length ) ;
342
333
343
- const disposables = new DisposableStore ( ) ;
344
334
const menus = this . scmViewService . menus . getRepositoryMenus ( group . provider ) ;
345
- disposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceGroupMenu ( group ) , template . actionBar ) ) ;
346
-
347
- template . elementDisposables = disposables ;
335
+ template . elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceGroupMenu ( group ) , template . actionBar ) ) ;
348
336
}
349
337
350
338
renderCompressedElements ( node : ITreeNode < ICompressedTreeNode < ISCMResourceGroup > , FuzzyScore > , index : number , templateData : ResourceGroupTemplate , height : number | undefined ) : void {
351
339
throw new Error ( 'Should never happen since node is incompressible' ) ;
352
340
}
353
341
354
342
disposeElement ( group : ITreeNode < ISCMResourceGroup , FuzzyScore > , index : number , template : ResourceGroupTemplate ) : void {
355
- template . elementDisposables . dispose ( ) ;
343
+ template . elementDisposables . clear ( ) ;
356
344
}
357
345
358
346
disposeTemplate ( template : ResourceGroupTemplate ) : void {
@@ -367,8 +355,8 @@ interface ResourceTemplate {
367
355
fileLabel : IResourceLabel ;
368
356
decorationIcon : HTMLElement ;
369
357
actionBar : ActionBar ;
370
- elementDisposables : IDisposable ;
371
- disposables : IDisposable ;
358
+ readonly elementDisposables : DisposableStore ;
359
+ readonly disposables : IDisposable ;
372
360
}
373
361
374
362
interface RenderedResourceData {
@@ -430,13 +418,10 @@ class ResourceRenderer implements ICompressibleTreeRenderer<ISCMResource | IReso
430
418
const decorationIcon = append ( element , $ ( '.decoration-icon' ) ) ;
431
419
const disposables = combinedDisposable ( actionBar , fileLabel ) ;
432
420
433
- return { element, name, fileLabel, decorationIcon, actionBar, elementDisposables : Disposable . None , disposables } ;
421
+ return { element, name, fileLabel, decorationIcon, actionBar, elementDisposables : new DisposableStore ( ) , disposables } ;
434
422
}
435
423
436
424
renderElement ( node : ITreeNode < ISCMResource , FuzzyScore | LabelFuzzyScore > | ITreeNode < ISCMResource | IResourceNode < ISCMResource , ISCMResourceGroup > , FuzzyScore | LabelFuzzyScore > , index : number , template : ResourceTemplate ) : void {
437
- template . elementDisposables . dispose ( ) ;
438
-
439
- const elementDisposables = new DisposableStore ( ) ;
440
425
const resourceOrFolder = node . element ;
441
426
const iconResource = ResourceTree . isResourceNode ( resourceOrFolder ) ? resourceOrFolder . element : resourceOrFolder ;
442
427
const uri = ResourceTree . isResourceNode ( resourceOrFolder ) ? resourceOrFolder . uri : resourceOrFolder . sourceUri ;
@@ -454,19 +439,19 @@ class ResourceRenderer implements ICompressibleTreeRenderer<ISCMResource | IReso
454
439
if ( ResourceTree . isResourceNode ( resourceOrFolder ) ) {
455
440
if ( resourceOrFolder . element ) {
456
441
const menus = this . scmViewService . menus . getRepositoryMenus ( resourceOrFolder . element . resourceGroup . provider ) ;
457
- elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceMenu ( resourceOrFolder . element ) , template . actionBar ) ) ;
442
+ template . elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceMenu ( resourceOrFolder . element ) , template . actionBar ) ) ;
458
443
template . element . classList . toggle ( 'faded' , resourceOrFolder . element . decorations . faded ) ;
459
444
strikethrough = resourceOrFolder . element . decorations . strikeThrough ;
460
445
} else {
461
446
matches = createMatches ( node . filterData as FuzzyScore | undefined ) ;
462
447
const menus = this . scmViewService . menus . getRepositoryMenus ( resourceOrFolder . context . provider ) ;
463
- elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceFolderMenu ( resourceOrFolder . context ) , template . actionBar ) ) ;
448
+ template . elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceFolderMenu ( resourceOrFolder . context ) , template . actionBar ) ) ;
464
449
template . element . classList . remove ( 'faded' ) ;
465
450
}
466
451
} else {
467
452
[ matches , descriptionMatches ] = this . _processFilterData ( uri , node . filterData ) ;
468
453
const menus = this . scmViewService . menus . getRepositoryMenus ( resourceOrFolder . resourceGroup . provider ) ;
469
- elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceMenu ( resourceOrFolder ) , template . actionBar ) ) ;
454
+ template . elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceMenu ( resourceOrFolder ) , template . actionBar ) ) ;
470
455
template . element . classList . toggle ( 'faded' , resourceOrFolder . decorations . faded ) ;
471
456
strikethrough = resourceOrFolder . decorations . strikeThrough ;
472
457
}
@@ -487,20 +472,16 @@ class ResourceRenderer implements ICompressibleTreeRenderer<ISCMResource | IReso
487
472
this . renderIcon ( template , renderedData ) ;
488
473
489
474
this . renderedResources . set ( template , renderedData ) ;
490
- elementDisposables . add ( toDisposable ( ( ) => this . renderedResources . delete ( template ) ) ) ;
475
+ template . elementDisposables . add ( toDisposable ( ( ) => this . renderedResources . delete ( template ) ) ) ;
491
476
492
477
template . element . setAttribute ( 'data-tooltip' , tooltip ) ;
493
- template . elementDisposables = elementDisposables ;
494
478
}
495
479
496
480
disposeElement ( resource : ITreeNode < ISCMResource , FuzzyScore | LabelFuzzyScore > | ITreeNode < IResourceNode < ISCMResource , ISCMResourceGroup > , FuzzyScore | LabelFuzzyScore > , index : number , template : ResourceTemplate ) : void {
497
- template . elementDisposables . dispose ( ) ;
481
+ template . elementDisposables . clear ( ) ;
498
482
}
499
483
500
484
renderCompressedElements ( node : ITreeNode < ICompressedTreeNode < ISCMResource > | ICompressedTreeNode < IResourceNode < ISCMResource , ISCMResourceGroup > > , FuzzyScore | LabelFuzzyScore > , index : number , template : ResourceTemplate , height : number | undefined ) : void {
501
- template . elementDisposables . dispose ( ) ;
502
-
503
- const elementDisposables = new DisposableStore ( ) ;
504
485
const compressed = node . element as ICompressedTreeNode < IResourceNode < ISCMResource , ISCMResourceGroup > > ;
505
486
const folder = compressed . elements [ compressed . elements . length - 1 ] ;
506
487
@@ -519,19 +500,18 @@ class ResourceRenderer implements ICompressibleTreeRenderer<ISCMResource | IReso
519
500
template . actionBar . context = folder ;
520
501
521
502
const menus = this . scmViewService . menus . getRepositoryMenus ( folder . context . provider ) ;
522
- elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceFolderMenu ( folder . context ) , template . actionBar ) ) ;
503
+ template . elementDisposables . add ( connectPrimaryMenuToInlineActionBar ( menus . getResourceFolderMenu ( folder . context ) , template . actionBar ) ) ;
523
504
524
505
template . name . classList . remove ( 'strike-through' ) ;
525
506
template . element . classList . remove ( 'faded' ) ;
526
507
template . decorationIcon . style . display = 'none' ;
527
508
template . decorationIcon . style . backgroundImage = '' ;
528
509
529
510
template . element . setAttribute ( 'data-tooltip' , '' ) ;
530
- template . elementDisposables = elementDisposables ;
531
511
}
532
512
533
513
disposeCompressedElements ( node : ITreeNode < ICompressedTreeNode < ISCMResource > | ICompressedTreeNode < IResourceNode < ISCMResource , ISCMResourceGroup > > , FuzzyScore | LabelFuzzyScore > , index : number , template : ResourceTemplate , height : number | undefined ) : void {
534
- template . elementDisposables . dispose ( ) ;
514
+ template . elementDisposables . clear ( ) ;
535
515
}
536
516
537
517
disposeTemplate ( template : ResourceTemplate ) : void {
0 commit comments