Path: blob/main/src/vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Emitter } from '../../../../../base/common/event.js';6import { Disposable } from '../../../../../base/common/lifecycle.js';7import { observableValue } from '../../../../../base/common/observable.js';8import { ICellOutputViewModel, IGenericCellViewModel } from '../notebookBrowser.js';9import { NotebookTextModel } from '../../common/model/notebookTextModel.js';10import { ICellOutput, IOrderedMimeType, RENDERER_NOT_AVAILABLE } from '../../common/notebookCommon.js';11import { INotebookService } from '../../common/notebookService.js';1213let handle = 0;14export class CellOutputViewModel extends Disposable implements ICellOutputViewModel {15private _onDidResetRendererEmitter = this._register(new Emitter<void>());16readonly onDidResetRenderer = this._onDidResetRendererEmitter.event;1718private alwaysShow = false;19visible = observableValue<boolean>('outputVisible', false);20setVisible(visible = true, force: boolean = false) {21if (!visible && this.alwaysShow) {22// we are forced to show, so no-op23return;24}2526if (force && visible) {27this.alwaysShow = true;28}2930this.visible.set(visible, undefined);31}3233outputHandle = handle++;34get model(): ICellOutput {35return this._outputRawData;36}3738private _pickedMimeType: IOrderedMimeType | undefined;39get pickedMimeType() {40return this._pickedMimeType;41}4243set pickedMimeType(value: IOrderedMimeType | undefined) {44this._pickedMimeType = value;45}4647constructor(48readonly cellViewModel: IGenericCellViewModel,49private readonly _outputRawData: ICellOutput,50private readonly _notebookService: INotebookService51) {52super();53}5455hasMultiMimeType() {56if (this._outputRawData.outputs.length < 2) {57return false;58}5960const firstMimeType = this._outputRawData.outputs[0].mime;61return this._outputRawData.outputs.some(output => output.mime !== firstMimeType);62}6364resolveMimeTypes(textModel: NotebookTextModel, kernelProvides: readonly string[] | undefined): [readonly IOrderedMimeType[], number] {65const mimeTypes = this._notebookService.getOutputMimeTypeInfo(textModel, kernelProvides, this.model);66const index = mimeTypes.findIndex(mimeType => mimeType.rendererId !== RENDERER_NOT_AVAILABLE && mimeType.isTrusted);6768return [mimeTypes, Math.max(index, 0)];69}7071resetRenderer() {72// reset the output renderer73this._pickedMimeType = undefined;74this.model.bumpVersion();75this._onDidResetRendererEmitter.fire();76}7778toRawJSON() {79return {80outputs: this._outputRawData.outputs,81// TODO@rebronix, no id, right?82};83}84}858687