@@ -20,6 +20,8 @@ import {
2020
2121import { IDisposable } from '@lumino/disposable' ;
2222
23+ import { IRenderMime } from '@jupyterlab/rendermime-interfaces' ;
24+
2325import { ReadonlyPartialJSONValue } from '@lumino/coreutils' ;
2426
2527import { INotebookModel } from '@jupyterlab/notebook' ;
@@ -44,9 +46,10 @@ import { SemVerCache } from './semvercache';
4446
4547import Backbone from 'backbone' ;
4648
47- import * as base from '@jupyter-widgets/base' ;
4849import { WidgetRenderer } from './renderer' ;
4950
51+ import * as base from '@jupyter-widgets/base' ;
52+
5053/**
5154 * The mime type for a widget view.
5255 */
@@ -354,15 +357,20 @@ export abstract class LabWidgetManager
354357export class KernelWidgetManager extends LabWidgetManager {
355358 constructor (
356359 kernel : Kernel . IKernelConnection ,
357- rendermime : IRenderMimeRegistry | null
360+ rendermime : IRenderMimeRegistry | null ,
361+ pendingManagerMessage = 'Loading widget ...'
358362 ) {
359363 if ( ! rendermime ) {
360364 rendermime = LabWidgetManager . globalRendermime ;
361365 }
362366 const instance = Private . kernelWidgetManagers . get ( kernel . id ) ;
363367 if ( instance ) {
364- KernelWidgetManager . updateManagerKernel ( instance , kernel ) ;
365- KernelWidgetManager . attachToRendermime ( rendermime , instance ) ;
368+ instance . _useKernel ( kernel ) ;
369+ KernelWidgetManager . configureRendermime (
370+ rendermime ,
371+ instance ,
372+ pendingManagerMessage
373+ ) ;
366374 return instance ;
367375 }
368376 if ( ! kernel . handleComms ) {
@@ -374,68 +382,72 @@ export class KernelWidgetManager extends LabWidgetManager {
374382 LabWidgetManager . WIDGET_REGISTRY . changed . connect ( ( ) =>
375383 this . loadCustomWidgetDefinitions ( )
376384 ) ;
377- KernelWidgetManager . updateManagerKernel ( this , kernel ) ;
378- KernelWidgetManager . attachToRendermime ( rendermime , this ) ;
385+ this . _useKernel ( kernel ) ;
386+ KernelWidgetManager . configureRendermime (
387+ rendermime ,
388+ this ,
389+ pendingManagerMessage
390+ ) ;
379391 }
380392
381- static updateManagerKernel (
382- manager : KernelWidgetManager ,
383- kernel : Kernel . IKernelConnection
384- ) {
393+ _useKernel ( this : KernelWidgetManager , kernel : Kernel . IKernelConnection ) {
385394 if ( ! kernel . handleComms ) {
386395 return ;
387396 }
388- manager . _handleKernelChanged ( {
397+ this . _handleKernelChanged ( {
389398 name : 'kernel' ,
390- oldValue : manager . _kernel ,
399+ oldValue : this . _kernel ,
391400 newValue : kernel ,
392401 } ) ;
393- if ( manager . _kernel ) {
394- manager . _kernel . statusChanged . disconnect (
395- manager . _handleKernelStatusChange ,
396- manager
402+ if ( this . _kernel ) {
403+ this . _kernel . statusChanged . disconnect (
404+ this . _handleKernelStatusChange ,
405+ this
397406 ) ;
398- manager . _kernel . connectionStatusChanged . disconnect (
399- manager . _handleKernelConnectionStatusChange ,
400- manager
407+ this . _kernel . connectionStatusChanged . disconnect (
408+ this . _handleKernelConnectionStatusChange ,
409+ this
401410 ) ;
402411 }
403- manager . _kernel = kernel ;
404- manager . _kernel . statusChanged . connect (
405- manager . _handleKernelStatusChange ,
406- manager
407- ) ;
408- manager . _kernel . connectionStatusChanged . connect (
409- manager . _handleKernelConnectionStatusChange ,
410- manager
412+ this . _kernel = kernel ;
413+ this . _kernel . statusChanged . connect ( this . _handleKernelStatusChange , this ) ;
414+ this . _kernel . connectionStatusChanged . connect (
415+ this . _handleKernelConnectionStatusChange ,
416+ this
411417 ) ;
412- manager . _restoredStatus = false ;
413- manager . _kernelRestoreInProgress = true ;
414- manager . clear_state ( ) . then ( ( ) => manager . restoreWidgets ( ) ) ;
418+ this . _restoredStatus = false ;
419+ this . _kernelRestoreInProgress = true ;
420+ this . clear_state ( ) . then ( ( ) => this . restoreWidgets ( ) ) ;
415421 }
416422
417423 /**
418- * Will define wManager as a renderer for rendermime if rendermime
419- * is not the global rendermime or there is only one wManager.
420- * If wManager is not provided, it will make the rendermine more general.
424+ * Configure a non-global rendermime. Passing the global rendermine will do
425+ * nothing.
426+ *
427+ * @param rendermime
428+ * @param manager The manager to use with WidgetRenderer.
429+ * @param pendingManagerMessage A message that is displayed while the manager
430+ * has not been provided. If manager is not provided here a non-empty string
431+ * assumes the manager will be provided at some time in the future.
432+ *
433+ * The default will search for a manager once.
434+ * @returns
421435 */
422- static attachToRendermime (
436+ static configureRendermime (
423437 rendermime : IRenderMimeRegistry ,
424- wManager ?: KernelWidgetManager
438+ manager ?: KernelWidgetManager ,
439+ pendingManagerMessage = ''
425440 ) {
426- const wManager_ =
427- rendermime === LabWidgetManager . globalRendermime &&
428- Private . kernelWidgetManagers . size > 1
429- ? undefined
430- : wManager ;
431- const pendingManagerMessage = wManager ? 'Loading widget ...' : '' ;
441+ if ( rendermime === LabWidgetManager . globalRendermime ) {
442+ return ;
443+ }
432444 rendermime . removeMimeType ( WIDGET_VIEW_MIMETYPE ) ;
433445 rendermime . addFactory (
434446 {
435447 safe : false ,
436448 mimeTypes : [ WIDGET_VIEW_MIMETYPE ] ,
437- createRenderer : ( options ) =>
438- new WidgetRenderer ( options , wManager_ , pendingManagerMessage ) ,
449+ createRenderer : ( options : IRenderMime . IRendererOptions ) =>
450+ new WidgetRenderer ( options , manager , pendingManagerMessage ) ,
439451 } ,
440452 - 10
441453 ) ;
@@ -491,7 +503,7 @@ export class KernelWidgetManager extends LabWidgetManager {
491503 return ;
492504 }
493505 super . dispose ( ) ;
494- KernelWidgetManager . attachToRendermime ( this . rendermime ) ;
506+ KernelWidgetManager . configureRendermime ( this . rendermime ) ;
495507 Private . kernelWidgetManagers . delete ( this . kernel . id ) ;
496508 this . _handleKernelChanged ( {
497509 name : 'kernel' ,
@@ -559,15 +571,11 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
559571 } ) ;
560572 }
561573 if ( rendermime !== LabWidgetManager . globalRendermime ) {
562- rendermime . removeMimeType ( WIDGET_VIEW_MIMETYPE ) ;
563- rendermime . addFactory (
564- {
565- safe : false ,
566- mimeTypes : [ WIDGET_VIEW_MIMETYPE ] ,
567- createRenderer : ( options ) =>
568- new WidgetRenderer ( options , undefined , 'Waiting for kernel' ) ,
569- } ,
570- - 10
574+ // Instruct the renderer to wait for the widgetManager.
575+ KernelWidgetManager . configureRendermime (
576+ rendermime ,
577+ undefined ,
578+ 'Waiting for kernel'
571579 ) ;
572580 }
573581 if ( this . kernel ) {
@@ -618,9 +626,10 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
618626 this . restoreWidgets ( this . _context ! . model ) ;
619627 }
620628 }
621- KernelWidgetManager . attachToRendermime (
629+ KernelWidgetManager . configureRendermime (
622630 this . rendermime ,
623- this . _widgetManager
631+ this . _widgetManager ,
632+ 'Loading widget ...'
624633 ) ;
625634 if ( this . _renderers ) {
626635 for ( const r of this . _renderers ) {
@@ -814,17 +823,15 @@ export namespace WidgetManager {
814823}
815824
816825/**
817- * Get the widgetManager that owns the model id=model_id.
818- * @param model_id An existing model_id
819- * @returns KernelWidgetManager
826+ * Get the widgetManager that owns the model.
820827 */
821- export function findWidgetManager ( model_id : string ) : KernelWidgetManager {
828+ export function getWidgetManager ( model_id : string ) : KernelWidgetManager | null {
822829 for ( const wManager of Private . kernelWidgetManagers . values ( ) ) {
823830 if ( wManager . has_model ( model_id ) ) {
824831 return wManager ;
825832 }
826833 }
827- throw new Error ( `A widget manager was not found for model_id: ' ${ model_id } '` ) ;
834+ return null ;
828835}
829836
830837/**
0 commit comments