Skip to content

Commit

Permalink
Merge pull request #89 from techartorg/widget-manager
Browse files Browse the repository at this point in the history
Widget manager
  • Loading branch information
hannesdelbeke authored Jun 6, 2023
2 parents 0f230bf + 7fa70ee commit 8a8b4d4
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 8 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
6 changes: 3 additions & 3 deletions bqt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"""
import bqt
import bqt.focus
import bqt.widget_manager
import bqt.manager
import os
import sys
import bpy
Expand All @@ -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
Expand All @@ -30,7 +30,7 @@
"category": "UI"
}

add = bqt.widget_manager.register
add = bqt.manager.register

# CORE FUNCTIONS #

Expand Down
6 changes: 3 additions & 3 deletions bqt/blender_applications/blender_application.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"""
Expand Down
21 changes: 20 additions & 1 deletion bqt/widget_manager.py → bqt/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@ 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:
widget: child widget to parent
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 []

Expand All @@ -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 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:
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
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down

0 comments on commit 8a8b4d4

Please sign in to comment.