diff --git a/src/vs/base/browser/ui/tree/treeModel.ts b/src/vs/base/browser/ui/tree/treeModel.ts index 24c8b8f822f..ed8062baa19 100644 --- a/src/vs/base/browser/ui/tree/treeModel.ts +++ b/src/vs/base/browser/ui/tree/treeModel.ts @@ -11,7 +11,7 @@ import { last } from 'vs/base/common/arrays'; export interface ITreeElement { readonly element: T; - readonly children?: IIterator>; + readonly children?: IIterator> | ITreeElement[]; readonly collapsed?: boolean; } @@ -49,6 +49,16 @@ function getVisibleNodes(nodes: IMutableTreeNode[], result: ITreeNode[] return result; } +function getTreeElementIterator(elements: IIterator> | ITreeElement[] | undefined): IIterator> { + if (!elements) { + return empty(); + } else if (Array.isArray(elements)) { + return iter(elements); + } else { + return elements; + } +} + function treeElementToNode(treeElement: ITreeElement, parent: IMutableTreeNode, visible: boolean, treeListElements: ITreeNode[]): IMutableTreeNode { const depth = parent.depth + 1; const { element, collapsed } = treeElement; @@ -58,7 +68,8 @@ function treeElementToNode(treeElement: ITreeElement, parent: IMutableTree treeListElements.push(node); } - node.children = collect(map(treeElement.children || empty>(), el => treeElementToNode(el, node, visible && !treeElement.collapsed, treeListElements))); + const children = getTreeElementIterator(treeElement.children); + node.children = collect(map(children, el => treeElementToNode(el, node, visible && !treeElement.collapsed, treeListElements))); node.visibleCount = 1 + getVisibleCount(node.children); return node; @@ -84,14 +95,15 @@ export class TreeModel { constructor(private list: ISpliceable>) { } - splice(location: number[], deleteCount: number, toInsert: IIterator> = empty()): IIterator> { + splice(location: number[], deleteCount: number, toInsert?: IIterator> | ITreeElement[]): IIterator> { if (location.length === 0) { throw new Error('Invalid tree location'); } const { parentNode, listIndex, visible } = this.findParentNode(location); const treeListElementsToInsert: ITreeNode[] = []; - const nodesToInsert = collect(map(toInsert, el => treeElementToNode(el, parentNode, visible, treeListElementsToInsert))); + const elementsToInsert = getTreeElementIterator(toInsert); + const nodesToInsert = collect(map(elementsToInsert, el => treeElementToNode(el, parentNode, visible, treeListElementsToInsert))); const deletedNodes = parentNode.children.splice(last(location), deleteCount, ...nodesToInsert); const visibleDeleteCount = getVisibleCount(deletedNodes); diff --git a/test/tree.html b/test/tree.html index 2932cc79701..7baa25e8ad4 100644 --- a/test/tree.html +++ b/test/tree.html @@ -35,17 +35,18 @@ }; const tree = new Tree(container, delegate, [renderer]); - tree.splice([0], 0, iter([ + tree.splice([0], 0, [ { - element: '0', children: iter([ + element: '0', + children: [ { element: '10' }, { element: '11' }, { element: '12' }, - ]) + ] }, { element: '1' }, { element: '2' } - ])) + ]) });