refactoring

This commit is contained in:
x01da
2026-08-11 08:09:10 +02:00
parent 4bf8952789
commit 734639dc40
2 changed files with 55 additions and 107 deletions
+43 -95
View File
@@ -1,12 +1,14 @@
"""
Edge Selector: Custom BEC dialog to select an absorption edge.
"""
import sys
from typing import Literal, Optional
import xraydb
from bec_lib import bec_logger
from bec_widgets.utils.bec_dispatcher import BECDispatcher
from bec_widgets.utils.colors import apply_theme, get_accent_colors
from bec_widgets.utils.error_popups import SafeSlot
from qtpy.QtCore import Signal
# pylint: disable=E0611
from qtpy.QtWidgets import (
@@ -17,9 +19,7 @@ from qtpy.QtWidgets import (
QHBoxLayout,
QLabel,
QPushButton,
QSizePolicy,
QVBoxLayout,
QWidget,
)
logger = bec_logger.logger
@@ -142,26 +142,26 @@ class EdgeSelector(QDialog):
def __init__(self, parent=None, llim: int | float = 0, hlim: int | float = 1e6):
super().__init__(parent)
self.setWindowTitle("Absorption Edge Selector")
self.buttons = {}
self._buttons = {}
self.selected_edge = None
self.selected_element = None
self.selected_energy = None
self.llim = llim
self.hlim = hlim
self._llim = llim
self._hlim = hlim
layout = QVBoxLayout(self)
text = QLabel("Select edge and element.")
edge_layout = QHBoxLayout(self)
edge_layout = QHBoxLayout()
edge_label = QLabel("Edge")
self.edge = QComboBox()
self.edge.addItems(["K", "L1", "L2", "L3"])
self._edge = QComboBox()
self._edge.addItems(["K", "L1", "L2", "L3"])
edge_layout.addWidget(edge_label)
edge_layout.addWidget(self.edge)
edge_layout.addWidget(self._edge)
edge_layout.addStretch()
grid_layout = QGridLayout(self)
grid_layout = QGridLayout()
grid_layout.setContentsMargins(0, 0, 0, 0)
grid_layout.setSpacing(1)
@@ -173,30 +173,30 @@ class EdgeSelector(QDialog):
button.setDefault(False)
button.clicked.connect(lambda checked=False, e=element: self._element_changed(e))
grid_layout.addWidget(button, row - 1, col - 1)
self.buttons[element] = button
self._buttons[element] = button
res_layout = QHBoxLayout(self)
self.res = QLabel("")
res_layout = QHBoxLayout()
self._res = QLabel("")
res_layout.addStretch()
res_layout.addWidget(self.res)
res_layout.addWidget(self._res)
res_layout.addStretch()
button_layout = QHBoxLayout()
self.cancel_button = QPushButton("Cancel")
self.cancel_button.clicked.connect(self.reject)
self.cancel_button.setStyleSheet(
self._cancel_button = QPushButton("Cancel")
self._cancel_button.clicked.connect(self.reject)
self._cancel_button.setStyleSheet(
f"QPushButton {{background-color: {get_accent_colors().default.name()}; color: white;}}"
)
self.select_button = QPushButton("Select")
self.select_button.setEnabled(False)
self.select_button.clicked.connect(self.accept)
self.select_button.setStyleSheet(
self._select_button = QPushButton("Select")
self._select_button.setEnabled(False)
self._select_button.clicked.connect(self.accept)
self._select_button.setStyleSheet(
f"QPushButton {{background-color: {get_accent_colors().default.name()}; color: white;}}"
)
button_layout.addStretch()
button_layout.addWidget(self.cancel_button)
button_layout.addWidget(self.select_button)
button_layout.addWidget(self._cancel_button)
button_layout.addWidget(self._select_button)
button_layout.addStretch()
layout.addWidget(text)
@@ -205,14 +205,16 @@ class EdgeSelector(QDialog):
layout.addLayout(res_layout)
layout.addLayout(button_layout)
self.edge.activated.connect(self._edge_changed)
self.adjustSize()
self.setFixedSize(self.sizeHint())
self._edge.activated.connect(self._edge_changed)
self._edge_changed()
@SafeSlot()
def _edge_changed(self, *_):
self.selected_edge = self.edge.currentText()
for element, button in self.buttons.items():
# logger.info(f"{element}")
self.selected_edge = self._edge.currentText()
for element, button in self._buttons.items():
if "L" in self.selected_edge and element in ["H", "He"]:
button.setDisabled(True)
button.setChecked(False)
@@ -224,7 +226,7 @@ class EdgeSelector(QDialog):
if self.selected_element == element:
self.selected_energy = energy
if energy is not None:
if energy < self.llim or energy > self.hlim:
if energy < self._llim or energy > self._hlim:
button.setChecked(False)
button.setDisabled(True)
else:
@@ -240,28 +242,27 @@ class EdgeSelector(QDialog):
if self.selected_element is None:
return
element = self.selected_element
# Uncheck all other buttons so only the picked one stays highlighted
for e, btn in self.buttons.items():
for e, btn in self._buttons.items():
if e != element:
btn.setChecked(False)
self.buttons[element].setChecked(True)
self._buttons[element].setChecked(True)
self.selected_element = element
self.selected_energy = xraydb.xray_edge(element, self.selected_edge, True)
self.select_button.setEnabled(True)
self._select_button.setEnabled(True)
self._set_select_text()
def _set_select_text(self):
if self.selected_energy is not None:
if self.buttons[self.selected_element].isChecked():
self._enable_button(self.select_button, True)
self.select_button.setText(
if self._buttons[self.selected_element].isChecked():
self._enable_button(self._select_button, True)
self._select_button.setText(
f"Selected {self.selected_element}, {self.selected_edge}-edge, {self.selected_energy:0.1f} eV"
)
else:
self._enable_button(self.select_button, False)
self.select_button.setText("Select")
self._enable_button(self._select_button, False)
self._select_button.setText("Select")
else:
self._enable_button(self.select_button, False)
self._enable_button(self._select_button, False)
@staticmethod
def _enable_button(button: QPushButton, enable: bool):
@@ -277,63 +278,10 @@ class EdgeSelector(QDialog):
)
ROW_MARGINS = (4, 0, 4, 0)
ROW_SPACING = 6
class ElementSelector(QWidget):
dialogClosed = Signal()
def __init__(self):
super().__init__()
self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
layout = QVBoxLayout(self)
layout.setContentsMargins(*ROW_MARGINS)
layout.setSpacing(ROW_SPACING)
self.label = QLabel("Element")
layout_selection = QHBoxLayout(self)
self.button = QPushButton("Select")
self.button.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
self.button.setStyleSheet(
f"QPushButton {{background-color: {get_accent_colors().default.name()}; color: white;}}"
)
layout_selection.addWidget(self.button)
layout.addWidget(self.label)
layout.addLayout(layout_selection)
self.current_element = ""
self.button.clicked.connect(self.open_table)
def open_table(self):
dialog = EdgeSelector(self, llim=4500, hlim=60000)
if dialog.exec_():
# self.current_element = dialog.selected
self.dialogClosed.emit()
def currentElement(self):
return self.current_element
def apply_theme(self, theme: Optional[Literal["dark", "light"]] = None):
"""
Apply the theme
Args:
theme (Optional[str]): Theme, either "dark", "light", or None. Defaults to None.
"""
if theme is None:
app = QApplication.instance()
theme = app.theme.theme # type: ignore
self.button.setStyleSheet(
f"QPushButton {{background-color: {get_accent_colors().default.name()}; color: white;}}"
)
if __name__ == "__main__":
app = QApplication(sys.argv)
apply_theme("light")
dispatcher = BECDispatcher(gui_id="scan_control_advanced")
win = ElementSelector()
dispatcher = BECDispatcher(gui_id="edge_selector")
win = EdgeSelector()
win.show()
sys.exit(app.exec_())
@@ -60,13 +60,13 @@ class ScanControlXAS(ScanControl):
"""
def __init__(self, *args, **kwargs):
self._motion_profile_group = QGroupBox("XAS scan helper")
self._motion_profile_group.setSizePolicy(
self._xas_scans_helper_group = QGroupBox("XAS scan helper")
self._xas_scans_helper_group.setSizePolicy(
QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
)
motion_profile_layout = QVBoxLayout(self._motion_profile_group)
self.motion_profile_widget = MotionProfileWidget(self)
motion_profile_layout.addWidget(self.motion_profile_widget)
xas_scans_helper_layout = QVBoxLayout(self._xas_scans_helper_group)
self.xas_scans_helper_widget = XASScansHelper(self)
xas_scans_helper_layout.addWidget(self.xas_scans_helper_widget)
super().__init__(
allowed_scans=ALLOWED_SCANS, default_scan="xas_simple_scan", *args, **kwargs
)
@@ -82,10 +82,10 @@ class ScanControlXAS(ScanControl):
d_spacing = msg["signals"].get("mo1_bragg_crystal_current_d_spacing")["value"]
if d_spacing != self.d_spacing:
self.d_spacing = d_spacing
self.motion_profile_widget.update_plot(d_spacing=d_spacing)
self.xas_scans_helper_widget.update_plot(d_spacing=d_spacing)
def _add_metadata_form(self):
self.layout.addWidget(self._motion_profile_group) # type: ignore
self.layout.addWidget(self._xas_scans_helper_group) # type: ignore
super()._add_metadata_form()
self._connect_scan_parameter_signals()
@@ -98,9 +98,9 @@ class ScanControlXAS(ScanControl):
def _show_motion_profile(self, scan_name):
if scan_name in ALLOWED_SCANS:
self.motion_profile_widget.setVisible(True)
self.xas_scans_helper_widget.setVisible(True)
else:
self.motion_profile_widget.setVisible(False)
self.xas_scans_helper_widget.setVisible(False)
def _connect_scan_parameter_signals(self):
for box in self.kwarg_boxes:
@@ -123,7 +123,7 @@ class ScanControlXAS(ScanControl):
@SafeSlot()
def _scan_parameter_changed(self, *_):
params = self.get_scan_parameters()[1]
self.motion_profile_widget.update_plot(
self.xas_scans_helper_widget.update_plot(
scan_name=self._selected_scan, scan_parameters=params
)
@@ -134,10 +134,10 @@ class ScanControlXAS(ScanControl):
Args:
theme (str): Theme, either "dark" or "light"
"""
self.motion_profile_widget.apply_theme(theme)
self.xas_scans_helper_widget.apply_theme(theme)
class MotionProfileWidget(QWidget):
class XASScansHelper(QWidget):
"""
Additional widget specifically for XAS scans
"""