47697db3b93728ce580011fd1b1d30c79f4bee18
[gc-dialer] / src / util / qui_utils.py
1 import sys
2 import logging
3
4 from PyQt4 import QtCore
5 from PyQt4 import QtGui
6
7 import misc
8
9
10 _moduleLogger = logging.getLogger(__name__)
11
12
13 class QErrorLog(QtCore.QObject):
14
15         messagePushed = QtCore.pyqtSignal()
16         messagePopped = QtCore.pyqtSignal()
17
18         def __init__(self):
19                 QtCore.QObject.__init__(self)
20                 self._messages = []
21
22         def push_message(self, message):
23                 self._messages.append(message)
24                 self.messagePushed.emit()
25
26         def push_exception(self):
27                 userMessage = str(sys.exc_info()[1])
28                 _moduleLogger.exception(userMessage)
29                 self.push_message(userMessage)
30
31         def pop_message(self):
32                 del self._messages[0]
33                 self.messagePopped.emit()
34
35         def peek_message(self):
36                 return self._messages[0]
37
38         def __len__(self):
39                 return len(self._messages)
40
41
42 class ErrorDisplay(object):
43
44         def __init__(self, errorLog):
45                 self._errorLog = errorLog
46                 self._errorLog.messagePushed.connect(self._on_message_pushed)
47                 self._errorLog.messagePopped.connect(self._on_message_popped)
48
49                 errorIcon = get_theme_icon(("dialog-error", "app_install_error", "gtk-dialog-error"))
50                 self._severityIcon = errorIcon.pixmap(32, 32)
51                 self._severityLabel = QtGui.QLabel()
52                 self._severityLabel.setPixmap(self._severityIcon)
53
54                 self._message = QtGui.QLabel()
55                 self._message.setText("Boo")
56
57                 closeIcon = get_theme_icon(("window-close", "general_close", "gtk-close"))
58                 self._closeLabel = QtGui.QPushButton(closeIcon, "")
59                 self._closeLabel.clicked.connect(self._on_close)
60
61                 self._controlLayout = QtGui.QHBoxLayout()
62                 self._controlLayout.addWidget(self._severityLabel)
63                 self._controlLayout.addWidget(self._message)
64                 self._controlLayout.addWidget(self._closeLabel)
65
66                 self._topLevelLayout = QtGui.QHBoxLayout()
67                 self._topLevelLayout.addLayout(self._controlLayout)
68                 self._widget = QtGui.QWidget()
69                 self._widget.setLayout(self._topLevelLayout)
70                 self._widget.hide()
71
72         @property
73         def toplevel(self):
74                 return self._widget
75
76         @QtCore.pyqtSlot()
77         @QtCore.pyqtSlot(bool)
78         @misc.log_exception(_moduleLogger)
79         def _on_close(self, checked = False):
80                 self._errorLog.pop_message()
81
82         @QtCore.pyqtSlot()
83         @misc.log_exception(_moduleLogger)
84         def _on_message_pushed(self):
85                 if 1 <= len(self._errorLog) and self._widget.isHidden():
86                         self._message.setText(self._errorLog.peek_message())
87                         self._widget.show()
88
89         @QtCore.pyqtSlot()
90         @misc.log_exception(_moduleLogger)
91         def _on_message_popped(self):
92                 if len(self._errorLog) == 0:
93                         self._message.setText("")
94                         self._widget.hide()
95                 else:
96                         self._message.setText(self._errorLog.peek_message())
97
98
99 def _null_set_stackable(window, isStackable):
100         pass
101
102
103 def _maemo_set_stackable(window, isStackable):
104         window.setAttribute(QtCore.Qt.WA_Maemo5StackedWindow, isStackable)
105
106
107 try:
108         QtCore.Qt.WA_Maemo5StackedWindow
109         set_stackable = _maemo_set_stackable
110 except AttributeError:
111         set_stackable = _null_set_stackable
112
113
114 def _null_set_autorient(window, isStackable):
115         pass
116
117
118 def _maemo_set_autorient(window, isStackable):
119         window.setAttribute(QtCore.Qt.WA_Maemo5StackedWindow, isStackable)
120
121
122 try:
123         QtCore.Qt.WA_Maemo5AutoOrientation
124         set_autorient = _maemo_set_autorient
125 except AttributeError:
126         set_autorient = _null_set_autorient
127
128
129 def _null_set_landscape(window, isStackable):
130         pass
131
132
133 def _maemo_set_landscape(window, isStackable):
134         window.setAttribute(QtCore.Qt.WA_Maemo5StackedWindow, isStackable)
135
136
137 try:
138         QtCore.Qt.WA_Maemo5LandscapeOrientation
139         set_landscape = _maemo_set_landscape
140 except AttributeError:
141         set_landscape = _null_set_landscape
142
143
144 def _null_set_portrait(window, isStackable):
145         pass
146
147
148 def _maemo_set_portrait(window, isStackable):
149         window.setAttribute(QtCore.Qt.WA_Maemo5StackedWindow, isStackable)
150
151
152 try:
153         QtCore.Qt.WA_Maemo5PortraitOrientation
154         set_portrait = _maemo_set_portrait
155 except AttributeError:
156         set_portrait = _null_set_portrait
157
158
159 def _null_show_progress_indicator(window, isStackable):
160         pass
161
162
163 def _maemo_show_progress_indicator(window, isStackable):
164         window.setAttribute(QtCore.Qt.WA_Maemo5StackedWindow, isStackable)
165
166
167 try:
168         QtCore.Qt.WA_Maemo5ShowProgressIndicator
169         show_progress_indicator = _maemo_show_progress_indicator
170 except AttributeError:
171         show_progress_indicator = _null_show_progress_indicator
172
173
174 def _null_mark_numbers_preferred(widget):
175         pass
176
177
178 def _newqt_mark_numbers_preferred(widget):
179         widget.setInputMethodHints(QtCore.Qt.ImhPreferNumbers)
180
181
182 try:
183         QtCore.Qt.ImhPreferNumbers
184         mark_numbers_preferred = _newqt_mark_numbers_preferred
185 except AttributeError:
186         mark_numbers_preferred = _null_mark_numbers_preferred
187
188
189 def screen_orientation():
190         geom = QtGui.QApplication.desktop().screenGeometry()
191         if geom.width() <= geom.height():
192                 return QtCore.Qt.Vertical
193         else:
194                 return QtCore.Qt.Horizontal
195
196
197 def _null_get_theme_icon(iconNames, fallback = None):
198         icon = fallback if fallback is not None else QtGui.QIcon()
199         return icon
200
201
202 def _newqt_get_theme_icon(iconNames, fallback = None):
203         for iconName in iconNames:
204                 if QtGui.QIcon.hasThemeIcon(iconName):
205                         icon = QtGui.QIcon.fromTheme(iconName)
206                         break
207         else:
208                 icon = fallback if fallback is not None else QtGui.QIcon()
209         return icon
210
211
212 try:
213         QtGui.QIcon.fromTheme
214         get_theme_icon = _newqt_get_theme_icon
215 except AttributeError:
216         get_theme_icon = _null_get_theme_icon
217