From d67fc4d2ab9b4643e39768aa00049ca889d13554 Mon Sep 17 00:00:00 2001 From: martinRenou Date: Tue, 29 Apr 2025 13:05:02 +0200 Subject: [PATCH 1/3] Dynamic widgets registry --- python/jupyterlab_widgets/src/plugin.ts | 33 ++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index 8dd7d6c5d4..7b796925b4 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -58,8 +58,29 @@ import '@jupyter-widgets/controls/css/widgets-base.css'; import { KernelMessage } from '@jupyterlab/services'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; import { ISessionContext } from '@jupyterlab/apputils'; +import { ISignal, Signal } from '@lumino/signaling'; -const WIDGET_REGISTRY: base.IWidgetRegistryData[] = []; +class WidgetRegistry { + + get widgets(): base.IWidgetRegistryData[] { + return [...this._registry]; + } + + push(data: base.IWidgetRegistryData) { + this._registry.push(data); + this._registeredWidget.emit(data); + } + + get registeredWidget(): ISignal { + return this._registeredWidget; + } + + private _registeredWidget = new Signal(this); + + private _registry: base.IWidgetRegistryData[] = []; +} + +const WIDGET_REGISTRY = new WidgetRegistry(); /** * The cached settings. @@ -178,7 +199,10 @@ async function registerWidgetHandler( if (!wManager) { wManager = widgetManagerFactory(); - WIDGET_REGISTRY.forEach((data) => wManager!.register(data)); + WIDGET_REGISTRY.widgets.forEach((data) => wManager!.register(data)); + WIDGET_REGISTRY.registeredWidget.connect((_, data) => { + wManager!.register(data); + }); Private.widgetManagerProperty.set(wManagerOwner, wManager); currentOwner = wManagerOwner; content.disposed.connect((_) => { @@ -241,7 +265,10 @@ export function registerWidgetManager( ) as WidgetManager; if (!currentManager) { wManager = new WidgetManager(context, rendermime, SETTINGS); - WIDGET_REGISTRY.forEach((data) => wManager!.register(data)); + WIDGET_REGISTRY.widgets.forEach((data) => wManager!.register(data)); + WIDGET_REGISTRY.registeredWidget.connect((_, data) => { + wManager!.register(data); + }); Private.widgetManagerProperty.set(wManagerOwner, wManager); } else { wManager = currentManager; From d9839041e7327dcbef86a9b6b95986a8d54c1335 Mon Sep 17 00:00:00 2001 From: martinRenou Date: Tue, 29 Apr 2025 13:14:29 +0200 Subject: [PATCH 2/3] Linter --- python/jupyterlab_widgets/src/plugin.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index 7b796925b4..3ffe02a1fd 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -61,7 +61,6 @@ import { ISessionContext } from '@jupyterlab/apputils'; import { ISignal, Signal } from '@lumino/signaling'; class WidgetRegistry { - get widgets(): base.IWidgetRegistryData[] { return [...this._registry]; } @@ -75,7 +74,10 @@ class WidgetRegistry { return this._registeredWidget; } - private _registeredWidget = new Signal(this); + private _registeredWidget = new Signal< + WidgetRegistry, + base.IWidgetRegistryData + >(this); private _registry: base.IWidgetRegistryData[] = []; } From 910868e38eda7da717bff55aec4e25cea466d100 Mon Sep 17 00:00:00 2001 From: martinRenou Date: Mon, 5 May 2025 11:44:10 +0200 Subject: [PATCH 3/3] Rename registeredWidget -> widgetRegistered --- python/jupyterlab_widgets/src/plugin.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index 3ffe02a1fd..6c3a569582 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -67,14 +67,14 @@ class WidgetRegistry { push(data: base.IWidgetRegistryData) { this._registry.push(data); - this._registeredWidget.emit(data); + this._widgetRegistered.emit(data); } - get registeredWidget(): ISignal { - return this._registeredWidget; + get widgetRegistered(): ISignal { + return this._widgetRegistered; } - private _registeredWidget = new Signal< + private _widgetRegistered = new Signal< WidgetRegistry, base.IWidgetRegistryData >(this); @@ -202,7 +202,7 @@ async function registerWidgetHandler( if (!wManager) { wManager = widgetManagerFactory(); WIDGET_REGISTRY.widgets.forEach((data) => wManager!.register(data)); - WIDGET_REGISTRY.registeredWidget.connect((_, data) => { + WIDGET_REGISTRY.widgetRegistered.connect((_, data) => { wManager!.register(data); }); Private.widgetManagerProperty.set(wManagerOwner, wManager); @@ -268,7 +268,7 @@ export function registerWidgetManager( if (!currentManager) { wManager = new WidgetManager(context, rendermime, SETTINGS); WIDGET_REGISTRY.widgets.forEach((data) => wManager!.register(data)); - WIDGET_REGISTRY.registeredWidget.connect((_, data) => { + WIDGET_REGISTRY.widgetRegistered.connect((_, data) => { wManager!.register(data); }); Private.widgetManagerProperty.set(wManagerOwner, wManager);