E5Gui/E5ErrorMessage.py

changeset 2683
ef93fc7332a2
child 2695
13c6301cbed3
equal deleted inserted replaced
2681:e793289c4362 2683:ef93fc7332a2
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 PyQt4.QtCore import qInstallMsgHandler, QCoreApplication, QtDebugMsg, \
11 QtWarningMsg, QtCriticalMsg, QtFatalMsg, QThread, QMetaObject, Qt, Q_ARG
12 from PyQt4.QtGui import QErrorMessage, qApp
13
14 import Utilities
15
16
17 __msgHandlerDialog = None
18 __origMsgHandler = None
19
20
21 class E5ErrorMessage(QErrorMessage):
22 """
23 Class implementing a specialized error message dialog.
24 """
25 def __init__(self, parent=None):
26 """
27 Constructor
28
29 @param parent reference to the parent widget (QWidget)
30 """
31 super().__init__(parent)
32
33 # TODO: make this list configurable by the user
34 self.__filters = [
35 "QFont::",
36 "QCocoaMenu::removeMenuItem",
37 "QCocoaMenu::insertNative",
38 ",type id:"
39 ]
40
41 def __filterMessage(self, message):
42 """
43 Private method to filter messages.
44
45 @param message message to be checked (string)
46 @return flag indicating that the message should be filtered out (boolean)
47 """
48 for filter in self.__filters:
49 if filter in message:
50 return True
51
52 return False
53
54 def showMessage(self, message, msgType=""):
55 """
56 Public method to show a message.
57
58 @param message error message to be shown (string)
59 @param msgType type of the error message (string)
60 """
61 if not self.__filterMessage(message):
62 if msgType:
63 super().showMessage(message, msgType)
64 else:
65 super().showMessage(message)
66
67
68 def messageHandler(msgType, message):
69 """
70 Module function handling messages.
71
72 @param msgType type of the message (integer, QtMsgType)
73 @param message message to be shown (bytes)
74 """
75 if __msgHandlerDialog:
76 if msgType == QtDebugMsg:
77 messageType = QCoreApplication.translate("E5ErrorMessage", "Debug Message:")
78 elif msgType == QtWarningMsg:
79 messageType = QCoreApplication.translate("E5ErrorMessage", "Warning:")
80 elif msgType == QtCriticalMsg:
81 messageType = QCoreApplication.translate("E5ErrorMessage", "Critical:")
82 elif msgType == QtFatalMsg:
83 messageType = QCoreApplication.translate("E5ErrorMessage", "Fatal Error:")
84 msg = "<p><b>{0}</b></p><p>{1}</p>".format(
85 messageType, Utilities.html_uencode(message.decode()))
86 if QThread.currentThread() == qApp.thread():
87 __msgHandlerDialog.showMessage(msg)
88 else:
89 QMetaObject.invokeMethod(
90 __msgHandlerDialog,
91 "showMessage",
92 Qt.QueuedConnection,
93 Q_ARG(str, msg))
94 elif __origMsgHandler:
95 __origMsgHandler(msgType, message)
96 else:
97 if msgType == QtDebugMsg:
98 messageType = QCoreApplication.translate("E5ErrorMessage", "Debug Message")
99 elif msgType == QtWarningMsg:
100 messageType = QCoreApplication.translate("E5ErrorMessage", "Warning")
101 elif msgType == QtCriticalMsg:
102 messageType = QCoreApplication.translate("E5ErrorMessage", "Critical")
103 elif msgType == QtFatalMsg:
104 messageType = QCoreApplication.translate("E5ErrorMessage", "Fatal Error")
105 print("{0}: {1}".format(messageType, message.decode()))
106
107
108 def qtHandler():
109 """
110 Module function to install an E5ErrorMessage dialog as the global
111 message handler.
112 """
113 global __msgHandlerDialog, __origMsgHandler
114
115 if __msgHandlerDialog is None:
116 # Install an E5ErrorMessage dialog as the global message handler.
117 __msgHandlerDialog = E5ErrorMessage()
118 __origMsgHandler = qInstallMsgHandler(messageHandler)
119
120 return __msgHandlerDialog

eric ide

mercurial