From 4639eee0b975ebd7a946e0e290449f5b88c372eb Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Fri, 21 Jun 2024 17:42:23 +0200 Subject: [PATCH] feat(bec-designer): automatic plugin discovery --- bec_widgets/utils/bec_designer.py | 45 ++++++++++++++----- .../device_combobox/device_combobox_plugin.py | 4 +- .../register_device_combobox.py | 1 - .../device_line_edit_plugin.py | 3 +- .../register_device_line_edit.py | 1 - 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/bec_widgets/utils/bec_designer.py b/bec_widgets/utils/bec_designer.py index efb7400b..a7bd102b 100644 --- a/bec_widgets/utils/bec_designer.py +++ b/bec_widgets/utils/bec_designer.py @@ -3,17 +3,17 @@ import sys import sysconfig from pathlib import Path -import bec_widgets - from PySide6.scripts.pyside_tool import ( - qt_tool_wrapper, - ui_tool_binary, + _extend_path_var, init_virtual_env, is_pyenv_python, is_virtual_env, - _extend_path_var, + qt_tool_wrapper, + ui_tool_binary, ) +import bec_widgets + def patch_designer(): # pragma: no cover # init_virtual_env() @@ -40,14 +40,37 @@ def patch_designer(): # pragma: no cover qt_tool_wrapper(ui_tool_binary("designer"), sys.argv[1:]) +def find_plugin_paths(base_path: Path): + """ + Recursively find all directories containing a .pyproject file. + """ + plugin_paths = [] + for path in base_path.rglob("*.pyproject"): + plugin_paths.append(str(path.parent)) + return plugin_paths + + +def set_plugin_environment_variable(plugin_paths): + """ + Set the PYSIDE_DESIGNER_PLUGINS environment variable with the given plugin paths. + """ + current_paths = os.environ.get("PYSIDE_DESIGNER_PLUGINS", "") + if current_paths: + current_paths = current_paths.split(os.pathsep) + else: + current_paths = [] + + current_paths.extend(plugin_paths) + os.environ["PYSIDE_DESIGNER_PLUGINS"] = os.pathsep.join(current_paths) + + # Patch the designer function def main(): # pragma: no cover - os.environ["PYSIDE_DESIGNER_PLUGINS"] = os.path.join( - os.path.dirname(bec_widgets.__file__), "widgets/device_inputs/device_combobox" - ) - # os.environ["PYSIDE_DESIGNER_PLUGINS"] = os.path.join( - # os.path.dirname(bec_widgets.__file__), "widgets/motor_control/selection" - # ) + + base_dir = Path(os.path.dirname(bec_widgets.__file__)).resolve() + plugin_paths = find_plugin_paths(base_dir) + set_plugin_environment_variable(plugin_paths) + patch_designer() diff --git a/bec_widgets/widgets/device_inputs/device_combobox/device_combobox_plugin.py b/bec_widgets/widgets/device_inputs/device_combobox/device_combobox_plugin.py index b8c5f4a5..4cb23008 100644 --- a/bec_widgets/widgets/device_inputs/device_combobox/device_combobox_plugin.py +++ b/bec_widgets/widgets/device_inputs/device_combobox/device_combobox_plugin.py @@ -2,10 +2,8 @@ # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause from device_combobox import DeviceComboBox - -from qtpy.QtGui import QIcon from qtpy.QtDesigner import QDesignerCustomWidgetInterface - +from qtpy.QtGui import QIcon DOM_XML = """ diff --git a/bec_widgets/widgets/device_inputs/device_combobox/register_device_combobox.py b/bec_widgets/widgets/device_inputs/device_combobox/register_device_combobox.py index df3581d5..41d7ba53 100644 --- a/bec_widgets/widgets/device_inputs/device_combobox/register_device_combobox.py +++ b/bec_widgets/widgets/device_inputs/device_combobox/register_device_combobox.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause from device_combobox import DeviceComboBox - from PySide6.QtDesigner import QPyDesignerCustomWidgetCollection from bec_widgets.widgets.device_inputs.device_combobox.device_combobox_plugin import ( diff --git a/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit_plugin.py b/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit_plugin.py index e0c4d4ee..58d45acf 100644 --- a/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit_plugin.py +++ b/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit_plugin.py @@ -2,9 +2,8 @@ # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause from device_line_edit import DeviceLineEdit -from qtpy.QtGui import QIcon from qtpy.QtDesigner import QDesignerCustomWidgetInterface - +from qtpy.QtGui import QIcon DOM_XML = """ diff --git a/bec_widgets/widgets/device_inputs/device_line_edit/register_device_line_edit.py b/bec_widgets/widgets/device_inputs/device_line_edit/register_device_line_edit.py index 5d6058bf..16905465 100644 --- a/bec_widgets/widgets/device_inputs/device_line_edit/register_device_line_edit.py +++ b/bec_widgets/widgets/device_inputs/device_line_edit/register_device_line_edit.py @@ -3,7 +3,6 @@ from device_line_edit import DeviceLineEdit from device_line_edit_plugin import DeviceLineEditPlugin - from PySide6.QtDesigner import QPyDesignerCustomWidgetCollection # Set PYSIDE_DESIGNER_PLUGINS to point to this directory and load the plugin