fix #121807. Turn notebook to dirty if the output changes.

This commit is contained in:
rebornix
2021-08-04 15:03:10 -07:00
parent 9dc30d8565
commit cd121a7976
2 changed files with 21 additions and 7 deletions
+1 -1
View File
@@ -668,7 +668,7 @@ export class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {
export class PauseableEmitter<T> extends Emitter<T> {
private _isPaused = 0;
private _eventQueue = new LinkedList<T>();
protected _eventQueue = new LinkedList<T>();
private _mergeFn?: (input: T[]) => T;
constructor(options?: EmitterOptions & { merge?: (input: T[]) => T }) {
@@ -142,6 +142,20 @@ type TransformedEdit = {
originalIndex: number;
};
export class NotebookEventEmitter extends PauseableEmitter<NotebookTextModelChangedEvent> {
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<void> = this._register(new Emitter<void>());
@@ -168,7 +182,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
*/
private _alternativeVersionId: string = '1';
private _operationManager: NotebookOperationManager;
private _pauseableEmitter: PauseableEmitter<NotebookTextModelChangedEvent>;
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<NotebookTextModelChangedEvent>({
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();