1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2009 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Class implementing a specialized application class.
8"""
9
10from PyQt5.QtCore import Qt, QCoreApplication
11from PyQt5.QtGui import QPalette
12from PyQt5.QtWidgets import QApplication
13
14QCoreApplication.setAttribute(
15    Qt.ApplicationAttribute.AA_EnableHighDpiScaling, True)
16QCoreApplication.setAttribute(
17    Qt.ApplicationAttribute.AA_ShareOpenGLContexts, True)
18
19
20class E5Application(QApplication):
21    """
22    Eric application class with an object registry.
23    """
24    def __init__(self, argv):
25        """
26        Constructor
27
28        @param argv command line arguments
29        @type list
30        """
31        super().__init__(argv)
32
33        QCoreApplication.setAttribute(
34            Qt.ApplicationAttribute.AA_DontCreateNativeWidgetSiblings, True)
35        QCoreApplication.setAttribute(
36            Qt.ApplicationAttribute.AA_UseHighDpiPixmaps, True)
37
38        self.__objectRegistry = {}
39        self.__pluginObjectRegistry = {}
40
41    def registerObject(self, name, objectRef):
42        """
43        Public method to register an object in the object registry.
44
45        @param name name of the object
46        @type str
47        @param objectRef reference to the object
48        @type any
49        @exception KeyError raised when the given name is already in use
50        """
51        if name in self.__objectRegistry:
52            raise KeyError('Object "{0}" already registered.'.format(name))
53        else:
54            self.__objectRegistry[name] = objectRef
55
56    def getObject(self, name):
57        """
58        Public method to get a reference to a registered object.
59
60        @param name name of the object
61        @type str
62        @return reference to the registered object
63        @rtype any
64        @exception KeyError raised when the given name is not known
65        """
66        if name not in self.__objectRegistry:
67            raise KeyError('Object "{0}" is not registered.'.format(name))
68
69        return self.__objectRegistry[name]
70
71    def registerPluginObject(self, name, objectRef, pluginType=None):
72        """
73        Public method to register a plugin object in the object registry.
74
75        @param name name of the plugin object
76        @type str
77        @param objectRef reference to the plugin object
78        @type any
79        @param pluginType type of the plugin object
80        @type str
81        @exception KeyError raised when the given name is already in use
82        """
83        if name in self.__pluginObjectRegistry:
84            raise KeyError(
85                'Pluginobject "{0}" already registered.'.format(name))
86        else:
87            self.__pluginObjectRegistry[name] = (objectRef, pluginType)
88
89    def unregisterPluginObject(self, name):
90        """
91        Public method to unregister a plugin object in the object registry.
92
93        @param name name of the plugin object
94        @type str
95        """
96        if name in self.__pluginObjectRegistry:
97            del self.__pluginObjectRegistry[name]
98
99    def getPluginObject(self, name):
100        """
101        Public method to get a reference to a registered plugin object.
102
103        @param name name of the plugin object
104        @type str
105        @return reference to the registered plugin object
106        @rtype any
107        @exception KeyError raised when the given name is not known
108        """
109        if name not in self.__pluginObjectRegistry:
110            raise KeyError(
111                'Pluginobject "{0}" is not registered.'.format(name))
112
113        return self.__pluginObjectRegistry[name][0]
114
115    def getPluginObjects(self):
116        """
117        Public method to get a list of (name, reference) pairs of all
118        registered plugin objects.
119
120        @return list of (name, reference) pairs
121        @rtype list of (str, any)
122        """
123        objects = []
124        for name in self.__pluginObjectRegistry:
125            objects.append((name, self.__pluginObjectRegistry[name][0]))
126        return objects
127
128    def getPluginObjectType(self, name):
129        """
130        Public method to get the type of a registered plugin object.
131
132        @param name name of the plugin object
133        @type str
134        @return type of the plugin object
135        @rtype str
136        @exception KeyError raised when the given name is not known
137        """
138        if name not in self.__pluginObjectRegistry:
139            raise KeyError(
140                'Pluginobject "{0}" is not registered.'.format(name))
141
142        return self.__pluginObjectRegistry[name][1]
143
144    def usesDarkPalette(self):
145        """
146        Public method to check, if the application uses a palette with a dark
147        background.
148
149        @return flag indicating the use of a palette with a dark background
150        @rtype bool
151        """
152        palette = self.palette()
153        lightness = palette.color(QPalette.ColorRole.Window).lightness()
154        return lightness <= 128
155
156e5App = QCoreApplication.instance
157