From 7a0ea55affcdb739155fc031c4ca57fdbfaeaaf4 Mon Sep 17 00:00:00 2001 From: hannes Date: Tue, 6 Jun 2023 21:49:34 +0100 Subject: [PATCH 1/4] rename bqt.widget_manager to bqt.manager --- bqt/__init__.py | 4 ++-- bqt/blender_applications/blender_application.py | 6 +++--- bqt/{widget_manager.py => manager.py} | 0 3 files changed, 5 insertions(+), 5 deletions(-) rename bqt/{widget_manager.py => manager.py} (100%) diff --git a/bqt/__init__.py b/bqt/__init__.py index ff32db2..0f16a6d 100644 --- a/bqt/__init__.py +++ b/bqt/__init__.py @@ -5,7 +5,7 @@ """ import bqt import bqt.focus -import bqt.widget_manager +import bqt.manager import os import sys import bpy @@ -30,7 +30,7 @@ "category": "UI" } -add = bqt.widget_manager.register +add = bqt.manager.register # CORE FUNCTIONS # diff --git a/bqt/blender_applications/blender_application.py b/bqt/blender_applications/blender_application.py index ecefea4..ae7dd73 100644 --- a/bqt/blender_applications/blender_application.py +++ b/bqt/blender_applications/blender_application.py @@ -12,7 +12,7 @@ from PySide2.QtCore import QEvent, QObject, QRect, QSettings, QTimer, Qt from bqt.ui.quit_dialogue import BlenderClosingDialog import bpy -import bqt.widget_manager +import bqt.manager STYLESHEET_PATH = Path(__file__).parents[1] / "blender_stylesheet.qss" @@ -72,10 +72,10 @@ def on_update(self): """qt event loop""" # we only need foreground managing if blender is not wrapped if os.getenv("BQT_DISABLE_WRAP") == "1" and os.getenv("BQT_MANAGE_FOREGROUND", "1") == "1" and self.blender_focus_toggled(): - bqt.widget_manager._blender_window_change(self._active_window_hwnd) + bqt.manager._blender_window_change(self._active_window_hwnd) if os.getenv("BQT_AUTO_ADD", "1") == "1": - bqt.widget_manager.parent_orphan_widgets(exclude=[self.blender_widget, self._blender_window, self.window_container]) # auto parent any orphaned widgets + bqt.manager.parent_orphan_widgets(exclude=[self.blender_widget, self._blender_window, self.window_container]) # auto parent any orphaned widgets def blender_focus_toggled(self): """returns true the first frame the blender window is focussed or unfoccused""" diff --git a/bqt/widget_manager.py b/bqt/manager.py similarity index 100% rename from bqt/widget_manager.py rename to bqt/manager.py From f8d0712244f45ba2dc876c5d4467829542a2b17b Mon Sep 17 00:00:00 2001 From: hannes Date: Tue, 6 Jun 2023 22:15:00 +0100 Subject: [PATCH 2/4] prevent registering widget when matching objectName exists UX is not smooth yet, widget flashes briefly and dissapears. --- bqt/manager.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/bqt/manager.py b/bqt/manager.py index 5b656d8..d0d6632 100644 --- a/bqt/manager.py +++ b/bqt/manager.py @@ -20,7 +20,7 @@ def __init__(self, widget, visible): self.visible = visible -def register(widget, exclude=None, parent=True, manage=True): +def register(widget, exclude=None, parent=True, manage=True, unique=True): """ parent widget to blender window Args: @@ -28,6 +28,7 @@ def register(widget, exclude=None, parent=True, manage=True): parent: if True, parent the widget to the blender window exclude: widgets to exclude from being parented to the blender window manage: if True, manage the visibility of the widget + unique: if True, prevent registering a new widget with the same objectName """ exclude = exclude or [] @@ -39,6 +40,24 @@ def register(widget, exclude=None, parent=True, manage=True): if widget == parent_widget: return + # prevent registering a new widget with the same objectName + if unique: + obj_name = widget.objectName() + old_widget = None # already registered widget with the same objectName + if obj_name: + for data in iter_widget_data(): + if data.widget.objectName() == obj_name: + old_widget = data.widget + break + if old_widget: + logging.warning("bqt: widget is already registered, skipping widget registration") + # show old widget, delete new widget + old_widget.show() + old_widget.activateWindow() + widget.deleteLater() # delete duplicate widget, todo dangerous? + __excluded_widgets.append(widget) + return + if widget in exclude: logging.warning("bqt: widget is in exclude list, skipping widget registration") return From da4c973ea3cade051200b5711abff4c6a464ebbc Mon Sep 17 00:00:00 2001 From: hannes Date: Tue, 6 Jun 2023 22:18:20 +0100 Subject: [PATCH 3/4] add env var BQT_UNIQUE_OBJECTNAME --- README.md | 1 + bqt/manager.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10f3f29..647387c 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ mklink /J "C:\Users\USERNAME\AppData\Roaming\Blender Foundation\Blender\2.93\scr |BQT_DISABLE_CLOSE_DIALOGUE| if set to `1`, use the standard blender close dialogue| |BQT_MANAGE_FOREGROUND| defaults to `1`, if `0`, widgets registered with `bqt.add(my_widget)` won't stay in the foreground when using Blender.| |BQT_AUTO_ADD| defaults to `1`, if `0` top level widgets won't automatically be added to bqt.| +|BQT_UNIQUE_OBJECTNAME| defaults to `1`, 1 or 0, automatically delete widgets with same objectName, preventing you from opening multiple versions of the same widget window. Great if you want to ensure that clicking "my window" activates "mywindow" if already open, instead of making a new one| - if you modify env vars, ensure they're strings - if you're unsure how to set env vars, google `set environment variable windows`. diff --git a/bqt/manager.py b/bqt/manager.py index d0d6632..a4a8f2f 100644 --- a/bqt/manager.py +++ b/bqt/manager.py @@ -41,7 +41,7 @@ def register(widget, exclude=None, parent=True, manage=True, unique=True): return # prevent registering a new widget with the same objectName - if unique: + if unique and os.getenv("BQT_UNIQUE_OBJECTNAME", "1") == "1": obj_name = widget.objectName() old_widget = None # already registered widget with the same objectName if obj_name: From 7fa70ee34bf4634fe5bc3c14bc28ce3e3d3128d7 Mon Sep 17 00:00:00 2001 From: hannes Date: Tue, 6 Jun 2023 22:20:08 +0100 Subject: [PATCH 4/4] v bump --- bqt/__init__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bqt/__init__.py b/bqt/__init__.py index 0f16a6d..5e0b3bd 100644 --- a/bqt/__init__.py +++ b/bqt/__init__.py @@ -20,7 +20,7 @@ "name": "PySide2 Qt wrapper (bqt)", "description": "Enable PySide2 QtWidgets in Blender", "author": "tech-artists.org", - "version": (1, 2, 3), + "version": (1, 3, 0), "blender": (2, 80, 0), # "location": "", # "warning": "", # used for warning icon and text in add-ons panel diff --git a/setup.py b/setup.py index 0fec9a8..50a379d 100644 --- a/setup.py +++ b/setup.py @@ -38,7 +38,7 @@ def run(self): setup( # Metadata name="bqt", - version="1.2.3", + version="1.3.0", description="Files to help bootstrap PySide2 with an event loop within Blender.", long_description=long_description, long_description_content_type='text/markdown',