Move hasExecutionOrder to cell level

This commit is contained in:
Rob Lourens
2020-05-21 21:30:53 -05:00
parent fe06af8951
commit f5d10326f5
6 changed files with 34 additions and 30 deletions
+8 -2
View File
@@ -1659,6 +1659,12 @@ declare module 'vscode' {
*/
breakpointMargin?: boolean;
/**
* Whether the [execution order](#NotebookCellMetadata.executionOrder) indicator will be displayed.
* Defaults to true.
*/
hasExecutionOrder?: boolean;
/**
* The order in which this cell was executed.
*/
@@ -1727,10 +1733,10 @@ declare module 'vscode' {
cellRunnable?: boolean;
/**
* Whether the [execution order](#NotebookCellMetadata.executionOrder) indicator will be displayed.
* Default value for [cell hasExecutionOrder metadata](#NotebookCellMetadata.hasExecutionOrder).
* Defaults to true.
*/
hasExecutionOrder?: boolean;
cellHasExecutionOrder?: boolean;
displayOrder?: GlobPattern[];
@@ -50,7 +50,7 @@ import { StatefullMarkdownCell } from 'vs/workbench/contrib/notebook/browser/vie
import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel';
import { MarkdownCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel';
import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel';
import { CellKind, NotebookCellRunState } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { CellKind, NotebookCellRunState, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
const $ = DOM.$;
@@ -1006,7 +1006,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
const metadata = element.getEvaluatedMetadata(this.notebookEditor.viewModel!.notebookDocument.metadata);
DOM.toggleClass(templateData.cellContainer, 'runnable', !!metadata.runnable);
this.renderExecutionOrder(element, templateData);
this.updateExecutionOrder(metadata, templateData);
cellEditableKey.set(!!metadata.editable);
cellRunnableKey.set(!!metadata.runnable);
templateData.cellStatusMessageContainer.textContent = metadata?.statusMessage || '';
@@ -1040,12 +1040,12 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
this.updateForRunState(metadata.runState, templateData);
}
private renderExecutionOrder(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void {
const hasExecutionOrder = this.notebookEditor.viewModel!.notebookDocument.metadata?.hasExecutionOrder;
if (hasExecutionOrder) {
const executionOrdeerLabel = typeof element.metadata?.executionOrder === 'number' ? `[${element.metadata.executionOrder}]` :
private updateExecutionOrder(metadata: NotebookCellMetadata, templateData: CodeCellRenderTemplate): void {
if (metadata.hasExecutionOrder) {
const executionOrderLabel = typeof metadata.executionOrder === 'number' ?
`[${metadata.executionOrder}]` :
'[ ]';
templateData.executionOrderLabel.innerText = executionOrdeerLabel;
templateData.executionOrderLabel.innerText = executionOrderLabel;
} else {
templateData.executionOrderLabel.innerText = '';
}
@@ -88,10 +88,10 @@ export class CodeCell extends Disposable {
}));
updateForFocusMode();
templateData.editor?.updateOptions({ readOnly: !(viewCell.getEvaluatedMetadata(notebookEditor.viewModel?.metadata).editable) });
templateData.editor?.updateOptions({ readOnly: !(viewCell.getEvaluatedMetadata(notebookEditor.viewModel!.metadata).editable) });
this._register(viewCell.onDidChangeState((e) => {
if (e.metadataChanged) {
templateData.editor?.updateOptions({ readOnly: !(viewCell.getEvaluatedMetadata(notebookEditor.viewModel?.metadata).editable) });
templateData.editor?.updateOptions({ readOnly: !(viewCell.getEvaluatedMetadata(notebookEditor.viewModel!.metadata).editable) });
}
}));
@@ -17,11 +17,6 @@ import { CellEditState, CellFocusMode, CursorAtBoundary, CellViewModelStateChang
import { CellKind, NotebookCellMetadata, NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
export const NotebookCellMetadataDefaults = {
editable: true,
runnable: true
};
export abstract class BaseCellViewModel extends Disposable {
protected readonly _onDidChangeEditorAttachState = new Emitter<void>();
// Do not merge this event with `onDidChangeState` as we are using `Event.once(onDidChangeEditorAttachState)` elsewhere.
@@ -344,20 +339,22 @@ export abstract class BaseCellViewModel extends Disposable {
return cellMatches;
}
getEvaluatedMetadata(documentMetadata: NotebookDocumentMetadata | undefined): NotebookCellMetadata {
const editable: boolean = this.metadata?.editable === undefined
? (documentMetadata?.cellEditable === undefined ? NotebookCellMetadataDefaults.editable : documentMetadata?.cellEditable)
: this.metadata?.editable;
getEvaluatedMetadata(documentMetadata: NotebookDocumentMetadata): NotebookCellMetadata {
const editable = this.metadata?.editable ??
documentMetadata.cellEditable;
const runnable: boolean = this.metadata?.runnable === undefined
? (documentMetadata?.cellRunnable === undefined ? NotebookCellMetadataDefaults.runnable : documentMetadata?.cellRunnable)
: this.metadata?.runnable;
const runnable = this.metadata?.runnable ??
documentMetadata.cellRunnable;
const hasExecutionOrder = this.metadata?.hasExecutionOrder ??
documentMetadata.cellHasExecutionOrder;
return {
...(this.metadata || {}),
...{
editable,
runnable
runnable,
hasExecutionOrder
}
};
}
@@ -55,7 +55,7 @@ export const notebookDocumentMetadataDefaults: Required<NotebookDocumentMetadata
runnable: true,
cellEditable: true,
cellRunnable: true,
hasExecutionOrder: true,
cellHasExecutionOrder: true,
displayOrder: NOTEBOOK_DISPLAY_ORDER,
custom: {}
};
@@ -65,7 +65,7 @@ export interface NotebookDocumentMetadata {
runnable: boolean;
cellEditable: boolean;
cellRunnable: boolean;
hasExecutionOrder: boolean;
cellHasExecutionOrder: boolean;
displayOrder?: GlobPattern[];
custom?: { [key: string]: any };
}
@@ -81,6 +81,7 @@ export interface NotebookCellMetadata {
editable?: boolean;
runnable?: boolean;
breakpointMargin?: boolean;
hasExecutionOrder?: boolean;
executionOrder?: number;
statusMessage?: string;
runState?: NotebookCellRunState;
@@ -154,9 +154,9 @@ suite('NotebookViewModel', () => {
[['var e = 5;'], 'javascript', CellKind.Code, [], { editable: false, runnable: false }],
],
(editor, viewModel) => {
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: true, cellEditable: true, hasExecutionOrder: true };
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: true, cellEditable: true, cellHasExecutionOrder: true };
const defaults = {};
const defaults = { hasExecutionOrder: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), <NotebookCellMetadata>{
editable: true,
@@ -188,7 +188,7 @@ suite('NotebookViewModel', () => {
...defaults
});
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: true, hasExecutionOrder: true };
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: true, cellHasExecutionOrder: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), <NotebookCellMetadata>{
editable: true,
@@ -220,7 +220,7 @@ suite('NotebookViewModel', () => {
...defaults
});
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: false, hasExecutionOrder: true };
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: false, cellHasExecutionOrder: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), <NotebookCellMetadata>{
editable: false,