diff --git a/gui/src/aaregui/panels/raster_data_collection.py b/gui/src/aaregui/panels/raster_data_collection.py index d7ea6baf..2dc42e57 100644 --- a/gui/src/aaregui/panels/raster_data_collection.py +++ b/gui/src/aaregui/panels/raster_data_collection.py @@ -6,7 +6,7 @@ from aaredaqlib.diffraction_geometry import DiffractionGeometry from aaredaqlib.models import DAQStatusModel from aaregui.panels.scan_settings_panel import ScanSettingsPanel from aaregui.scan_logic.raster_grid_manager import RasterGridManager, RasterGridMetric -from aaregui.widgets.number_line_edit import NumberLineEdit +from aaregui.widgets.number_line_edit import NumberLineEdit, CheckedLineEdit from aaregui.widgets.raster_grid_table import RasterGridTable from aaredaqlib.logger_config import setup_logger @@ -36,13 +36,13 @@ class RasterDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(QLabel("Grid element size", parent=self), 3, 0) - self.width_enter = NumberLineEdit(5, 100, decimals=0, default=self.__size_x, parent=self) + self.width_enter = CheckedLineEdit(5, 100, decimals=0, default=self.__size_x, parent=self) self.width_enter.newValue.connect(self.grid_size) self._layout.addWidget(self.width_enter, 3, 1) self._layout.addWidget(QLabel(" x ", parent=self), 3, 2) - self.height_enter = NumberLineEdit(5, 100, decimals=0, default=self.__size_y, parent=self) + self.height_enter = CheckedLineEdit(5, 100, decimals=0, default=self.__size_y, parent=self) self.height_enter.newValue.connect(self.grid_size) @@ -51,8 +51,8 @@ class RasterDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(QLabel("μm", parent=self), 3, 4) self._layout.addWidget(QLabel("Image time", parent=self), 4, 0) - self.image_time_enter = NumberLineEdit( - 0.0005, 10.0, raster_mgr.active_grid.exp_time_s, decimals=4, parent=self + self.image_time_enter = CheckedLineEdit( + 0.0005, 10.0, raster_mgr.active_grid.exp_time_s, decimals=4, check_box_text='Manual', parent=self ) self._layout.addWidget(self.image_time_enter, 4, 1, 1, 3) self._layout.addWidget(QLabel("s", parent=self), 4, 4) @@ -162,20 +162,14 @@ class RasterDataCollectionPanel(ScanSettingsPanel): super().update_daq_status(s) can_edit = getattr(self, "_can_edit_params", False) for w in (self.width_enter, self.height_enter, self.image_time_enter): - w.setReadOnly(not can_edit) - w.setStyleSheet( - "background-color: rgb(255, 255, 255);" if can_edit else "background-color: rgb(240, 240, 240);") + if hasattr(w, "set_busy"): + w.set_busy(not can_edit) + else: + w.setReadOnly(not can_edit) - # Only reset raster-specific widgets when transitioning from sample to no-sample if s.sample is None and not self._previous_sample_was_none_raster: for w in (self.width_enter, self.height_enter, self.image_time_enter): - try: - if hasattr(w, "saved_value"): - w.saved_value = float("nan") - if hasattr(w, "reset_to_default"): - w.reset_to_default() - except Exception: - pass + w.reset_to_default() self._previous_sample_was_none_raster = True elif s.sample is not None: self._previous_sample_was_none_raster = False diff --git a/gui/src/aaregui/panels/rotation_data_collection.py b/gui/src/aaregui/panels/rotation_data_collection.py index 9a3121d1..3bf05422 100644 --- a/gui/src/aaregui/panels/rotation_data_collection.py +++ b/gui/src/aaregui/panels/rotation_data_collection.py @@ -8,7 +8,7 @@ from aaredaqlib.logger_config import setup_logger from aaredaqlib.models import DAQStatusModel from aaredaqlib.rotation_scan import RotationScanRequest from aaregui.panels.scan_settings_panel import ScanSettingsPanel -from aaregui.widgets.number_line_edit import NumberLineEdit +from aaregui.widgets.number_line_edit import NumberLineEdit, CheckedLineEdit logger = setup_logger("aareGUI") @@ -43,13 +43,13 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(QLabel("Start angle", parent=self), 3, 0) self.start_angle = NumberLineEdit(-720, 720.0, 0.0, decimals=3, parent=self) - self._layout.addWidget(self.start_angle, 3, 1, 1, 3) - self._layout.addWidget(QLabel("°", parent=self), 3, 4) + self._layout.addWidget(self.start_angle, 3, 1, 1, 2) + self._layout.addWidget(QLabel("°", parent=self), 3, 3) self.omega_button = QPushButton("Ω") self.omega_button.setFixedWidth(20) self.omega_button.clicked.connect(self.update_omega_start) - self._layout.addWidget(self.omega_button, 3, 5) + self._layout.addWidget(self.omega_button, 3, 4) self._layout.addWidget(QLabel("
Screening
", parent=self), 4, 0, 1,6) @@ -83,17 +83,17 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(QLabel("
Rotation
", parent=self), 9, 0, 1, 6) self._layout.addWidget(QLabel("Total angle", parent=self), 10, 0) - self.total_angle = NumberLineEdit(0, 9999.0, 360.0, decimals=3, parent=self) + self.total_angle = CheckedLineEdit(0, 9999.0, 360.0, decimals=3, parent=self) self._layout.addWidget(self.total_angle, 10, 1, 1, 3) self._layout.addWidget(QLabel("°", parent=self), 10, 4) self._layout.addWidget(QLabel("Image angle", parent=self), 11, 0) - self.image_angle = NumberLineEdit(0, 10.0, 0.2, decimals=3, parent=self) + self.image_angle = CheckedLineEdit(0, 10.0, 0.2, decimals=3, parent=self) self._layout.addWidget(self.image_angle, 11, 1, 1, 3) self._layout.addWidget(QLabel("°", parent=self), 11, 4) self._layout.addWidget(QLabel("Image time", parent=self), 12, 0) - self.image_time_enter = NumberLineEdit( + self.image_time_enter = CheckedLineEdit( 0.0005, 10.0, 0.01, decimals=4, parent=self ) self._layout.addWidget(self.image_time_enter, 12, 1, 1, 3) @@ -203,22 +203,16 @@ class RotationDataCollectionPanel(ScanSettingsPanel): can_edit = getattr(self, "_can_edit_params", False) for w in (self.start_angle, self.screening_image_angle, self.screening_image_time_enter, self.total_angle, self.image_angle, self.image_time_enter): - w.setReadOnly(not can_edit) - w.setStyleSheet("background-color: rgb(255, 255, 255);" if can_edit else "background-color: rgb(240, 240, 240);") - + if hasattr(w, "set_busy"): + w.set_busy(not can_edit) + else: + w.setReadOnly(not can_edit) if s.sample is None and not self._previous_sample_was_none_rotation: # Reset rotation-specific widgets to their defaults for w in (self.start_angle, self.screening_image_angle, self.screening_image_time_enter, self.total_angle, self.image_angle, self.image_time_enter): - try: - if hasattr(w, "saved_value"): - w.saved_value = float("nan") - # NumberLineEdit keeps its default in .default - w.update_value(w.default if hasattr(w, "default") else 0.0) - except Exception: - logger.error(f"Failed to reset {w} to default.", exc_info=True) - pass + w.reset_to_default() self._previous_sample_was_none_rotation = True elif s.sample is not None: self._previous_sample_was_none_rotation = False diff --git a/gui/src/aaregui/panels/scan_settings_panel.py b/gui/src/aaregui/panels/scan_settings_panel.py index 11f9abd9..3082e84a 100644 --- a/gui/src/aaregui/panels/scan_settings_panel.py +++ b/gui/src/aaregui/panels/scan_settings_panel.py @@ -5,7 +5,7 @@ from aaredaqlib.diffraction_geometry import DiffractionGeometry from aaredaqlib.logger_config import setup_logger from aaredaqlib.models import DAQStatusModel from aaregui.widgets.message_box import ring_current_low_check, experiment_hutch_shutter_check -from aaregui.widgets.number_line_edit import NumberLineEdit +from aaregui.widgets.number_line_edit import NumberLineEdit, CheckedLineEdit logger = setup_logger("aareGUI") @@ -49,15 +49,16 @@ class ScanSettingsPanel(QWidget): self.high_res_enter.newValue.connect(self.set_high_res) self._layout.addWidget(QLabel("Detector distance", parent=self), 1, 0) - self.dtz_enter = NumberLineEdit(self.MIN_DTZ, 1000, decimals=2, default=self._dtz, parent=self) + self.dtz_enter = CheckedLineEdit(self.MIN_DTZ, 1000, decimals=2, default=self._dtz, check_box_text="Manual", parent=self) self._layout.addWidget(self.dtz_enter, 1, 1, 1, 3) self._layout.addWidget(QLabel("mm", parent=self), 1, 4) self.dtz_enter.newValue.connect(self.set_dtz) + self.dtz_enter.readOnlyChanged.connect(self.high_res_enter.setReadOnly) self._layout.addWidget(QLabel("Beam transmission", parent=self), 2, 0) - self.transmission_enter = NumberLineEdit( - 0, 1.0, decimals=4, default=self._transmission, parent=self + self.transmission_enter = CheckedLineEdit( + 0, 1.0, decimals=4, default=self._transmission, check_box_text="Manual", parent=self ) self._layout.addWidget(self.transmission_enter, 2, 1, 1, 3) self.transmission_enter.newValue.connect(self.set_transmission) @@ -77,14 +78,9 @@ class ScanSettingsPanel(QWidget): self._experiment_shutter_state = s.bl.exp_shutter_open can_edit = (not s.busy) and (s.session.session.name == "OwnedByYou") # Lock/unlock base NumberLineEdits - self.high_res_enter.setReadOnly(not can_edit) - self.dtz_enter.setReadOnly(not can_edit) - self.transmission_enter.setReadOnly(not can_edit) - # If you want a visual cue: - style_ro = "background-color: rgb(240, 240, 240);" # light gray - style_rw = "background-color: rgb(255, 255, 255);" - for w in (self.high_res_enter, self.dtz_enter, self.transmission_enter): - w.setStyleSheet(style_rw if can_edit else style_ro) + + for w in (self.dtz_enter, self.transmission_enter): + w.set_busy(not can_edit) self._can_edit_params = can_edit @@ -111,28 +107,9 @@ class ScanSettingsPanel(QWidget): self.reload_params_button.setEnabled(False) def _reset_to_defaults(self): - """Reset all parameters to their defaults. Only called when sample transitions to None.""" - try: - # Reset high-resolution dependent defaults - self._dtz = float(self.dtz_enter.get_default()) - self._transmission = float(self.transmission_enter.get_default()) - self._high_res = float(self.high_res_enter.get_default()) - except Exception: - pass - - # Force-update to defaults (invalidate saved values) - if hasattr(self.dtz_enter, "saved_value"): - self.dtz_enter.saved_value = float("nan") - if hasattr(self.transmission_enter, "saved_value"): - self.transmission_enter.saved_value = float("nan") - if hasattr(self.high_res_enter, "saved_value"): - self.high_res_enter.saved_value = float("nan") - - # Apply defaults - self.dtz_enter.reset_to_default() - self.transmission_enter.reset_to_default() - self.high_res_enter.reset_to_default() - + self._dtz = float(self.dtz_enter.get_default()) + self._transmission = float(self.transmission_enter.get_default()) + self._high_res = float(self.high_res_enter.get_default()) @Slot(float) def set_dtz(self, v: float): @@ -147,7 +124,7 @@ class ScanSettingsPanel(QWidget): self._dtz = self.__diffraction.calc_dtz_mm(v) if self._dtz < self.MIN_DTZ: self._dtz = self.MIN_DTZ - self.dtz_enter.update_value(self._dtz) + self.dtz_enter.manual_update(self._dtz) self.dtz_updated.emit(self._dtz) @Slot(float)