diff --git a/gui/src/aaregui/panels/raster_data_collection.py b/gui/src/aaregui/panels/raster_data_collection.py index 2dc42e57..4618adb3 100644 --- a/gui/src/aaregui/panels/raster_data_collection.py +++ b/gui/src/aaregui/panels/raster_data_collection.py @@ -52,7 +52,7 @@ class RasterDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(QLabel("Image time", parent=self), 4, 0) self.image_time_enter = CheckedLineEdit( - 0.0005, 10.0, raster_mgr.active_grid.exp_time_s, decimals=4, check_box_text='Manual', parent=self + 0.0005, 10.0, raster_mgr.active_grid.exp_time_s, decimals=4, check_box_text='', parent=self ) self._layout.addWidget(self.image_time_enter, 4, 1, 1, 3) self._layout.addWidget(QLabel("s", parent=self), 4, 4) diff --git a/gui/src/aaregui/panels/scan_settings_panel.py b/gui/src/aaregui/panels/scan_settings_panel.py index 3082e84a..e572d271 100644 --- a/gui/src/aaregui/panels/scan_settings_panel.py +++ b/gui/src/aaregui/panels/scan_settings_panel.py @@ -40,7 +40,7 @@ class ScanSettingsPanel(QWidget): self._layout = QGridLayout(self) self._layout.addWidget(QLabel("High resolution", parent=self), 0, 0) - self.high_res_enter = NumberLineEdit( + self.high_res_enter = CheckedLineEdit( 1.0, 10, decimals=2, default=self._high_res, parent=self ) self._layout.addWidget(self.high_res_enter, 0, 1, 1, 3) @@ -49,16 +49,17 @@ 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 = CheckedLineEdit(self.MIN_DTZ, 1000, decimals=2, default=self._dtz, check_box_text="Manual", parent=self) + self.dtz_enter = CheckedLineEdit(self.MIN_DTZ, 1000, decimals=2, default=self._dtz, check_box_text="", 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.dtz_enter.readOnlyChanged.connect(self.high_res_enter.external_read_only) + self.high_res_enter.readOnlyChanged.connect(self.dtz_enter.external_read_only) self._layout.addWidget(QLabel("Beam transmission", parent=self), 2, 0) self.transmission_enter = CheckedLineEdit( - 0, 1.0, decimals=4, default=self._transmission, check_box_text="Manual", parent=self + 0, 1.0, decimals=4, default=self._transmission, check_box_text="", parent=self ) self._layout.addWidget(self.transmission_enter, 2, 1, 1, 3) self.transmission_enter.newValue.connect(self.set_transmission) @@ -77,12 +78,11 @@ class ScanSettingsPanel(QWidget): self._ring_current = s.bl.ring_current_mA self._experiment_shutter_state = s.bl.exp_shutter_open can_edit = (not s.busy) and (s.session.session.name == "OwnedByYou") + self._can_edit_params = can_edit # Lock/unlock base NumberLineEdits - for w in (self.dtz_enter, self.transmission_enter): - w.set_busy(not can_edit) - - self._can_edit_params = can_edit + for w in (self.dtz_enter, self.high_res_enter, self.transmission_enter): + w.set_busy(not can_edit) # Update sample and parameters if s.sample is not None: @@ -113,18 +113,21 @@ class ScanSettingsPanel(QWidget): @Slot(float) def set_dtz(self, v: float): + #dtz_enter will only be edited in GUI when manual is checked, otherwise it is updated when high_res changes self._dtz = v self._high_res = self.__diffraction.resolution_angstrom(self._dtz) - self.high_res_enter.update_value(self._high_res) + self.high_res_enter.force_update_value(self._high_res) self.dtz_updated.emit(self._dtz) @Slot(float) def set_high_res(self, v: float): + #if updated from spreadsheet should change dtz external + #if manually updated from GUI should not change dtz internal self._high_res = v self._dtz = self.__diffraction.calc_dtz_mm(v) if self._dtz < self.MIN_DTZ: self._dtz = self.MIN_DTZ - self.dtz_enter.manual_update(self._dtz) + self.dtz_enter.force_update_value(self._dtz) self.dtz_updated.emit(self._dtz) @Slot(float) diff --git a/gui/src/aaregui/widgets/number_line_edit.py b/gui/src/aaregui/widgets/number_line_edit.py index bd2e62d2..a715170c 100644 --- a/gui/src/aaregui/widgets/number_line_edit.py +++ b/gui/src/aaregui/widgets/number_line_edit.py @@ -118,19 +118,21 @@ class CheckedLineEdit(QWidget): readOnlyChanged = Signal(bool) def __init__(self, min_val: float, max_val: float, /, default: float = 0.0, decimals: int = 2, - check_box_text: str ="", parent = None): + check_box_text: str ="", start_checked: bool = False, parent = None): super().__init__(parent) self._busy = False - self._checked = False + self._checked = start_checked self._internal_value = default self._external_value = default self.check_box = QCheckBox(check_box_text, self) self.check_box.stateChanged.connect(self._on_checked_toggled) - self.check_box.setChecked(False) + self.check_box.setChecked(self._checked) self.editor = NumberLineEdit(min_val, max_val, default, decimals, self) + self.editor.newValue.connect(self._on_editor_value_changed) self.editor.newValue.connect(self.newValue.emit) + self.editor.setReadOnly(not self._checked) self.layout = QHBoxLayout(self) self.layout.setContentsMargins(0, 0, 0, 0) @@ -140,17 +142,16 @@ class CheckedLineEdit(QWidget): def _on_editor_value_changed(self, value_float: float): if self._checked: self._internal_value = value_float - self.newValue.emit(value_float) + else: + self._external_value = value_float def _on_checked_toggled(self, checked: bool): #when check box is clicked, change read only state of editor self._checked = checked if checked: self.editor.force_update_value(self._internal_value) - self.newValue.emit(self._internal_value) else: self.editor.force_update_value(self._external_value) - self.newValue.emit(self._external_value) self.setReadOnly() def set_busy(self, busy: bool): @@ -170,18 +171,13 @@ class CheckedLineEdit(QWidget): self._external_value = value if not self._checked: self.editor.update_value(value) + self._on_editor_value_changed(value) def force_update_value(self, value): #wrapper for NumberLineEdit.force_update_value - self._external_value = value - if not self._checked: - self.editor.force_update_value(value) - self.newValue.emit(value) - - def manual_update(self, value): - self._internal_value = value - self._external_value = value - self.editor.update_value(value) + #self._external_value = value + self.editor.force_update_value(value) + self._on_editor_value_changed(value) @property def value(self) -> float: @@ -199,16 +195,19 @@ class CheckedLineEdit(QWidget): def isReadOnly(self) -> bool: return self.editor.isReadOnly() + def external_read_only(self, ro: bool): + self.check_box.setChecked(not ro) + self.editor.setReadOnly(ro) + def setReadOnly(self): # Change editor read only state based on self._busy and self._checked should_be_ro = True if not self._busy and self._checked: # Only set editor to writeable if busy is False and the checkbox is checked, should_be_ro = False self.editor.setReadOnly(False) - if self.editor.isReadOnly() != should_be_ro: - self.editor.setReadOnly(should_be_ro) - self.readOnlyChanged.emit(should_be_ro) + #state_changed = self.editor.isReadOnly() != should_be_ro self.editor.setReadOnly(should_be_ro) + self.readOnlyChanged.emit(should_be_ro) def get_default(self) -> float: return float(self._internal_value) @@ -216,4 +215,3 @@ class CheckedLineEdit(QWidget): def reset_to_default(self): # Force set to initial default self.force_update_value(self._internal_value) - self.newValue.emit(self._internal_value)