Skip to content

Commit

Permalink
CellExecutionPart #131808
Browse files Browse the repository at this point in the history
  • Loading branch information
roblourens committed Nov 22, 2021
1 parent 33a6ac6 commit e7b11f3
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 46 deletions.
Original file line number Diff line number Diff line change
@@ -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 comment has been minimized.

Copy link
@roblourens

roblourens Nov 22, 2021

Author Member

This is weird. It needs to know about currentRenderedCell. Maybe there is a better way to get arbitrary access to that templateData property.

This comment has been minimized.

Copy link
@roblourens

roblourens Nov 22, 2021

Author Member

Could store a reference to templateData when renderCell is called, or pass a special accessor to the constructor

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) {

This comment has been minimized.

Copy link
@roblourens

roblourens Nov 22, 2021

Author Member

This happens at a different time than it did when CodeCell did this but I think this is correct and better.

DOM.hide(this._executionOrderLabel);
} else {
DOM.show(this._executionOrderLabel);
}
}

prepareLayout(): void { }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -117,14 +118,14 @@ export interface MarkdownCellRenderTemplate extends BaseCellRenderTemplate {

export interface CodeCellRenderTemplate extends BaseCellRenderTemplate {
runToolbar: RunToolbar;
executionOrderLabel: HTMLElement;
outputContainer: FastDomNode<HTMLElement>;
cellOutputCollapsedContainer: HTMLElement;
outputShowMoreContainer: FastDomNode<HTMLElement>;
focusSinkElement: HTMLElement;
editor: ICodeEditor;
progressBar: CellProgressBar;
dragHandle: FastDomNode<HTMLElement>;
cellExecution: CellExecutionPart;
}

export function isCodeCellRenderTemplate(templateData: BaseCellRenderTemplate): templateData is CodeCellRenderTemplate {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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.$;

Expand Down Expand Up @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -618,6 +590,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende

this.updateForTitleMenu(templateData);
templateData.betweenCellToolbar.updateLayoutNow(element);

templateData.cellExecution.updateLayoutNow(element);
}));
}

Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit e7b11f3

Please sign in to comment.