Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Emitter } from '../../../../../base/common/event.js';
7
import { Disposable } from '../../../../../base/common/lifecycle.js';
8
import { observableValue } from '../../../../../base/common/observable.js';
9
import { ICellOutputViewModel, IGenericCellViewModel } from '../notebookBrowser.js';
10
import { NotebookTextModel } from '../../common/model/notebookTextModel.js';
11
import { ICellOutput, IOrderedMimeType, RENDERER_NOT_AVAILABLE } from '../../common/notebookCommon.js';
12
import { INotebookService } from '../../common/notebookService.js';
13
14
let handle = 0;
15
export class CellOutputViewModel extends Disposable implements ICellOutputViewModel {
16
private _onDidResetRendererEmitter = this._register(new Emitter<void>());
17
readonly onDidResetRenderer = this._onDidResetRendererEmitter.event;
18
19
private alwaysShow = false;
20
visible = observableValue<boolean>('outputVisible', false);
21
setVisible(visible = true, force: boolean = false) {
22
if (!visible && this.alwaysShow) {
23
// we are forced to show, so no-op
24
return;
25
}
26
27
if (force && visible) {
28
this.alwaysShow = true;
29
}
30
31
this.visible.set(visible, undefined);
32
}
33
34
outputHandle = handle++;
35
get model(): ICellOutput {
36
return this._outputRawData;
37
}
38
39
private _pickedMimeType: IOrderedMimeType | undefined;
40
get pickedMimeType() {
41
return this._pickedMimeType;
42
}
43
44
set pickedMimeType(value: IOrderedMimeType | undefined) {
45
this._pickedMimeType = value;
46
}
47
48
constructor(
49
readonly cellViewModel: IGenericCellViewModel,
50
private readonly _outputRawData: ICellOutput,
51
private readonly _notebookService: INotebookService
52
) {
53
super();
54
}
55
56
hasMultiMimeType() {
57
if (this._outputRawData.outputs.length < 2) {
58
return false;
59
}
60
61
const firstMimeType = this._outputRawData.outputs[0].mime;
62
return this._outputRawData.outputs.some(output => output.mime !== firstMimeType);
63
}
64
65
resolveMimeTypes(textModel: NotebookTextModel, kernelProvides: readonly string[] | undefined): [readonly IOrderedMimeType[], number] {
66
const mimeTypes = this._notebookService.getOutputMimeTypeInfo(textModel, kernelProvides, this.model);
67
const index = mimeTypes.findIndex(mimeType => mimeType.rendererId !== RENDERER_NOT_AVAILABLE && mimeType.isTrusted);
68
69
return [mimeTypes, Math.max(index, 0)];
70
}
71
72
resetRenderer() {
73
// reset the output renderer
74
this._pickedMimeType = undefined;
75
this.model.bumpVersion();
76
this._onDidResetRendererEmitter.fire();
77
}
78
79
toRawJSON() {
80
return {
81
outputs: this._outputRawData.outputs,
82
// TODO@rebronix, no id, right?
83
};
84
}
85
}
86
87