From 507d46f88bd06a3e77b1e60a6ce56c80f622cb6c Mon Sep 17 00:00:00 2001 From: David Perl Date: Thu, 9 Jan 2025 10:34:05 +0100 Subject: [PATCH] feat(widget): make Minesweeper into BEC widget --- bec_widgets/cli/client.py | 4 ++ bec_widgets/widgets/games/minesweeper.py | 9 +++- .../widgets/games/minesweeper.pyproject | 1 + .../widgets/games/minesweeper_plugin.py | 54 +++++++++++++++++++ .../widgets/games/register_minesweeper.py | 15 ++++++ 5 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 bec_widgets/widgets/games/minesweeper.pyproject create mode 100644 bec_widgets/widgets/games/minesweeper_plugin.py create mode 100644 bec_widgets/widgets/games/register_minesweeper.py diff --git a/bec_widgets/cli/client.py b/bec_widgets/cli/client.py index f9483ea2..61774208 100644 --- a/bec_widgets/cli/client.py +++ b/bec_widgets/cli/client.py @@ -31,6 +31,7 @@ class Widgets(str, enum.Enum): DeviceComboBox = "DeviceComboBox" DeviceLineEdit = "DeviceLineEdit" LMFitDialog = "LMFitDialog" + Minesweeper = "Minesweeper" PositionIndicator = "PositionIndicator" PositionerBox = "PositionerBox" PositionerControlLine = "PositionerControlLine" @@ -3181,6 +3182,9 @@ class LMFitDialog(RPCBase): """ +class Minesweeper(RPCBase): ... + + class PositionIndicator(RPCBase): @rpc_call def set_value(self, position: float): diff --git a/bec_widgets/widgets/games/minesweeper.py b/bec_widgets/widgets/games/minesweeper.py index d03c44d5..70ff1125 100644 --- a/bec_widgets/widgets/games/minesweeper.py +++ b/bec_widgets/widgets/games/minesweeper.py @@ -16,6 +16,8 @@ from qtpy.QtWidgets import ( QWidget, ) +from bec_widgets.utils.bec_widget import BECWidget + NUM_COLORS = { 1: QColor("#f44336"), 2: QColor("#9C27B0"), @@ -137,13 +139,16 @@ class Pos(QWidget): self.ohno.emit() -class Minesweeper(QWidget): +class Minesweeper(BECWidget, QWidget): PLUGIN = True ICON_NAME = "videogame_asset" + USER_ACCESS = [] - def __init__(self, *args, **kwargs): + def __init__(self, parent=None, *args, **kwargs): super().__init__(*args, **kwargs) + QWidget.__init__(self, parent=parent) + self._ui_initialised = False self._timer_start_num_seconds = 0 self._set_level_params(LEVELS["1"]) diff --git a/bec_widgets/widgets/games/minesweeper.pyproject b/bec_widgets/widgets/games/minesweeper.pyproject new file mode 100644 index 00000000..bf3bd8a1 --- /dev/null +++ b/bec_widgets/widgets/games/minesweeper.pyproject @@ -0,0 +1 @@ +{'files': ['minesweeper.py']} \ No newline at end of file diff --git a/bec_widgets/widgets/games/minesweeper_plugin.py b/bec_widgets/widgets/games/minesweeper_plugin.py new file mode 100644 index 00000000..bc4b3297 --- /dev/null +++ b/bec_widgets/widgets/games/minesweeper_plugin.py @@ -0,0 +1,54 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +from qtpy.QtDesigner import QDesignerCustomWidgetInterface + +from bec_widgets.utils.bec_designer import designer_material_icon +from bec_widgets.widgets.games.minesweeper import Minesweeper + +DOM_XML = """ + + + + +""" + + +class MinesweeperPlugin(QDesignerCustomWidgetInterface): # pragma: no cover + def __init__(self): + super().__init__() + self._form_editor = None + + def createWidget(self, parent): + t = Minesweeper(parent) + return t + + def domXml(self): + return DOM_XML + + def group(self): + return "BEC Games" + + def icon(self): + return designer_material_icon(Minesweeper.ICON_NAME) + + def includeFile(self): + return "minesweeper" + + 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 "Minesweeper" + + def toolTip(self): + return "Minesweeper" + + def whatsThis(self): + return self.toolTip() diff --git a/bec_widgets/widgets/games/register_minesweeper.py b/bec_widgets/widgets/games/register_minesweeper.py new file mode 100644 index 00000000..3c049f21 --- /dev/null +++ b/bec_widgets/widgets/games/register_minesweeper.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.games.minesweeper_plugin import MinesweeperPlugin + + QPyDesignerCustomWidgetCollection.addCustomWidget(MinesweeperPlugin()) + + +if __name__ == "__main__": # pragma: no cover + main()