E5Gui/E5ErrorMessage.py

branch
Py2 comp.
changeset 2791
a9577f248f04
parent 2770
fd5ee85f0450
child 3057
10516539f238
equal deleted inserted replaced
2790:6686a3326df8 2791:a9577f248f04
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2013 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a specialized error message dialog.
8 """
9
10 from __future__ import unicode_literals # __IGNORE_WARNING__
11
12 from PyQt4.QtCore import qInstallMsgHandler, QCoreApplication, QtDebugMsg, \
13 QtWarningMsg, QtCriticalMsg, QtFatalMsg, QThread, QMetaObject, Qt, Q_ARG, \
14 QSettings
15 from PyQt4.QtGui import QErrorMessage, qApp, QDialog
16
17 import Globals
18 import Utilities
19
20
21 __msgHandlerDialog = None
22 __origMsgHandler = None
23
24
25 class E5ErrorMessage(QErrorMessage):
26 """
27 Class implementing a specialized error message dialog.
28 """
29 def __init__(self, parent=None):
30 """
31 Constructor
32
33 @param parent reference to the parent widget (QWidget)
34 """
35 super(E5ErrorMessage, self).__init__(parent)
36
37 self.settings = QSettings(QSettings.IniFormat,
38 QSettings.UserScope,
39 Globals.settingsNameOrganization,
40 "eric5messagefilters")
41
42 self.__defaultFilters = [
43 "QFont::",
44 "QCocoaMenu::removeMenuItem",
45 "QCocoaMenu::insertNative",
46 ",type id:"
47 ]
48
49 def __filterMessage(self, message):
50 """
51 Private method to filter messages.
52
53 @param message message to be checked (string)
54 @return flag indicating that the message should be filtered out (boolean)
55 """
56 for filter in self.settings.value("MessageFilters", self.__defaultFilters):
57 if filter in message:
58 return True
59
60 return False
61
62 def showMessage(self, message, msgType=""):
63 """
64 Public method to show a message.
65
66 @param message error message to be shown (string)
67 @param msgType type of the error message (string)
68 """
69 if not self.__filterMessage(message):
70 if msgType:
71 super(E5ErrorMessage, self).showMessage(message, msgType)
72 else:
73 super(E5ErrorMessage, self).showMessage(message)
74
75 def editMessageFilters(self):
76 """
77 Public method to edit the list of message filters.
78 """
79 from .E5ErrorMessageFilterDialog import E5ErrorMessageFilterDialog
80 dlg = E5ErrorMessageFilterDialog(
81 self.settings.value("MessageFilters", self.__defaultFilters))
82 if dlg.exec_() == QDialog.Accepted:
83 filters = dlg.getFilters()
84 self.settings.setValue("MessageFilters", filters)
85
86
87 def messageHandler(msgType, message):
88 """
89 Module function handling messages.
90
91 @param msgType type of the message (integer, QtMsgType)
92 @param message message to be shown (bytes)
93 """
94 if __msgHandlerDialog:
95 try:
96 if msgType == QtDebugMsg:
97 messageType = QCoreApplication.translate(
98 "E5ErrorMessage", "Debug Message:")
99 elif msgType == QtWarningMsg:
100 messageType = QCoreApplication.translate(
101 "E5ErrorMessage", "Warning:")
102 elif msgType == QtCriticalMsg:
103 messageType = QCoreApplication.translate(
104 "E5ErrorMessage", "Critical:")
105 elif msgType == QtFatalMsg:
106 messageType = QCoreApplication.translate(
107 "E5ErrorMessage", "Fatal Error:")
108 if isinstance(message, bytes):
109 message = message.decode()
110 message = message.replace("\r\n", "<br/>")\
111 .replace("\n", "<br/>")\
112 .replace("\r", "<br/>")
113 msg = "<p><b>{0}</b></p><p>{1}</p>".format(
114 messageType, Utilities.html_uencode(message))
115 if QThread.currentThread() == qApp.thread():
116 __msgHandlerDialog.showMessage(msg)
117 else:
118 QMetaObject.invokeMethod(
119 __msgHandlerDialog,
120 "showMessage",
121 Qt.QueuedConnection,
122 Q_ARG(str, msg))
123 return
124 except RuntimeError:
125 pass
126 elif __origMsgHandler:
127 __origMsgHandler(msgType, message)
128 return
129
130 if msgType == QtDebugMsg:
131 messageType = QCoreApplication.translate("E5ErrorMessage", "Debug Message")
132 elif msgType == QtWarningMsg:
133 messageType = QCoreApplication.translate("E5ErrorMessage", "Warning")
134 elif msgType == QtCriticalMsg:
135 messageType = QCoreApplication.translate("E5ErrorMessage", "Critical")
136 elif msgType == QtFatalMsg:
137 messageType = QCoreApplication.translate("E5ErrorMessage", "Fatal Error")
138 if isinstance(message, bytes):
139 message = message.decode()
140 print("{0}: {1}".format(messageType, message))
141
142
143 def qtHandler():
144 """
145 Module function to install an E5ErrorMessage dialog as the global
146 message handler.
147 """
148 global __msgHandlerDialog, __origMsgHandler
149
150 if __msgHandlerDialog is None:
151 # Install an E5ErrorMessage dialog as the global message handler.
152 __msgHandlerDialog = E5ErrorMessage()
153 __origMsgHandler = qInstallMsgHandler(messageHandler)
154
155 return __msgHandlerDialog
156
157
158 def editMessageFilters():
159 """
160 Module function to edit the list of message filters.
161 """
162 if __msgHandlerDialog:
163 __msgHandlerDialog.editMessageFilters()
164 else:
165 print(QCoreApplication.translate("E5ErrorMessage",
166 "No message handler installed."))
167
168
169 def messageHandlerInstalled():
170 """
171 Module function to check, if a message handler was installed.
172
173 @return flag indicating an installed message handler (boolean)
174 """
175 return __msgHandlerDialog is not None

eric ide

mercurial