mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 11:41:49 +02:00
feat(rpc): discover widgets automatically
This commit is contained in:
@ -1,22 +1,37 @@
|
|||||||
from bec_widgets.utils import BECConnector
|
from bec_widgets.utils import BECConnector
|
||||||
from bec_widgets.widgets.figure import BECFigure
|
|
||||||
from bec_widgets.widgets.spiral_progress_bar.spiral_progress_bar import SpiralProgressBar
|
|
||||||
from bec_widgets.widgets.text_box.text_box import TextBox
|
|
||||||
from bec_widgets.widgets.website.website import WebsiteWidget
|
|
||||||
|
|
||||||
|
|
||||||
class RPCWidgetHandler:
|
class RPCWidgetHandler:
|
||||||
"""Handler class for creating widgets from RPC messages."""
|
"""Handler class for creating widgets from RPC messages."""
|
||||||
|
|
||||||
widget_classes = {
|
def __init__(self):
|
||||||
"BECFigure": BECFigure,
|
self._widget_classes = None
|
||||||
"SpiralProgressBar": SpiralProgressBar,
|
|
||||||
"Website": WebsiteWidget,
|
|
||||||
"TextBox": TextBox,
|
|
||||||
}
|
|
||||||
|
|
||||||
@staticmethod
|
@property
|
||||||
def create_widget(widget_type, **kwargs) -> BECConnector:
|
def widget_classes(self):
|
||||||
|
"""
|
||||||
|
Get the available widget classes.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: The available widget classes.
|
||||||
|
"""
|
||||||
|
if self._widget_classes is None:
|
||||||
|
self.update_available_widgets()
|
||||||
|
return self._widget_classes
|
||||||
|
|
||||||
|
def update_available_widgets(self):
|
||||||
|
"""
|
||||||
|
Update the available widgets.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
from bec_widgets.utils.plugin_utils import get_rpc_classes
|
||||||
|
|
||||||
|
clss = get_rpc_classes("bec_widgets")
|
||||||
|
self._widget_classes = {cls.__name__: cls for cls in clss["top_level_classes"]}
|
||||||
|
|
||||||
|
def create_widget(self, widget_type, **kwargs) -> BECConnector:
|
||||||
"""
|
"""
|
||||||
Create a widget from an RPC message.
|
Create a widget from an RPC message.
|
||||||
|
|
||||||
@ -27,7 +42,12 @@ class RPCWidgetHandler:
|
|||||||
Returns:
|
Returns:
|
||||||
widget(BECConnector): The created widget.
|
widget(BECConnector): The created widget.
|
||||||
"""
|
"""
|
||||||
widget_class = RPCWidgetHandler.widget_classes.get(widget_type)
|
if self._widget_classes is None:
|
||||||
|
self.update_available_widgets()
|
||||||
|
widget_class = self._widget_classes.get(widget_type)
|
||||||
if widget_class:
|
if widget_class:
|
||||||
return widget_class(**kwargs)
|
return widget_class(**kwargs)
|
||||||
raise ValueError(f"Unknown widget type: {widget_type}")
|
raise ValueError(f"Unknown widget type: {widget_type}")
|
||||||
|
|
||||||
|
|
||||||
|
widget_handler = RPCWidgetHandler()
|
||||||
|
@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Literal, Optional
|
|||||||
from pydantic import Field
|
from pydantic import Field
|
||||||
from pyqtgraph.dockarea import Dock
|
from pyqtgraph.dockarea import Dock
|
||||||
|
|
||||||
from bec_widgets.cli.rpc_wigdet_handler import RPCWidgetHandler
|
from bec_widgets.cli.rpc_wigdet_handler import widget_handler
|
||||||
from bec_widgets.utils import BECConnector, ConnectionConfig, GridLayoutManager
|
from bec_widgets.utils import BECConnector, ConnectionConfig, GridLayoutManager
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@ -149,7 +149,7 @@ class BECDock(BECConnector, Dock):
|
|||||||
Returns:
|
Returns:
|
||||||
list: The list of eligible widgets.
|
list: The list of eligible widgets.
|
||||||
"""
|
"""
|
||||||
return list(RPCWidgetHandler.widget_classes.keys())
|
return list(widget_handler.widget_classes.keys())
|
||||||
|
|
||||||
def add_widget(
|
def add_widget(
|
||||||
self,
|
self,
|
||||||
@ -178,7 +178,7 @@ class BECDock(BECConnector, Dock):
|
|||||||
self.layout_manager.shift_widgets(shift, start_row=row)
|
self.layout_manager.shift_widgets(shift, start_row=row)
|
||||||
|
|
||||||
if isinstance(widget, str):
|
if isinstance(widget, str):
|
||||||
widget = RPCWidgetHandler.create_widget(widget)
|
widget = widget_handler.create_widget(widget)
|
||||||
else:
|
else:
|
||||||
widget = widget
|
widget = widget
|
||||||
|
|
||||||
|
7
tests/unit_tests/test_rpc_widget_handler.py
Normal file
7
tests/unit_tests/test_rpc_widget_handler.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from bec_widgets.cli.rpc_wigdet_handler import RPCWidgetHandler
|
||||||
|
|
||||||
|
|
||||||
|
def test_rpc_widget_handler():
|
||||||
|
handler = RPCWidgetHandler()
|
||||||
|
assert "BECFigure" in handler.widget_classes
|
||||||
|
assert "SpiralProgressBar" in handler.widget_classes
|
Reference in New Issue
Block a user