2
2
// Distributed under the terms of the Modified BSD License.
3
3
4
4
import { ISettingRegistry } from '@jupyterlab/settingregistry' ;
5
+
5
6
import * as nbformat from '@jupyterlab/nbformat' ;
6
7
8
+ import { IConsoleTracker , CodeConsole } from '@jupyterlab/console' ;
9
+
7
10
import { DocumentRegistry } from '@jupyterlab/docregistry' ;
8
11
9
12
import {
@@ -34,7 +37,11 @@ import { AttachedProperty } from '@lumino/properties';
34
37
35
38
import { WidgetRenderer } from './renderer' ;
36
39
37
- import { WidgetManager , WIDGET_VIEW_MIMETYPE } from './manager' ;
40
+ import {
41
+ WidgetManager ,
42
+ WIDGET_VIEW_MIMETYPE ,
43
+ KernelWidgetManager
44
+ } from './manager' ;
38
45
39
46
import { OutputModel , OutputView , OUTPUT_WIDGET_VERSION } from './output' ;
40
47
@@ -58,7 +65,7 @@ const SETTINGS: WidgetManager.Settings = { saveState: false };
58
65
/**
59
66
* Iterate through all widget renderers in a notebook.
60
67
*/
61
- function * widgetRenderers (
68
+ function * notebookWidgetRenderers (
62
69
nb : Notebook
63
70
) : Generator < WidgetRenderer , void , unknown > {
64
71
for ( const cell of nb . widgets ) {
@@ -74,6 +81,25 @@ function* widgetRenderers(
74
81
}
75
82
}
76
83
84
+ /**
85
+ * Iterate through all widget renderers in a console.
86
+ */
87
+ function * consoleWidgetRenderers (
88
+ console : CodeConsole
89
+ ) : Generator < WidgetRenderer , void , unknown > {
90
+ for ( const cell of toArray ( console . cells ) ) {
91
+ if ( cell . model . type === 'code' ) {
92
+ for ( const codecell of ( cell as CodeCell ) . outputArea . widgets ) {
93
+ for ( const output of toArray ( codecell . children ( ) ) ) {
94
+ if ( output instanceof WidgetRenderer ) {
95
+ yield output ;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+
77
103
/**
78
104
* Iterate through all matching linked output views
79
105
*/
@@ -140,13 +166,58 @@ export function registerWidgetManager(
140
166
} ) ;
141
167
}
142
168
169
+ export function registerConsoleWidgetManager (
170
+ console : CodeConsole ,
171
+ rendermime : IRenderMimeRegistry ,
172
+ renderers : IterableIterator < WidgetRenderer >
173
+ ) : DisposableDelegate {
174
+ let wManager = Private . widgetManagerProperty . get ( console ) ;
175
+ if ( ! wManager ) {
176
+ wManager = new KernelWidgetManager (
177
+ console . sessionContext . session ?. kernel ! ,
178
+ rendermime
179
+ ) ;
180
+ WIDGET_REGISTRY . forEach ( data => wManager ! . register ( data ) ) ;
181
+ Private . widgetManagerProperty . set ( console , wManager ) ;
182
+ }
183
+
184
+ for ( const r of renderers ) {
185
+ r . manager = wManager ;
186
+ }
187
+
188
+ // Replace the placeholder widget renderer with one bound to this widget
189
+ // manager.
190
+ rendermime . removeMimeType ( WIDGET_VIEW_MIMETYPE ) ;
191
+ rendermime . addFactory (
192
+ {
193
+ safe : false ,
194
+ mimeTypes : [ WIDGET_VIEW_MIMETYPE ] ,
195
+ createRenderer : options => new WidgetRenderer ( options , wManager )
196
+ } ,
197
+ 0
198
+ ) ;
199
+
200
+ return new DisposableDelegate ( ( ) => {
201
+ if ( rendermime ) {
202
+ rendermime . removeMimeType ( WIDGET_VIEW_MIMETYPE ) ;
203
+ }
204
+ wManager ! . dispose ( ) ;
205
+ } ) ;
206
+ }
207
+
143
208
/**
144
209
* The widget manager provider.
145
210
*/
146
211
const plugin : JupyterFrontEndPlugin < base . IJupyterWidgetRegistry > = {
147
212
id : '@jupyter-widgets/jupyterlab-manager:plugin' ,
148
213
requires : [ IRenderMimeRegistry ] ,
149
- optional : [ INotebookTracker , ISettingRegistry , IMainMenu , ILoggerRegistry ] ,
214
+ optional : [
215
+ INotebookTracker ,
216
+ IConsoleTracker ,
217
+ ISettingRegistry ,
218
+ IMainMenu ,
219
+ ILoggerRegistry
220
+ ] ,
150
221
provides : base . IJupyterWidgetRegistry ,
151
222
activate : activateWidgetExtension ,
152
223
autoStart : true
@@ -165,6 +236,7 @@ function activateWidgetExtension(
165
236
app : JupyterFrontEnd ,
166
237
rendermime : IRenderMimeRegistry ,
167
238
tracker : INotebookTracker | null ,
239
+ consoleTracker : IConsoleTracker | null ,
168
240
settingRegistry : ISettingRegistry | null ,
169
241
menu : IMainMenu | null ,
170
242
loggerRegistry : ILoggerRegistry | null
@@ -179,7 +251,10 @@ function activateWidgetExtension(
179
251
const wManager = Private . widgetManagerProperty . get ( nb . context ) ;
180
252
if ( wManager ) {
181
253
wManager . onUnhandledIOPubMessage . connect (
182
- ( sender : WidgetManager , msg : KernelMessage . IIOPubMessage ) => {
254
+ (
255
+ sender : WidgetManager | KernelWidgetManager ,
256
+ msg : KernelMessage . IIOPubMessage
257
+ ) => {
183
258
const logger = loggerRegistry . getLogger ( nb . context . path ) ;
184
259
let level : LogLevel = 'warning' ;
185
260
if (
@@ -226,7 +301,7 @@ function activateWidgetExtension(
226
301
panel . context ,
227
302
panel . content . rendermime ,
228
303
chain (
229
- widgetRenderers ( panel . content ) ,
304
+ notebookWidgetRenderers ( panel . content ) ,
230
305
outputViews ( app , panel . context . path )
231
306
)
232
307
) ;
@@ -238,7 +313,7 @@ function activateWidgetExtension(
238
313
panel . context ,
239
314
panel . content . rendermime ,
240
315
chain (
241
- widgetRenderers ( panel . content ) ,
316
+ notebookWidgetRenderers ( panel . content ) ,
242
317
outputViews ( app , panel . context . path )
243
318
)
244
319
) ;
@@ -247,6 +322,24 @@ function activateWidgetExtension(
247
322
} ) ;
248
323
}
249
324
325
+ if ( consoleTracker !== null ) {
326
+ consoleTracker . forEach ( async panel => {
327
+ await panel . sessionContext . ready ;
328
+ registerConsoleWidgetManager (
329
+ panel . console ,
330
+ panel . console . rendermime ,
331
+ chain ( consoleWidgetRenderers ( panel . console ) )
332
+ ) ;
333
+ } ) ;
334
+ consoleTracker . widgetAdded . connect ( async ( sender , panel ) => {
335
+ await panel . sessionContext . ready ;
336
+ registerConsoleWidgetManager (
337
+ panel . console ,
338
+ panel . console . rendermime ,
339
+ chain ( consoleWidgetRenderers ( panel . console ) )
340
+ ) ;
341
+ } ) ;
342
+ }
250
343
if ( settingRegistry !== null ) {
251
344
// Add a command for automatically saving (jupyter-)widget state.
252
345
commands . addCommand ( '@jupyter-widgets/jupyterlab-manager:saveWidgetState' , {
@@ -321,10 +414,11 @@ namespace Private {
321
414
* A private attached property for a widget manager.
322
415
*/
323
416
export const widgetManagerProperty = new AttachedProperty <
324
- DocumentRegistry . Context ,
325
- WidgetManager | undefined
417
+ DocumentRegistry . Context | CodeConsole ,
418
+ WidgetManager | KernelWidgetManager | undefined
326
419
> ( {
327
420
name : 'widgetManager' ,
328
- create : ( owner : DocumentRegistry . Context ) : undefined => undefined
421
+ create : ( owner : DocumentRegistry . Context | CodeConsole ) : undefined =>
422
+ undefined
329
423
} ) ;
330
424
}
0 commit comments