Skip to content

Commit 5b57da7

Browse files
author
Alan Fleming
committed
manager and render code refactoring.
1 parent 6412361 commit 5b57da7

File tree

3 files changed

+74
-64
lines changed

3 files changed

+74
-64
lines changed

python/jupyterlab_widgets/src/manager.ts

Lines changed: 67 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import {
2020

2121
import { IDisposable } from '@lumino/disposable';
2222

23+
import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
24+
2325
import { ReadonlyPartialJSONValue } from '@lumino/coreutils';
2426

2527
import { INotebookModel } from '@jupyterlab/notebook';
@@ -44,9 +46,10 @@ import { SemVerCache } from './semvercache';
4446

4547
import Backbone from 'backbone';
4648

47-
import * as base from '@jupyter-widgets/base';
4849
import { 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
354357
export 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
/**

python/jupyterlab_widgets/src/plugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ function activateWidgetExtension(
225225
}
226226
WidgetManager.loggerRegistry = loggerRegistry;
227227
LabWidgetManager.globalRendermime = rendermime;
228-
// Add a placeholder widget renderer.
228+
// Add a default widget renderer.
229229
rendermime.addFactory(
230230
{
231231
safe: false,

python/jupyterlab_widgets/src/renderer.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
1111

1212
import { DOMWidgetModel } from '@jupyter-widgets/base';
1313

14-
import { LabWidgetManager, findWidgetManager } from './manager';
14+
import { LabWidgetManager, getWidgetManager } from './manager';
1515

1616
/**
1717
* A renderer for widgets.
@@ -65,7 +65,7 @@ export class WidgetRenderer
6565
}
6666
let manager;
6767
if (!this._pendingManagerMessage && !this._managerIsSet) {
68-
manager = findWidgetManager(source.model_id);
68+
manager = getWidgetManager(source.model_id);
6969
}
7070
this.node.textContent = `${
7171
this._pendingManagerMessage || model.data['text/plain']
@@ -80,13 +80,16 @@ export class WidgetRenderer
8080
} catch (err) {
8181
if (!manager.restoredStatus) {
8282
this._rerenderMimeModel = model;
83+
} else if (this._pendingManagerMessage === 'Waiting for kernel') {
84+
this.node.textContent = `Widget not found in this kernel: ${
85+
model.data['text/plain'] || source.model_id
86+
}`;
8387
} else {
8488
// The manager has been restored, so this error won't be going away.
8589
this.node.textContent = 'Error displaying widget: model not found';
8690
this.addClass('jupyter-widgets');
8791
console.error(err);
8892
}
89-
9093
// Store the model for a possible rerender
9194
return Promise.resolve();
9295
}

0 commit comments

Comments
 (0)