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):
"""