Skip to content

Commit d48f535

Browse files
committed
Move renderers to manager
This is the first step towards allowing customisation of renderers.
1 parent 74f59bf commit d48f535

File tree

3 files changed

+68
-54
lines changed

3 files changed

+68
-54
lines changed

jupyter-widgets-htmlmanager/src/htmlmanager.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import * as widgets from '@jupyter-widgets/controls';
55

66
import * as PhosphorWidget from '@phosphor/widgets';
77

8+
import { RenderMime } from '@jupyterlab/rendermime';
9+
810
import { OutputModel, OutputView } from './output'
11+
import { WidgetRenderer, WIDGET_MIMETYPE } from './output_renderers'
912

1013
const coreWidgetModules: Array<string> = [
1114
'@jupyter-widgets/controls', '@jupyter-widgets/base'
@@ -76,4 +79,12 @@ class HTMLManager extends widgets.ManagerBase<HTMLElement> {
7679
}
7780
});
7881
}
82+
83+
renderMime: RenderMime =
84+
new RenderMime({
85+
items: [... RenderMime.getDefaultItems(), {
86+
mimeType: WIDGET_MIMETYPE,
87+
renderer: new WidgetRenderer(this)
88+
}]
89+
});
7990
};

jupyter-widgets-htmlmanager/src/output.ts

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -7,61 +7,12 @@ import { Panel, Widget } from '@phosphor/widgets';
77

88
import { OutputAreaModel, OutputArea } from '@jupyterlab/outputarea';
99

10-
import { IRenderMime, RenderMime } from '@jupyterlab/rendermime';
11-
1210
import { HTMLManager } from './htmlmanager';
1311

1412
import * as $ from 'jquery';
1513

1614
import '../css/output.css';
1715

18-
const WIDGET_MIMETYPE = 'application/vnd.jupyter.widget-view+json';
19-
20-
export class WidgetRenderer implements RenderMime.IRenderer {
21-
constructor(widget_manager: HTMLManager) {
22-
this._manager = widget_manager;
23-
}
24-
25-
canRender(options: RenderMime.IRenderOptions): boolean {
26-
const source: any = options.model.data.get(options.mimeType);
27-
const model = this._manager.get_model(source.model_id);
28-
return model !== void 0;
29-
}
30-
31-
wouldSanitize(options: RenderMime.IRenderOptions): boolean {
32-
return false;
33-
}
34-
35-
render(options: RenderMime.IRenderOptions) {
36-
const widget = new Panel();
37-
const source: any = options.model.data.get(options.mimeType);
38-
const model = this._manager.get_model(source.model_id);
39-
console.log(model);
40-
if (model) {
41-
model.then((model: any) => {
42-
return this._manager.display_model(null, model, {
43-
el: widget.node
44-
})
45-
}).catch((error) => {
46-
console.log('Error creating widget.')
47-
console.log(error);
48-
const node = document.createElement('p')
49-
node.textContent = 'Error creating widget.'
50-
widget.addWidget(new Widget({node}))
51-
})
52-
} else {
53-
const node = document.createElement('p')
54-
node.textContent = 'Error creating widget.'
55-
widget.addWidget(new Widget({node}))
56-
}
57-
return widget;
58-
}
59-
60-
private _manager: HTMLManager;
61-
public mimeTypes = [WIDGET_MIMETYPE];
62-
}
63-
64-
6516
export class OutputModel extends DOMWidgetModel {
6617
defaults() {
6718
return {
@@ -103,11 +54,8 @@ export class OutputView extends DOMWidgetView {
10354
}
10455

10556
render() {
106-
const rendermime = new RenderMime({items: RenderMime.getDefaultItems()})
107-
rendermime.addRenderer({
108-
mimeType: WIDGET_MIMETYPE,
109-
renderer: new WidgetRenderer(this.model.widget_manager)
110-
});
57+
const manager = this.model.widget_manager
58+
const rendermime = manager.renderMime;
11159
this._outputView = new OutputArea({
11260
rendermime: rendermime,
11361
contentFactory: OutputArea.defaultContentFactory,
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (c) Jupyter Development Team.
2+
// Distributed under the terms of the Modified BSD License.
3+
4+
import { Widget, Panel } from '@phosphor/widgets';
5+
6+
import { IRenderMime, RenderMime } from '@jupyterlab/rendermime';
7+
8+
import { HTMLManager } from './htmlmanager';
9+
10+
export const WIDGET_MIMETYPE = 'application/vnd.jupyter.widget-view+json';
11+
12+
// Renderer to allow the output widget to render sub-widgets
13+
export class WidgetRenderer implements RenderMime.IRenderer {
14+
constructor(widget_manager: HTMLManager) {
15+
this._manager = widget_manager;
16+
}
17+
18+
canRender(options: RenderMime.IRenderOptions): boolean {
19+
const source: any = options.model.data.get(options.mimeType);
20+
const model = this._manager.get_model(source.model_id);
21+
return model !== void 0;
22+
}
23+
24+
wouldSanitize(options: RenderMime.IRenderOptions): boolean {
25+
return false;
26+
}
27+
28+
render(options: RenderMime.IRenderOptions) {
29+
const widget = new Panel();
30+
const source: any = options.model.data.get(options.mimeType);
31+
const model = this._manager.get_model(source.model_id);
32+
console.log(model);
33+
if (model) {
34+
model.then((model: any) => {
35+
return this._manager.display_model(null, model, {
36+
el: widget.node
37+
})
38+
}).catch((error) => {
39+
console.log('Error creating widget.')
40+
console.log(error);
41+
const node = document.createElement('p')
42+
node.textContent = 'Error creating widget.'
43+
widget.addWidget(new Widget({node}))
44+
})
45+
} else {
46+
const node = document.createElement('p')
47+
node.textContent = 'Error creating widget.'
48+
widget.addWidget(new Widget({node}))
49+
}
50+
return widget;
51+
}
52+
53+
private _manager: HTMLManager;
54+
public mimeTypes = [WIDGET_MIMETYPE];
55+
}

0 commit comments

Comments
 (0)