From 24e8396dd67f658a4c689d32a7efa505df2ea344 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 22 Jul 2021 09:32:32 -0700 Subject: [PATCH] Allow calling updateElementHeight with undefined to prompt re-probing of dynamic height See #128563 --- src/vs/base/browser/ui/list/listView.ts | 15 +++++++++++---- src/vs/base/browser/ui/tree/indexTreeModel.ts | 4 ++-- src/vs/base/browser/ui/tree/objectTree.ts | 2 +- src/vs/base/browser/ui/tree/objectTreeModel.ts | 4 ++-- .../preferences/browser/settingsEditor2.ts | 4 ++-- .../contrib/preferences/browser/settingsTree.ts | 15 ++++----------- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index eebaad00fed..21693cd162d 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -389,12 +389,19 @@ export class ListView implements ISpliceable, IDisposable { this.scrollableElement.triggerScrollFromMouseWheelEvent(browserEvent); } - updateElementHeight(index: number, size: number, anchorIndex: number | null): void { + updateElementHeight(index: number, size: number | undefined, anchorIndex: number | null): void { if (index < 0 || index >= this.items.length) { return; } - if (this.items[index].size === size) { + const originalSize = this.items[index].size; + + if (typeof size === 'undefined') { + this.items[index].lastDynamicHeightWidth = undefined; + size = originalSize + this.probeDynamicHeight(index); + } + + if (originalSize === size) { return; } @@ -404,12 +411,12 @@ export class ListView implements ISpliceable, IDisposable { if (index < lastRenderRange.start) { // do not scroll the viewport if resized element is out of viewport - heightDiff = size - this.items[index].size; + heightDiff = size - originalSize; } else { if (anchorIndex !== null && anchorIndex > index && anchorIndex <= lastRenderRange.end) { // anchor in viewport // resized element in viewport and above the anchor - heightDiff = size - this.items[index].size; + heightDiff = size - originalSize; } else { heightDiff = 0; } diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index 67def4dfaf3..123b6cb0e1e 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -87,7 +87,7 @@ function isCollapsibleStateUpdate(update: CollapseStateUpdate): update is Collap } export interface IList extends ISpliceable { - updateElementHeight(index: number, height: number): void; + updateElementHeight(index: number, height: number | undefined): void; } export class IndexTreeModel, TFilterData = void> implements ITreeModel { @@ -328,7 +328,7 @@ export class IndexTreeModel, TFilterData = voi } } - updateElementHeight(location: number[], height: number): void { + updateElementHeight(location: number[], height: number | undefined): void { if (location.length === 0) { throw new TreeError(this.user, 'Invalid tree location'); } diff --git a/src/vs/base/browser/ui/tree/objectTree.ts b/src/vs/base/browser/ui/tree/objectTree.ts index 988529971c7..40a2c92e6a9 100644 --- a/src/vs/base/browser/ui/tree/objectTree.ts +++ b/src/vs/base/browser/ui/tree/objectTree.ts @@ -65,7 +65,7 @@ export class ObjectTree, TFilterData = void> extends this.model.rerender(element); } - updateElementHeight(element: T, height: number): void { + updateElementHeight(element: T, height: number | undefined): void { this.model.updateElementHeight(element, height); } diff --git a/src/vs/base/browser/ui/tree/objectTreeModel.ts b/src/vs/base/browser/ui/tree/objectTreeModel.ts index c4fce903a54..daefce35be9 100644 --- a/src/vs/base/browser/ui/tree/objectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/objectTreeModel.ts @@ -14,7 +14,7 @@ export type ITreeNodeCallback = (node: ITreeNode export interface IObjectTreeModel, TFilterData extends NonNullable = void> extends ITreeModel { setChildren(element: T | null, children: Iterable> | undefined, options?: IObjectTreeModelSetChildrenOptions): void; resort(element?: T | null, recursive?: boolean): void; - updateElementHeight(element: T, height: number): void; + updateElementHeight(element: T, height: number | undefined): void; } export interface IObjectTreeModelSetChildrenOptions extends IIndexTreeModelSpliceOptions { @@ -164,7 +164,7 @@ export class ObjectTreeModel, TFilterData extends Non this.model.rerender(location); } - updateElementHeight(element: T, height: number): void { + updateElementHeight(element: T, height: number | undefined): void { const location = this.getElementLocation(element); this.model.updateElementHeight(location, height); } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index 9cc27f12c0e..4e8aee7236a 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -747,9 +747,9 @@ export class SettingsEditor2 extends EditorPane { this.searchWidget.setValue(element.targetKey); })); this._register(this.settingRenderers.onDidChangeSettingHeight((params: HeightChangeParams) => { - const { element, height } = params; + const { element } = params; try { - this.settingsTree.updateElementHeight(element, height); + this.settingsTree.updateElementHeight(element, undefined); } catch (e) { // the element was not found } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 2fac89f41da..f901ad5b0f8 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -590,7 +590,6 @@ function addChildrenToTabOrder(node: Element): void { export interface HeightChangeParams { element: SettingsTreeElement; - height: number; } export abstract class AbstractSettingRenderer extends Disposable implements ITreeRenderer { @@ -1495,16 +1494,10 @@ export class SettingMultilineTextRenderer extends AbstractSettingTextRenderer im }; super.renderValue(dataElement, template, onChangeOverride); template.elementDisposables.add( - template.inputBox.onDidHeightChange(e => { - const height = template.containerElement.clientHeight; - // Don't fire event if height is reported as 0, - // which sometimes happens when clicking onto a new setting. - if (height) { - this._onDidChangeSettingHeight.fire({ - element: dataElement, - height: template.containerElement.clientHeight - }); - } + template.inputBox.onDidHeightChange(() => { + this._onDidChangeSettingHeight.fire({ + element: dataElement, + }); }) ); template.inputBox.layout();