From 589bb6b7c3976d0f09c7116d106fe0d48bc042b3 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Fri, 29 May 2026 17:14:42 +0200 Subject: [PATCH] wip state drag&drop --- bec_widgets/cli/client.py | 1 + .../services/beamline_states/beamline_state_pill.py | 7 ++++++- tests/unit_tests/test_beamline_state_pill.py | 11 +++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/bec_widgets/cli/client.py b/bec_widgets/cli/client.py index df821022..ed15a14d 100644 --- a/bec_widgets/cli/client.py +++ b/bec_widgets/cli/client.py @@ -733,6 +733,7 @@ class BeamlineStateManager(RPCBase): Supported values: ``"config"``: drag the full state configuration dictionary. ``"device"``: drag only the configured device name. + ``"name"``: drag only the beamline state name. """ @rpc_call diff --git a/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py b/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py index 91476441..50a025f8 100644 --- a/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py +++ b/bec_widgets/widgets/services/beamline_states/beamline_state_pill.py @@ -77,7 +77,7 @@ class BeamlineStatePill(BECWidget, QWidget): "unknown": "help", } _SETTINGS_FIELD_WIDTH = 280 - _VALID_DRAG_PAYLOAD_MODES = {"config", "device"} + _VALID_DRAG_PAYLOAD_MODES = {"config", "device", "name"} MIME_PAYLOAD = "application/x-bec-beamline-state-payload" MIME_CONFIG = "application/x-bec-beamline-state-config" MIME_NAME = "application/x-bec-beamline-state-name" @@ -359,6 +359,7 @@ class BeamlineStatePill(BECWidget, QWidget): Supported values: ``"config"``: drag the full state configuration dictionary. ``"device"``: drag only the configured device name. + ``"name"``: drag only the beamline state name. """ return self._drag_payload_mode @@ -643,6 +644,8 @@ class BeamlineStatePill(BECWidget, QWidget): """Return the currently configured drag payload.""" if self._drag_payload_mode == "device": return str(self._state_field("device") or "") + if self._drag_payload_mode == "name": + return self._state_name or "" return self._state_config def _state_field(self, name: str) -> Any: @@ -1245,6 +1248,7 @@ class BeamlineStateManager(BECWidget, QWidget): Supported values: ``"config"``: drag the full state configuration dictionary. ``"device"``: drag only the configured device name. + ``"name"``: drag only the beamline state name. """ return self._drag_payload_mode @@ -1657,6 +1661,7 @@ if __name__ == "__main__": # pragma: no cover mode_combo = QComboBox(window) mode_combo.addItem("Drag full config", "config") mode_combo.addItem("Drag device name", "device") + mode_combo.addItem("Drag state name", "name") mode_combo.currentIndexChanged.connect( lambda: setattr(manager, "drag_payload_mode", mode_combo.currentData()) ) diff --git a/tests/unit_tests/test_beamline_state_pill.py b/tests/unit_tests/test_beamline_state_pill.py index 17fc1b60..524b4f79 100644 --- a/tests/unit_tests/test_beamline_state_pill.py +++ b/tests/unit_tests/test_beamline_state_pill.py @@ -153,6 +153,13 @@ def test_beamline_state_pill_drag_payload_modes(qtbot, mocked_client): assert bytes(device_mime.data(BeamlineStatePill.MIME_DEVICE)).decode("utf-8") == "samx" assert device_mime.text() == "samx" + widget.drag_payload_mode = "name" + name_mime = widget._create_drag_mime_data() + + assert bytes(name_mime.data(BeamlineStatePill.MIME_PAYLOAD)).decode("utf-8") == "limits" + assert bytes(name_mime.data(BeamlineStatePill.MIME_NAME)).decode("utf-8") == "limits" + assert name_mime.text() == "limits" + def test_beamline_state_manager_adds_and_removes_pills(qtbot, mocked_client): widget = BeamlineStateManager(client=mocked_client) @@ -216,9 +223,9 @@ def test_beamline_state_manager_propagates_drag_payload_mode(qtbot, mocked_clien assert widget._state_pills["limits"].drag_payload_mode == "device" - widget.drag_payload_mode = "config" + widget.drag_payload_mode = "name" - assert widget._state_pills["limits"].drag_payload_mode == "config" + assert widget._state_pills["limits"].drag_payload_mode == "name" def test_beamline_state_manager_propagates_idle_card_background(qtbot, mocked_client):