diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 422492ce148..0a94450446a 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -668,7 +668,7 @@ export class AsyncEmitter extends Emitter { export class PauseableEmitter extends Emitter { private _isPaused = 0; - private _eventQueue = new LinkedList(); + protected _eventQueue = new LinkedList(); private _mergeFn?: (input: T[]) => T; constructor(options?: EmitterOptions & { merge?: (input: T[]) => T }) { diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index ca79bc1d4cc..f79ea248389 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -142,6 +142,20 @@ type TransformedEdit = { originalIndex: number; }; +export class NotebookEventEmitter extends PauseableEmitter { + isDirtyEvent() { + for (let e of this._eventQueue) { + for (let i = 0; i < e.rawEvents.length; i++) { + if (!e.rawEvents[i].transient) { + return true; + } + } + } + + return false; + } +} + export class NotebookTextModel extends Disposable implements INotebookTextModel { private readonly _onWillDispose: Emitter = this._register(new Emitter()); @@ -168,7 +182,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel */ private _alternativeVersionId: string = '1'; private _operationManager: NotebookOperationManager; - private _pauseableEmitter: PauseableEmitter; + private _pauseableEmitter: NotebookEventEmitter; get length() { return this._cells.length; @@ -217,7 +231,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel }; this._register(_modelService.onModelAdded(e => maybeUpdateCellTextModel(e))); - this._pauseableEmitter = new PauseableEmitter({ + this._pauseableEmitter = new NotebookEventEmitter({ merge: (events: NotebookTextModelChangedEvent[]) => { let first = events[0]; @@ -365,7 +379,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel } finally { // Update selection and versionId after applying edits. const endSelections = endSelectionsComputer(); - this._increaseVersionId(this._operationManager.isUndoStackEmpty()); + this._increaseVersionId(this._operationManager.isUndoStackEmpty() && !this._pauseableEmitter.isDirtyEvent()); // Finalize undo element this.pushStackElement('edit', endSelections, undefined); @@ -376,7 +390,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel } } - private _doApplyEdits(rawEdits: ICellEditOperation[], synchronous: boolean, computeUndoRedo: boolean = true): void { + private _doApplyEdits(rawEdits: ICellEditOperation[], synchronous: boolean, computeUndoRedo: boolean): void { // compress all edits which have no side effects on cell index const edits = this._mergeCellEdits(rawEdits.map((edit, index) => { @@ -601,9 +615,9 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel }); } - private _increaseVersionId(undoStackEmpty: boolean): void { + private _increaseVersionId(transient: boolean): void { this._versionId = this._versionId + 1; - if (!undoStackEmpty) { + if (!transient) { this._notebookSpecificAlternativeId = this._versionId; } this._alternativeVersionId = this._generateAlternativeId();