From f5b8375fd36e3bb681de571da86a6c0bdb3cb6f0 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Sat, 6 Jul 2024 20:48:15 +0200 Subject: [PATCH] refactor(stop_button): moved to top layer, plugin added --- bec_widgets/cli/client.py | 1 + bec_widgets/widgets/buttons/__init__.py | 1 - .../widgets/scan_control/scan_control.py | 2 +- .../{buttons => }/stop_button/__init__.py | 0 .../widgets/stop_button/assets/stop.png | Bin 0 -> 8424 bytes .../stop_button/register_stop_button.py | 15 +++++ .../{buttons => }/stop_button/stop_button.py | 17 ++---- .../widgets/stop_button/stop_button.pyproject | 1 + .../widgets/stop_button/stop_button_plugin.py | 57 ++++++++++++++++++ tests/unit_tests/test_stop_button.py | 8 ++- 10 files changed, 85 insertions(+), 17 deletions(-) delete mode 100644 bec_widgets/widgets/buttons/__init__.py rename bec_widgets/widgets/{buttons => }/stop_button/__init__.py (100%) create mode 100644 bec_widgets/widgets/stop_button/assets/stop.png create mode 100644 bec_widgets/widgets/stop_button/register_stop_button.py rename bec_widgets/widgets/{buttons => }/stop_button/stop_button.py (68%) create mode 100644 bec_widgets/widgets/stop_button/stop_button.pyproject create mode 100644 bec_widgets/widgets/stop_button/stop_button_plugin.py diff --git a/bec_widgets/cli/client.py b/bec_widgets/cli/client.py index 9b02d0a2..a123a3a7 100644 --- a/bec_widgets/cli/client.py +++ b/bec_widgets/cli/client.py @@ -21,6 +21,7 @@ class Widgets(str, enum.Enum): BECStatusBox = "BECStatusBox" RingProgressBar = "RingProgressBar" ScanControl = "ScanControl" + StopButton = "StopButton" TextBox = "TextBox" VSCodeEditor = "VSCodeEditor" WebsiteWidget = "WebsiteWidget" diff --git a/bec_widgets/widgets/buttons/__init__.py b/bec_widgets/widgets/buttons/__init__.py deleted file mode 100644 index 3d77c605..00000000 --- a/bec_widgets/widgets/buttons/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .stop_button.stop_button import StopButton diff --git a/bec_widgets/widgets/scan_control/scan_control.py b/bec_widgets/widgets/scan_control/scan_control.py index 514d10c7..a66ea421 100644 --- a/bec_widgets/widgets/scan_control/scan_control.py +++ b/bec_widgets/widgets/scan_control/scan_control.py @@ -12,8 +12,8 @@ from qtpy.QtWidgets import ( ) from bec_widgets.utils import BECConnector -from bec_widgets.widgets.buttons.stop_button.stop_button import StopButton from bec_widgets.widgets.scan_control.scan_group_box import ScanGroupBox +from bec_widgets.widgets.stop_button.stop_button import StopButton class ScanControl(BECConnector, QWidget): diff --git a/bec_widgets/widgets/buttons/stop_button/__init__.py b/bec_widgets/widgets/stop_button/__init__.py similarity index 100% rename from bec_widgets/widgets/buttons/stop_button/__init__.py rename to bec_widgets/widgets/stop_button/__init__.py diff --git a/bec_widgets/widgets/stop_button/assets/stop.png b/bec_widgets/widgets/stop_button/assets/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..a6392d1a88f4c74337ae69c504fec57ee19aae91 GIT binary patch literal 8424 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 S$$z&M5ENzAWGbahVgCc*Yo37s literal 0 HcmV?d00001 diff --git a/bec_widgets/widgets/stop_button/register_stop_button.py b/bec_widgets/widgets/stop_button/register_stop_button.py new file mode 100644 index 00000000..5f1e8235 --- /dev/null +++ b/bec_widgets/widgets/stop_button/register_stop_button.py @@ -0,0 +1,15 @@ +def main(): # pragma: no cover + from qtpy import PYSIDE6 + + if not PYSIDE6: + print("PYSIDE6 is not available in the environment. Cannot patch designer.") + return + from PySide6.QtDesigner import QPyDesignerCustomWidgetCollection + + from bec_widgets.widgets.stop_button.stop_button_plugin import StopButtonPlugin + + QPyDesignerCustomWidgetCollection.addCustomWidget(StopButtonPlugin()) + + +if __name__ == "__main__": # pragma: no cover + main() diff --git a/bec_widgets/widgets/buttons/stop_button/stop_button.py b/bec_widgets/widgets/stop_button/stop_button.py similarity index 68% rename from bec_widgets/widgets/buttons/stop_button/stop_button.py rename to bec_widgets/widgets/stop_button/stop_button.py index 9805fa0a..0f617a43 100644 --- a/bec_widgets/widgets/buttons/stop_button/stop_button.py +++ b/bec_widgets/widgets/stop_button/stop_button.py @@ -1,3 +1,4 @@ +from qtpy.QtCore import Slot from qtpy.QtWidgets import QPushButton from bec_widgets.utils import BECConnector @@ -12,21 +13,13 @@ class StopButton(BECConnector, QPushButton): self.get_bec_shortcuts() self.setText("Stop") - self.setStyleSheet("background-color: #cc181e; color: white") + self.setStyleSheet( + "background-color: #cc181e; color: white; font-weight: bold; font-size: 12px;" + ) self.clicked.connect(self.stop_scan) + @Slot() 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/bec_widgets/widgets/stop_button/stop_button.pyproject b/bec_widgets/widgets/stop_button/stop_button.pyproject new file mode 100644 index 00000000..01536add --- /dev/null +++ b/bec_widgets/widgets/stop_button/stop_button.pyproject @@ -0,0 +1 @@ +{'files': ['stop_button.py']} \ No newline at end of file diff --git a/bec_widgets/widgets/stop_button/stop_button_plugin.py b/bec_widgets/widgets/stop_button/stop_button_plugin.py new file mode 100644 index 00000000..8148ef15 --- /dev/null +++ b/bec_widgets/widgets/stop_button/stop_button_plugin.py @@ -0,0 +1,57 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +import os + +from qtpy.QtDesigner import QDesignerCustomWidgetInterface +from qtpy.QtGui import QIcon + +from bec_widgets.widgets.stop_button.stop_button import StopButton + +DOM_XML = """ + + + + +""" + + +class StopButtonPlugin(QDesignerCustomWidgetInterface): # pragma: no cover + def __init__(self): + super().__init__() + self._form_editor = None + + def createWidget(self, parent): + t = StopButton(parent) + return t + + def domXml(self): + return DOM_XML + + def group(self): + return "BEC Buttons" + + def icon(self): + current_path = os.path.dirname(__file__) + icon_path = os.path.join(current_path, "assets", "stop.png") + return QIcon(icon_path) + + def includeFile(self): + return "stop_button" + + def initialize(self, form_editor): + self._form_editor = form_editor + + def isContainer(self): + return False + + def isInitialized(self): + return self._form_editor is not None + + def name(self): + return "StopButton" + + def toolTip(self): + return "A button that stops the current scan." + + def whatsThis(self): + return self.toolTip() diff --git a/tests/unit_tests/test_stop_button.py b/tests/unit_tests/test_stop_button.py index c57c60d5..cd9e57b6 100644 --- a/tests/unit_tests/test_stop_button.py +++ b/tests/unit_tests/test_stop_button.py @@ -2,8 +2,7 @@ import pytest -from bec_widgets.widgets.buttons import StopButton - +from bec_widgets.widgets.stop_button.stop_button import StopButton from .client_mocks import mocked_client @@ -18,7 +17,10 @@ def stop_button(qtbot, mocked_client): def test_stop_button(stop_button): assert stop_button.text() == "Stop" - assert stop_button.styleSheet() == "background-color: #cc181e; color: white" + assert ( + stop_button.styleSheet() + == "background-color: #cc181e; color: white; font-weight: bold; font-size: 12px;" + ) stop_button.click() assert stop_button.queue.request_scan_abortion.called assert stop_button.queue.request_queue_reset.called