diff --git a/debye_bec/bec_widgets/widgets/edge_selector.py b/debye_bec/bec_widgets/widgets/edge_selector.py index 3d974d5..e2d62cc 100644 --- a/debye_bec/bec_widgets/widgets/edge_selector.py +++ b/debye_bec/bec_widgets/widgets/edge_selector.py @@ -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_()) diff --git a/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py b/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py index be3c4cf..995ea76 100644 --- a/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py +++ b/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py @@ -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 """