diff --git a/bec_widgets/cli/client.py b/bec_widgets/cli/client.py index 7933e42e..2667c9e4 100644 --- a/bec_widgets/cli/client.py +++ b/bec_widgets/cli/client.py @@ -29,6 +29,7 @@ class _WidgetsEnumType(str, enum.Enum): _Widgets = { "AbortButton": "AbortButton", "BECDockArea": "BECDockArea", + "BECMainWindow": "BECMainWindow", "BECProgressBar": "BECProgressBar", "BECQueue": "BECQueue", "BECStatusBox": "BECStatusBox", @@ -427,6 +428,14 @@ class BECDockArea(RPCBase): """ +class BECMainWindow(RPCBase): + @rpc_call + def remove(self): + """ + Cleanup the BECConnector + """ + + class BECProgressBar(RPCBase): """A custom progress bar with smooth transitions. The displayed text can be customized using a template.""" @@ -4511,14 +4520,6 @@ class TextBox(RPCBase): """ -class UILaunchWindow(RPCBase): - @rpc_call - def remove(self): - """ - Cleanup the BECConnector - """ - - class VSCodeEditor(RPCBase): """A widget to display the VSCode editor.""" diff --git a/bec_widgets/widgets/containers/auto_update/auto_updates.py b/bec_widgets/widgets/containers/auto_update/auto_updates.py index ce604044..ed477726 100644 --- a/bec_widgets/widgets/containers/auto_update/auto_updates.py +++ b/bec_widgets/widgets/containers/auto_update/auto_updates.py @@ -27,6 +27,7 @@ class AutoUpdates(BECMainWindow): _default_dock: BECDock USER_ACCESS = ["enabled", "enabled.setter", "selected_device", "selected_device.setter"] RPC = True + PLUGIN = False # enforce that subclasses have the same rpc widget class rpc_widget_class = "AutoUpdates" diff --git a/bec_widgets/widgets/containers/main_window/bec_main_window.pyproject b/bec_widgets/widgets/containers/main_window/bec_main_window.pyproject new file mode 100644 index 00000000..ff247afd --- /dev/null +++ b/bec_widgets/widgets/containers/main_window/bec_main_window.pyproject @@ -0,0 +1 @@ +{'files': ['main_window.py']} \ No newline at end of file diff --git a/bec_widgets/widgets/containers/main_window/bec_main_window_plugin.py b/bec_widgets/widgets/containers/main_window/bec_main_window_plugin.py new file mode 100644 index 00000000..d4edf9ac --- /dev/null +++ b/bec_widgets/widgets/containers/main_window/bec_main_window_plugin.py @@ -0,0 +1,73 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +from qtpy.QtCore import QSize +from qtpy.QtDesigner import QDesignerCustomWidgetInterface +from qtpy.QtGui import QIcon +from qtpy.QtWidgets import QWidget + +from bec_widgets.utils.bec_designer import designer_material_icon +from bec_widgets.widgets.containers.main_window.main_window import BECMainWindow + +DOM_XML = """ + + + + +""" + + +class BECMainWindowPlugin(QDesignerCustomWidgetInterface): # pragma: no cover + def __init__(self): + super().__init__() + self._form_editor = None + + def createWidget(self, parent): + # We want to initialize BECMainWindow upon starting designer + t = BECMainWindow(parent) + return t + + def domXml(self): + return DOM_XML + + def group(self): + return "BEC Containers" + + def icon(self): + return designer_material_icon(BECMainWindow.ICON_NAME) + + def includeFile(self): + return "bec_main_window" + + def initialize(self, form_editor): + import os + + from qtpy.QtCore import Qt + from qtpy.QtWidgets import QApplication + + import bec_widgets + + MODULE_PATH = os.path.dirname(bec_widgets.__file__) + QApplication.setAttribute(Qt.AA_DontUseNativeMenuBar, True) + app = QApplication.instance() + icon = QIcon() + icon.addFile( + os.path.join(MODULE_PATH, "assets", "app_icons", "BEC-General-App.png"), + size=QSize(48, 48), + ) + app.setWindowIcon(icon) + self._form_editor = form_editor + + def isContainer(self): + return True + + def isInitialized(self): + return self._form_editor is not None + + def name(self): + return "BECMainWindow" + + def toolTip(self): + return "BECMainWindow" + + def whatsThis(self): + return self.toolTip() diff --git a/bec_widgets/widgets/containers/main_window/main_window.py b/bec_widgets/widgets/containers/main_window/main_window.py index dcdec146..7edaff7a 100644 --- a/bec_widgets/widgets/containers/main_window/main_window.py +++ b/bec_widgets/widgets/containers/main_window/main_window.py @@ -34,12 +34,13 @@ from bec_widgets.widgets.progress.scan_progressbar.scan_progressbar import ScanP MODULE_PATH = os.path.dirname(bec_widgets.__file__) +# Ensure the application does not use the native menu bar on macOS to be consistent with linux development. QApplication.setAttribute(Qt.AA_DontUseNativeMenuBar, True) class BECMainWindow(BECWidget, QMainWindow): - RPC = False - PLUGIN = False + RPC = True + PLUGIN = True SCAN_PROGRESS_WIDTH = 100 # px STATUS_BAR_WIDGETS_EXPIRE_TIME = 60_000 # milliseconds @@ -493,15 +494,16 @@ class BECMainWindow(BECWidget, QMainWindow): super().cleanup() -class UILaunchWindow(BECMainWindow): - RPC = True +class BECMainWindowNoRPC(BECMainWindow): + RPC = False + PLUGIN = False if __name__ == "__main__": import sys app = QApplication(sys.argv) - main_window = UILaunchWindow() + main_window = BECMainWindow() main_window.show() main_window.resize(800, 600) sys.exit(app.exec()) diff --git a/bec_widgets/widgets/containers/main_window/register_bec_main_window.py b/bec_widgets/widgets/containers/main_window/register_bec_main_window.py new file mode 100644 index 00000000..2c9bff16 --- /dev/null +++ b/bec_widgets/widgets/containers/main_window/register_bec_main_window.py @@ -0,0 +1,17 @@ +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.containers.main_window.bec_main_window_plugin import ( + BECMainWindowPlugin, + ) + + QPyDesignerCustomWidgetCollection.addCustomWidget(BECMainWindowPlugin()) + + +if __name__ == "__main__": # pragma: no cover + main() diff --git a/bec_widgets/widgets/utility/widget_finder/widget_finder.py b/bec_widgets/widgets/utility/widget_finder/widget_finder.py index fb211990..b13a5edb 100644 --- a/bec_widgets/widgets/utility/widget_finder/widget_finder.py +++ b/bec_widgets/widgets/utility/widget_finder/widget_finder.py @@ -17,7 +17,7 @@ from qtpy.QtWidgets import ( from bec_widgets import SafeProperty from bec_widgets.utils.widget_io import WidgetIO -from bec_widgets.widgets.containers.main_window.main_window import BECMainWindow +from bec_widgets.widgets.containers.main_window.main_window import BECMainWindowNoRPC from bec_widgets.widgets.plots.image.image import Image from bec_widgets.widgets.plots.waveform.waveform import Waveform @@ -179,7 +179,7 @@ class WidgetFinderComboBox(QComboBox): event.accept() -class InspectorMainWindow(BECMainWindow): # pragma: no cover +class InspectorMainWindow(BECMainWindowNoRPC): # pragma: no cover """ A main window that includes a widget finder combobox to inspect widgets. """