@@ -7,7 +7,7 @@ import { ISpliceable } from 'vs/base/common/sequence';
77import { Iterator , ISequence } from 'vs/base/common/iterator' ;
88import { Emitter , Event , EventBufferer } from 'vs/base/common/event' ;
99import { tail2 } from 'vs/base/common/arrays' ;
10- import { ITreeFilterDataResult , TreeVisibility , ITreeFilter , ITreeModel , ITreeNode , ITreeElement } from 'vs/base/browser/ui/tree/tree' ;
10+ import { ITreeFilterDataResult , TreeVisibility , ITreeFilter , ITreeModel , ITreeNode , ITreeElement , ICollapseStateChangeEvent } from 'vs/base/browser/ui/tree/tree' ;
1111
1212interface IMutableTreeNode < T , TFilterData > extends ITreeNode < T , TFilterData > {
1313 readonly parent : IMutableTreeNode < T , TFilterData > | undefined ;
@@ -48,10 +48,10 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
4848 readonly rootRef = [ ] ;
4949
5050 private root : IMutableTreeNode < T , TFilterData > ;
51- private eventBufferer = new EventBufferer ( ) ; // TODO @joao is this really necessary
51+ private eventBufferer = new EventBufferer ( ) ;
5252
53- private _onDidChangeCollapseState = new Emitter < ITreeNode < T , TFilterData > > ( ) ;
54- readonly onDidChangeCollapseState : Event < ITreeNode < T , TFilterData > > = this . eventBufferer . wrapEvent ( this . _onDidChangeCollapseState . event ) ;
53+ private _onDidChangeCollapseState = new Emitter < ICollapseStateChangeEvent < T , TFilterData > > ( ) ;
54+ readonly onDidChangeCollapseState : Event < ICollapseStateChangeEvent < T , TFilterData > > = this . eventBufferer . wrapEvent ( this . _onDidChangeCollapseState . event ) ;
5555
5656 private _onDidChangeRenderNodeCount = new Emitter < ITreeNode < T , TFilterData > > ( ) ;
5757 readonly onDidChangeRenderNodeCount : Event < ITreeNode < T , TFilterData > > = this . eventBufferer . wrapEvent ( this . _onDidChangeRenderNodeCount . event ) ;
@@ -63,6 +63,8 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
6363 this . collapseByDefault = typeof options . collapseByDefault === 'undefined' ? false : options . collapseByDefault ;
6464 this . filter = options . filter ;
6565
66+ // this.onDidChangeCollapseState(node => console.log(node.collapsed, node));
67+
6668 this . root = {
6769 parent : undefined ,
6870 element : rootElement ,
@@ -140,37 +142,40 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
140142 collapsed = ! node . collapsed ;
141143 }
142144
143- return this . _setCollapsed ( node , listIndex , revealed , collapsed , recursive || false ) ;
145+ return this . eventBufferer . bufferEvents ( ( ) => {
146+ return this . _setCollapsed ( node , listIndex , revealed , collapsed ! , recursive || false ) ;
147+ } ) ;
144148 }
145149
146150 private _setCollapsed ( node : IMutableTreeNode < T , TFilterData > , listIndex : number , revealed : boolean , collapsed : boolean , recursive : boolean ) : boolean {
147- const result = this . _setNodeCollapsed ( node , collapsed , recursive ) ;
151+ const result = this . _setNodeCollapsed ( node , collapsed , recursive , false ) ;
148152
149153 if ( ! revealed || ! node . visible ) {
150154 return result ;
151155 }
152156
153157 const previousRenderNodeCount = node . renderNodeCount ;
154158 const toInsert = this . updateNodeAfterCollapseChange ( node ) ;
155-
156159 const deleteCount = previousRenderNodeCount - ( listIndex === - 1 ? 0 : 1 ) ;
157-
158160 this . list . splice ( listIndex + 1 , deleteCount , toInsert . slice ( 1 ) ) ;
159- this . _onDidChangeCollapseState . fire ( node ) ;
160161
161162 return result ;
162163 }
163164
164- private _setNodeCollapsed ( node : IMutableTreeNode < T , TFilterData > , collapsed : boolean , recursive : boolean ) : boolean {
165+ private _setNodeCollapsed ( node : IMutableTreeNode < T , TFilterData > , collapsed : boolean , recursive : boolean , deep : boolean ) : boolean {
165166 let result = node . collapsible && node . collapsed !== collapsed ;
166167
167168 if ( node . collapsible ) {
168169 node . collapsed = collapsed ;
170+
171+ if ( result ) {
172+ this . _onDidChangeCollapseState . fire ( { node, deep } ) ;
173+ }
169174 }
170175
171176 if ( recursive ) {
172177 for ( const child of node . children ) {
173- result = this . _setNodeCollapsed ( child , collapsed , true ) || result ;
178+ result = this . _setNodeCollapsed ( child , collapsed , true , true ) || result ;
174179 }
175180 }
176181
0 commit comments