From b8b3bc327a34b381210af494f36cc0878f00d042 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 8 May 2018 13:58:46 +0200 Subject: [PATCH] tree: collapsed resolved parent should update children visibility --- src/vs/base/parts/tree/browser/treeModel.ts | 7 +++- .../parts/tree/test/browser/treeModel.test.ts | 38 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/vs/base/parts/tree/browser/treeModel.ts b/src/vs/base/parts/tree/browser/treeModel.ts index 7e7fbe18c49..a9caa37d358 100644 --- a/src/vs/base/parts/tree/browser/treeModel.ts +++ b/src/vs/base/parts/tree/browser/treeModel.ts @@ -507,6 +507,7 @@ export class Item { return child.doRefresh(recursive, true); })); } else { + this.mapEachChild(child => child.updateVisibility()); return WinJS.TPromise.as(null); } }); @@ -522,13 +523,17 @@ export class Item { private doRefresh(recursive: boolean, safe: boolean = false): WinJS.Promise { this.doesHaveChildren = this.context.dataSource.hasChildren(this.context.tree, this.element); this.height = this._getHeight(); - this.setVisible(this._isVisible()); + this.updateVisibility(); this._onDidRefresh.fire(this); return this.refreshChildren(recursive, safe); } + private updateVisibility(): void { + this.setVisible(this._isVisible()); + } + public refresh(recursive: boolean): WinJS.Promise { return this.doRefresh(recursive); } diff --git a/src/vs/base/parts/tree/test/browser/treeModel.test.ts b/src/vs/base/parts/tree/test/browser/treeModel.test.ts index 449830f5786..b65060dec56 100644 --- a/src/vs/base/parts/tree/test/browser/treeModel.test.ts +++ b/src/vs/base/parts/tree/test/browser/treeModel.test.ts @@ -1695,4 +1695,42 @@ suite('TreeModel - bugs', () => { assert.equal(counter.count, 0); }); }); + + test('collapsed resolved parent should also update all children visibility on refresh', async function () { + const counter = new EventCounter(); + const dataModel = new DynamicModel(); + + let isSonVisible = true; + const filter: _.IFilter = { + isVisible(_, element) { + return element !== 'son' || isSonVisible; + } + }; + + const model = new TreeModel({ dataSource: dataModel, filter }); + + dataModel.addChild('root', 'father'); + dataModel.addChild('father', 'son'); + + await model.setInput('root'); + await model.expand('father'); + + let nav = model.getNavigator(); + assert.equal(nav.next().id, 'father'); + assert.equal(nav.next().id, 'son'); + assert.equal(nav.next(), null); + + await model.collapse('father'); + isSonVisible = false; + + await model.refresh(undefined, true); + await model.expand('father'); + + nav = model.getNavigator(); + assert.equal(nav.next().id, 'father'); + assert.equal(nav.next(), null); + + counter.dispose(); + model.dispose(); + }); }); -- GitLab