From e7b11f34e1604d28f6fa5b801defa7634277f6aa Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 22 Nov 2021 15:30:49 -0800 Subject: [PATCH] CellExecutionPart #131808 --- .../browser/view/cellParts/cellExecution.ts | 58 +++++++++++++++++++ .../browser/view/cellParts/codeCell.ts | 2 - .../browser/view/notebookRenderingCommon.ts | 3 +- .../browser/view/renderers/cellRenderer.ts | 51 +++------------- 4 files changed, 68 insertions(+), 46 deletions(-) create mode 100644 src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts new file mode 100644 index 0000000000000..4c09541fe945a --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as DOM from 'vs/base/browser/dom'; +import { CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellPart'; +import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { NotebookCellInternalMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; + +export class CellExecutionPart extends CellPart { + constructor( + private readonly _notebookEditor: INotebookEditorDelegate, + private readonly _executionOrderLabel: HTMLElement + ) { + super(); + } + + setup(templateData: BaseCellRenderTemplate): void { + this._register(this._notebookEditor.onDidChangeActiveKernel(() => { + if (templateData.currentRenderedCell) { + this.updateExecutionOrder(templateData.currentRenderedCell.internalMetadata); + } + })); + } + + renderCell(element: ICellViewModel, _templateData: BaseCellRenderTemplate): void { + this.updateExecutionOrder(element.internalMetadata); + } + + private updateExecutionOrder(internalMetadata: NotebookCellInternalMetadata): void { + if (this._notebookEditor.activeKernel?.implementsExecutionOrder) { + const executionOrderLabel = typeof internalMetadata.executionOrder === 'number' ? + `[${internalMetadata.executionOrder}]` : + '[ ]'; + this._executionOrderLabel.innerText = executionOrderLabel; + } else { + this._executionOrderLabel.innerText = ''; + } + } + + updateState(element: ICellViewModel, e: CellViewModelStateChangeEvent): void { + if (e.internalMetadataChanged) { + this.updateExecutionOrder(element.internalMetadata); + } + } + + updateLayoutNow(element: ICellViewModel): void { + if (element.isInputCollapsed) { + DOM.hide(this._executionOrderLabel); + } else { + DOM.show(this._executionOrderLabel); + } + } + + prepareLayout(): void { } +} diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts index 0dca46ec29ef2..a877084617e22 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts @@ -351,7 +351,6 @@ export class CodeCell extends Disposable { private _collapseInput() { // hide the editor and execution label, keep the run button DOM.hide(this.templateData.editorPart); - DOM.hide(this.templateData.executionOrderLabel); this.templateData.container.classList.toggle('input-collapsed', true); // remove input preview @@ -378,7 +377,6 @@ export class CodeCell extends Disposable { private _showInput() { DOM.show(this.templateData.editorPart); - DOM.show(this.templateData.executionOrderLabel); DOM.hide(this.templateData.cellInputCollapsedContainer); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts b/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts index 9231bcfc62c02..1ce50e25e9c63 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts @@ -16,6 +16,7 @@ import { Range } from 'vs/editor/common/core/range'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICellOutputViewModel, ICellViewModel, IGenericCellViewModel, INotebookCellOutputLayoutInfo, INotebookEditorCreationOptions, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellExecutionPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution'; import { CellFocusIndicator } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator'; import { CellProgressBar } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar'; import { BetweenCellToolbar, CellTitleToolbarPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars'; @@ -117,7 +118,6 @@ export interface MarkdownCellRenderTemplate extends BaseCellRenderTemplate { export interface CodeCellRenderTemplate extends BaseCellRenderTemplate { runToolbar: RunToolbar; - executionOrderLabel: HTMLElement; outputContainer: FastDomNode; cellOutputCollapsedContainer: HTMLElement; outputShowMoreContainer: FastDomNode; @@ -125,6 +125,7 @@ export interface CodeCellRenderTemplate extends BaseCellRenderTemplate { editor: ICodeEditor; progressBar: CellProgressBar; dragHandle: FastDomNode; + cellExecution: CellExecutionPart; } export function isCodeCellRenderTemplate(templateData: BaseCellRenderTemplate): templateData is CodeCellRenderTemplate { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts index 4330548950d3a..cc48db29118e0 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -34,6 +34,7 @@ import { CellContextKeyManager } from 'vs/workbench/contrib/notebook/browser/vie import { CellDecorations } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellDecorations'; import { CellDragAndDropController } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd'; import { CellEditorOptions } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions'; +import { CellExecutionPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution'; import { CellFocusIndicator } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator'; import { CellProgressBar } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar'; import { BetweenCellToolbar, CellTitleToolbarPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars'; @@ -45,7 +46,7 @@ import { BaseCellRenderTemplate, CodeCellRenderTemplate, MarkdownCellRenderTempl import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; -import { CellKind, NotebookCellInternalMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; const $ = DOM.$; @@ -462,11 +463,11 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende progressBar, statusBar, focusIndicator: new CellFocusIndicator(this.notebookEditor, focusIndicatorTop, focusIndicatorLeft, focusIndicatorRight, focusIndicatorBottom), + cellExecution: new CellExecutionPart(this.notebookEditor, executionOrderLabel), titleToolbar, betweenCellToolbar, focusSinkElement, runToolbar, - executionOrderLabel, outputContainer, outputShowMoreContainer, editor, @@ -487,12 +488,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende } })); - templateDisposables.add(this.notebookEditor.onDidChangeActiveKernel(() => { - if (templateData.currentRenderedCell) { - this.updateForKernel(templateData.currentRenderedCell as CodeCellViewModel, templateData); - } - })); - + templateData.cellExecution.setup(templateData); this.commonRenderTemplate(templateData); return templateData; @@ -582,30 +578,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende return combinedDisposable(dragHandleListener, collapsedPartListener, clickHandler); } - private updateForInternalMetadata(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { - if (!this.notebookEditor.hasModel()) { - return; - } - - const internalMetadata = element.internalMetadata; - this.updateExecutionOrder(internalMetadata, templateData); - } - - private updateForKernel(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { - this.updateExecutionOrder(element.internalMetadata, templateData); - } - - private updateExecutionOrder(internalMetadata: NotebookCellInternalMetadata, templateData: CodeCellRenderTemplate): void { - if (this.notebookEditor.activeKernel?.implementsExecutionOrder) { - const executionOrderLabel = typeof internalMetadata.executionOrder === 'number' ? - `[${internalMetadata.executionOrder}]` : - '[ ]'; - templateData.executionOrderLabel.innerText = executionOrderLabel; - } else { - templateData.executionOrderLabel.innerText = ''; - } - } - private updateForLayout(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { templateData.elementDisposables.add(DOM.scheduleAtNextAnimationFrame(() => { const bottomToolbarDimensions = this.notebookEditor.notebookOptions.computeBottomToolbarDimensions(this.notebookEditor.textModel?.viewType); @@ -618,6 +590,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende this.updateForTitleMenu(templateData); templateData.betweenCellToolbar.updateLayoutNow(element); + + templateData.cellExecution.updateLayoutNow(element); })); } @@ -658,7 +632,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende templateData.progressBar, templateData.titleToolbar, templateData.runToolbar, - cellEditorOptions + cellEditorOptions, + templateData.cellExecution, ])); this.renderedEditors.set(element, templateData.editor); @@ -672,16 +647,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende this.updateForLayout(element, templateData); })); - this.updateForInternalMetadata(element, templateData); - - elementDisposables.add(element.onDidChangeState((e) => { - if (e.metadataChanged || e.internalMetadataChanged) { - this.updateForInternalMetadata(element, templateData); - } - })); - - this.updateForKernel(element, templateData); - templateData.elementDisposables.add(templateData.titleToolbar.onDidUpdateActions(() => { // Don't call directly here - is initially called by updateForLayout in the next frame this.updateForTitleMenu(templateData);