From a8dd7f60a6204353e8d6969c8bc39f0476d46e2a Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 13 Jan 2021 16:58:15 -0800 Subject: [PATCH] update collapsible when children change --- src/vs/base/browser/ui/tree/indexTreeModel.ts | 6 +++++ .../browser/ui/tree/indexTreeModel.test.ts | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index 91b69d3fff5..3497b96b89c 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -228,6 +228,7 @@ export class IndexTreeModel, TFilterData = voi const nodesToInsertIterator = Iterable.map(toInsert, el => this.createTreeNode(el, parentNode, parentNode.visible ? TreeVisibility.Visible : TreeVisibility.Hidden, revealed, treeListElementsToInsert, onDidCreateNode)); const lastIndex = location[location.length - 1]; + const lastHadChildren = parentNode.children.length > 0; // figure out what's the visible child start index right before the // splice point @@ -296,6 +297,11 @@ export class IndexTreeModel, TFilterData = voi deletedNodes.forEach(visit); } + const currentlyHasChildren = parentNode.children.length > 0; + if (lastHadChildren !== currentlyHasChildren) { + this.setCollapsible(location.slice(0, -1), currentlyHasChildren); + } + this._onDidSplice.fire({ insertedNodes: nodesToInsert, deletedNodes }); let node: IIndexTreeNode | undefined = parentNode; diff --git a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts index b82a9c8ee2c..52e7bb698d0 100644 --- a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts @@ -309,6 +309,30 @@ suite('IndexTreeModel', () => { assert.deepEqual(list[2].depth, 1); })); + test('updates collapsible', () => withSmartSplice(options => { + const list: ITreeNode[] = []; + const model = new IndexTreeModel('test', toList(list), -1); + + model.splice([0], 0, [ + { + element: 0, children: [ + { element: 1 }, + ] + }, + ], options); + + assert.strictEqual(list[0].collapsible, true); + assert.strictEqual(list[1].collapsible, false); + + model.splice([0, 0], 1, [], options); + assert.strictEqual(list[0].collapsible, false); + assert.strictEqual(list[1], undefined); + + model.splice([0, 0], 0, [{ element: 1 }], options); + assert.strictEqual(list[0].collapsible, true); + assert.strictEqual(list[1].collapsible, false); + })); + test('expand', () => withSmartSplice(options => { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toList(list), -1); -- GitLab