提交 a9f87e7c 编写于 作者: R rebornix

diff outputs instead of replacing the whole outputs array.

上级 5d73637a
......@@ -74,7 +74,9 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod
) {
super(viewType, model, UUID.generateUuid(), configurationService);
this._register(this.model.onDidChangeOutputs((splices) => {
this._outputCollection = new Array(this.model.outputs.length);
splices.reverse().forEach(splice => {
this._outputCollection.splice(splice[0], splice[1], ...splice[2].map(() => 0));
});
this._outputsTop = null;
this._onDidChangeOutputs.fire(splices);
}));
......
......@@ -8,13 +8,15 @@ import { Emitter, Event } from 'vs/base/common/event';
import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle';
import { URI } from 'vs/base/common/uri';
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
import { INotebookTextModel, NotebookCellOutputsSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, CellEditType, CellUri, notebookDocumentMetadataDefaults, diff, NotebookCellsChangeType, ICellDto2, TransientOptions, NotebookTextModelChangedEvent, NotebookRawContentEvent } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookTextModel, NotebookCellOutputsSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, CellEditType, CellUri, notebookDocumentMetadataDefaults, diff, NotebookCellsChangeType, ICellDto2, TransientOptions, NotebookTextModelChangedEvent, NotebookRawContentEvent, IProcessedOutput, CellOutputKind } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { ITextSnapshot } from 'vs/editor/common/model';
import { IUndoRedoService, UndoRedoElementType, IUndoRedoElement, IResourceUndoRedoElement } from 'vs/platform/undoRedo/common/undoRedo';
import { MoveCellEdit, SpliceCellsEdit, CellMetadataEdit } from 'vs/workbench/contrib/notebook/common/model/cellEdit';
import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { IModeService } from 'vs/editor/common/services/modeService';
import { IRange } from 'vs/editor/common/core/range';
import { ISequence, LcsDiff } from 'vs/base/common/diff/diff';
import { hash } from 'vs/base/common/hash';
export class NotebookTextModelSnapshot implements ITextSnapshot {
......@@ -329,8 +331,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
//TODO@joh,@rebornix no event, no undo stop (?)
this._assertIndex(edit.index);
const cell = this._cells[edit.index];
// TODO@rebornix, we should do diff first
this._spliceNotebookCellOutputs(cell.handle, [[0, cell.outputs.length, edit.outputs]], computeUndoRedo);
this._spliceNotebookCellOutputs2(cell.handle, edit.outputs, computeUndoRedo);
break;
case CellEditType.OutputsSplice:
{
......@@ -645,6 +646,18 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
this._eventEmitter.emit({ kind: NotebookCellsChangeType.ChangeLanguage, index: this._cells.indexOf(cell), language: languageId, transient: false }, true);
}
private _spliceNotebookCellOutputs2(cellHandle: number, outputs: IProcessedOutput[], computeUndoRedo: boolean): void {
const cell = this._mapping.get(cellHandle);
if (!cell) {
return;
}
const diff = new LcsDiff(new OutputSequence(cell.outputs), new OutputSequence(outputs));
const diffResult = diff.ComputeDiff(false);
const splices: NotebookCellOutputsSplice[] = diffResult.changes.map(change => [change.originalStart, change.originalLength, outputs.slice(change.modifiedStart, change.modifiedStart + change.modifiedLength)]);
this._spliceNotebookCellOutputs(cellHandle, splices, computeUndoRedo);
}
private _spliceNotebookCellOutputs(cellHandle: number, splices: NotebookCellOutputsSplice[], computeUndoRedo: boolean): void {
const cell = this._mapping.get(cellHandle);
if (cell) {
......@@ -695,3 +708,22 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
}
}
}
class OutputSequence implements ISequence {
constructor(readonly outputs: IProcessedOutput[]) {
}
getElements(): Int32Array | number[] | string[] {
return this.outputs.map(output => {
switch (output.outputKind) {
case CellOutputKind.Rich:
return hash([output.outputKind, output.metadata, output.data]);
case CellOutputKind.Error:
return hash([output.outputKind, output.ename, output.evalue, output.traceback]);
case CellOutputKind.Text:
return hash([output.outputKind, output.text]);
}
});
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册