From ea36e04bc7a4fff8683172e71140a873229c592f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 22 Jul 2019 20:13:51 +0200 Subject: [PATCH] CompressedObjectTree --- .../browser/ui/tree/compressedObjectTree.ts | 58 +++++++++++++++++++ .../ui/tree/compressedObjectTreeModel.ts | 12 +++- .../base/browser/ui/tree/objectTreeModel.ts | 2 +- src/vs/base/browser/ui/tree/tree.ts | 1 + 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/vs/base/browser/ui/tree/compressedObjectTree.ts diff --git a/src/vs/base/browser/ui/tree/compressedObjectTree.ts b/src/vs/base/browser/ui/tree/compressedObjectTree.ts new file mode 100644 index 00000000000..fb63e29135d --- /dev/null +++ b/src/vs/base/browser/ui/tree/compressedObjectTree.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Iterator, ISequence } from 'vs/base/common/iterator'; +import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree'; +import { ISpliceable } from 'vs/base/common/sequence'; +import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, ICollapseStateChangeEvent } from 'vs/base/browser/ui/tree/tree'; +import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { Event } from 'vs/base/common/event'; +import { ICompressedTreeNode, CompressedObjectTreeModel } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; + +export interface ICompressedObjectTreeOptions extends IAbstractTreeOptions, TFilterData> { + sorter?: ITreeSorter>; +} + +export class CompressedObjectTree, TFilterData = void> extends AbstractTree | null, TFilterData, T | null> { + + protected model: CompressedObjectTreeModel; + + get onDidChangeCollapseState(): Event, TFilterData>> { return this.model.onDidChangeCollapseState; } + + constructor( + container: HTMLElement, + delegate: IListVirtualDelegate>, + renderers: ITreeRenderer[], + options: ICompressedObjectTreeOptions = {} + ) { + super(container, delegate, renderers, options); + } + + setChildren( + element: T | null, + children?: ISequence>, + onDidCreateNode?: (node: ITreeNode, TFilterData>) => void, + onDidDeleteNode?: (node: ITreeNode, TFilterData>) => void + ): Iterator> { + return this.model.setChildren(element, children, onDidCreateNode, onDidDeleteNode); + } + + rerender(element?: T): void { + if (element === undefined) { + this.view.rerender(); + return; + } + + this.model.rerender(element); + } + + resort(element: T, recursive = true): void { + this.model.resort(element, recursive); + } + + protected createModel(view: ISpliceable, TFilterData>>, options: ICompressedObjectTreeOptions): ITreeModel | null, TFilterData, T | null> { + return new CompressedObjectTreeModel(view, options); + } +} diff --git a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts index 3eae4d5e4c8..a9ad916d647 100644 --- a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts @@ -239,13 +239,23 @@ export class CompressedObjectTreeModel, TFilterData e expandTo(location: T | null): void { const compressedNode = this.getCompressedNode(location); - return this.model.expandTo(compressedNode); + this.model.expandTo(compressedNode); + } + + rerender(location: T | null): void { + const compressedNode = this.getCompressedNode(location); + this.model.rerender(compressedNode); } refilter(): void { this.model.refilter(); } + resort(location: T | null = null, recursive = true): void { + const compressedNode = this.getCompressedNode(location); + this.model.resort(compressedNode, recursive); + } + private getCompressedNode(element: T | null): ICompressedTreeNode | null { if (element === null) { return null; diff --git a/src/vs/base/browser/ui/tree/objectTreeModel.ts b/src/vs/base/browser/ui/tree/objectTreeModel.ts index 44254446f92..880d5e40a6e 100644 --- a/src/vs/base/browser/ui/tree/objectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/objectTreeModel.ts @@ -144,7 +144,7 @@ export class ObjectTreeModel, TFilterData extends Non }); } - rerender(element: T): void { + rerender(element: T | null): void { const location = this.getElementLocation(element); this.model.rerender(location); } diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts index 80b30fa4c55..5f9f2e14d69 100644 --- a/src/vs/base/browser/ui/tree/tree.ts +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -124,6 +124,7 @@ export interface ITreeModel { setCollapsed(location: TRef, collapsed?: boolean, recursive?: boolean): boolean; expandTo(location: TRef): void; + rerender(location: TRef): void; refilter(): void; } -- GitLab