GUI: fixed bug where the line edits were not updated in the GUI when reloading parameters

This commit is contained in:
appleb_m committed 2025-11-05 13:35:47 +01:00
1 parent 3afd05ee3b
commit 10f881e0cf
1 file changed
+45 -13
+45 -13
View File
@@ -2,9 +2,11 @@ from PySide6.QtCore import Slot, Signal
from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QFrame, QPushButton
from aaredaqlib.diffraction_geometry import DiffractionGeometry
from aaredaqlib.logger_config import setup_logger
from aaredaqlib.models import DAQStatusModel
from aaregui.widgets.number_line_edit import NumberLineEdit
logger = setup_logger("aareGUI")
class ScanSettingsPanel(QWidget):
dtz_updated = Signal(float)
@@ -68,11 +70,23 @@ class ScanSettingsPanel(QWidget):
self.__diffraction.resolution_angstrom(s.bl.dtz_max))
self.__diffraction = s.diffraction
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)
self._can_edit_params = can_edit
# Update sample and parameters
if s.sample is not None:
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.reload_params_button.setEnabled(self._params is not None)
@@ -84,6 +98,27 @@ class ScanSettingsPanel(QWidget):
self._params = None
self.reload_params_button.setEnabled(False)
try:
# Reset high-resolution dependent defaults
self._dtz = float(self.dtz_enter.default)
self._transmission = float(self.transmission_enter.default)
self._high_res = float(self.high_res_enter.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")
# Apply defaults shown in the controls
self.dtz_enter.update_value(self.dtz_enter.default)
self.transmission_enter.update_value(self.transmission_enter.default)
self.high_res_enter.update_value(self.high_res_enter.default)
@Slot(float)
def set_dtz(self, v: float):
self._dtz = v
@@ -106,21 +141,13 @@ class ScanSettingsPanel(QWidget):
@Slot()
def reload_parameters(self):
"""Manually reload data collection parameters from database.
This allows users to reset their changes back to database values."""
# Temporarily clear the last sample ID to force reload
logger.info("Reloading parameters from spreadsheet")
temp_id = self._last_sample_id
self._last_sample_id = None
self.update_data_collection_parameters()
self._last_sample_id = temp_id
def update_data_collection_parameters(self):
"""Update data collection parameters when a new sample is loaded.
Only updates fields if database parameters exist, otherwise keeps defaults.
This should only be called when a new sample is mounted.
Child classes can override get_parameter_mappings() to specify which
parameters should be loaded."""
if self._sample is None:
return
@@ -139,18 +166,23 @@ class ScanSettingsPanel(QWidget):
for param_name, widget, converter in param_mappings:
value = getattr(self._params, param_name, None)
if value is not None:
widget.update_value(converter(value) if converter else value)
if hasattr(widget, "force_update_value"):
widget.force_update_value(converter(value) if converter else value)
else:
widget.update_value(converter(value) if converter else value)
# Handle transmission with conversion (common to all panels)
if (transmission := getattr(self._params, 'transmission', None)) is not None:
transmission_value = transmission / 100.0 if transmission > 1.0 else transmission
self._transmission = transmission_value
self.transmission_enter.update_value(transmission_value)
self.transmission_enter.force_update_value(transmission_value)
# Handle target resolution (common to all panels)
if (target_res := getattr(self._params, 'targetresolution', None)) is not None:
logger.info(f"updatig resolution {target_res}")
self._high_res = target_res
self.high_res_enter.update_value(target_res)
self.high_res_enter.force_update_value(self._high_res)
self.set_high_res(self._high_res)
# Store metadata (common to all panels)
self._sample_space_group = getattr(self._params, 'spacegroupnumber', None)