提交 e88c040d 编写于 作者: R rebornix

ignore transient metadata in diff editor.

上级 7c986e94
...@@ -428,9 +428,9 @@ export class ExtHostNotebookDocument extends Disposable { ...@@ -428,9 +428,9 @@ export class ExtHostNotebookDocument extends Disposable {
this._emitter.emitCellLanguageChange(event); this._emitter.emitCellLanguageChange(event);
} }
private _changeCellMetadata(index: number, newMetadata: NotebookCellMetadata): void { private _changeCellMetadata(index: number, newMetadata: NotebookCellMetadata | undefined): void {
const cell = this._cells[index]; const cell = this._cells[index];
cell.setMetadata(newMetadata); cell.setMetadata(newMetadata || {});
const event: vscode.NotebookCellMetadataChangeEvent = { document: this.notebookDocument, cell: cell.cell }; const event: vscode.NotebookCellMetadataChangeEvent = { document: this.notebookDocument, cell: cell.cell };
this._emitter.emitCellMetadataChange(event); this._emitter.emitCellMetadataChange(event);
} }
......
...@@ -235,7 +235,7 @@ abstract class AbstractCellRenderer extends Disposable { ...@@ -235,7 +235,7 @@ abstract class AbstractCellRenderer extends Disposable {
{ {
updateInfoRendering: this.updateMetadataRendering.bind(this), updateInfoRendering: this.updateMetadataRendering.bind(this),
checkIfModified: (cell) => { checkIfModified: (cell) => {
return cell.type === 'modified' && hash(cell.original?.metadata ?? {}) !== hash(cell.modified?.metadata ?? {}); return cell.type === 'modified' && hash(this._getFormatedMetadataJSON(cell.original?.metadata || {})) !== hash(this._getFormatedMetadataJSON(cell.modified?.metadata ?? {}));
}, },
getFoldingState: (cell) => { getFoldingState: (cell) => {
return cell.metadataFoldingState; return cell.metadataFoldingState;
...@@ -321,10 +321,25 @@ abstract class AbstractCellRenderer extends Disposable { ...@@ -321,10 +321,25 @@ abstract class AbstractCellRenderer extends Disposable {
} }
} }
private _getFormatedMetadataJSON(metadata: NotebookCellMetadata, language?: string) { protected _getFormatedMetadataJSON(metadata: NotebookCellMetadata, language?: string) {
let filteredMetadata: { [key: string]: any } = {};
if (this.notebookEditor.textModel) {
const transientMetadata = this.notebookEditor.textModel!.transientMetadata;
const keys = new Set([...Object.keys(metadata)]);
for (let key of keys) {
if (!(transientMetadata[key as keyof NotebookCellMetadata])
) {
filteredMetadata[key] = metadata[key as keyof NotebookCellMetadata];
}
}
} else {
filteredMetadata = metadata;
}
const content = JSON.stringify({ const content = JSON.stringify({
language, language,
...metadata ...filteredMetadata
}); });
const edits = format(content, undefined, {}); const edits = format(content, undefined, {});
......
...@@ -8,8 +8,10 @@ import { CellDiffViewModel } from 'vs/workbench/contrib/notebook/browser/diff/ce ...@@ -8,8 +8,10 @@ import { CellDiffViewModel } from 'vs/workbench/contrib/notebook/browser/diff/ce
import { Event } from 'vs/base/common/event'; import { Event } from 'vs/base/common/event';
import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
import { DisposableStore } from 'vs/base/common/lifecycle'; import { DisposableStore } from 'vs/base/common/lifecycle';
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
export interface INotebookTextDiffEditor { export interface INotebookTextDiffEditor {
readonly textModel?: NotebookTextModel;
onMouseUp: Event<{ readonly event: MouseEvent; readonly target: CellDiffViewModel; }>; onMouseUp: Event<{ readonly event: MouseEvent; readonly target: CellDiffViewModel; }>;
getOverflowContainerDomNode(): HTMLElement; getOverflowContainerDomNode(): HTMLElement;
getLayoutInfo(): NotebookLayoutInfo; getLayoutInfo(): NotebookLayoutInfo;
......
...@@ -30,6 +30,7 @@ import { Emitter } from 'vs/base/common/event'; ...@@ -30,6 +30,7 @@ import { Emitter } from 'vs/base/common/event';
import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { NotebookDiffEditorEventDispatcher, NotebookLayoutChangedEvent } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; import { NotebookDiffEditorEventDispatcher, NotebookLayoutChangedEvent } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher';
import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane';
import { INotebookDiffEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon';
export const IN_NOTEBOOK_TEXT_DIFF_EDITOR = new RawContextKey<boolean>('isInNotebookTextDiffEditor', false); export const IN_NOTEBOOK_TEXT_DIFF_EDITOR = new RawContextKey<boolean>('isInNotebookTextDiffEditor', false);
...@@ -46,6 +47,10 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD ...@@ -46,6 +47,10 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD
public readonly onMouseUp = this._onMouseUp.event; public readonly onMouseUp = this._onMouseUp.event;
private _eventDispatcher: NotebookDiffEditorEventDispatcher | undefined; private _eventDispatcher: NotebookDiffEditorEventDispatcher | undefined;
protected _scopeContextKeyService!: IContextKeyService; protected _scopeContextKeyService!: IContextKeyService;
private _model: INotebookDiffEditorModel | null = null;
get textModel() {
return this._model?.modified.notebook;
}
constructor( constructor(
@IInstantiationService readonly instantiationService: IInstantiationService, @IInstantiationService readonly instantiationService: IInstantiationService,
...@@ -132,19 +137,19 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD ...@@ -132,19 +137,19 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD
async setInput(input: NotebookDiffEditorInput, options: EditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise<void> { async setInput(input: NotebookDiffEditorInput, options: EditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise<void> {
await super.setInput(input, options, context, token); await super.setInput(input, options, context, token);
const model = await input.resolve(); this._model = await input.resolve();
if (model === null) { if (this._model === null) {
return; return;
} }
this._eventDispatcher = new NotebookDiffEditorEventDispatcher(); this._eventDispatcher = new NotebookDiffEditorEventDispatcher();
const diffResult = await this.notebookEditorWorkerService.computeDiff(model.original.resource, model.modified.resource); const diffResult = await this.notebookEditorWorkerService.computeDiff(this._model.original.resource, this._model.modified.resource);
const cellChanges = diffResult.cellsDiff.changes; const cellChanges = diffResult.cellsDiff.changes;
const cellDiffViewModels: CellDiffViewModel[] = []; const cellDiffViewModels: CellDiffViewModel[] = [];
const originalModel = model.original.notebook; const originalModel = this._model.original.notebook;
const modifiedModel = model.modified.notebook; const modifiedModel = this._model.modified.notebook;
let originalCellIndex = 0; let originalCellIndex = 0;
let modifiedCellIndex = 0; let modifiedCellIndex = 0;
......
...@@ -198,14 +198,6 @@ ${patterns} ...@@ -198,14 +198,6 @@ ${patterns}
if (!this._textModel) { if (!this._textModel) {
this._textModel = await this._notebookModelResolverService.resolve(this.resource, this.viewType!, editorId); this._textModel = await this._notebookModelResolverService.resolve(this.resource, this.viewType!, editorId);
this._originalTextModel = await this._notebookModelResolverService.resolve(this.originalResource, this.viewType!, editorId); this._originalTextModel = await this._notebookModelResolverService.resolve(this.originalResource, this.viewType!, editorId);
// this._register(this._textModel.object.onDidChangeDirty(() => {
// this._onDidChangeDirty.fire();
// }));
// if (this._textModel.object.isDirty()) {
// this._onDidChangeDirty.fire();
// }
} }
return new NotebookDiffEditorModel(this._originalTextModel!.object as NotebookEditorModel, this._textModel.object as NotebookEditorModel); return new NotebookDiffEditorModel(this._originalTextModel!.object as NotebookEditorModel, this._textModel.object as NotebookEditorModel);
......
...@@ -15,7 +15,7 @@ export interface ITextCellEditingDelegate { ...@@ -15,7 +15,7 @@ export interface ITextCellEditingDelegate {
insertCell?(index: number, cell: NotebookCellTextModel): void; insertCell?(index: number, cell: NotebookCellTextModel): void;
deleteCell?(index: number): void; deleteCell?(index: number): void;
moveCell?(fromIndex: number, length: number, toIndex: number, beforeSelections: number[] | undefined, endSelections: number[] | undefined): void; moveCell?(fromIndex: number, length: number, toIndex: number, beforeSelections: number[] | undefined, endSelections: number[] | undefined): void;
updateCellMetadata?(index: number, newMetadata: NotebookCellMetadata | undefined): void; updateCellMetadata?(index: number, newMetadata: NotebookCellMetadata): void;
emitSelections(selections: number[]): void; emitSelections(selections: number[]): void;
} }
...@@ -192,8 +192,8 @@ export class CellMetadataEdit implements IResourceUndoRedoElement { ...@@ -192,8 +192,8 @@ export class CellMetadataEdit implements IResourceUndoRedoElement {
constructor( constructor(
public resource: URI, public resource: URI,
readonly index: number, readonly index: number,
readonly oldMetadata: NotebookCellMetadata | undefined, readonly oldMetadata: NotebookCellMetadata,
readonly newMetadata: NotebookCellMetadata | undefined, readonly newMetadata: NotebookCellMetadata,
private editingDelegate: ITextCellEditingDelegate, private editingDelegate: ITextCellEditingDelegate,
) { ) {
......
...@@ -32,13 +32,13 @@ export class NotebookCellTextModel extends Disposable implements ICell { ...@@ -32,13 +32,13 @@ export class NotebookCellTextModel extends Disposable implements ICell {
return this._outputs; return this._outputs;
} }
private _metadata: NotebookCellMetadata | undefined; private _metadata: NotebookCellMetadata;
get metadata() { get metadata() {
return this._metadata; return this._metadata;
} }
set metadata(newMetadata: NotebookCellMetadata | undefined) { set metadata(newMetadata: NotebookCellMetadata) {
this._metadata = newMetadata; this._metadata = newMetadata;
this._hash = null; this._hash = null;
this._onDidChangeMetadata.fire(); this._onDidChangeMetadata.fire();
...@@ -89,7 +89,7 @@ export class NotebookCellTextModel extends Disposable implements ICell { ...@@ -89,7 +89,7 @@ export class NotebookCellTextModel extends Disposable implements ICell {
) { ) {
super(); super();
this._outputs = outputs; this._outputs = outputs;
this._metadata = metadata; this._metadata = metadata || {};
} }
getValue(): string { getValue(): string {
......
...@@ -187,7 +187,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel ...@@ -187,7 +187,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
) { ) {
const cellHandle = this._cellhandlePool++; const cellHandle = this._cellhandlePool++;
const cellUri = CellUri.generate(this.uri, cellHandle); const cellUri = CellUri.generate(this.uri, cellHandle);
return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata, this._modelService); return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata || {}, this._modelService);
} }
initialize(cells: ICellDto2[]) { initialize(cells: ICellDto2[]) {
...@@ -497,59 +497,22 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel ...@@ -497,59 +497,22 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
} }
} }
private _compareCellMetadata(a: NotebookCellMetadata | undefined, b: NotebookCellMetadata | undefined) { private _compareCellMetadata(a: NotebookCellMetadata, b: NotebookCellMetadata) {
if (a?.editable !== b?.editable && !this.transientMetadata.editable) { const keys = new Set([...Object.keys(a || {}), ...Object.keys(b || {})]);
return true; for (let key of keys) {
} if (
(a[key as keyof NotebookCellMetadata] !== b[key as keyof NotebookCellMetadata])
if (a?.runnable !== b?.runnable && !this.transientMetadata.runnable) { &&
return true; !(this.transientMetadata[key as keyof NotebookCellMetadata])
} ) {
return true;
if (a?.breakpointMargin !== b?.breakpointMargin && !this.transientMetadata.breakpointMargin) { }
return true;
}
if (a?.hasExecutionOrder !== b?.hasExecutionOrder && !this.transientMetadata.hasExecutionOrder) {
return true;
}
if (a?.executionOrder !== b?.executionOrder && !this.transientMetadata.executionOrder) {
return true;
}
if (a?.statusMessage !== b?.statusMessage && !this.transientMetadata.statusMessage) {
return true;
}
if (a?.runState !== b?.runState && !this.transientMetadata.runState) {
return true;
}
if (a?.runStartTime !== b?.runStartTime && !this.transientMetadata.runStartTime) {
return true;
}
if (a?.lastRunDuration !== b?.lastRunDuration && !this.transientMetadata.lastRunDuration) {
return true;
}
if (a?.inputCollapsed !== b?.inputCollapsed && !this.transientMetadata.inputCollapsed) {
return true;
}
if (a?.outputCollapsed !== b?.outputCollapsed && !this.transientMetadata.outputCollapsed) {
return true;
}
if (a?.custom !== b?.custom && !this.transientMetadata.custom) {
return true;
} }
return false; return false;
} }
changeCellMetadata(handle: number, metadata: NotebookCellMetadata | undefined, pushUndoStop: boolean) { changeCellMetadata(handle: number, metadata: NotebookCellMetadata, pushUndoStop: boolean) {
const cell = this.cells.find(cell => cell.handle === handle); const cell = this.cells.find(cell => cell.handle === handle);
if (!cell) { if (!cell) {
......
...@@ -397,7 +397,7 @@ export interface NotebookCellsChangeMetadataEvent { ...@@ -397,7 +397,7 @@ export interface NotebookCellsChangeMetadataEvent {
readonly kind: NotebookCellsChangeType.ChangeMetadata; readonly kind: NotebookCellsChangeType.ChangeMetadata;
readonly versionId: number; readonly versionId: number;
readonly index: number; readonly index: number;
readonly metadata: NotebookCellMetadata; readonly metadata: NotebookCellMetadata | undefined;
} }
export type NotebookCellsChangedEvent = NotebookCellsInitializeEvent | NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent | NotebookCellsChangeMetadataEvent; export type NotebookCellsChangedEvent = NotebookCellsInitializeEvent | NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent | NotebookCellsChangeMetadataEvent;
......
...@@ -76,3 +76,9 @@ export class NotebookModelResolverService implements INotebookEditorModelResolve ...@@ -76,3 +76,9 @@ export class NotebookModelResolverService implements INotebookEditorModelResolve
}; };
} }
} }
// notebookService.onDidAddDocument
// resolve()
// notebookService.onDidRemoveDocument ...
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册