This commit is contained in:
rebornix
2020-08-04 19:11:14 -07:00
parent d762190a09
commit d13d2fc56d
3 changed files with 38 additions and 7 deletions
@@ -30,7 +30,7 @@ import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEd
import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
import { NotebookService } from 'vs/workbench/contrib/notebook/browser/notebookServiceImpl';
import { CellKind, CellUri, NotebookDocumentBackupData, NotebookEditorPriority } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { CellKind, CellUri, getCellUndoRedoComparisonKey, NotebookDocumentBackupData, NotebookEditorPriority } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider';
import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService';
import { IEditorService, IOpenEditorOverride } from 'vs/workbench/services/editor/common/editorService';
@@ -151,12 +151,7 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri
this._register(undoRedoService.registerUriComparisonKeyComputer(CellUri.scheme, {
getComparisonKey: (uri: URI): string => {
const data = CellUri.parse(uri);
if (!data) {
return uri.toString();
}
return data.notebook.toString();
return getCellUndoRedoComparisonKey(uri);
}
}));
@@ -32,6 +32,7 @@ import { IPosition, Position } from 'vs/editor/common/core/position';
import { SplitCellEdit, JoinCellEdit } from 'vs/workbench/contrib/notebook/browser/viewModel/cellEdit';
import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel';
import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer';
import { MultiModelEditStackElement, SingleModelEditStackElement } from 'vs/editor/common/model/editStack';
export interface INotebookEditorViewState {
editingCells: { [key: number]: boolean };
@@ -1051,12 +1052,38 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD
});
}
async withElement(element: SingleModelEditStackElement | MultiModelEditStackElement, callback: () => Promise<void>) {
const viewCells = this._viewCells.filter(cell => element.matchesResource(cell.uri));
const refs = await Promise.all(viewCells.map(cell => cell.model.resolveTextModelRef()));
await callback();
refs.forEach(ref => ref.dispose());
}
async undo() {
const editStack = this._undoService.getElements(this.uri);
const element = editStack.past.length ? editStack.past[editStack.past.length - 1] : undefined;
if (element && element instanceof SingleModelEditStackElement || element instanceof MultiModelEditStackElement) {
return await this.withElement(element, async () => {
await this._undoService.undo(this.uri);
});
}
await this._undoService.undo(this.uri);
}
async redo() {
const editStack = this._undoService.getElements(this.uri);
const element = editStack.future[0];
if (element && element instanceof SingleModelEditStackElement || element instanceof MultiModelEditStackElement) {
return await this.withElement(element, async () => {
await this._undoService.redo(this.uri);
});
}
await this._undoService.redo(this.uri);
}
equal(notebook: NotebookTextModel) {
@@ -413,6 +413,15 @@ export interface NotebookDataDto {
readonly metadata: NotebookDocumentMetadata;
}
export function getCellUndoRedoComparisonKey(uri: URI) {
const data = CellUri.parse(uri);
if (!data) {
return uri.toString();
}
return data.notebook.toString();
}
export namespace CellUri {