提交 433086be 编写于 作者: R Rob Lourens

Make notebook doc metadata optional, listen to changes on metadata object

Fix #93815
上级 9442048e
......@@ -1320,25 +1320,25 @@ declare module 'vscode' {
* Controls if users can add or delete cells
* Defaults to true
*/
editable: boolean;
editable?: boolean;
/**
* Default value for [cell editable metadata](#NotebookCellMetadata.editable).
* Defaults to true.
*/
cellEditable: boolean;
cellEditable?: boolean;
/**
* Default value for [cell runnable metadata](#NotebookCellMetadata.runnable).
* Defaults to true.
*/
cellRunnable: boolean;
cellRunnable?: boolean;
/**
* Whether the [execution order](#NotebookCellMetadata.executionOrder) indicator will be displayed.
* Defaults to true.
*/
hasExecutionOrder: boolean;
hasExecutionOrder?: boolean;
}
export interface NotebookDocument {
......@@ -1348,7 +1348,7 @@ declare module 'vscode' {
readonly cells: NotebookCell[];
languages: string[];
displayOrder?: GlobPattern[];
metadata?: NotebookDocumentMetadata;
metadata: NotebookDocumentMetadata;
}
export interface NotebookEditorCellEdit {
......
......@@ -13,7 +13,7 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'
import { CellKind, CellOutputKind, ExtHostNotebookShape, IMainContext, MainContext, MainThreadNotebookShape, NotebookCellOutputsSplice } from 'vs/workbench/api/common/extHost.protocol';
import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands';
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
import { CellEditType, CellUri, diff, ICellEditOperation, ICellInsertEdit, IErrorOutput, INotebookDisplayOrder, INotebookEditData, IOrderedMimeType, IStreamOutput, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellsChangedEvent, NotebookCellsSplice2, sortMimeTypes, ICellDeleteEdit } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { CellEditType, CellUri, diff, ICellEditOperation, ICellInsertEdit, IErrorOutput, INotebookDisplayOrder, INotebookEditData, IOrderedMimeType, IStreamOutput, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellsChangedEvent, NotebookCellsSplice2, sortMimeTypes, ICellDeleteEdit, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { Disposable as VSCodeDisposable } from './extHostTypes';
import { CancellationToken } from 'vs/base/common/cancellation';
......@@ -38,13 +38,6 @@ function getObservable<T extends Object>(obj: T): IObservable<T> {
};
}
const notebookDocumentMetadataDefaults: vscode.NotebookDocumentMetadata = {
editable: true,
cellEditable: true,
cellRunnable: true,
hasExecutionOrder: true
};
export class ExtHostCell extends Disposable implements vscode.NotebookCell {
private originalSource: string[];
......@@ -82,7 +75,7 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell {
this.originalSource = this._content.split(/\r|\n|\r\n/g);
this._outputs = outputs;
const observableMetadata = getObservable(_metadata || {} as any);
const observableMetadata = getObservable(_metadata || {});
this._metadata = observableMetadata.proxy;
this._metadataChangeListener = this._register(observableMetadata.onDidChange(() => {
this.updateMetadata();
......@@ -117,8 +110,9 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell {
}
set metadata(newMetadata: vscode.NotebookCellMetadata) {
// Don't apply metadata defaults here, 'undefined' means 'inherit from document metadata'
this._metadataChangeListener.dispose();
const observableMetadata = getObservable(newMetadata || {} as any); // TODO defaults
const observableMetadata = getObservable(newMetadata);
this._metadata = observableMetadata.proxy;
this._metadataChangeListener = this._register(observableMetadata.onDidChange(() => {
this.updateMetadata();
......@@ -177,15 +171,24 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo
this._proxy.$updateNotebookLanguages(this.viewType, this.uri, this._languages);
}
private _metadata: vscode.NotebookDocumentMetadata | undefined = notebookDocumentMetadataDefaults;
private _metadata: Required<vscode.NotebookDocumentMetadata> = notebookDocumentMetadataDefaults;
private _metadataChangeListener: IDisposable;
get metadata() {
return this._metadata;
}
set metadata(newMetadata: vscode.NotebookDocumentMetadata | undefined) {
this._metadata = newMetadata || notebookDocumentMetadataDefaults;
this._proxy.$updateNotebookMetadata(this.viewType, this.uri, this._metadata);
set metadata(newMetadata: Required<vscode.NotebookDocumentMetadata>) {
this._metadataChangeListener.dispose();
newMetadata = {
...notebookDocumentMetadataDefaults,
...newMetadata
};
const observableMetadata = getObservable(newMetadata);
this._metadata = observableMetadata.proxy;
this._metadataChangeListener = this._register(observableMetadata.onDidChange(() => {
this.updateMetadata();
}));
}
private _displayOrder: string[] = [];
......@@ -212,6 +215,16 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo
public renderingHandler: ExtHostNotebookOutputRenderingHandler
) {
super();
const observableMetadata = getObservable(notebookDocumentMetadataDefaults);
this._metadata = observableMetadata.proxy;
this._metadataChangeListener = this._register(observableMetadata.onDidChange(() => {
this.updateMetadata();
}));
}
private updateMetadata() {
this._proxy.$updateNotebookMetadata(this.viewType, this.uri, this._metadata);
}
dispose() {
......
......@@ -7,7 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event';
import { Disposable, 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, NotebookCellsSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, CellEditType, CellUri, ICellInsertEdit, NotebookCellsChangedEvent, CellKind, IOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookTextModel, NotebookCellOutputsSplice, NotebookCellsSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, CellEditType, CellUri, ICellInsertEdit, NotebookCellsChangedEvent, CellKind, IOutput, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon';
export class NotebookTextModel extends Disposable implements INotebookTextModel {
private static _cellhandlePool: number = 0;
......@@ -26,7 +26,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
private _cellListeners: Map<number, IDisposable> = new Map();
cells: NotebookCellTextModel[];
languages: string[] = [];
metadata: NotebookDocumentMetadata | undefined = { editable: true };
metadata: NotebookDocumentMetadata = notebookDocumentMetadataDefaults;
renderers = new Set<number>();
private _isUntitled: boolean | undefined = undefined;
private _versionId = 0;
......
......@@ -36,11 +36,18 @@ export const NOTEBOOK_DISPLAY_ORDER = [
'text/plain'
];
export const notebookDocumentMetadataDefaults: NotebookDocumentMetadata = {
editable: true,
cellEditable: true,
cellRunnable: true,
hasExecutionOrder: true
};
export interface NotebookDocumentMetadata {
editable: boolean;
cellEditable?: boolean;
cellRunnable?: boolean;
hasExecutionOrder?: boolean;
cellEditable: boolean;
cellRunnable: boolean;
hasExecutionOrder: boolean;
}
export interface NotebookCellMetadata {
......
......@@ -97,7 +97,7 @@ suite('NotebookViewModel', () => {
[['var e = 5;'], 'javascript', CellKind.Code, [], { editable: false, runnable: false }],
],
(editor, viewModel) => {
viewModel.notebookDocument.metadata = { editable: true, cellRunnable: true, cellEditable: true };
viewModel.notebookDocument.metadata = { editable: true, cellRunnable: true, cellEditable: true, hasExecutionOrder: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), {
editable: true,
......@@ -124,7 +124,7 @@ suite('NotebookViewModel', () => {
runnable: false
});
viewModel.notebookDocument.metadata = { editable: true, cellRunnable: false, cellEditable: true };
viewModel.notebookDocument.metadata = { editable: true, cellRunnable: false, cellEditable: true, hasExecutionOrder: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), {
editable: true,
......@@ -151,7 +151,7 @@ suite('NotebookViewModel', () => {
runnable: false
});
viewModel.notebookDocument.metadata = { editable: true, cellRunnable: false, cellEditable: false };
viewModel.notebookDocument.metadata = { editable: true, cellRunnable: false, cellEditable: false, hasExecutionOrder: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), {
editable: false,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册