diff --git a/bec_widgets/utils/clickable_label.py b/bec_widgets/utils/clickable_label.py new file mode 100644 index 00000000..a88ffe98 --- /dev/null +++ b/bec_widgets/utils/clickable_label.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from PySide6.QtGui import QMouseEvent +from qtpy.QtCore import Signal +from qtpy.QtWidgets import QLabel + + +class ClickableLabel(QLabel): + clicked = Signal() + + def mouseReleaseEvent(self, ev: QMouseEvent) -> None: + self.clicked.emit() + return super().mouseReleaseEvent(ev) diff --git a/bec_widgets/utils/expandable_frame.py b/bec_widgets/utils/expandable_frame.py index f8c0c965..cb39a464 100644 --- a/bec_widgets/utils/expandable_frame.py +++ b/bec_widgets/utils/expandable_frame.py @@ -14,6 +14,7 @@ from qtpy.QtWidgets import ( QWidget, ) +from bec_widgets.utils.clickable_label import ClickableLabel from bec_widgets.utils.error_popups import SafeProperty, SafeSlot @@ -39,8 +40,8 @@ class ExpandableGroupFrame(QFrame): self._title_layout = QHBoxLayout() self._layout.addLayout(self._title_layout) - self._title = QLabel(f"{title}") - self._title_icon = QLabel() + self._title = ClickableLabel(f"{title}") + self._title_icon = ClickableLabel() self._title_layout.addWidget(self._title_icon) self._title_layout.addWidget(self._title) self.icon_name = icon diff --git a/bec_widgets/utils/forms_from_types/styles.py b/bec_widgets/utils/forms_from_types/styles.py index bc1f7426..8a77ab16 100644 --- a/bec_widgets/utils/forms_from_types/styles.py +++ b/bec_widgets/utils/forms_from_types/styles.py @@ -2,7 +2,6 @@ import bec_qthemes def pretty_display_theme(theme: str = "dark"): - print(f"loading theme {theme}") palette = bec_qthemes.load_palette(theme) foreground = palette.text().color().name() background = palette.base().color().name() diff --git a/bec_widgets/widgets/services/device_browser/device_item/device_item.py b/bec_widgets/widgets/services/device_browser/device_item/device_item.py index 7091975c..3631ae50 100644 --- a/bec_widgets/widgets/services/device_browser/device_item/device_item.py +++ b/bec_widgets/widgets/services/device_browser/device_item/device_item.py @@ -65,6 +65,8 @@ class DeviceItem(ExpandableGroupFrame): self.set_layout(layout) self.adjustSize() + self._title.clicked.connect(self.switch_expanded_state) + self._title_icon.clicked.connect(self.switch_expanded_state) @SafeSlot() def switch_expanded_state(self): diff --git a/tests/unit_tests/test_device_browser.py b/tests/unit_tests/test_device_browser.py index 2911f809..18f11777 100644 --- a/tests/unit_tests/test_device_browser.py +++ b/tests/unit_tests/test_device_browser.py @@ -77,7 +77,8 @@ def test_update_event_captured(device_browser, qtbot): def test_device_item_expansion(device_browser, qtbot): """ - Test that the form is displayed when the item is expanded + Test that the form is displayed when the item is expanded, and that the expansion is triggered + by clicking on the expansion button, the title, or the device icon """ device_item: QListWidgetItem = device_browser.ui.device_list.itemAt(0, 0) widget: DeviceItem = device_browser.ui.device_list.itemWidget(device_item) @@ -90,6 +91,12 @@ def test_device_item_expansion(device_browser, qtbot): qtbot.mouseClick(widget._expansion_button, Qt.MouseButton.LeftButton) assert not widget.expanded + qtbot.mouseClick(widget._title, Qt.MouseButton.LeftButton) + qtbot.waitUntil(lambda: widget.expanded, timeout=500) + + qtbot.mouseClick(widget._title_icon, Qt.MouseButton.LeftButton) + qtbot.waitUntil(lambda: not widget.expanded, timeout=500) + def test_device_item_mouse_press_and_move_events_creates_drag(device_browser, qtbot): """