diff --git a/bec_widgets/cli/client.py b/bec_widgets/cli/client.py index 7ce1f92d..ebd9c5d8 100644 --- a/bec_widgets/cli/client.py +++ b/bec_widgets/cli/client.py @@ -25,22 +25,31 @@ class _WidgetsEnumType(str, enum.Enum): _Widgets = { + "AbortButton": "AbortButton", "BECDockArea": "BECDockArea", "BECProgressBar": "BECProgressBar", "BECQueue": "BECQueue", "BECStatusBox": "BECStatusBox", "DapComboBox": "DapComboBox", + "DarkModeButton": "DarkModeButton", "DeviceBrowser": "DeviceBrowser", "DeviceComboBox": "DeviceComboBox", "DeviceLineEdit": "DeviceLineEdit", "Image": "Image", "LogPanel": "LogPanel", + "Minesweeper": "Minesweeper", "MotorMap": "MotorMap", "MultiWaveform": "MultiWaveform", "PositionIndicator": "PositionIndicator", + "PositionerBox": "PositionerBox", + "PositionerBox2D": "PositionerBox2D", + "PositionerControlLine": "PositionerControlLine", + "ResetButton": "ResetButton", + "ResumeButton": "ResumeButton", "RingProgressBar": "RingProgressBar", "ScanControl": "ScanControl", "ScatterWaveform": "ScatterWaveform", + "StopButton": "StopButton", "TextBox": "TextBox", "VSCodeEditor": "VSCodeEditor", "Waveform": "Waveform", @@ -76,6 +85,16 @@ except ImportError as e: logger.error(f"Failed loading plugins: \n{reduce(add, traceback.format_exception(e))}") +class AbortButton(RPCBase): + """A button that abort the scan.""" + + @rpc_call + def remove(self): + """ + Cleanup the BECConnector + """ + + class AutoUpdates(RPCBase): @property @rpc_call @@ -665,6 +684,14 @@ class DapComboBox(RPCBase): """ +class DarkModeButton(RPCBase): + @rpc_call + def remove(self): + """ + Cleanup the BECConnector + """ + + class DeviceBrowser(RPCBase): """DeviceBrowser is a widget that displays all available devices in the current BEC session.""" @@ -1388,6 +1415,9 @@ class LogPanel(RPCBase): """ +class Minesweeper(RPCBase): ... + + class MotorMap(RPCBase): """Motor map widget for plotting motor positions in 2D including a trace of the last points.""" @@ -2231,6 +2261,54 @@ class PositionIndicator(RPCBase): """ +class PositionerBox(RPCBase): + """Simple Widget to control a positioner in box form""" + + @rpc_call + def set_positioner(self, positioner: "str | Positioner"): + """ + Set the device + + Args: + positioner (Positioner | str) : Positioner to set, accepts str or the device + """ + + +class PositionerBox2D(RPCBase): + """Simple Widget to control two positioners in box form""" + + @rpc_call + def set_positioner_hor(self, positioner: "str | Positioner"): + """ + Set the device + + Args: + positioner (Positioner | str) : Positioner to set, accepts str or the device + """ + + @rpc_call + def set_positioner_ver(self, positioner: "str | Positioner"): + """ + Set the device + + Args: + positioner (Positioner | str) : Positioner to set, accepts str or the device + """ + + +class PositionerControlLine(RPCBase): + """A widget that controls a single device.""" + + @rpc_call + def set_positioner(self, positioner: "str | Positioner"): + """ + Set the device + + Args: + positioner (Positioner | str) : Positioner to set, accepts str or the device + """ + + class PositionerGroup(RPCBase): """Simple Widget to control a positioner in box form""" @@ -2243,6 +2321,26 @@ class PositionerGroup(RPCBase): """ +class ResetButton(RPCBase): + """A button that resets the scan queue.""" + + @rpc_call + def remove(self): + """ + Cleanup the BECConnector + """ + + +class ResumeButton(RPCBase): + """A button that continue scan queue.""" + + @rpc_call + def remove(self): + """ + Cleanup the BECConnector + """ + + class Ring(RPCBase): @rpc_call def _get_all_rpc(self) -> "dict": @@ -2887,6 +2985,16 @@ class ScatterWaveform(RPCBase): """ +class StopButton(RPCBase): + """A button that stops the current scan.""" + + @rpc_call + def remove(self): + """ + Cleanup the BECConnector + """ + + class TextBox(RPCBase): """A widget that displays text in plain and HTML format""" diff --git a/bec_widgets/widgets/control/buttons/button_abort/button_abort.py b/bec_widgets/widgets/control/buttons/button_abort/button_abort.py index dfae2de7..c14bb062 100644 --- a/bec_widgets/widgets/control/buttons/button_abort/button_abort.py +++ b/bec_widgets/widgets/control/buttons/button_abort/button_abort.py @@ -11,7 +11,7 @@ class AbortButton(BECWidget, QWidget): PLUGIN = True ICON_NAME = "cancel" - RPC = False + RPC = True def __init__( self, diff --git a/bec_widgets/widgets/control/buttons/button_reset/button_reset.py b/bec_widgets/widgets/control/buttons/button_reset/button_reset.py index dc468a31..caea1cc7 100644 --- a/bec_widgets/widgets/control/buttons/button_reset/button_reset.py +++ b/bec_widgets/widgets/control/buttons/button_reset/button_reset.py @@ -11,7 +11,7 @@ class ResetButton(BECWidget, QWidget): PLUGIN = True ICON_NAME = "restart_alt" - RPC = False + RPC = True def __init__(self, parent=None, client=None, config=None, gui_id=None, toolbar=False, **kwargs): super().__init__(parent=parent, client=client, gui_id=gui_id, config=config, **kwargs) diff --git a/bec_widgets/widgets/control/buttons/button_resume/button_resume.py b/bec_widgets/widgets/control/buttons/button_resume/button_resume.py index c27369ed..33f694ff 100644 --- a/bec_widgets/widgets/control/buttons/button_resume/button_resume.py +++ b/bec_widgets/widgets/control/buttons/button_resume/button_resume.py @@ -11,7 +11,7 @@ class ResumeButton(BECWidget, QWidget): PLUGIN = True ICON_NAME = "resume" - RPC = False + RPC = True def __init__(self, parent=None, client=None, config=None, gui_id=None, toolbar=False, **kwargs): super().__init__(parent=parent, client=client, gui_id=gui_id, config=config, **kwargs) diff --git a/bec_widgets/widgets/control/buttons/stop_button/stop_button.py b/bec_widgets/widgets/control/buttons/stop_button/stop_button.py index 201a108a..ec9732ab 100644 --- a/bec_widgets/widgets/control/buttons/stop_button/stop_button.py +++ b/bec_widgets/widgets/control/buttons/stop_button/stop_button.py @@ -11,7 +11,7 @@ class StopButton(BECWidget, QWidget): PLUGIN = True ICON_NAME = "dangerous" - RPC = False + RPC = True def __init__(self, parent=None, client=None, config=None, gui_id=None, toolbar=False, **kwargs): super().__init__(parent=parent, client=client, gui_id=gui_id, config=config, **kwargs) diff --git a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py index 430badde..64b4b3f5 100644 --- a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +++ b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py @@ -31,6 +31,7 @@ class PositionerBox(PositionerBoxBase): dimensions = (234, 224) PLUGIN = True + RPC = True USER_ACCESS = ["set_positioner"] device_changed = Signal(str, str) diff --git a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py index 589a6c22..9c7dd32d 100644 --- a/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +++ b/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py @@ -33,6 +33,7 @@ class PositionerBox2D(PositionerBoxBase): ui_file = "positioner_box_2d.ui" PLUGIN = True + RPC = True USER_ACCESS = ["set_positioner_hor", "set_positioner_ver"] device_changed_hor = Signal(str, str) diff --git a/bec_widgets/widgets/games/minesweeper.py b/bec_widgets/widgets/games/minesweeper.py index e730ad10..607cde57 100644 --- a/bec_widgets/widgets/games/minesweeper.py +++ b/bec_widgets/widgets/games/minesweeper.py @@ -144,7 +144,7 @@ class Minesweeper(BECWidget, QWidget): PLUGIN = True ICON_NAME = "videogame_asset" USER_ACCESS = [] - RPC = False + RPC = True def __init__(self, parent=None, *args, **kwargs): super().__init__(parent=parent, *args, **kwargs) diff --git a/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py b/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py index 28baa73c..72a9e9bd 100644 --- a/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +++ b/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py @@ -12,7 +12,7 @@ class DarkModeButton(BECWidget, QWidget): ICON_NAME = "dark_mode" PLUGIN = True - RPC = False + RPC = True def __init__( self, diff --git a/tests/end-2-end/conftest.py b/tests/end-2-end/conftest.py index cbca8431..9866cf98 100644 --- a/tests/end-2-end/conftest.py +++ b/tests/end-2-end/conftest.py @@ -44,7 +44,7 @@ def connected_client_gui_obj(gui_id, bec_client_lib): @pytest.fixture(scope="session") -def connected_gui_with_scope_session(gui_id, bec_client_lib): +def connected_gui_with_scope_session(qtbot, gui_id, bec_client_lib): """ Fixture to create a new BECGuiClient object and start a server in the background. @@ -55,6 +55,8 @@ def connected_gui_with_scope_session(gui_id, bec_client_lib): gui = BECGuiClient(gui_id=gui_id) try: gui.start(wait=True) + # After the server started, we need to wait until the bec exists in the namespace + qtbot.waitUntil(lambda: hasattr(gui, "bec"), timeout=5000) yield gui finally: gui.kill_server()