33 from python_qt_binding.QtCore
import qCritical, qDebug, QObject, Qt, qWarning, Signal, Slot
34 from python_qt_binding.QtWidgets
import QDockWidget, QToolBar
44 Base class for the bidirectional exchange between the framework and one `Plugin` instance.
46 It utilizes a `PluginProvider` to load/unload the plugin and provides callbacks for the
50 label_updated = Signal(str, str)
51 close_signal = Signal(str)
52 reload_signal = Signal(str)
53 help_signal = Signal(str)
54 _defered_check_close = Signal()
56 def __init__(self, parent, main_window, instance_id, application_context, container_manager,
58 super(PluginHandler, self).
__init__(parent)
59 self.setObjectName(
'PluginHandler')
65 self.
_argv = argv
if argv
else []
93 def load(self, plugin_provider, callback=None):
97 Completion is signaled asynchronously if a callback is passed.
103 except Exception
as e:
107 raise NotImplementedError
110 if exception
is not None:
115 callback(self, exception)
116 elif exception
is not None:
117 qCritical(
'PluginHandler.load() failed%s' %
118 (
':\n%s' % str(exception)
if not exception
else ''))
121 for widget
in list(self.
_widgets.keys()):
130 Shut down the plugin and remove all added widgets.
132 Completion is signaled asynchronously if a callback is passed.
138 qCritical(
'PluginHandler.shutdown_plugin() plugin "%s" raised an exception:\n%s' %
143 raise NotImplementedError
156 toolbar.deleteLater()
162 Completion is signaled asynchronously if a callback is passed.
168 qCritical(
'PluginHandler.unload() plugin "%s" raised an exception:\n%s' %
173 raise NotImplementedError
183 Save settings of the plugin and all dock widget title bars.
185 Completion is signaled asynchronously if a callback is passed.
187 qDebug(
'PluginHandler.save_settings()')
193 qCritical(
'PluginHandler.save_settings() plugin "%s" raised an exception:\n%s' %
198 raise NotImplementedError
201 qDebug(
'PluginHandler.emit_save_settings_completed()')
210 for dock_widget, _, _
in self.
_widgets.values():
211 name =
'dock_widget' + \
212 dock_widget.objectName().replace(self.
_instance_id.tidy_str(),
'', 1)
213 settings = instance_settings.get_settings(name)
214 method = getattr(dock_widget, method_name)
218 qCritical(
'PluginHandler._call_method_on_all_dock_widgets(%s) failed:\n%s' %
219 (method_name, traceback.format_exc()))
223 Restore settings of the plugin and all dock widget title bars.
225 Completion is signaled asynchronously if a callback is passed.
227 qDebug(
'PluginHandler.restore_settings()')
233 qCritical(
'PluginHandler.restore_settings() plugin "%s" raised an exception:\n%s' %
238 raise NotImplementedError
241 qDebug(
'PluginHandler.emit_restore_settings_completed()')
262 features = dock_widget.features()
263 dock_widget.setFeatures(features ^ QDockWidget.DockWidgetClosable)
267 features = dock_widget.features()
268 dock_widget.setFeatures(
269 features ^ (QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable))
272 title_bar = dock_widget.titleBarWidget()
273 if title_bar
is None:
277 dock_widget.setTitleBarWidget(title_bar)
283 title_bar.show_button(
'help',
not hide_help)
286 title_bar.show_button(
'reload',
not hide_reload)
293 if 'icon' in action_attributes
and action_attributes[
'icon']
is not None:
296 action_attributes[
'icon'], action_attributes.get(
'icontype',
None), base_path)
297 widget.setWindowIcon(icon)
301 for dock_widget, _, _
in self.
_widgets.values():
302 title_bar = dock_widget.titleBarWidget()
303 title_bar.show_button(
'configuration')
306 widget = [key
for key, value
in self.
_widgets.items()
if value[0] == dock_widget][0]
316 self._plugin.trigger_configuration()
319 dock_widget.setWidget(widget)
321 dock_widget.setObjectName(self.
_instance_id.tidy_str() +
'__' + widget.objectName())
330 self.
_widgets[widget] = [dock_widget, signaler, signaler2]
339 old_dock_widget = self.
_main_window.findChild(DockWidget, dock_widget.objectName())
340 if old_dock_widget
is not None:
341 qWarning(
'PluginHandler._add_dock_widget_to_main_window() duplicate object name ' +
342 '"%s", assign unique object names before adding widgets!' %
343 dock_widget.objectName())
345 self.
_main_window.addDockWidget(Qt.BottomDockWidgetArea, dock_widget)
348 dock_widget, _, _ = self.
_widgets[widget]
349 dock_widget.setWindowIcon(widget.windowIcon())
352 dock_widget, _, _ = self.
_widgets[widget]
353 dock_widget.setWindowTitle(widget.windowTitle())
369 dock_widget, signaler, signaler2 = self.
_widgets[widget]
371 if signaler
is not None:
374 if signaler2
is not None:
376 signaler2.show_signal.emit(dock_widget)
381 dock_widget.parent().removeDockWidget(dock_widget)
383 dock_widget.setParent(
None)
384 widget.setParent(
None)
385 dock_widget.deleteLater()
392 toolbar_object_name = toolbar.objectName()
395 if not toolbar_object_name.startswith(prefix):
396 toolbar_object_name = prefix + toolbar_object_name
397 toolbar.setObjectName(toolbar_object_name)
400 toolbar.setMovable(
False)
405 old_toolbar = self.
_main_window.findChild(QToolBar, toolbar.objectName())
406 if old_toolbar
is not None:
407 qWarning(
'PluginHandler._add_toolbar() duplicate object name "%s", '
408 'assign unique object names before adding toolbars!' %
409 toolbar.objectName())
410 self.
_main_window.addToolBar(Qt.TopToolBarArea, toolbar)
418 toolbar.parent().removeToolBar(toolbar)