From 61ba08d0b8df9f48f5c54c7c2b4e6d395206e7e6 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Wed, 12 Jun 2024 00:42:37 +0200 Subject: [PATCH] feat(widgets/stop_button): General stop button added --- bec_widgets/widgets/__init__.py | 1 + bec_widgets/widgets/buttons/__init__.py | 1 + .../widgets/buttons/stop_button/__init__.py | 0 .../buttons/stop_button/stop_button.py | 32 ++++++++++++++++ docs/user/widgets/buttons.md | 38 +++++++++++++++++++ docs/user/widgets/widgets.md | 1 + tests/unit_tests/test_stop_button.py | 25 ++++++++++++ 7 files changed, 98 insertions(+) create mode 100644 bec_widgets/widgets/buttons/__init__.py create mode 100644 bec_widgets/widgets/buttons/stop_button/__init__.py create mode 100644 bec_widgets/widgets/buttons/stop_button/stop_button.py create mode 100644 docs/user/widgets/buttons.md create mode 100644 tests/unit_tests/test_stop_button.py diff --git a/bec_widgets/widgets/__init__.py b/bec_widgets/widgets/__init__.py index 5e041775..37b622a6 100644 --- a/bec_widgets/widgets/__init__.py +++ b/bec_widgets/widgets/__init__.py @@ -1,3 +1,4 @@ +from .buttons import StopButton from .dock import BECDock, BECDockArea from .figure import BECFigure, FigureConfig from .scan_control import ScanControl diff --git a/bec_widgets/widgets/buttons/__init__.py b/bec_widgets/widgets/buttons/__init__.py new file mode 100644 index 00000000..3d77c605 --- /dev/null +++ b/bec_widgets/widgets/buttons/__init__.py @@ -0,0 +1 @@ +from .stop_button.stop_button import StopButton diff --git a/bec_widgets/widgets/buttons/stop_button/__init__.py b/bec_widgets/widgets/buttons/stop_button/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bec_widgets/widgets/buttons/stop_button/stop_button.py b/bec_widgets/widgets/buttons/stop_button/stop_button.py new file mode 100644 index 00000000..9805fa0a --- /dev/null +++ b/bec_widgets/widgets/buttons/stop_button/stop_button.py @@ -0,0 +1,32 @@ +from qtpy.QtWidgets import QPushButton + +from bec_widgets.utils import BECConnector + + +class StopButton(BECConnector, QPushButton): + """A button that stops the current scan.""" + + def __init__(self, parent=None, client=None, config=None, gui_id=None): + super().__init__(client=client, config=config, gui_id=gui_id) + QPushButton.__init__(self, parent=parent) + + self.get_bec_shortcuts() + self.setText("Stop") + self.setStyleSheet("background-color: #cc181e; color: white") + self.clicked.connect(self.stop_scan) + + def stop_scan(self): + """Stop the scan.""" + self.queue.request_scan_abortion() + self.queue.request_queue_reset() + + +if __name__ == "__main__": # pragma: no cover + import sys + + from qtpy.QtWidgets import QApplication + + app = QApplication(sys.argv) + widget = StopButton() + widget.show() + sys.exit(app.exec_()) diff --git a/docs/user/widgets/buttons.md b/docs/user/widgets/buttons.md new file mode 100644 index 00000000..df93a24a --- /dev/null +++ b/docs/user/widgets/buttons.md @@ -0,0 +1,38 @@ +(user.widgets.buttons)= + +# Buttons Widgets + +This section consolidates various custom buttons used within the BEC GUIs, facilitating the integration of these +controls into different layouts. + +## Stop Button + +**Purpose:** + +The `Stop Button` provides a user interface control to immediately halt the execution of the current operation in the +BEC Client. It is designed for easy integration into any BEC GUI layout. + +**Key Features:** + +- **Immediate Termination:** Halts the execution of the current script or process. +- **Queue Management:** Clears any pending operations in the scan queue, ensuring the system is ready for new tasks. + +**Code example:** + +Integrating the `StopButton` into a BEC GUI layout is straightforward. The following example demonstrates how to embed +a `StopButton` within a GUI layout: + +```python +from qtpy.QtWidgets import QWidget, QVBoxLayout +from bec_widgets.widgets import StopButton + + +class MyGui(QWidget): + def __init__(self): + super().__init__() + self.setLayout(QVBoxLayout(self)) # Initialize the layout for the widget + + # Create and add the StopButton to the layout + self.stop_button = StopButton() + self.layout().addWidget(self.stop_button) +``` \ No newline at end of file diff --git a/docs/user/widgets/widgets.md b/docs/user/widgets/widgets.md index 46842db0..f47e449e 100644 --- a/docs/user/widgets/widgets.md +++ b/docs/user/widgets/widgets.md @@ -11,6 +11,7 @@ hidden: false bec_figure/ spiral_progress_bar/ website/ +buttons/ ``` diff --git a/tests/unit_tests/test_stop_button.py b/tests/unit_tests/test_stop_button.py new file mode 100644 index 00000000..99be7feb --- /dev/null +++ b/tests/unit_tests/test_stop_button.py @@ -0,0 +1,25 @@ +# pylint: disable=missing-function-docstring, missing-module-docstring, unused-import + +import pytest + +from bec_widgets.widgets import StopButton + +from .client_mocks import mocked_client + + +@pytest.fixture +def stop_button(qtbot, mocked_client): + widget = StopButton(client=mocked_client) + qtbot.addWidget(widget) + qtbot.waitExposed(widget) + yield widget + widget.close() + + +def test_stop_button(stop_button): + assert stop_button.text() == "Stop" + assert stop_button.styleSheet() == "background-color: #cc181e; color: white" + stop_button.click() + assert stop_button.queue.request_scan_abortion.called + assert stop_button.queue.request_queue_reset.called + stop_button.close()