diff --git a/bec_widgets/assets/designer_icons/device_box.png b/bec_widgets/assets/designer_icons/positioner_box.png
similarity index 100%
rename from bec_widgets/assets/designer_icons/device_box.png
rename to bec_widgets/assets/designer_icons/positioner_box.png
diff --git a/bec_widgets/widgets/positioner_box/positioner_box.py b/bec_widgets/widgets/positioner_box/positioner_box.py
index abf1f063..a517b893 100644
--- a/bec_widgets/widgets/positioner_box/positioner_box.py
+++ b/bec_widgets/widgets/positioner_box/positioner_box.py
@@ -7,16 +7,19 @@ from bec_lib.device import Positioner
from bec_lib.endpoints import MessageEndpoints
from bec_lib.logger import bec_logger
from bec_lib.messages import ScanQueueMessage
-from qtpy.QtCore import Property, Signal, Slot
-from qtpy.QtGui import QDoubleValidator
-from qtpy.QtWidgets import QDoubleSpinBox, QVBoxLayout, QWidget
+from qtpy.QtCore import Property, QSize, Signal, Slot
+from qtpy.QtGui import QDoubleValidator, QIcon
+from qtpy.QtWidgets import QDialog, QDoubleSpinBox, QPushButton, QVBoxLayout, QWidget
from bec_widgets.utils import UILoader
from bec_widgets.utils.bec_widget import BECWidget
from bec_widgets.utils.colors import apply_theme
+from bec_widgets.widgets.device_line_edit.device_line_edit import DeviceLineEdit
logger = bec_logger.logger
+MODULE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
+
class PositionerBox(BECWidget, QWidget):
"""Simple Widget to control a positioner in box form"""
@@ -71,6 +74,36 @@ class PositionerBox(BECWidget, QWidget):
self.setpoint_validator = QDoubleValidator()
self.ui.setpoint.setValidator(self.setpoint_validator)
self.ui.spinner_widget.start()
+ self.ui.tool_button.clicked.connect(self._open_dialog_selection)
+ icon = QIcon()
+ icon.addFile(
+ os.path.join(MODULE_PATH, "assets", "designer_icons", "device_line_edit.png"),
+ size=QSize(16, 16),
+ )
+ self.ui.tool_button.setIcon(icon)
+
+ def _open_dialog_selection(self):
+ """Open dialog window for positioner selection"""
+ dialog = QDialog(self)
+ dialog.setWindowTitle("Positioner Selection")
+ layout = QVBoxLayout()
+ line_edit = DeviceLineEdit(self, client=self.client, device_filter="Positioner")
+ line_edit.textChanged.connect(self._positioner_changed)
+ layout.addWidget(line_edit)
+ close_button = QPushButton("Close")
+ close_button.clicked.connect(dialog.accept)
+ layout.addWidget(close_button)
+ dialog.setLayout(layout)
+ dialog.exec()
+
+ @Slot(str)
+ def _positioner_changed(self, positioner_name: str):
+ """Changed input in combobox.
+
+ Args:
+ positioner_name (str): name of the positioner
+ """
+ self.set_positioner(positioner_name)
def init_device(self):
"""Init the device view and readback"""
@@ -267,7 +300,7 @@ if __name__ == "__main__": # pragma: no cover
from qtpy.QtWidgets import QApplication
app = QApplication(sys.argv)
- apply_theme("light")
+ apply_theme("dark")
widget = PositionerBox(device="bpm4i")
widget.show()
diff --git a/bec_widgets/widgets/positioner_box/positioner_box.ui b/bec_widgets/widgets/positioner_box/positioner_box.ui
index d70058ce..7ccd9558 100644
--- a/bec_widgets/widgets/positioner_box/positioner_box.ui
+++ b/bec_widgets/widgets/positioner_box/positioner_box.ui
@@ -78,6 +78,9 @@
false
+
+ Qt::AlignmentFlag::AlignCenter
+
-
@@ -125,6 +128,13 @@
-
+
-
+
+
+ ...
+
+
+
-
diff --git a/bec_widgets/widgets/positioner_box/positioner_box_plugin.py b/bec_widgets/widgets/positioner_box/positioner_box_plugin.py
index 48494331..3f25fa41 100644
--- a/bec_widgets/widgets/positioner_box/positioner_box_plugin.py
+++ b/bec_widgets/widgets/positioner_box/positioner_box_plugin.py
@@ -1,6 +1,8 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+import os
+
from qtpy.QtDesigner import QDesignerCustomWidgetInterface
from qtpy.QtGui import QIcon
@@ -12,6 +14,7 @@ DOM_XML = """
"""
+MODULE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
class PositionerBoxPlugin(QDesignerCustomWidgetInterface): # pragma: no cover
@@ -27,10 +30,11 @@ class PositionerBoxPlugin(QDesignerCustomWidgetInterface): # pragma: no cover
return DOM_XML
def group(self):
- return ""
+ return "Device Control"
def icon(self):
- return QIcon()
+ icon_path = os.path.join(MODULE_PATH, "assets", "designer_icons", "positioner_box.png")
+ return QIcon(icon_path)
def includeFile(self):
return "positioner_box"