summaryrefslogtreecommitdiff
path: root/silx/gui/qt/_pyside_dynamic.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/qt/_pyside_dynamic.py')
-rw-r--r--silx/gui/qt/_pyside_dynamic.py239
1 files changed, 0 insertions, 239 deletions
diff --git a/silx/gui/qt/_pyside_dynamic.py b/silx/gui/qt/_pyside_dynamic.py
deleted file mode 100644
index 6013416..0000000
--- a/silx/gui/qt/_pyside_dynamic.py
+++ /dev/null
@@ -1,239 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Taken from: https://gist.github.com/cpbotha/1b42a20c8f3eb9bb7cb8
-# Plus: https://github.com/spyder-ide/qtpy/commit/001a862c401d757feb63025f88dbb4601d353c84
-
-# Copyright (c) 2011 Sebastian Wiesner <lunaryorn@gmail.com>
-# Modifications by Charl Botha <cpbotha@vxlabs.com>
-# * customWidgets support (registerCustomWidget() causes segfault in
-# pyside 1.1.2 on Ubuntu 12.04 x86_64)
-# * workingDirectory support in loadUi
-
-# found this here:
-# https://github.com/lunaryorn/snippets/blob/master/qt4/designer/pyside_dynamic.py
-
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# DEALINGS IN THE SOFTWARE.
-
-"""
- How to load a user interface dynamically with PySide.
-
- .. moduleauthor:: Sebastian Wiesner <lunaryorn@gmail.com>
-"""
-
-from __future__ import (print_function, division, unicode_literals,
- absolute_import)
-
-import logging
-import sys
-
-if "PySide.QtCore" in sys.modules:
- from PySide.QtCore import QMetaObject
- from PySide.QtUiTools import QUiLoader
-else: # PySide2
- from PySide2.QtCore import QMetaObject, Property, Qt
- from PySide2.QtWidgets import QFrame
- from PySide2.QtUiTools import QUiLoader
-
-_logger = logging.getLogger(__name__)
-
-
-class UiLoader(QUiLoader):
- """
- Subclass :class:`~PySide.QtUiTools.QUiLoader` to create the user interface
- in a base instance.
-
- Unlike :class:`~PySide.QtUiTools.QUiLoader` itself this class does not
- create a new instance of the top-level widget, but creates the user
- interface in an existing instance of the top-level class.
-
- This mimics the behaviour of :func:`PyQt*.uic.loadUi`.
- """
-
- def __init__(self, baseinstance, customWidgets=None):
- """
- Create a loader for the given ``baseinstance``.
-
- The user interface is created in ``baseinstance``, which must be an
- instance of the top-level class in the user interface to load, or a
- subclass thereof.
-
- ``customWidgets`` is a dictionary mapping from class name to class
- object for widgets that you've promoted in the Qt Designer
- interface. Usually, this should be done by calling
- registerCustomWidget on the QUiLoader, but
- with PySide 1.1.2 on Ubuntu 12.04 x86_64 this causes a segfault.
-
- ``parent`` is the parent object of this loader.
- """
-
- QUiLoader.__init__(self, baseinstance)
- self.baseinstance = baseinstance
- self.customWidgets = {}
- self.uifile = None
- self.customWidgets.update(customWidgets)
-
- def createWidget(self, class_name, parent=None, name=''):
- """
- Function that is called for each widget defined in ui file,
- overridden here to populate baseinstance instead.
- """
-
- if parent is None and self.baseinstance:
- # supposed to create the top-level widget, return the base instance
- # instead
- return self.baseinstance
-
- else:
- if class_name in self.availableWidgets():
- # create a new widget for child widgets
- widget = QUiLoader.createWidget(self, class_name, parent, name)
-
- else:
- # if not in the list of availableWidgets,
- # must be a custom widget
- # this will raise KeyError if the user has not supplied the
- # relevant class_name in the dictionary, or TypeError, if
- # customWidgets is None
- if class_name not in self.customWidgets:
- raise Exception('No custom widget ' + class_name +
- ' found in customWidgets param of' +
- 'UiFile %s.' % self.uifile)
- try:
- widget = self.customWidgets[class_name](parent)
- except Exception:
- _logger.error("Fail to instanciate widget %s from file %s", class_name, self.uifile)
- raise
-
- if self.baseinstance:
- # set an attribute for the new child widget on the base
- # instance, just like PyQt*.uic.loadUi does.
- setattr(self.baseinstance, name, widget)
-
- # this outputs the various widget names, e.g.
- # sampleGraphicsView, dockWidget, samplesTableView etc.
- # print(name)
-
- return widget
-
- def _parse_custom_widgets(self, ui_file):
- """
- This function is used to parse a ui file and look for the <customwidgets>
- section, then automatically load all the custom widget classes.
- """
- import importlib
- from xml.etree.ElementTree import ElementTree
-
- # Parse the UI file
- etree = ElementTree()
- ui = etree.parse(ui_file)
-
- # Get the customwidgets section
- custom_widgets = ui.find('customwidgets')
-
- if custom_widgets is None:
- return
-
- custom_widget_classes = {}
-
- for custom_widget in custom_widgets.getchildren():
-
- cw_class = custom_widget.find('class').text
- cw_header = custom_widget.find('header').text
-
- module = importlib.import_module(cw_header)
-
- custom_widget_classes[cw_class] = getattr(module, cw_class)
-
- self.customWidgets.update(custom_widget_classes)
-
- def load(self, uifile):
- self._parse_custom_widgets(uifile)
- self.uifile = uifile
- return QUiLoader.load(self, uifile)
-
-
-if "PySide2.QtCore" in sys.modules:
-
- class _Line(QFrame):
- """Widget to use as 'Line' Qt designer"""
- def __init__(self, parent=None):
- super(_Line, self).__init__(parent)
- self.setFrameShape(QFrame.HLine)
- self.setFrameShadow(QFrame.Sunken)
-
- def getOrientation(self):
- shape = self.frameShape()
- if shape == QFrame.HLine:
- return Qt.Horizontal
- elif shape == QFrame.VLine:
- return Qt.Vertical
- else:
- raise RuntimeError("Wrong shape: %d", shape)
-
- def setOrientation(self, orientation):
- if orientation == Qt.Horizontal:
- self.setFrameShape(QFrame.HLine)
- elif orientation == Qt.Vertical:
- self.setFrameShape(QFrame.VLine)
- else:
- raise ValueError("Unsupported orientation %s" % str(orientation))
-
- orientation = Property("Qt::Orientation", getOrientation, setOrientation)
-
- CUSTOM_WIDGETS = {"Line": _Line}
- """Default custom widgets for `loadUi`"""
-
-else: # PySide support
- CUSTOM_WIDGETS = {}
- """Default custom widgets for `loadUi`"""
-
-
-def loadUi(uifile, baseinstance=None, package=None, resource_suffix=None):
- """
- Dynamically load a user interface from the given ``uifile``.
-
- ``uifile`` is a string containing a file name of the UI file to load.
-
- If ``baseinstance`` is ``None``, the a new instance of the top-level widget
- will be created. Otherwise, the user interface is created within the given
- ``baseinstance``. In this case ``baseinstance`` must be an instance of the
- top-level widget class in the UI file to load, or a subclass thereof. In
- other words, if you've created a ``QMainWindow`` interface in the designer,
- ``baseinstance`` must be a ``QMainWindow`` or a subclass thereof, too. You
- cannot load a ``QMainWindow`` UI file with a plain
- :class:`~PySide.QtGui.QWidget` as ``baseinstance``.
-
- :method:`~PySide.QtCore.QMetaObject.connectSlotsByName()` is called on the
- created user interface, so you can implemented your slots according to its
- conventions in your widget class.
-
- Return ``baseinstance``, if ``baseinstance`` is not ``None``. Otherwise
- return the newly created instance of the user interface.
- """
- if package is not None:
- _logger.warning(
- "loadUi package parameter not implemented with PySide")
- if resource_suffix is not None:
- _logger.warning(
- "loadUi resource_suffix parameter not implemented with PySide")
-
- loader = UiLoader(baseinstance, customWidgets=CUSTOM_WIDGETS)
- widget = loader.load(uifile)
- QMetaObject.connectSlotsByName(widget)
- return widget