Skip to content

Commit 5c53ef1

Browse files
author
Alan Fleming
committed
Add attachToRendermime function.
1 parent 880a82c commit 5c53ef1

File tree

2 files changed

+42
-45
lines changed

2 files changed

+42
-45
lines changed

python/jupyterlab_widgets/src/manager.ts

Lines changed: 41 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ export abstract class LabWidgetManager
326326
await this.handle_comm_open(oldComm, msg);
327327
};
328328

329+
static globalRendermime: IRenderMimeRegistry;
330+
329331
protected _restored = new Signal<this, void>(this);
330332
protected _restoredStatus = false;
331333
protected _kernelRestoreInProgress = false;
@@ -346,20 +348,24 @@ export abstract class LabWidgetManager
346348

347349
/**
348350
* A singleton widget manager per kernel for the lifecycle of the kernel.
351+
* If a rendermime isn't provided the global singleton will be used.
349352
*/
350353
export class KernelWidgetManager extends LabWidgetManager {
351354
constructor(
352355
kernel: Kernel.IKernelConnection,
353-
rendermime: IRenderMimeRegistry
356+
rendermime: IRenderMimeRegistry | null
354357
) {
358+
if (!rendermime) {
359+
rendermime = LabWidgetManager.globalRendermime;
360+
}
355361
const instance = Private.kernelWidgetManagers.get(kernel.id);
356362
if (instance) {
357-
instance.attachToRendermime(rendermime);
363+
attachToRendermime(rendermime, instance);
358364
return instance;
359365
}
360366
super(rendermime);
361-
this.attachToRendermime(rendermime);
362367
Private.kernelWidgetManagers.set(kernel.id, this);
368+
attachToRendermime(rendermime, this);
363369
this._kernel = kernel;
364370
this.loadCustomWidgetDefinitions();
365371
LabWidgetManager.WIDGET_REGISTRY.changed.connect(() =>
@@ -433,7 +439,8 @@ export class KernelWidgetManager extends LabWidgetManager {
433439
if (this.isDisposed) {
434440
return;
435441
}
436-
442+
attachToRendermime(this.rendermime);
443+
Private.kernelWidgetManagers.delete(this.kernel.id);
437444
this._kernel = null!;
438445
super.dispose();
439446
}
@@ -452,18 +459,6 @@ export class KernelWidgetManager extends LabWidgetManager {
452459
return this.filterExistingModelState(serialized_state);
453460
}
454461

455-
attachToRendermime(rendermime: IRenderMimeRegistry) {
456-
rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE);
457-
rendermime.addFactory(
458-
{
459-
safe: false,
460-
mimeTypes: [WIDGET_VIEW_MIMETYPE],
461-
createRenderer: (options) => new WidgetRenderer(options, this),
462-
},
463-
-10
464-
);
465-
}
466-
467462
private _kernel: Kernel.IKernelConnection;
468463
protected _kernelRestoreInProgress = false;
469464
}
@@ -537,7 +532,10 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
537532
);
538533
}
539534
if (this.kernel) {
540-
this._widgetManager = getWidgetManager(this.kernel, this.rendermime);
535+
this._widgetManager = new KernelWidgetManager(
536+
this.kernel,
537+
this.rendermime
538+
);
541539
this._widgetManager.onUnhandledIOPubMessage.connect(
542540
this.onUnhandledIOPubMessage,
543541
this
@@ -756,31 +754,6 @@ export namespace WidgetManager {
756754
};
757755
}
758756

759-
/**
760-
* Get the widget manager for the kernel. Calling this will ensure
761-
* widgets work in a kernel (providing the kerenel provides comms).
762-
* With the widgetManager use the method `widgetManager.attachToRendermime`
763-
* against any rendermime.
764-
* @param kernel A kernel connection to which the widget manager is associated.
765-
* @returns LabWidgetManager
766-
*/
767-
export function getWidgetManager(
768-
kernel: Kernel.IKernelConnection,
769-
rendermime: IRenderMimeRegistry
770-
): KernelWidgetManager {
771-
if (!Private.kernelWidgetManagers.has(kernel.id)) {
772-
new KernelWidgetManager(kernel, rendermime);
773-
}
774-
const wManager = Private.kernelWidgetManagers.get(kernel.id);
775-
if (!wManager) {
776-
throw new Error('Failed to create KernelWidgetManager');
777-
}
778-
if (wManager.rendermime !== rendermime) {
779-
wManager.attachToRendermime(rendermime);
780-
}
781-
return wManager;
782-
}
783-
784757
/**
785758
* Get the widgetManager that owns the model id=model_id.
786759
* @param model_id An existing model_id
@@ -795,6 +768,32 @@ export function findWidgetManager(model_id: string): KernelWidgetManager {
795768
throw new Error(`A widget manager was not found for model_id ${model_id}'`);
796769
}
797770

771+
/**
772+
* Will define wManager as a renderer for rendermime if rendermime
773+
* is not the global rendermime or there is only one wManager.
774+
* If wManager is not provided, it will make the rendermine more general.
775+
*/
776+
function attachToRendermime(
777+
rendermime: IRenderMimeRegistry,
778+
wManager?: KernelWidgetManager
779+
) {
780+
const wManager_ =
781+
rendermime === LabWidgetManager.globalRendermime &&
782+
Private.kernelWidgetManagers.size > 1
783+
? undefined
784+
: wManager;
785+
786+
rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE);
787+
rendermime.addFactory(
788+
{
789+
safe: false,
790+
mimeTypes: [WIDGET_VIEW_MIMETYPE],
791+
createRenderer: (options) => new WidgetRenderer(options, wManager_),
792+
},
793+
-10
794+
);
795+
}
796+
798797
/**
799798
* A namespace for private data
800799
*/

python/jupyterlab_widgets/src/plugin.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,6 @@ export function registerWidgetManager(
148148
wManager.updateWidgetRenderers(renderers);
149149
}
150150
return new DisposableDelegate(() => {
151-
if (rendermime) {
152-
rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE);
153-
}
154151
wManager!.dispose();
155152
});
156153
}
@@ -230,6 +227,7 @@ function activateWidgetExtension(
230227
});
231228
}
232229
WidgetManager.loggerRegistry = loggerRegistry;
230+
LabWidgetManager.globalRendermime = rendermime;
233231
// Add a placeholder widget renderer.
234232
rendermime.addFactory(
235233
{

0 commit comments

Comments
 (0)