0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 03:31:50 +02:00

refactor: move add/remove bundle to scan group box

This commit is contained in:
2024-10-11 11:44:01 +02:00
parent 523cc43572
commit e3d0a7bbf9
3 changed files with 65 additions and 55 deletions

View File

@ -62,6 +62,8 @@ class ScanControl(BECWidget, QWidget):
super().__init__(client=client, gui_id=gui_id, config=config) super().__init__(client=client, gui_id=gui_id, config=config)
QWidget.__init__(self, parent=parent) QWidget.__init__(self, parent=parent)
self._hide_add_remove_buttons = False
# Client from BEC + shortcuts to device manager and scans # Client from BEC + shortcuts to device manager and scans
self.get_bec_shortcuts() self.get_bec_shortcuts()
@ -100,21 +102,6 @@ class ScanControl(BECWidget, QWidget):
self.comboBox_scan_selection.currentIndexChanged.connect(self.on_scan_selection_changed) self.comboBox_scan_selection.currentIndexChanged.connect(self.on_scan_selection_changed)
self.button_run_scan.clicked.connect(self.run_scan) self.button_run_scan.clicked.connect(self.run_scan)
# Add bundle button
self.button_add_bundle = QPushButton("Add Bundle")
self.button_add_bundle.setVisible(False)
# Remove bundle button
self.button_remove_bundle = QPushButton("Remove Bundle")
self.button_remove_bundle.setVisible(False)
bundle_layout = QHBoxLayout()
bundle_layout.addWidget(self.button_add_bundle)
bundle_layout.addWidget(self.button_remove_bundle)
self.layout.addLayout(bundle_layout)
self.button_add_bundle.clicked.connect(self.add_arg_bundle)
self.button_remove_bundle.clicked.connect(self.remove_arg_bundle)
self.scan_selected.connect(self.scan_select) self.scan_selected.connect(self.scan_select)
# Initialize scan selection # Initialize scan selection
@ -366,11 +353,7 @@ class ScanControl(BECWidget, QWidget):
self.arg_group = gui_config.get("arg_group", None) self.arg_group = gui_config.get("arg_group", None)
self.kwarg_groups = gui_config.get("kwarg_groups", None) self.kwarg_groups = gui_config.get("kwarg_groups", None)
show_bundle_buttons = bool(self.arg_group["arg_inputs"]) if bool(self.arg_group["arg_inputs"]):
self._show_bundle_buttons(show_bundle_buttons)
if show_bundle_buttons:
self.add_arg_group(self.arg_group) self.add_arg_group(self.arg_group)
if len(self.kwarg_groups) > 0: if len(self.kwarg_groups) > 0:
self.add_kwargs_boxes(self.kwarg_groups) self.add_kwargs_boxes(self.kwarg_groups)
@ -378,28 +361,21 @@ class ScanControl(BECWidget, QWidget):
self.update() self.update()
self.adjustSize() self.adjustSize()
def _show_bundle_buttons(self, show: bool):
"""Shows or hides the bundle buttons based on the show argument.
Args:
show(bool): Show or hide the bundle buttons.
"""
self.button_add_bundle.setVisible(show)
self.button_remove_bundle.setVisible(show)
@Property(bool) @Property(bool)
def hide_bundle_buttons(self): def hide_add_remove_buttons(self):
"""Property to hide the bundle buttons.""" """Property to hide the add_remove buttons."""
return not self.button_add_bundle.isVisible() return self._hide_add_remove_buttons
@hide_bundle_buttons.setter @hide_add_remove_buttons.setter
def hide_bundle_buttons(self, hide: bool): def hide_add_remove_buttons(self, hide: bool):
"""Setter for the hide_bundle_buttons property. """Setter for the hide_add_remove_buttons property.
Args: Args:
hide(bool): Hide or show the bundle buttons. hide(bool): Hide or show the add_remove buttons.
""" """
self._show_bundle_buttons(not hide) self._hide_add_remove_buttons = hide
if self.arg_box is not None:
self.arg_box.hide_add_remove_buttons = hide
def add_kwargs_boxes(self, groups: list): def add_kwargs_boxes(self, groups: list):
""" """
@ -423,6 +399,7 @@ class ScanControl(BECWidget, QWidget):
self.arg_box = ScanGroupBox(box_type="args", config=group) self.arg_box = ScanGroupBox(box_type="args", config=group)
self.arg_box.device_selected.connect(self.emit_device_selected) self.arg_box.device_selected.connect(self.emit_device_selected)
self.arg_box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self.arg_box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
self.arg_box.hide_add_remove_buttons = self._hide_add_remove_buttons
self.layout.addWidget(self.arg_box) self.layout.addWidget(self.arg_box)
@Slot(str) @Slot(str)
@ -435,16 +412,6 @@ class ScanControl(BECWidget, QWidget):
self._selected_devices = dev_names self._selected_devices = dev_names
self.device_selected.emit(dev_names) self.device_selected.emit(dev_names)
@Slot()
def add_arg_bundle(self):
"""Adds a new argument bundle to the scan control layout."""
self.arg_box.add_widget_bundle()
@Slot()
def remove_arg_bundle(self):
"""Removes the last argument bundle from the scan control layout."""
self.arg_box.remove_widget_bundle()
def reset_layout(self): def reset_layout(self):
"""Clears the scan control layout from GuiGroups and ArgGroups boxes.""" """Clears the scan control layout from GuiGroups and ArgGroups boxes."""
if self.arg_box is not None: if self.arg_box is not None:

View File

@ -1,7 +1,8 @@
from typing import Literal from typing import Literal
from bec_lib.logger import bec_logger from bec_lib.logger import bec_logger
from qtpy.QtCore import Qt, Slot, Signal from bec_qthemes import material_icon
from qtpy.QtCore import Property, Qt, Signal, Slot
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QCheckBox, QCheckBox,
QComboBox, QComboBox,
@ -11,9 +12,12 @@ from qtpy.QtWidgets import (
QFormLayout, QFormLayout,
QGridLayout, QGridLayout,
QGroupBox, QGroupBox,
QHBoxLayout,
QLabel, QLabel,
QLineEdit, QLineEdit,
QPushButton,
QSpinBox, QSpinBox,
QVBoxLayout,
) )
from bec_widgets.utils.widget_io import WidgetIO from bec_widgets.utils.widget_io import WidgetIO
@ -146,14 +150,36 @@ class ScanGroupBox(QGroupBox):
super().__init__(parent=parent, *args, **kwargs) super().__init__(parent=parent, *args, **kwargs)
self.config = config self.config = config
self.box_type = box_type self.box_type = box_type
self._hide_add_remove_buttons = False
vbox_layout = QVBoxLayout(self)
hbox_layout = QHBoxLayout()
vbox_layout.addLayout(hbox_layout)
self.layout = QGridLayout(self) self.layout = QGridLayout(self)
vbox_layout.addLayout(self.layout)
# Add bundle button
self.button_add_bundle = QPushButton(self)
self.button_add_bundle.setIcon(
material_icon(icon_name="add", size=(15, 15), convert_to_pixmap=False)
)
# Remove bundle button
self.button_remove_bundle = QPushButton(self)
self.button_remove_bundle.setIcon(
material_icon(icon_name="remove", size=(15, 15), convert_to_pixmap=False)
)
hbox_layout.addWidget(self.button_add_bundle)
hbox_layout.addWidget(self.button_remove_bundle)
self.labels = [] self.labels = []
self.widgets = [] self.widgets = []
self.selected_devices = {} self.selected_devices = {}
self.init_box(self.config) self.init_box(self.config)
self.button_add_bundle.clicked.connect(self.add_widget_bundle)
self.button_remove_bundle.clicked.connect(self.remove_widget_bundle)
def init_box(self, config: dict): def init_box(self, config: dict):
box_name = config.get("name", "ScanGroupBox") box_name = config.get("name", "ScanGroupBox")
self.inputs = config.get("inputs", {}) self.inputs = config.get("inputs", {})
@ -169,6 +195,8 @@ class ScanGroupBox(QGroupBox):
self.add_input_widgets(self.inputs, i) self.add_input_widgets(self.inputs, i)
else: else:
self.add_input_widgets(self.inputs, 1) self.add_input_widgets(self.inputs, 1)
self.button_add_bundle.setVisible(False)
self.button_remove_bundle.setVisible(False)
def add_input_labels(self, group_inputs: dict, row: int) -> None: def add_input_labels(self, group_inputs: dict, row: int) -> None:
""" """
@ -223,8 +251,6 @@ class ScanGroupBox(QGroupBox):
""" """
Adds a new row of widgets to the scan control layout. Only usable for arg_groups. Adds a new row of widgets to the scan control layout. Only usable for arg_groups.
""" """
if self.box_type != "args":
return
arg_max = self.config.get("max", None) arg_max = self.config.get("max", None)
row = self.layout.rowCount() row = self.layout.rowCount()
if arg_max is not None and row >= arg_max: if arg_max is not None and row >= arg_max:
@ -236,17 +262,34 @@ class ScanGroupBox(QGroupBox):
""" """
Removes the last row of widgets from the scan control layout. Only usable for arg_groups. Removes the last row of widgets from the scan control layout. Only usable for arg_groups.
""" """
if self.box_type != "args":
return
arg_min = self.config.get("min", None) arg_min = self.config.get("min", None)
row = self.count_arg_rows() row = self.count_arg_rows()
if arg_min is not None and row <= arg_min: if arg_min is not None and row <= arg_min:
return return
for widget in self.widgets[-len(self.inputs) :]: for widget in self.widgets[-len(self.inputs) :]:
if isinstance(widget, DeviceLineEdit):
self.selected_devices[widget] = ""
widget.deleteLater() widget.deleteLater()
self.widgets = self.widgets[: -len(self.inputs)] self.widgets = self.widgets[: -len(self.inputs)]
selected_devices_str = " ".join(self.selected_devices.values())
self.device_selected.emit(selected_devices_str.strip())
@Property(bool)
def hide_add_remove_buttons(self):
return self._hide_add_remove_buttons
@hide_add_remove_buttons.setter
def hide_add_remove_buttons(self, hide: bool):
self._hide_add_remove_buttons = hide
if not hide and self.box_type == "args":
self.button_add_bundle.show()
self.button_remove_bundle.show()
return
self.button_add_bundle.hide()
self.button_remove_bundle.hide()
def get_parameters(self, device_object: bool = True): def get_parameters(self, device_object: bool = True):
""" """
Returns the parameters from the widgets in the scan control layout formated to run scan from BEC. Returns the parameters from the widgets in the scan control layout formated to run scan from BEC.

View File

@ -355,14 +355,14 @@ def test_add_remove_bundle(scan_control, scan_name, qtbot):
assert initial_num_of_rows == expected_scan_info["arg_bundle_size"]["min"] assert initial_num_of_rows == expected_scan_info["arg_bundle_size"]["min"]
scan_control.button_add_bundle.click() scan_control.arg_box.button_add_bundle.click()
scan_control.button_add_bundle.click() scan_control.arg_box.button_add_bundle.click()
if expected_scan_info["arg_bundle_size"]["max"] is None: if expected_scan_info["arg_bundle_size"]["max"] is None:
assert scan_control.arg_box.count_arg_rows() == initial_num_of_rows + 2 assert scan_control.arg_box.count_arg_rows() == initial_num_of_rows + 2
# Remove one bundle # Remove one bundle
scan_control.button_remove_bundle.click() scan_control.arg_box.button_remove_bundle.click()
qtbot.wait(200) qtbot.wait(200)
assert scan_control.arg_box.count_arg_rows() == initial_num_of_rows + 1 assert scan_control.arg_box.count_arg_rows() == initial_num_of_rows + 1