mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 03:31:50 +02:00
fix(scan_control): restore scan parameters always regenerate the arg box, preventing infinite loop
This commit is contained in:
@ -281,6 +281,17 @@ class ScanGroupBox(QGroupBox):
|
|||||||
selected_devices_str = " ".join(self.selected_devices.values())
|
selected_devices_str = " ".join(self.selected_devices.values())
|
||||||
self.device_selected.emit(selected_devices_str.strip())
|
self.device_selected.emit(selected_devices_str.strip())
|
||||||
|
|
||||||
|
def remove_all_widget_bundles(self):
|
||||||
|
"""Remove every widget bundle from the scan control layout."""
|
||||||
|
for widget in list(self.widgets):
|
||||||
|
if isinstance(widget, DeviceLineEdit):
|
||||||
|
self.selected_devices.pop(widget, None)
|
||||||
|
widget.close()
|
||||||
|
widget.deleteLater()
|
||||||
|
self.layout.removeWidget(widget)
|
||||||
|
self.widgets.clear()
|
||||||
|
self.device_selected.emit("")
|
||||||
|
|
||||||
@Property(bool)
|
@Property(bool)
|
||||||
def hide_add_remove_buttons(self):
|
def hide_add_remove_buttons(self):
|
||||||
return self._hide_add_remove_buttons
|
return self._hide_add_remove_buttons
|
||||||
@ -349,10 +360,21 @@ class ScanGroupBox(QGroupBox):
|
|||||||
self._set_kwarg_parameters(parameters)
|
self._set_kwarg_parameters(parameters)
|
||||||
|
|
||||||
def _set_arg_parameters(self, parameters: list):
|
def _set_arg_parameters(self, parameters: list):
|
||||||
while len(parameters) != len(self.widgets):
|
self.remove_all_widget_bundles()
|
||||||
self.add_widget_bundle()
|
if not parameters:
|
||||||
for i, parameter in enumerate(parameters):
|
return
|
||||||
WidgetIO.set_value(self.widgets[i], parameter)
|
|
||||||
|
inputs_per_bundle = len(self.inputs)
|
||||||
|
if inputs_per_bundle == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
bundles_needed = -(-len(parameters) // inputs_per_bundle)
|
||||||
|
|
||||||
|
for row in range(1, bundles_needed + 1):
|
||||||
|
self.add_input_widgets(self.inputs, row)
|
||||||
|
|
||||||
|
for i, value in enumerate(parameters):
|
||||||
|
WidgetIO.set_value(self.widgets[i], value)
|
||||||
|
|
||||||
def _set_kwarg_parameters(self, parameters: dict):
|
def _set_kwarg_parameters(self, parameters: dict):
|
||||||
for widget in self.widgets:
|
for widget in self.widgets:
|
||||||
|
@ -558,3 +558,31 @@ def test_scan_metadata_is_connected(scan_control):
|
|||||||
"test key 1": "test value 1",
|
"test key 1": "test value 1",
|
||||||
"test key 2": "test value 2",
|
"test key 2": "test value 2",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_restore_parameters_with_fewer_arg_bundles(scan_control, qtbot):
|
||||||
|
"""
|
||||||
|
Ensure that when more argument bundles are present than exist in the
|
||||||
|
stored history, restoring parameters regenerates the arg box to the
|
||||||
|
correct (smaller) size and sets the values properly.
|
||||||
|
This is a check for the previous infinite loop bug.
|
||||||
|
"""
|
||||||
|
# Select the scan type that has history with only one arg bundle
|
||||||
|
scan_control.comboBox_scan_selection.setCurrentText("line_scan")
|
||||||
|
|
||||||
|
# Manually add bundles so we end up with three rows
|
||||||
|
while scan_control.arg_box.count_arg_rows() < 3:
|
||||||
|
scan_control.arg_box.add_widget_bundle()
|
||||||
|
assert scan_control.arg_box.count_arg_rows() == 3
|
||||||
|
|
||||||
|
# Trigger restore of parameters from history
|
||||||
|
scan_control.toggle.checked = True
|
||||||
|
qtbot.wait(200)
|
||||||
|
|
||||||
|
# After restore, arg_box should have only one bundle (the history size)
|
||||||
|
assert scan_control.arg_box.count_arg_rows() == 1
|
||||||
|
|
||||||
|
# Verify that the restored parameter values match the history
|
||||||
|
args, kwargs = scan_control.get_scan_parameters(bec_object=False)
|
||||||
|
assert args == ["samx", 0.0, 2.0]
|
||||||
|
assert kwargs["steps"] == 10
|
||||||
|
Reference in New Issue
Block a user