提交 94317e38 编写于 作者: R Rob Lourens

Show cell run progress for a minimum of 200ms

上级 cf1b3574
......@@ -19,7 +19,7 @@ import { Range } from 'vs/editor/common/core/range';
import { FindMatch, IReadonlyTextBuffer, ITextModel } from 'vs/editor/common/model';
import { ContextKeyExpr, RawContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { OutputRenderer } from 'vs/workbench/contrib/notebook/browser/view/output/outputRenderer';
import { CellLanguageStatusBarItem, TimerRenderer } from 'vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer';
import { CellLanguageStatusBarItem, RunStateRenderer, TimerRenderer } from 'vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer';
import { CellViewModel, IModelDecorationsChangeAccessor, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel';
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
import { CellKind, IProcessedOutput, IRenderOutput, NotebookCellMetadata, NotebookDocumentMetadata, INotebookKernelInfo, IEditor, INotebookKernelInfo2 } from 'vs/workbench/contrib/notebook/common/notebookCommon';
......@@ -489,7 +489,7 @@ export interface MarkdownCellRenderTemplate extends BaseCellRenderTemplate {
}
export interface CodeCellRenderTemplate extends BaseCellRenderTemplate {
cellRunStatusContainer: HTMLElement;
cellRunState: RunStateRenderer;
cellStatusMessageContainer: HTMLElement;
runToolbar: ToolBar;
runButtonContainer: HTMLElement;
......
......@@ -964,6 +964,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
const statusBar = this.instantiationService.createInstance(CellEditorStatusBar, editorPart);
const timer = new TimerRenderer(statusBar.durationContainer);
const cellRunState = new RunStateRenderer(statusBar.cellRunStatusContainer, runToolbar, this.instantiationService);
const outputContainer = DOM.append(container, $('.output'));
......@@ -986,7 +987,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
container,
cellContainer,
statusBarContainer: statusBar.statusBarContainer,
cellRunStatusContainer: statusBar.cellRunStatusContainer,
cellRunState,
cellStatusMessageContainer: statusBar.cellStatusMessageContainer,
languageStatusBarItem: statusBar.languageStatusBarItem,
progressBar,
......@@ -1022,26 +1023,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
return templateData;
}
private updateForRunState(runState: NotebookCellRunState | undefined, templateData: CodeCellRenderTemplate): void {
if (typeof runState === 'undefined') {
runState = NotebookCellRunState.Idle;
}
if (runState === NotebookCellRunState.Running) {
templateData.progressBar.infinite().show(500);
templateData.runToolbar.setActions([
this.instantiationService.createInstance(CancelCellAction)
]);
} else {
templateData.progressBar.hide();
templateData.runToolbar.setActions([
this.instantiationService.createInstance(ExecuteCellAction)
]);
}
}
private updateForOutputs(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void {
if (element.outputs.length) {
DOM.show(templateData.focusSinkElement);
......@@ -1056,15 +1037,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
this.updateExecutionOrder(metadata, templateData);
templateData.cellStatusMessageContainer.textContent = metadata?.statusMessage || '';
if (metadata.runState === NotebookCellRunState.Success) {
templateData.cellRunStatusContainer.innerHTML = renderCodicons('$(check)');
} else if (metadata.runState === NotebookCellRunState.Error) {
templateData.cellRunStatusContainer.innerHTML = renderCodicons('$(error)');
} else if (metadata.runState === NotebookCellRunState.Running) {
templateData.cellRunStatusContainer.innerHTML = renderCodicons('$(sync~spin)');
} else {
templateData.cellRunStatusContainer.innerHTML = '';
}
templateData.cellRunState.renderState(element.metadata?.runState);
if (metadata.runState === NotebookCellRunState.Running) {
if (metadata.runStartTime) {
......@@ -1082,7 +1055,11 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
this.editorOptions.setGlyphMargin(metadata.breakpointMargin);
}
this.updateForRunState(metadata.runState, templateData);
if (metadata.runState === NotebookCellRunState.Running) {
templateData.progressBar.infinite().show(500);
} else {
templateData.progressBar.hide();
}
}
private updateExecutionOrder(metadata: NotebookCellMetadata, templateData: CodeCellRenderTemplate): void {
......@@ -1141,6 +1118,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
this.updateForLayout(element, templateData);
}));
templateData.cellRunState.clear();
this.updateForMetadata(element, templateData);
this.updateForHover(element, templateData);
elementDisposables.add(element.onDidChangeState((e) => {
......@@ -1230,3 +1208,50 @@ export class TimerRenderer {
return `${seconds}.${tenths}s`;
}
}
export class RunStateRenderer {
private static readonly MIN_SPINNER_TIME = 200;
private spinnerTimer: NodeJS.Timeout | undefined;
private pendingNewState: NotebookCellRunState | undefined;
constructor(private readonly element: HTMLElement, private readonly runToolbar: ToolBar, private readonly instantiationService: IInstantiationService) {
}
clear() {
if (this.spinnerTimer) {
clearTimeout(this.spinnerTimer);
}
}
renderState(runState: NotebookCellRunState = NotebookCellRunState.Idle) {
if (this.spinnerTimer) {
this.pendingNewState = runState;
return;
}
if (runState === NotebookCellRunState.Running) {
this.runToolbar.setActions([this.instantiationService.createInstance(CancelCellAction)]);
} else {
this.runToolbar.setActions([this.instantiationService.createInstance(ExecuteCellAction)]);
}
if (runState === NotebookCellRunState.Success) {
this.element.innerHTML = renderCodicons('$(check)');
} else if (runState === NotebookCellRunState.Error) {
this.element.innerHTML = renderCodicons('$(error)');
} else if (runState === NotebookCellRunState.Running) {
this.element.innerHTML = renderCodicons('$(sync~spin)');
this.spinnerTimer = setTimeout(() => {
this.spinnerTimer = undefined;
if (this.pendingNewState) {
this.renderState(this.pendingNewState);
this.pendingNewState = undefined;
}
}, RunStateRenderer.MIN_SPINNER_TIME);
} else {
this.element.innerHTML = '';
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册