Skip to content

Commit 2951e1f

Browse files
committed
add NotebookEditorCellEdit#replaceMetadata,
microsoft#105283
1 parent 8c5bdcd commit 2951e1f

4 files changed

Lines changed: 39 additions & 49 deletions

File tree

src/vs/vscode.proposed.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1356,8 +1356,8 @@ declare module 'vscode' {
13561356
export interface NotebookEditorCellEdit {
13571357

13581358
replaceCells(from: number, to: number, cells: NotebookCellData[]): void;
1359-
13601359
replaceOutputs(index: number, outputs: CellOutput[]): void;
1360+
replaceMetadata(index: number, metadata: NotebookCellMetadata): void;
13611361

13621362
/** @deprecated */
13631363
insert(index: number, content: string | string[], language: string, type: CellKind, outputs: CellOutput[], metadata: NotebookCellMetadata | undefined): void;

src/vs/workbench/api/common/extHostNotebook.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,15 @@ export class NotebookEditorCellEditBuilder implements vscode.NotebookEditorCellE
511511
}
512512
}
513513

514+
replaceMetadata(index: number, metadata: vscode.NotebookCellMetadata): void {
515+
this._throwIfFinalized();
516+
this._collectedEdits.push({
517+
editType: CellEditType.Metadata,
518+
index,
519+
metadata
520+
});
521+
}
522+
514523
replaceOutputs(index: number, outputs: vscode.CellOutput[]): void {
515524
this._throwIfFinalized();
516525
this._collectedEdits.push({

src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,12 @@ import { Emitter, Event } from 'vs/base/common/event';
88
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
99
import { URI } from 'vs/base/common/uri';
1010
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
11-
import { INotebookTextModel, NotebookCellOutputsSplice, NotebookCellTextModelSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, CellEditType, CellUri, ICellInsertEdit, NotebookCellsChangedEvent, CellKind, IProcessedOutput, notebookDocumentMetadataDefaults, diff, ICellDeleteEdit, NotebookCellsChangeType, ICellDto2, IMainCellDto, ICellOutputEdit } from 'vs/workbench/contrib/notebook/common/notebookCommon';
11+
import { INotebookTextModel, NotebookCellOutputsSplice, NotebookCellTextModelSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, CellEditType, CellUri, NotebookCellsChangedEvent, CellKind, IProcessedOutput, notebookDocumentMetadataDefaults, diff, NotebookCellsChangeType, ICellDto2, IMainCellDto } from 'vs/workbench/contrib/notebook/common/notebookCommon';
1212
import { ITextSnapshot } from 'vs/editor/common/model';
1313
import { IUndoRedoService, UndoRedoElementType, IUndoRedoElement, IResourceUndoRedoElement } from 'vs/platform/undoRedo/common/undoRedo';
1414
import { InsertCellEdit, DeleteCellEdit, MoveCellEdit, SpliceCellsEdit } from 'vs/workbench/contrib/notebook/common/model/cellEdit';
1515
import { ITextModelService } from 'vs/editor/common/services/resolverService';
1616

17-
function compareRangesUsingEnds(a: [number, number], b: [number, number]): number {
18-
if (a[1] === b[1]) {
19-
return a[1] - b[1];
20-
21-
}
22-
return a[1] - b[1];
23-
}
24-
2517
export class NotebookTextModelSnapshot implements ITextSnapshot {
2618
// private readonly _pieces: Ce[] = [];
2719
private _index: number = -1;
@@ -235,54 +227,36 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
235227
const oldViewCells = this.cells.slice(0);
236228
const oldMap = new Map(this._mapping);
237229

238-
let operations: ({ sortIndex: number; start: number; end: number; } & ICellEditOperation)[] = [];
239-
for (let i = 0; i < rawEdits.length; i++) {
240-
if (rawEdits[i].editType === CellEditType.Insert) {
241-
const edit = rawEdits[i] as ICellInsertEdit;
242-
operations.push({
243-
sortIndex: i,
244-
start: edit.index,
245-
end: edit.index,
246-
...edit
247-
});
248-
} else {
249-
const edit = rawEdits[i] as ICellDeleteEdit;
250-
operations.push({
251-
sortIndex: i,
252-
start: edit.index,
253-
end: edit.index + edit.count,
254-
...edit
255-
});
256-
}
257-
}
258-
259-
// const edits
260-
operations = operations.sort((a, b) => {
261-
const r = compareRangesUsingEnds([a.start, a.end], [b.start, b.end]);
262-
if (r === 0) {
263-
return b.sortIndex - a.sortIndex;
264-
}
265-
return -r;
230+
const edits = rawEdits.map((edit, index) => {
231+
return {
232+
edit,
233+
end: edit.editType === CellEditType.Delete ? edit.index + edit.count : edit.index,
234+
originalIndex: index,
235+
};
236+
}).sort((a, b) => {
237+
return b.end - a.end || b.originalIndex - a.originalIndex;
266238
});
267239

268-
for (let i = 0; i < operations.length; i++) {
269-
switch (operations[i].editType) {
240+
for (const { edit } of edits) {
241+
switch (edit.editType) {
270242
case CellEditType.Insert:
271-
const insertEdit = operations[i] as ICellInsertEdit;
272-
const mainCells = insertEdit.cells.map(cell => {
243+
const mainCells = edit.cells.map(cell => {
273244
const cellHandle = this._cellhandlePool++;
274245
const cellUri = CellUri.generate(this.uri, cellHandle);
275246
return new NotebookCellTextModel(cellUri, cellHandle, cell.source, cell.language, cell.cellKind, cell.outputs || [], cell.metadata, this._modelService);
276247
});
277-
this.insertNewCell(insertEdit.index, mainCells, false);
248+
this.insertNewCell(edit.index, mainCells, false);
278249
break;
279250
case CellEditType.Delete:
280-
this.removeCell(operations[i].index, operations[i].end - operations[i].start, false);
251+
this.removeCell(edit.index, edit.count, false);
281252
break;
282253
case CellEditType.Output:
283254
//TODO@joh,@rebornix no event, no undo stop (?)
284-
const cell = this.cells[operations[i].index];
285-
this.spliceNotebookCellOutputs(cell.handle, [[0, cell.outputs.length, (<ICellOutputEdit>operations[i]).outputs]]);
255+
const cell = this.cells[edit.index];
256+
this.spliceNotebookCellOutputs(cell.handle, [[0, cell.outputs.length, edit.outputs]]);
257+
break;
258+
case CellEditType.Metadata:
259+
this.changeCellMetadata(this.cells[edit.index].handle, edit.metadata);
286260
break;
287261
}
288262
}

src/vs/workbench/contrib/notebook/common/notebookCommon.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ export const enum CellEditType {
403403
Insert = 1,
404404
Delete = 2,
405405
Output = 3,
406+
Metadata = 4,
406407
}
407408

408409
export interface ICellDto2 {
@@ -427,11 +428,17 @@ export interface ICellDeleteEdit {
427428

428429
export interface ICellOutputEdit {
429430
editType: CellEditType.Output;
430-
index: number,
431-
outputs: IProcessedOutput[]
431+
index: number;
432+
outputs: IProcessedOutput[];
433+
}
434+
435+
export interface ICellMetadataEdit {
436+
editType: CellEditType.Metadata;
437+
index: number;
438+
metadata: NotebookCellMetadata;
432439
}
433440

434-
export type ICellEditOperation = ICellInsertEdit | ICellDeleteEdit | ICellOutputEdit;
441+
export type ICellEditOperation = ICellInsertEdit | ICellDeleteEdit | ICellOutputEdit | ICellMetadataEdit;
435442

436443
export interface INotebookEditData {
437444
documentVersionId: number;

0 commit comments

Comments
 (0)