Compare commits

..

4 Commits

3 changed files with 51 additions and 28 deletions
@@ -26,7 +26,6 @@ from bec_widgets.utils.error_popups import SafeProperty, SafeSlot
from bec_widgets.widgets.control.buttons.stop_button.stop_button import StopButton from bec_widgets.widgets.control.buttons.stop_button.stop_button import StopButton
from bec_widgets.widgets.control.scan_control.scan_group_box import ScanGroupBox from bec_widgets.widgets.control.scan_control.scan_group_box import ScanGroupBox
from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata
from bec_widgets.widgets.utility.toggle.toggle import ToggleSwitch
class ScanParameterConfig(BaseModel): class ScanParameterConfig(BaseModel):
@@ -84,7 +83,6 @@ class ScanControl(BECWidget, QWidget):
self.kwarg_boxes = [] self.kwarg_boxes = []
self.expert_mode = False # TODO implement in the future versions self.expert_mode = False # TODO implement in the future versions
self.previous_scan = None self.previous_scan = None
self.last_scan_found = None
# Widget Default Parameters # Widget Default Parameters
self.config.default_scan = default_scan self.config.default_scan = default_scan
@@ -123,17 +121,12 @@ class ScanControl(BECWidget, QWidget):
scan_selection_layout.addWidget(self.comboBox_scan_selection, 1) scan_selection_layout.addWidget(self.comboBox_scan_selection, 1)
self.scan_selection_group.layout().addLayout(scan_selection_layout) self.scan_selection_group.layout().addLayout(scan_selection_layout)
# Label to reload the last scan parameters within scan selection group box # Button to reload the last scan parameters on demand.
self.toggle_layout = QHBoxLayout() self.last_scan_button = QPushButton(
self.toggle_layout.addSpacerItem( "Restore last scan parameters", self.scan_selection_group
QSpacerItem(0, 0, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
) )
self.last_scan_label = QLabel("Restore last scan parameters", self.scan_selection_group) self.last_scan_button.clicked.connect(self.request_last_executed_scan_parameters)
self.toggle = ToggleSwitch(parent=self.scan_selection_group, checked=False) self.scan_selection_group.layout().addWidget(self.last_scan_button)
self.toggle.enabled.connect(self.request_last_executed_scan_parameters)
self.toggle_layout.addWidget(self.last_scan_label)
self.toggle_layout.addWidget(self.toggle)
self.scan_selection_group.layout().addLayout(self.toggle_layout)
self.scan_selection_group.setSizePolicy( self.scan_selection_group.setSizePolicy(
QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed
) )
@@ -206,7 +199,6 @@ class ScanControl(BECWidget, QWidget):
"""Callback for scan selection combo box""" """Callback for scan selection combo box"""
selected_scan_name = self.comboBox_scan_selection.currentText() selected_scan_name = self.comboBox_scan_selection.currentText()
self.scan_selected.emit(selected_scan_name) self.scan_selected.emit(selected_scan_name)
self.request_last_executed_scan_parameters()
self.restore_scan_parameters(selected_scan_name) self.restore_scan_parameters(selected_scan_name)
@SafeSlot() @SafeSlot()
@@ -215,10 +207,6 @@ class ScanControl(BECWidget, QWidget):
""" """
Requests the last executed scan parameters from BEC and restores them to the scan control widget. Requests the last executed scan parameters from BEC and restores them to the scan control widget.
""" """
self.last_scan_found = False
if not self.toggle.checked:
return
current_scan = self.comboBox_scan_selection.currentText() current_scan = self.comboBox_scan_selection.currentText()
history = ( history = (
self.client.connector.xread( self.client.connector.xread(
@@ -246,8 +234,6 @@ class ScanControl(BECWidget, QWidget):
if merged and self.kwarg_boxes: if merged and self.kwarg_boxes:
for box in self.kwarg_boxes: for box in self.kwarg_boxes:
box.set_parameters(merged) box.set_parameters(merged)
self.last_scan_found = True
break break
@SafeProperty(str) @SafeProperty(str)
@@ -496,8 +482,6 @@ class ScanControl(BECWidget, QWidget):
Args: Args:
scan_name(str): Name of the scan to restore the parameters for. scan_name(str): Name of the scan to restore the parameters for.
""" """
if self.last_scan_found is True:
return
scan_params = self.config.scans.get(scan_name, None) scan_params = self.config.scans.get(scan_name, None)
if scan_params is None and self.previous_scan is None: if scan_params is None and self.previous_scan is None:
return return
+2 -2
View File
@@ -62,8 +62,8 @@ TEST_LOG_MESSAGES = [
@pytest.fixture @pytest.fixture
def log_panel(qtbot, mocked_client): def log_panel(qtbot, mocked_client, monkeypatch):
mocked_client.connector.xread = lambda *_, **__: TEST_LOG_MESSAGES monkeypatch.setattr(mocked_client.connector, "xread", lambda *_, **__: TEST_LOG_MESSAGES)
widget = LogPanel() widget = LogPanel()
qtbot.addWidget(widget) qtbot.addWidget(widget)
qtbot.waitExposed(widget) qtbot.waitExposed(widget)
+44 -5
View File
@@ -256,6 +256,7 @@ scan_history = ScanHistoryMessage(
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def scan_control(qtbot, mocked_client): # , mock_dev): def scan_control(qtbot, mocked_client): # , mock_dev):
mocked_client.connector.delete(MessageEndpoints.scan_history())
mocked_client.connector.set_and_publish( mocked_client.connector.set_and_publish(
MessageEndpoints.available_scans(), available_scans_message MessageEndpoints.available_scans(), available_scans_message
) )
@@ -266,6 +267,7 @@ def scan_control(qtbot, mocked_client): # , mock_dev):
qtbot.addWidget(widget) qtbot.addWidget(widget)
qtbot.waitExposed(widget) qtbot.waitExposed(widget)
yield widget yield widget
mocked_client.connector.delete(MessageEndpoints.scan_history())
def test_populate_scans(scan_control, mocked_client): def test_populate_scans(scan_control, mocked_client):
@@ -503,12 +505,49 @@ def test_changing_scans_remember_parameters(scan_control, mocked_client):
assert grid_kwargs["burst_at_each_point"] == kwargs["burst_at_each_point"] assert grid_kwargs["burst_at_each_point"] == kwargs["burst_at_each_point"]
@pytest.mark.skip(reason="Unreliable - GH issue #1134") def test_scan_selection_does_not_fetch_last_scan_parameters(
def test_get_scan_parameters_from_redis(scan_control, mocked_client): scan_control, mocked_client, monkeypatch
):
xread = MagicMock(wraps=mocked_client.connector.xread)
monkeypatch.setattr(mocked_client.connector, "xread", xread)
scan_control.comboBox_scan_selection.setCurrentText("line_scan")
assert scan_control.comboBox_scan_selection.currentText() == "line_scan"
scan_control.comboBox_scan_selection.setCurrentText("grid_scan")
xread.assert_not_called()
def test_restore_last_scan_parameters_button_fetches_on_demand(
scan_control, mocked_client, qtbot, monkeypatch
):
xread = MagicMock(wraps=mocked_client.connector.xread)
monkeypatch.setattr(mocked_client.connector, "xread", xread)
scan_control.comboBox_scan_selection.setCurrentText("grid_scan")
scan_control.comboBox_scan_selection.setCurrentText("line_scan")
xread.assert_not_called()
qtbot.mouseClick(scan_control.last_scan_button, Qt.LeftButton)
xread.assert_called_once_with(
MessageEndpoints.scan_history(), from_start=True, user_id=scan_control.object_name
)
args, kwargs = scan_control.get_scan_parameters(bec_object=False)
assert args == ["samx", 0.0, 2.0]
assert kwargs["steps"] == 10
assert kwargs["relative"] is False
assert kwargs["exp_time"] == 2
# @pytest.mark.skip(reason="Unreliable - GH issue #1134")
def test_get_scan_parameters_from_redis(scan_control, mocked_client, qtbot):
scan_name = "line_scan" scan_name = "line_scan"
scan_control.comboBox_scan_selection.setCurrentText(scan_name) scan_control.comboBox_scan_selection.setCurrentText(scan_name)
scan_control.toggle.checked = True scan_control.last_scan_button.click()
qtbot.wait(200)
args, kwargs = scan_control.get_scan_parameters(bec_object=False) args, kwargs = scan_control.get_scan_parameters(bec_object=False)
@@ -588,7 +627,7 @@ def test_scan_metadata_is_passed_to_scan_function(scan_control: ScanControl):
scans.grid_scan.assert_called_once_with(metadata=TEST_MD) scans.grid_scan.assert_called_once_with(metadata=TEST_MD)
@pytest.mark.skip(reason="Unreliable - GH issue #1134") # @pytest.mark.skip(reason="Unreliable - GH issue #1134")
def test_restore_parameters_with_fewer_arg_bundles(scan_control, qtbot): def test_restore_parameters_with_fewer_arg_bundles(scan_control, qtbot):
""" """
Ensure that when more argument bundles are present than exist in the Ensure that when more argument bundles are present than exist in the
@@ -605,7 +644,7 @@ def test_restore_parameters_with_fewer_arg_bundles(scan_control, qtbot):
assert scan_control.arg_box.count_arg_rows() == 3 assert scan_control.arg_box.count_arg_rows() == 3
# Trigger restore of parameters from history # Trigger restore of parameters from history
scan_control.toggle.checked = True scan_control.last_scan_button.click()
qtbot.wait(200) qtbot.wait(200)
# After restore, arg_box should have only one bundle (the history size) # After restore, arg_box should have only one bundle (the history size)