E5Gui/E5ErrorMessage.py

changeset 6391
0b91857640ed
parent 6048
82ad8ec9548c
child 6393
46e4ae753e22
equal deleted inserted replaced
6390:355b89e9bfad 6391:0b91857640ed
15 15
16 import Globals 16 import Globals
17 import Utilities 17 import Utilities
18 18
19 19
20 __msgHandlerDialog = None 20 _msgHandlerDialog = None
21 __origMsgHandler = None 21 _origMsgHandler = None
22
23 _filterSettings = QSettings(
24 QSettings.IniFormat,
25 QSettings.UserScope,
26 Globals.settingsNameOrganization,
27 "eric6messagefilters")
28 _defaultFilters = [
29 "QFont::",
30 "QCocoaMenu::removeMenuItem",
31 "QCocoaMenu::insertNative",
32 ",type id:",
33 "Remote debugging server started successfully",
34 "Uncaught SecurityError:",
35 "Content Security Policy",
36 "QXcbClipboard:",
37 "QXcbConnection: XCB error",
38 "libpng warning: iCCP:",
39 ]
40
41
42 def filterMessage(message):
43 """
44 Module function to filter messages.
45
46 @param message message to be checked
47 @type str
48 @return flag indicating that the message should be filtered out
49 @rtype bool
50 """
51 for filterStr in Globals.toList(_filterSettings.value(
52 "MessageFilters", _defaultFilters)):
53 if filterStr in message:
54 return True
55
56 return False
22 57
23 58
24 class E5ErrorMessage(QErrorMessage): 59 class E5ErrorMessage(QErrorMessage):
25 """ 60 """
26 Class implementing a specialized error message dialog. 61 Class implementing a specialized error message dialog.
27 """ 62 """
28 def __init__(self, parent=None): 63 def __init__(self, parent=None):
29 """ 64 """
30 Constructor 65 Constructor
31 66
32 @param parent reference to the parent widget (QWidget) 67 @param parent reference to the parent widget
68 @type QWidget
33 """ 69 """
34 super(E5ErrorMessage, self).__init__(parent) 70 super(E5ErrorMessage, self).__init__(parent)
35
36 self.settings = QSettings(
37 QSettings.IniFormat,
38 QSettings.UserScope,
39 Globals.settingsNameOrganization,
40 "eric6messagefilters")
41
42 self.__defaultFilters = [
43 "QFont::",
44 "QCocoaMenu::removeMenuItem",
45 "QCocoaMenu::insertNative",
46 ",type id:",
47 "Remote debugging server started successfully",
48 "Uncaught SecurityError:",
49 "Content Security Policy",
50 "QXcbClipboard:",
51 "QXcbConnection: XCB error",
52 "libpng warning: iCCP:",
53 ]
54
55 def __filterMessage(self, message):
56 """
57 Private method to filter messages.
58
59 @param message message to be checked (string)
60 @return flag indicating that the message should be filtered out
61 (boolean)
62 """
63 for filterStr in Globals.toList(self.settings.value(
64 "MessageFilters", self.__defaultFilters)):
65 if filterStr in message:
66 return True
67
68 return False
69 71
70 def showMessage(self, message, msgType=""): 72 def showMessage(self, message, msgType=""):
71 """ 73 """
72 Public method to show a message. 74 Public method to show a message.
73 75
74 @param message error message to be shown (string) 76 @param message error message to be shown
75 @param msgType type of the error message (string) 77 @type str
76 """ 78 @param msgType type of the error message
77 if not self.__filterMessage(message): 79 @type str
80 """
81 if not filterMessage(message):
78 if msgType: 82 if msgType:
79 super(E5ErrorMessage, self).showMessage(message, msgType) 83 super(E5ErrorMessage, self).showMessage(message, msgType)
80 else: 84 else:
81 super(E5ErrorMessage, self).showMessage(message) 85 super(E5ErrorMessage, self).showMessage(message)
82 86
84 """ 88 """
85 Public method to edit the list of message filters. 89 Public method to edit the list of message filters.
86 """ 90 """
87 from .E5ErrorMessageFilterDialog import E5ErrorMessageFilterDialog 91 from .E5ErrorMessageFilterDialog import E5ErrorMessageFilterDialog
88 dlg = E5ErrorMessageFilterDialog( 92 dlg = E5ErrorMessageFilterDialog(
89 Globals.toList(self.settings.value( 93 Globals.toList(_filterSettings.value(
90 "MessageFilters", self.__defaultFilters)), 94 "MessageFilters", _defaultFilters)),
91 self.__defaultFilters) 95 _defaultFilters)
92 if dlg.exec_() == QDialog.Accepted: 96 if dlg.exec_() == QDialog.Accepted:
93 filters = dlg.getFilters() 97 filters = dlg.getFilters()
94 self.settings.setValue("MessageFilters", filters) 98 _filterSettings.setValue("MessageFilters", filters)
95 99
96 100
97 def messageHandler(msgType, *args): 101 def messageHandler(msgType, *args):
98 """ 102 """
99 Module function handling messages. 103 Module function handling messages.
100 104
101 @param msgType type of the message (integer, QtMsgType) 105 @param msgType type of the message
102 @param args message handler arguments, for PyQt4 message to be shown 106 @type int, QtMsgType
103 (bytes), for PyQt5 context information (QMessageLogContext) and 107 @param args message handler arguments, for PyQt4 message to be shown, for
104 message to be shown (bytes) 108 PyQt5 context information and message to be shown
109 @type PyQt4: bytes; PyQt5: tuple of (QMessageLogContext, bytes)
105 """ 110 """
106 if len(args) == 2: 111 if len(args) == 2:
107 context = args[0] 112 context = args[0]
108 message = args[1] 113 message = args[1]
109 else: 114 else:
110 message = args[0] 115 message = args[0]
111 if __msgHandlerDialog: 116 if _msgHandlerDialog:
112 try: 117 try:
113 if msgType == QtDebugMsg: 118 if msgType == QtDebugMsg:
114 messageType = "Debug Message:" 119 messageType = "Debug Message:"
115 elif msgType == QtWarningMsg: 120 elif msgType == QtWarningMsg:
116 messageType = "Warning:" 121 messageType = "Warning:"
118 messageType = "Critical:" 123 messageType = "Critical:"
119 elif msgType == QtFatalMsg: 124 elif msgType == QtFatalMsg:
120 messageType = "Fatal Error:" 125 messageType = "Fatal Error:"
121 if isinstance(message, bytes): 126 if isinstance(message, bytes):
122 message = Utilities.decodeBytes(message) 127 message = Utilities.decodeBytes(message)
128 if filterMessage(message):
129 return
123 message = message.replace("\r\n", "<br/>")\ 130 message = message.replace("\r\n", "<br/>")\
124 .replace("\n", "<br/>")\ 131 .replace("\n", "<br/>")\
125 .replace("\r", "<br/>") 132 .replace("\r", "<br/>")
126 if len(args) == 2: 133 if len(args) == 2:
127 msg = "<p><b>{0}</b></p><p>{1}</p><p>File: {2}</p>" \ 134 msg = "<p><b>{0}</b></p><p>{1}</p><p>File: {2}</p>" \
130 context.file, context.line, context.function) 137 context.file, context.line, context.function)
131 else: 138 else:
132 msg = "<p><b>{0}</b></p><p>{1}</p>".format( 139 msg = "<p><b>{0}</b></p><p>{1}</p>".format(
133 messageType, Utilities.html_uencode(message)) 140 messageType, Utilities.html_uencode(message))
134 if QThread.currentThread() == qApp.thread(): 141 if QThread.currentThread() == qApp.thread():
135 __msgHandlerDialog.showMessage(msg) 142 _msgHandlerDialog.showMessage(msg)
136 else: 143 else:
137 QMetaObject.invokeMethod( 144 QMetaObject.invokeMethod(
138 __msgHandlerDialog, 145 _msgHandlerDialog,
139 "showMessage", 146 "showMessage",
140 Qt.QueuedConnection, 147 Qt.QueuedConnection,
141 Q_ARG(str, msg)) 148 Q_ARG(str, msg))
142 return 149 return
143 except RuntimeError: 150 except RuntimeError:
144 pass 151 pass
145 elif __origMsgHandler: 152 elif _origMsgHandler:
146 __origMsgHandler(msgType, message) 153 _origMsgHandler(msgType, message)
147 return 154 return
148 155
149 if msgType == QtDebugMsg: 156 if msgType == QtDebugMsg:
150 messageType = "Debug Message" 157 messageType = "Debug Message"
151 elif msgType == QtWarningMsg: 158 elif msgType == QtWarningMsg:
167 def qtHandler(): 174 def qtHandler():
168 """ 175 """
169 Module function to install an E5ErrorMessage dialog as the global 176 Module function to install an E5ErrorMessage dialog as the global
170 message handler. 177 message handler.
171 178
172 @return reference to the message handler dialog (E5ErrorMessage) 179 @return reference to the message handler dialog
173 """ 180 @rtype E5ErrorMessage
174 global __msgHandlerDialog, __origMsgHandler 181 """
175 182 global _msgHandlerDialog, _origMsgHandler
176 if __msgHandlerDialog is None: 183
184 if _msgHandlerDialog is None:
177 # Install an E5ErrorMessage dialog as the global message handler. 185 # Install an E5ErrorMessage dialog as the global message handler.
178 __msgHandlerDialog = E5ErrorMessage() 186 _msgHandlerDialog = E5ErrorMessage()
179 __origMsgHandler = qInstallMessageHandler(messageHandler) 187 _origMsgHandler = qInstallMessageHandler(messageHandler)
180 188
181 return __msgHandlerDialog 189 return _msgHandlerDialog
182 190
183 191
184 def editMessageFilters(): 192 def editMessageFilters():
185 """ 193 """
186 Module function to edit the list of message filters. 194 Module function to edit the list of message filters.
187 """ 195 """
188 if __msgHandlerDialog: 196 if _msgHandlerDialog:
189 __msgHandlerDialog.editMessageFilters() 197 _msgHandlerDialog.editMessageFilters()
190 else: 198 else:
191 print("No message handler installed.") 199 print("No message handler installed.")
192 200
193 201
194 def messageHandlerInstalled(): 202 def messageHandlerInstalled():
195 """ 203 """
196 Module function to check, if a message handler was installed. 204 Module function to check, if a message handler was installed.
197 205
198 @return flag indicating an installed message handler (boolean) 206 @return flag indicating an installed message handler
199 """ 207 @rtype bool
200 return __msgHandlerDialog is not None 208 """
209 return _msgHandlerDialog is not None
201 210
202 # 211 #
203 # eflag: noqa = M801 212 # eflag: noqa = M801

eric ide

mercurial