Limiting log size
[gonvert] / src / windows.py
1 #!/usr/bin/env python
2
3 from __future__ import with_statement
4 from __future__ import division
5
6 import logging
7
8 from PyQt4 import QtGui
9 from PyQt4 import QtCore
10
11 import constants
12 from util import qui_utils
13 from util import misc as misc_utils
14 import unit_data
15
16
17 _moduleLogger = logging.getLogger(__name__)
18
19
20 class FavoritesWindow(object):
21
22         def __init__(self, parent, app, source, hidden):
23                 self._app = app
24                 self._source = list(source)
25                 self._hidden = hidden
26
27                 self._categories = QtGui.QTreeWidget()
28                 self._categories.setHeaderLabels(["Categories"])
29                 self._categories.setHeaderHidden(True)
30                 self._categories.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
31                 if not constants.IS_MAEMO:
32                         self._categories.setAlternatingRowColors(True)
33                 self._childWidgets = []
34                 for catName in self._source:
35                         twi = QtGui.QTreeWidgetItem(self._categories)
36                         twi.setText(0, catName)
37                         self._childWidgets.append(twi)
38                         if catName in self._hidden:
39                                 twi.setCheckState(0, QtCore.Qt.Unchecked)
40                         else:
41                                 twi.setCheckState(0, QtCore.Qt.Checked)
42                 self._categories.itemChanged.connect(self._on_item_changed)
43
44                 self._allButton = QtGui.QPushButton("All")
45                 self._allButton.clicked.connect(self._on_select_all)
46                 self._invertButton = QtGui.QPushButton("Invert")
47                 self._invertButton.clicked.connect(self._on_invert_selection)
48                 self._noneButton = QtGui.QPushButton("None")
49                 self._noneButton.clicked.connect(self._on_select_none)
50
51                 self._buttonLayout = QtGui.QHBoxLayout()
52                 self._buttonLayout.addWidget(self._allButton)
53                 self._buttonLayout.addWidget(self._invertButton)
54                 self._buttonLayout.addWidget(self._noneButton)
55
56                 self._layout = QtGui.QVBoxLayout()
57                 self._layout.addWidget(self._categories)
58                 self._layout.addLayout(self._buttonLayout)
59
60                 centralWidget = QtGui.QWidget()
61                 centralWidget.setLayout(self._layout)
62
63                 self._window = QtGui.QMainWindow(parent)
64                 self._window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
65                 qui_utils.set_stackable(self._window, True)
66                 self._window.setWindowTitle("%s - Favorites" % constants.__pretty_app_name__)
67                 self._window.setWindowIcon(QtGui.QIcon(self._app.appIconPath))
68                 self._window.setCentralWidget(centralWidget)
69
70                 self._closeWindowAction = QtGui.QAction(None)
71                 self._closeWindowAction.setText("Close")
72                 self._closeWindowAction.setShortcut(QtGui.QKeySequence("CTRL+w"))
73                 self._closeWindowAction.triggered.connect(self._on_close_window)
74
75                 if constants.IS_MAEMO:
76                         self._window.addAction(self._closeWindowAction)
77                         self._window.addAction(self._app.quitAction)
78                         self._window.addAction(self._app.fullscreenAction)
79                 else:
80                         fileMenu = self._window.menuBar().addMenu("&Units")
81                         fileMenu.addAction(self._closeWindowAction)
82                         fileMenu.addAction(self._app.quitAction)
83
84                         viewMenu = self._window.menuBar().addMenu("&View")
85                         viewMenu.addAction(self._app.fullscreenAction)
86
87                 self._window.addAction(self._app.logAction)
88
89                 self.set_fullscreen(self._app.fullscreenAction.isChecked())
90                 self._window.show()
91
92         @property
93         def window(self):
94                 return self._window
95
96         def show(self):
97                 self._window.show()
98
99         def hide(self):
100                 self._window.hide()
101
102         def close(self):
103                 self._window.close()
104
105         def set_fullscreen(self, isFullscreen):
106                 if isFullscreen:
107                         self._window.showFullScreen()
108                 else:
109                         self._window.showNormal()
110
111         @misc_utils.log_exception(_moduleLogger)
112         def _on_select_all(self, checked = False):
113                 for child in self._childWidgets:
114                         child.setCheckState(0, QtCore.Qt.Checked)
115
116         @misc_utils.log_exception(_moduleLogger)
117         def _on_invert_selection(self, checked = False):
118                 for child in self._childWidgets:
119                         state = child.checkState(0)
120                         if state == QtCore.Qt.Unchecked:
121                                 newState = QtCore.Qt.Checked
122                         elif state == QtCore.Qt.Checked:
123                                 newState = QtCore.Qt.Unchecked
124                         else:
125                                 raise RuntimeError("Bad check state %r" % state)
126                         child.setCheckState(0, newState)
127
128         @misc_utils.log_exception(_moduleLogger)
129         def _on_select_none(self, checked = False):
130                 for child in self._childWidgets:
131                         child.setCheckState(0, QtCore.Qt.Unchecked)
132
133         @misc_utils.log_exception(_moduleLogger)
134         def _on_item_changed(self, item, column):
135                 state = item.checkState(column)
136                 if state == QtCore.Qt.Unchecked:
137                         name = str(item.text(column))
138                         self._hidden.add(name)
139                 elif state == QtCore.Qt.Checked:
140                         name = str(item.text(column))
141                         self._hidden.remove(name)
142                 else:
143                         raise RuntimeError("Bad check state %r" % state)
144
145         @misc_utils.log_exception(_moduleLogger)
146         def _on_close_window(self, checked = True):
147                 self.close()
148
149
150 class QuickJump(object):
151
152         MINIMAL_ENTRY = 3
153
154         def __init__(self, parent, app):
155                 self._app = app
156
157                 self._searchLabel = QtGui.QLabel("Search:")
158                 self._searchEntry = QtGui.QLineEdit("")
159                 self._searchEntry.textEdited.connect(self._on_search_edited)
160
161                 self._entryLayout = QtGui.QHBoxLayout()
162                 self._entryLayout.addWidget(self._searchLabel)
163                 self._entryLayout.addWidget(self._searchEntry)
164
165                 self._resultsBox = QtGui.QTreeWidget()
166                 self._resultsBox.setHeaderLabels(["Categories", "Units"])
167                 self._resultsBox.setHeaderHidden(True)
168                 if not constants.IS_MAEMO:
169                         self._resultsBox.setAlternatingRowColors(True)
170                 self._resultsBox.itemClicked.connect(self._on_result_clicked)
171
172                 self._layout = QtGui.QVBoxLayout()
173                 self._layout.addLayout(self._entryLayout)
174                 self._layout.addWidget(self._resultsBox)
175
176                 centralWidget = QtGui.QWidget()
177                 centralWidget.setLayout(self._layout)
178
179                 self._window = QtGui.QMainWindow(parent)
180                 self._window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
181                 qui_utils.set_stackable(self._window, True)
182                 self._window.setWindowTitle("%s - Quick Jump" % constants.__pretty_app_name__)
183                 self._window.setWindowIcon(QtGui.QIcon(self._app.appIconPath))
184                 self._window.setCentralWidget(centralWidget)
185
186                 self._closeWindowAction = QtGui.QAction(None)
187                 self._closeWindowAction.setText("Close")
188                 self._closeWindowAction.setShortcut(QtGui.QKeySequence("CTRL+w"))
189                 self._closeWindowAction.triggered.connect(self._on_close_window)
190
191                 if constants.IS_MAEMO:
192                         self._window.addAction(self._closeWindowAction)
193                         self._window.addAction(self._app.quitAction)
194                         self._window.addAction(self._app.fullscreenAction)
195                 else:
196                         fileMenu = self._window.menuBar().addMenu("&Units")
197                         fileMenu.addAction(self._closeWindowAction)
198                         fileMenu.addAction(self._app.quitAction)
199
200                         viewMenu = self._window.menuBar().addMenu("&View")
201                         viewMenu.addAction(self._app.fullscreenAction)
202
203                 self._window.addAction(self._app.logAction)
204
205                 self.set_fullscreen(self._app.fullscreenAction.isChecked())
206                 self._window.show()
207
208         @property
209         def window(self):
210                 return self._window
211
212         def show(self):
213                 self._window.show()
214
215         def hide(self):
216                 self._window.hide()
217
218         def close(self):
219                 self._window.close()
220
221         def set_fullscreen(self, isFullscreen):
222                 if isFullscreen:
223                         self._window.showFullScreen()
224                 else:
225                         self._window.showNormal()
226
227         @misc_utils.log_exception(_moduleLogger)
228         def _on_close_window(self, checked = True):
229                 self.close()
230
231         @misc_utils.log_exception(_moduleLogger)
232         def _on_result_clicked(self, item, columnIndex):
233                 categoryName = unicode(item.text(0))
234                 unitName = unicode(item.text(1))
235                 catWindow = self._app.request_category()
236                 unitsWindow = catWindow.select_category(categoryName)
237                 unitsWindow.select_unit(unitName)
238                 self.close()
239
240         @misc_utils.log_exception(_moduleLogger)
241         def _on_search_edited(self, *args):
242                 userInput = self._searchEntry.text()
243                 if len(userInput) <  self.MINIMAL_ENTRY:
244                         return
245
246                 self._resultsBox.clear()
247                 lowerInput = str(userInput).lower()
248                 for catIndex, category in enumerate(unit_data.UNIT_CATEGORIES):
249                         units = unit_data.get_units(category)
250                         for unitIndex, unit in enumerate(units):
251                                 loweredUnit = unit.lower()
252                                 if lowerInput in loweredUnit:
253                                         twi = QtGui.QTreeWidgetItem(self._resultsBox)
254                                         twi.setText(0, category)
255                                         twi.setText(1, unit)
256
257
258 class Recent(object):
259
260         def __init__(self, parent, app):
261                 self._app = app
262
263                 self._resultsBox = QtGui.QTreeWidget()
264                 self._resultsBox.setHeaderLabels(["Categories", "Units"])
265                 self._resultsBox.setHeaderHidden(True)
266                 if not constants.IS_MAEMO:
267                         self._resultsBox.setAlternatingRowColors(True)
268                 self._resultsBox.itemClicked.connect(self._on_result_clicked)
269
270                 self._layout = QtGui.QVBoxLayout()
271                 self._layout.addWidget(self._resultsBox)
272
273                 centralWidget = QtGui.QWidget()
274                 centralWidget.setLayout(self._layout)
275
276                 self._window = QtGui.QMainWindow(parent)
277                 self._window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
278                 qui_utils.set_stackable(self._window, True)
279                 self._window.setWindowTitle("%s - Recent" % constants.__pretty_app_name__)
280                 self._window.setWindowIcon(QtGui.QIcon(self._app.appIconPath))
281                 self._window.setCentralWidget(centralWidget)
282
283                 for cat, unit in self._app.get_recent():
284                         twi = QtGui.QTreeWidgetItem(self._resultsBox)
285                         twi.setText(0, cat)
286                         twi.setText(1, unit)
287
288                 self._closeWindowAction = QtGui.QAction(None)
289                 self._closeWindowAction.setText("Close")
290                 self._closeWindowAction.setShortcut(QtGui.QKeySequence("CTRL+w"))
291                 self._closeWindowAction.triggered.connect(self._on_close_window)
292
293                 if constants.IS_MAEMO:
294                         self._window.addAction(self._closeWindowAction)
295                         self._window.addAction(self._app.quitAction)
296                         self._window.addAction(self._app.fullscreenAction)
297                 else:
298                         fileMenu = self._window.menuBar().addMenu("&Units")
299                         fileMenu.addAction(self._closeWindowAction)
300                         fileMenu.addAction(self._app.quitAction)
301
302                         viewMenu = self._window.menuBar().addMenu("&View")
303                         viewMenu.addAction(self._app.fullscreenAction)
304
305                 self._window.addAction(self._app.logAction)
306
307                 self.set_fullscreen(self._app.fullscreenAction.isChecked())
308                 self._window.show()
309
310         @property
311         def window(self):
312                 return self._window
313
314         def show(self):
315                 self._window.show()
316
317         def hide(self):
318                 self._window.hide()
319
320         def close(self):
321                 self._window.close()
322
323         def set_fullscreen(self, isFullscreen):
324                 if isFullscreen:
325                         self._window.showFullScreen()
326                 else:
327                         self._window.showNormal()
328
329         @misc_utils.log_exception(_moduleLogger)
330         def _on_close_window(self, checked = True):
331                 self.close()
332
333         @misc_utils.log_exception(_moduleLogger)
334         def _on_result_clicked(self, item, columnIndex):
335                 categoryName = unicode(item.text(0))
336                 unitName = unicode(item.text(1))
337                 catWindow = self._app.request_category()
338                 unitsWindow = catWindow.select_category(categoryName)
339                 unitsWindow.select_unit(unitName)
340                 self.close()