From af5f77bb5f21e740a32d921c5570297c250f2d3d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 1 Nov 2018 17:32:37 +0100 Subject: [PATCH] tree: pass along parent visibility to filter function fixes #62216 --- src/vs/base/browser/ui/tree/indexTreeModel.ts | 43 +++++++++---------- src/vs/base/browser/ui/tree/tree.ts | 2 +- .../electron-browser/markersTreeViewer.ts | 14 +++--- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index bd0d0809b7a..695a145e421 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -30,13 +30,11 @@ function treeNodeToElement(node: IMutableTreeNode): ITreeElement { return { element, children, collapsed }; } -function getVisibleState(visibility: boolean | TreeVisibility): boolean | undefined { +function getVisibleState(visibility: boolean | TreeVisibility): TreeVisibility { switch (visibility) { - case true: return true; - case false: return false; - case TreeVisibility.Hidden: return false; - case TreeVisibility.Visible: return true; - case TreeVisibility.Recurse: return undefined; + case true: return TreeVisibility.Visible; + case false: return TreeVisibility.Hidden; + default: return visibility; } } @@ -85,7 +83,7 @@ export class IndexTreeModel implements ITreeModel[] = []; - const nodesToInsertIterator = Iterator.map(Iterator.from(toInsert), el => this.createTreeNode(el, parentNode, revealed, treeListElementsToInsert, onDidCreateNode)); + const nodesToInsertIterator = Iterator.map(Iterator.from(toInsert), el => this.createTreeNode(el, parentNode, parentNode.visible ? TreeVisibility.Visible : TreeVisibility.Hidden, revealed, treeListElementsToInsert, onDidCreateNode)); const nodesToInsert: IMutableTreeNode[] = []; let renderNodeCount = 0; @@ -186,6 +184,7 @@ export class IndexTreeModel implements ITreeModel, parent: IMutableTreeNode, + parentVisibility: TreeVisibility, revealed: boolean, treeListElements: ITreeNode[], onDidCreateNode?: (node: ITreeNode) => void @@ -202,15 +201,15 @@ export class IndexTreeModel implements ITreeModel this.createTreeNode(el, node, childRevealed, treeListElements, onDidCreateNode)); + const childRevealed = revealed && visibility !== TreeVisibility.Hidden && !node.collapsed; + const childNodes = Iterator.map(childElements, el => this.createTreeNode(el, node, visibility, childRevealed, treeListElements, onDidCreateNode)); let hasVisibleDescendants = false; let renderNodeCount = 1; @@ -222,7 +221,7 @@ export class IndexTreeModel implements ITreeModel 0; - node.visible = typeof visible === 'undefined' ? hasVisibleDescendants : visible; + node.visible = visibility === TreeVisibility.Recurse ? hasVisibleDescendants : (visibility === TreeVisibility.Visible); if (!node.visible) { node.renderNodeCount = 0; @@ -273,19 +272,19 @@ export class IndexTreeModel implements ITreeModel[] = []; - this._updateNodeAfterFilterChange(node, result); + this._updateNodeAfterFilterChange(node, node.visible ? TreeVisibility.Visible : TreeVisibility.Hidden, result); this._updateAncestorsRenderNodeCount(node.parent, result.length - previousRenderNodeCount); return result; } - private _updateNodeAfterFilterChange(node: IMutableTreeNode, result: ITreeNode[], revealed = true): boolean { - let visible: boolean | undefined; + private _updateNodeAfterFilterChange(node: IMutableTreeNode, parentVisibility: TreeVisibility, result: ITreeNode[], revealed = true): boolean { + let visibility: TreeVisibility; if (node !== this.root) { - visible = this._filterNode(node); + visibility = this._filterNode(node, parentVisibility); - if (visible === false) { + if (visibility === TreeVisibility.Hidden) { node.visible = false; return false; } @@ -299,14 +298,14 @@ export class IndexTreeModel implements ITreeModel implements ITreeModel): boolean | undefined { - const result = this.filter ? this.filter.filter(node.element) : TreeVisibility.Visible; + private _filterNode(node: IMutableTreeNode, parentVisibility: TreeVisibility): TreeVisibility { + const result = this.filter ? this.filter.filter(node.element, parentVisibility) : TreeVisibility.Visible; if (typeof result === 'boolean') { node.filterData = undefined; - return result; + return TreeVisibility.Visible; } else if (isFilterResult(result)) { node.filterData = result.data; return getVisibleState(result.visibility); diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts index b66284dcc2b..8c8956f0eb5 100644 --- a/src/vs/base/browser/ui/tree/tree.ts +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -64,7 +64,7 @@ export interface ITreeFilter { * * @param element The tree element. */ - filter(element: T): TreeFilterResult; + filter(element: T, parentVisibility: TreeVisibility): TreeFilterResult; } export interface ITreeElement { diff --git a/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts b/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts index 2a2b456fc89..a675b2b7463 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts @@ -328,13 +328,13 @@ export class Filter implements ITreeFilter { options = new FilterOptions(); - filter(element: TreeElement): TreeFilterResult { + filter(element: TreeElement, parentVisibility: TreeVisibility): TreeFilterResult { if (element instanceof ResourceMarkers) { return this.filterResourceMarkers(element); } else if (element instanceof Marker) { - return this.filterMarker(element); + return this.filterMarker(element, parentVisibility); } else { - return this.filterRelatedInformation(element); + return this.filterRelatedInformation(element, parentVisibility); } } @@ -360,7 +360,7 @@ export class Filter implements ITreeFilter { return TreeVisibility.Recurse; } - private filterMarker(marker: Marker): TreeFilterResult { + private filterMarker(marker: Marker, parentVisibility: TreeVisibility): TreeFilterResult { if (this.options.filterErrors && MarkerSeverity.Error === marker.marker.severity) { return true; } @@ -385,10 +385,10 @@ export class Filter implements ITreeFilter { return { visibility: true, data: { type: FilterDataType.Marker, messageMatches: messageMatches || [], sourceMatches: sourceMatches || [], codeMatches: codeMatches || [] } }; } - return TreeVisibility.Recurse; + return parentVisibility; } - private filterRelatedInformation(relatedInformation: RelatedInformation): TreeFilterResult { + private filterRelatedInformation(relatedInformation: RelatedInformation, parentVisibility: TreeVisibility): TreeFilterResult { if (!this.options.textFilter) { return true; } @@ -400,6 +400,6 @@ export class Filter implements ITreeFilter { return { visibility: true, data: { type: FilterDataType.RelatedInformation, uriMatches: uriMatches || [], messageMatches: messageMatches || [] } }; } - return false; + return parentVisibility; } } \ No newline at end of file -- GitLab