diff --git a/src/vs/base/browser/ui/tree/treeModel.ts b/src/vs/base/browser/ui/tree/treeModel.ts index 2f352c42ac1e3d27f749ece0ab7fd3ad9cfab11d..20ede7b260c9c0bb4461264c9313be4817d8738d 100644 --- a/src/vs/base/browser/ui/tree/treeModel.ts +++ b/src/vs/base/browser/ui/tree/treeModel.ts @@ -133,7 +133,8 @@ export class TreeModel { const lastIndex = location[location.length - 1]; const deletedNodes = parentNode.children.splice(lastIndex, deleteCount, ...nodesToInsert); const visibleDeleteCount = deletedNodes.reduce((r, node) => r + node.revealedCount, 0); - parentNode.revealedCount += revealedCount - visibleDeleteCount; + + this._updateAncestorsRevealedCount(parentNode, revealedCount - visibleDeleteCount); if (revealed) { this.list.splice(listIndex, visibleDeleteCount, treeListElementsToInsert); diff --git a/src/vs/base/browser/ui/tree/treeObjectModel.ts b/src/vs/base/browser/ui/tree/treeObjectModel.ts index 74ac3214ee8e1817e83c799611468c3b26bfa414..46affafd041d38a3417df14c8d161ab6b69e0c5b 100644 --- a/src/vs/base/browser/ui/tree/treeObjectModel.ts +++ b/src/vs/base/browser/ui/tree/treeObjectModel.ts @@ -14,6 +14,8 @@ export class TreeObjectModel, TFilterData = void> { private model: TreeModel; private nodes = new Map>(); + get size(): number { return this.nodes.size; } + constructor(list: ISpliceable>, options: ITreeModelOptions = {}) { this.model = new TreeModel(list, options); } diff --git a/src/vs/base/test/browser/ui/tree/treeObjectModel.test.ts b/src/vs/base/test/browser/ui/tree/treeObjectModel.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..b2ed750edcf9419e4fc83c3fcbb3502652ed3f9b --- /dev/null +++ b/src/vs/base/test/browser/ui/tree/treeObjectModel.test.ts @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { ITreeNode } from 'vs/base/browser/ui/tree/treeModel'; +import { ISpliceable } from 'vs/base/common/sequence'; +import { TreeObjectModel } from 'vs/base/browser/ui/tree/treeObjectModel'; +import { Iterator } from 'vs/base/common/iterator'; + +function toSpliceable(arr: T[]): ISpliceable { + return { + splice(start: number, deleteCount: number, elements: T[]): void { + arr.splice(start, deleteCount, ...elements); + } + }; +} + +function toArray(list: ITreeNode[]): T[] { + return list.map(i => i.element); +} + +suite('TreeObjectModel', function () { + + test('ctor', () => { + const list = [] as ITreeNode[]; + const model = new TreeObjectModel(toSpliceable(list)); + assert(model); + assert.equal(list.length, 0); + assert.equal(model.size, 0); + }); + + test('flat', () => { + const list = [] as ITreeNode[]; + const model = new TreeObjectModel(toSpliceable(list)); + + model.splice(null, 0, 0, Iterator.fromArray([ + { element: 0 }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(toArray(list), [0, 1, 2]); + assert.equal(model.size, 3); + + model.splice(null, 3, 0, Iterator.fromArray([ + { element: 3 }, + { element: 4 }, + { element: 5 }, + ])); + + assert.deepEqual(toArray(list), [0, 1, 2, 3, 4, 5]); + assert.equal(model.size, 6); + + model.splice(null, 2, 2); + assert.deepEqual(toArray(list), [0, 1, 4, 5]); + assert.equal(model.size, 4); + }); + + test('nested', () => { + const list = [] as ITreeNode[]; + const model = new TreeObjectModel(toSpliceable(list)); + + model.splice(null, 0, 0, Iterator.fromArray([ + { + element: 0, children: Iterator.fromArray([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(toArray(list), [0, 10, 11, 12, 1, 2]); + assert.equal(model.size, 6); + + model.splice(12, 0, 0, Iterator.fromArray([ + { element: 120 }, + { element: 121 } + ])); + + assert.deepEqual(toArray(list), [0, 10, 11, 12, 120, 121, 1, 2]); + assert.equal(model.size, 8); + + model.splice(0, 1, 1); + assert.deepEqual(toArray(list), [0, 10, 12, 120, 121, 1, 2]); + assert.equal(model.size, 7); + + model.splice(null, 0, 1); + assert.deepEqual(toArray(list), [1, 2]); + assert.equal(model.size, 2); + + model.splice(null, 0, 2); + assert.deepEqual(toArray(list), []); + assert.equal(model.size, 0); + }); +}); \ No newline at end of file