mirror of
https://github.com/bec-project/bec_widgets.git
synced 2026-06-05 12:58:40 +02:00
wip
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from bec_lib.logger import bec_logger
|
||||
from qtpy import PYSIDE6
|
||||
from qtpy.QtCore import QFile, QIODevice
|
||||
from qtpy.QtCore import QEvent, QFile, QIODevice, QObject
|
||||
|
||||
from bec_widgets.utils.plugin_utils import get_designer_plugin
|
||||
|
||||
@@ -9,16 +9,56 @@ logger = bec_logger.logger
|
||||
if PYSIDE6:
|
||||
from qtpy.QtUiTools import QUiLoader
|
||||
|
||||
class _LoadedUiCloser(QObject):
|
||||
"""Forward root close events to widgets instantiated by ``QUiLoader``.
|
||||
|
||||
Destroying a parent widget does not guarantee ``closeEvent`` is delivered to
|
||||
every child widget. Some of our designer plugins rely on ``closeEvent`` /
|
||||
``cleanup`` to unregister callbacks, so explicitly close loaded descendants
|
||||
when the loaded form itself is closed.
|
||||
"""
|
||||
|
||||
def __init__(self, root_widget):
|
||||
super().__init__(root_widget)
|
||||
self._root_widget = root_widget
|
||||
self._widgets = []
|
||||
root_widget.installEventFilter(self)
|
||||
|
||||
def register_widget(self, widget):
|
||||
if widget is None or widget is self._root_widget:
|
||||
return
|
||||
self._widgets.append(widget)
|
||||
|
||||
def eventFilter(self, watched, event):
|
||||
if watched is self._root_widget and event.type() == QEvent.Close:
|
||||
for widget in reversed(self._widgets):
|
||||
try:
|
||||
widget.close()
|
||||
except RuntimeError:
|
||||
continue
|
||||
return super().eventFilter(watched, event)
|
||||
|
||||
class CustomUiLoader(QUiLoader):
|
||||
def __init__(self, baseinstance):
|
||||
super().__init__(baseinstance)
|
||||
self.baseinstance = baseinstance
|
||||
self._closer = _LoadedUiCloser(baseinstance) if baseinstance is not None else None
|
||||
|
||||
def createWidget(self, class_name, parent=None, name=""):
|
||||
if parent is None and self.baseinstance is not None:
|
||||
return self.baseinstance
|
||||
|
||||
widget_parent = parent if parent is not None else self.baseinstance
|
||||
widget = get_designer_plugin(class_name, raise_on_missing=False)
|
||||
if widget is not None:
|
||||
return widget(self.baseinstance)
|
||||
return super().createWidget(class_name, self.baseinstance, name)
|
||||
created_widget = widget(widget_parent)
|
||||
created_widget.setObjectName(name)
|
||||
else:
|
||||
created_widget = super().createWidget(class_name, widget_parent, name)
|
||||
|
||||
if self._closer is not None:
|
||||
self._closer.register_widget(created_widget)
|
||||
return created_widget
|
||||
|
||||
|
||||
class UILoader:
|
||||
|
||||
Reference in New Issue
Block a user