refactoring
This commit is contained in:
@@ -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
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user