From 36f8fa9d582c9e419c65e13e12e18d802ccdcc27 Mon Sep 17 00:00:00 2001 From: appleb_m Date: Fri, 7 Nov 2025 11:16:33 +0100 Subject: [PATCH] GUI: bug fix, if sample is None default values are no longer enforced by the GUI, user can edit values again. --- .../aaregui/panels/raster_data_collection.py | 18 ++++++- .../panels/rotation_data_collection.py | 10 ++-- gui/src/aaregui/panels/scan_settings_panel.py | 47 ++++++++++++------- 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/gui/src/aaregui/panels/raster_data_collection.py b/gui/src/aaregui/panels/raster_data_collection.py index e8c05eeb..b07f7cda 100644 --- a/gui/src/aaregui/panels/raster_data_collection.py +++ b/gui/src/aaregui/panels/raster_data_collection.py @@ -23,7 +23,9 @@ class RasterDataCollectionPanel(ScanSettingsPanel): default_transmission: float = 1.0, parent=None): super().__init__(diffraction, raster_mgr.active_grid.dtz, default_transmission, parent) - + + self._previous_sample_was_none_raster = True + self.__n_x = raster_mgr.active_grid.n_x self.__n_y = raster_mgr.active_grid.n_y self.__size_x = raster_mgr.active_grid.grid_size_mm.x * 1000.0 @@ -151,6 +153,20 @@ class RasterDataCollectionPanel(ScanSettingsPanel): w.setStyleSheet( "background-color: rgb(255, 255, 255);" if can_edit else "background-color: rgb(240, 240, 240);") + # 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 + self._previous_sample_was_none_raster = True + elif s.sample is not None: + self._previous_sample_was_none_raster = False + def update_grid_scan_size(self): self.width_enter.update_value(self.__size_x) self.height_enter.update_value(self.__size_y) diff --git a/gui/src/aaregui/panels/rotation_data_collection.py b/gui/src/aaregui/panels/rotation_data_collection.py index d9cdd937..000285c1 100644 --- a/gui/src/aaregui/panels/rotation_data_collection.py +++ b/gui/src/aaregui/panels/rotation_data_collection.py @@ -34,6 +34,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): default_transmission=default_transmission) self._filename = "" + self._previous_sample_was_none_rotation = True self.__omega = 0 self.__dose_mgy = 0 @@ -169,7 +170,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): w.setStyleSheet("background-color: rgb(255, 255, 255);" if can_edit else "background-color: rgb(240, 240, 240);") - if s.sample is None: + 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): @@ -181,10 +182,9 @@ class RotationDataCollectionPanel(ScanSettingsPanel): except Exception: logger.error(f"Failed to reset {w} to default.", exc_info=True) pass - # Reset dose label - #self.__dose_mgy = 0 - #self.dose.setText("0.0") - #return + self._previous_sample_was_none_rotation = True + elif s.sample is not None: + self._previous_sample_was_none_rotation = False lambda_a = s.diffraction.wavelength_angstrom kdose = 2000 / (lambda_a * lambda_a) diff --git a/gui/src/aaregui/panels/scan_settings_panel.py b/gui/src/aaregui/panels/scan_settings_panel.py index ad7677d5..0f51734a 100644 --- a/gui/src/aaregui/panels/scan_settings_panel.py +++ b/gui/src/aaregui/panels/scan_settings_panel.py @@ -27,6 +27,7 @@ class ScanSettingsPanel(QWidget): self._sample = None self._params = None self._last_sample_id = None + self._previous_sample_was_none = True self._sample_space_group = None self._sample_cell_parameters = None self._sample_pdb_id = None @@ -88,36 +89,46 @@ class ScanSettingsPanel(QWidget): self._sample = s.sample self._params = s.sample.aaredb_params if hasattr(s.sample, 'aaredb_params') else None # Enable reload button only if sample has parameters + self._previous_sample_was_none = False self.reload_params_button.setEnabled(self._params is not None) # Check if this is a new sample - if so, update parameters if self._last_sample_id != s.sample.db_id: self.update_data_collection_parameters() else: + if not self._previous_sample_was_none: + logger.info("Sample cleared, resetting parameters to defaults") + self._reset_to_defaults() + self._previous_sample_was_none = True # Mark that sample is now None + self._sample = None self._params = None + self._last_sample_id = None self.reload_params_button.setEnabled(False) - 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 + 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 - 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") + # 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() - # Apply defaults shown in the controls - self.dtz_enter.reset_to_default() - self.transmission_enter.reset_to_default() - self.high_res_enter.reset_to_default() @Slot(float) def set_dtz(self, v: float):