diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index e65d517c15200f62e0d7649b69c84cf7d963e514..d3a23d3faf331e177d31aac5f314fd48ac400c5c 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -10,7 +10,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Color, RGBA } from 'vs/base/common/color'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { combinedDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, DisposableStore, Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import 'vs/css!./media/notebook'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; @@ -732,6 +732,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor private readonly _onMouseDown: Emitter = this._register(new Emitter()); public readonly onMouseDown: Event = this._onMouseDown.event; + private pendingLayouts = new WeakMap(); + //#endregion //#region Cell operations @@ -746,16 +748,27 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this.list?.updateElementHeight2(cell, height); }; + if (this.pendingLayouts.has(cell)) { + this.pendingLayouts.get(cell)!.dispose(); + } + let r: () => void; - DOM.scheduleAtNextAnimationFrame(() => { + const layoutDisposable = DOM.scheduleAtNextAnimationFrame(() => { if (this._isDisposed) { return; } + this.pendingLayouts.delete(cell); + relayout(cell, height); r(); }); + this.pendingLayouts.set(cell, toDisposable(() => { + layoutDisposable.dispose(); + r(); + })); + return new Promise(resolve => { r = resolve; }); }