diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 118427fd..8963be34 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -925,6 +925,10 @@ class MainWindow(QMainWindow): self.beamline.illumination_panel.front_light.connect(self.daq.front_light) self.beamline.illumination_panel.back_light.connect(self.daq.back_light) + # Energy row inside Exp. Config. — not staff-gated like the Beamline + # Setup copy; the server enforces write permission anyway. + self.data_collection.change_energy.connect(self.daq.change_energy) + if self._decoded_token.staff: self.monochromator_panel.mono_pitch_scan.connect(self.daq.mono_pitch_scan) self.monochromator_panel.change_energy.connect(self.daq.change_energy) diff --git a/src/aare/gui/panels/data_collection_settings.py b/src/aare/gui/panels/data_collection_settings.py index 3a5fbc14..ecd2282e 100644 --- a/src/aare/gui/panels/data_collection_settings.py +++ b/src/aare/gui/panels/data_collection_settings.py @@ -3,8 +3,10 @@ from aarecommon.math.sample_geometry import SampleGeometryModel from aarecommon.models.models import DAQStatusModel from PySide6.QtCore import Signal, Slot from PySide6.QtWidgets import ( + QDoubleSpinBox, QFrame, QHBoxLayout, + QLabel, QPushButton, QSizePolicy, QStackedWidget, @@ -26,6 +28,8 @@ from aare.gui.widgets.title_label import TitleLabel, tighten_column class DataCollectionSettings(QFrame): cancel = Signal() + # Same convention as the Beamline Setup panel: keV in the GUI, eV on emit. + change_energy = Signal(float) set_width = 400 @@ -81,6 +85,22 @@ class DataCollectionSettings(QFrame): centering_layout.addWidget(self.find_tip) centering_layout.addWidget(self.bounding_box) + # Energy row copied from the Beamline Setup panel so users can change + # energy without leaving the experiment configuration. + self.energy_spin = QDoubleSpinBox(parent=self) + self.energy_spin.setDecimals(3) + self.energy_spin.setRange(1.0, 30.0) + self.energy_spin.setSingleStep(0.1) + self.energy_spin.setValue(12.0) + self.change_energy_button = QPushButton("Change Energy", parent=self) + self.change_energy_button.clicked.connect(self._emit_change_energy) + energy_row = QWidget(self) + energy_layout = QHBoxLayout(energy_row) + energy_layout.setContentsMargins(0, 0, 0, 0) + energy_layout.addWidget(QLabel("Energy (keV)", parent=energy_row)) + energy_layout.addWidget(self.energy_spin) + energy_layout.addWidget(self.change_energy_button) + # Pane frame carries the border QTabWidget::pane used to draw # (#expConfigPane rule in styles.py). pane = QFrame(self) @@ -90,6 +110,7 @@ class DataCollectionSettings(QFrame): # border, and the Abort button should hug the pane. pane_layout.setContentsMargins(6, 6, 6, 0) pane_layout.addWidget(centering_row) + pane_layout.addWidget(energy_row) pane_layout.addWidget(self._stack) # Own container: TitleLabel collapse hides its siblings, so without it @@ -147,6 +168,10 @@ class DataCollectionSettings(QFrame): page.setSizePolicy(QSizePolicy.Policy.Preferred, vertical) self._stack.adjustSize() + @Slot() + def _emit_change_energy(self): + self.change_energy.emit(float(self.energy_spin.value()) * 1000.0) + @Slot() def switch_to_raster(self): self._tab_bar.setCurrentIndex(0)