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

refactor: redesign of scan selection and scan control boxes

This commit is contained in:
2024-10-11 11:45:58 +02:00
parent e3d0a7bbf9
commit a69d2870e2

View File

@ -1,4 +1,5 @@
from collections import defaultdict from collections import defaultdict
from types import SimpleNamespace
from typing import Optional from typing import Optional
from bec_lib.endpoints import MessageEndpoints from bec_lib.endpoints import MessageEndpoints
@ -7,11 +8,11 @@ from qtpy.QtCore import Property, Signal, Slot
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QApplication, QApplication,
QComboBox, QComboBox,
QGroupBox,
QHBoxLayout, QHBoxLayout,
QLabel, QLabel,
QPushButton, QPushButton,
QSizePolicy, QSizePolicy,
QSpacerItem,
QVBoxLayout, QVBoxLayout,
QWidget, QWidget,
) )
@ -19,6 +20,7 @@ from qtpy.QtWidgets import (
from bec_widgets.qt_utils.error_popups import SafeSlot from bec_widgets.qt_utils.error_popups import SafeSlot
from bec_widgets.utils import ConnectionConfig from bec_widgets.utils import ConnectionConfig
from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.bec_widget import BECWidget
from bec_widgets.utils.colors import get_accent_colors
from bec_widgets.widgets.scan_control.scan_group_box import ScanGroupBox from bec_widgets.widgets.scan_control.scan_group_box import ScanGroupBox
from bec_widgets.widgets.stop_button.stop_button import StopButton from bec_widgets.widgets.stop_button.stop_button import StopButton
from bec_widgets.widgets.toggle.toggle import ToggleSwitch from bec_widgets.widgets.toggle.toggle import ToggleSwitch
@ -87,12 +89,54 @@ class ScanControl(BECWidget, QWidget):
""" """
Initializes the UI of the scan control widget. Create the top box for scan selection and populate scans to main combobox. Initializes the UI of the scan control widget. Create the top box for scan selection and populate scans to main combobox.
""" """
palette = get_accent_colors()
if palette is None:
palette = SimpleNamespace(
default=QColor("blue"),
success=QColor("green"),
warning=QColor("orange"),
emergency=QColor("red"),
)
# Scan selection box
self.scan_selection_group = QWidget(self)
QVBoxLayout(self.scan_selection_group)
scan_selection_layout = QHBoxLayout()
self.comboBox_scan_selection_label = QLabel("Scan:", self.scan_selection_group)
self.comboBox_scan_selection = QComboBox(self.scan_selection_group)
scan_selection_layout.addWidget(self.comboBox_scan_selection_label, 0)
scan_selection_layout.addWidget(self.comboBox_scan_selection, 1)
self.scan_selection_group.layout().addLayout(scan_selection_layout)
# Scan selection group box # Label to reload the last scan parameters within scan selection group box
self.scan_selection_group = self.create_scan_selection_group() self.toggle_layout = QHBoxLayout()
self.toggle_layout.addSpacerItem(
QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Fixed)
)
self.last_scan_label = QLabel("Restore last scan parameters", self.scan_selection_group)
self.toggle = ToggleSwitch(parent=self.scan_selection_group, checked=False)
self.toggle.enabled.connect(self.request_last_executed_scan_parameters)
self.toggle_layout.addWidget(self.last_scan_label)
self.toggle_layout.addWidget(self.toggle)
self.scan_selection_group.layout().addLayout(self.toggle_layout)
self.scan_selection_group.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self.scan_selection_group.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
self.layout.addWidget(self.scan_selection_group) self.layout.addWidget(self.scan_selection_group)
# Scan control (Run/Stop) buttons
self.scan_control_group = QWidget(self)
self.scan_control_group.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
self.button_layout = QHBoxLayout(self.scan_control_group)
self.button_run_scan = QPushButton("Start", self.scan_control_group)
self.button_run_scan.setStyleSheet(
f"background-color: {palette.success.name()}; color: white"
)
self.button_stop_scan = StopButton(parent=self.scan_control_group)
self.button_stop_scan.setStyleSheet(
f"background-color: {palette.emergency.name()}; color: white"
)
self.button_layout.addWidget(self.button_run_scan)
self.button_layout.addWidget(self.button_stop_scan)
self.layout.addWidget(self.scan_control_group)
# Default scan from config # Default scan from config
if self.config.default_scan is not None: if self.config.default_scan is not None:
self.comboBox_scan_selection.setCurrentText(self.config.default_scan) self.comboBox_scan_selection.setCurrentText(self.config.default_scan)
@ -107,47 +151,6 @@ class ScanControl(BECWidget, QWidget):
# Initialize scan selection # Initialize scan selection
self.populate_scans() self.populate_scans()
def create_scan_selection_group(self) -> QGroupBox:
"""
Creates the scan selection group box with combobox to select the scan and start/stop button.
Returns:
QGroupBox: Group box containing the scan selection widgets.
"""
scan_selection_group = QGroupBox("Scan Selection", self)
self.scan_selection_layout = QVBoxLayout(scan_selection_group)
self.comboBox_scan_selection = QComboBox(scan_selection_group)
# Buttons
self.button_layout = QHBoxLayout()
## Run button
self.button_run_scan = QPushButton("Start", scan_selection_group)
self.button_run_scan.setStyleSheet("background-color: #559900; color: white")
## Stop button
self.button_stop_scan = StopButton(parent=scan_selection_group)
## Add buttons to layout
self.button_layout.addWidget(self.button_run_scan)
self.button_layout.addWidget(self.button_stop_scan)
# Label to reload the last scan parameters
self.toggle_layout = QHBoxLayout()
## Label
self.last_scan_label = QLabel("Restore last scan parameters", scan_selection_group)
## Switch toggle button
self.toggle = ToggleSwitch(parent=scan_selection_group, checked=False)
self.toggle.enabled.connect(self.request_last_executed_scan_parameters)
## Add label and switch to layout
self.toggle_layout.addWidget(self.last_scan_label)
self.toggle_layout.addWidget(self.toggle)
# Add widgets to layout
self.scan_selection_layout.addWidget(self.comboBox_scan_selection)
self.scan_selection_layout.addLayout(self.button_layout)
self.scan_selection_layout.addLayout(self.toggle_layout)
return scan_selection_group
def populate_scans(self): def populate_scans(self):
"""Populates the scan selection combo box with available scans from BEC session.""" """Populates the scan selection combo box with available scans from BEC session."""
self.available_scans = self.client.connector.get( self.available_scans = self.client.connector.get(
@ -270,29 +273,6 @@ class ScanControl(BECWidget, QWidget):
for box in self.kwarg_boxes: for box in self.kwarg_boxes:
box.setVisible(not hide) box.setVisible(not hide)
@Property(bool)
def hide_scan_remember_toggle(self):
"""Property to hide the scan remember toggle."""
return not self.toggle.isVisible()
@hide_scan_remember_toggle.setter
def hide_scan_remember_toggle(self, hide: bool):
"""Setter for the hide_scan_remember_toggle property.
Args:
hide(bool): Hide or show the scan remember toggle.
"""
self.show_scan_remember_toggle(not hide)
@Slot(bool)
def show_scan_remember_toggle(self, show: bool):
"""Shows or hides the scan control buttons."""
self.toggle.setVisible(show)
self.last_scan_label.setVisible(show)
show_group = show or self.button_run_scan.isVisible()
self.scan_selection_group.setVisible(show_group)
@Property(bool) @Property(bool)
def hide_scan_control_buttons(self): def hide_scan_control_buttons(self):
"""Property to hide the scan control buttons.""" """Property to hide the scan control buttons."""
@ -310,11 +290,7 @@ class ScanControl(BECWidget, QWidget):
@Slot(bool) @Slot(bool)
def show_scan_control_buttons(self, show: bool): def show_scan_control_buttons(self, show: bool):
"""Shows or hides the scan control buttons.""" """Shows or hides the scan control buttons."""
self.button_run_scan.setVisible(show) self.scan_control_group.setVisible(show)
self.button_stop_scan.setVisible(show)
show_group = show or self.button_run_scan.isVisible()
self.scan_selection_group.setVisible(show_group)
@Property(bool) @Property(bool)
def hide_scan_selection_combobox(self): def hide_scan_selection_combobox(self):
@ -333,10 +309,7 @@ class ScanControl(BECWidget, QWidget):
@Slot(bool) @Slot(bool)
def show_scan_selection_combobox(self, show: bool): def show_scan_selection_combobox(self, show: bool):
"""Shows or hides the scan selection combobox.""" """Shows or hides the scan selection combobox."""
self.comboBox_scan_selection.setVisible(show) self.scan_selection_group.setVisible(show)
show_group = show or self.button_run_scan.isVisible()
self.scan_selection_group.setVisible(show_group)
@Slot(str) @Slot(str)
def scan_select(self, scan_name: str): def scan_select(self, scan_name: str):