GUI: Added CheckedLineEdit to raster, rotation and scan settings
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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("<center><B><u>Screening</u></B></center>", parent=self), 4, 0, 1,6)
|
||||
|
||||
@@ -83,17 +83,17 @@ class RotationDataCollectionPanel(ScanSettingsPanel):
|
||||
self._layout.addWidget(QLabel("<center><B><u>Rotation</u></B></center>", 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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user