Helpviewer/History/HistoryMenu.py

changeset 1693
9bb872e26a33
parent 1509
c0b5e693b0eb
child 1694
648466a9451b
equal deleted inserted replaced
1689:2d007a789078 1693:9bb872e26a33
8 """ 8 """
9 9
10 import sys 10 import sys
11 11
12 from PyQt4.QtCore import pyqtSignal, Qt, QMimeData, QUrl, QModelIndex 12 from PyQt4.QtCore import pyqtSignal, Qt, QMimeData, QUrl, QModelIndex
13 from PyQt4.QtGui import QAbstractProxyModel 13 from PyQt4.QtGui import QAbstractProxyModel, QSortFilterProxyModel
14 14
15 from E5Gui.E5ModelMenu import E5ModelMenu 15 from E5Gui.E5ModelMenu import E5ModelMenu
16 from E5Gui import E5MessageBox 16 from E5Gui import E5MessageBox
17 17
18 import Helpviewer.HelpWindow 18 import Helpviewer.HelpWindow
19 19
20 from .HistoryModel import HistoryModel 20 from .HistoryModel import HistoryModel
21 from .HistoryDialog import HistoryDialog 21 from .HistoryDialog import HistoryDialog
22 from .HistoryFilterModel import HistoryFilterModel
22 23
23 import UI.PixmapCache 24 import UI.PixmapCache
24 25
25 26
26 class HistoryMenuModel(QAbstractProxyModel): 27 class HistoryMenuModel(QAbstractProxyModel):
98 Public method to map an index to the proxy model index. 99 Public method to map an index to the proxy model index.
99 100
100 @param sourceIndex reference to a source model index (QModelIndex) 101 @param sourceIndex reference to a source model index (QModelIndex)
101 @return proxy model index (QModelIndex) 102 @return proxy model index (QModelIndex)
102 """ 103 """
103 assert False
104 sourceRow = self.__treeModel.mapToSource(sourceIndex).row() 104 sourceRow = self.__treeModel.mapToSource(sourceIndex).row()
105 return self.createIndex(sourceIndex.row(), sourceIndex.column(), sourceRow) 105 return self.createIndex(sourceIndex.row(), sourceIndex.column(), sourceRow)
106 106
107 def mapToSource(self, proxyIndex): 107 def mapToSource(self, proxyIndex):
108 """ 108 """
200 mdata = QMimeData() 200 mdata = QMimeData()
201 mdata.setUrls(urls) 201 mdata.setUrls(urls)
202 return mdata 202 return mdata
203 203
204 204
205 class HistoryMostVisitedMenuModel(QSortFilterProxyModel):
206 """
207 Class implementing a model to show the most visited history entries.
208 """
209 def __init__(self, sourceModel, parent=None):
210 """
211 Constructor
212
213 @param sourceModel reference to the source model (QAbstractItemModel)
214 @param parent reference to the parent object (QObject)
215 """
216 super().__init__(parent)
217
218 self.setDynamicSortFilter(True)
219 self.setSourceModel(sourceModel)
220
221 def lessThan(self, left, right):
222 """
223 Protected method used to sort the displayed items.
224
225 @param left index of left item (QModelIndex)
226 @param right index of right item (QModelIndex)
227 @return true, if left is less than right (boolean)
228 """
229 frequency_L = \
230 self.sourceModel().data(left, HistoryFilterModel.FrequencyRole)
231 dateTime_L = \
232 self.sourceModel().data(left, HistoryModel.DateTimeRole)
233 frequency_R = \
234 self.sourceModel().data(right, HistoryFilterModel.FrequencyRole)
235 dateTime_R = \
236 self.sourceModel().data(right, HistoryModel.DateTimeRole)
237
238 # Sort results in descending frequency-derived score. If frequencies are equal,
239 # sort on most recently viewed
240 if frequency_R == frequency_L:
241 return dateTime_R < dateTime_L
242
243 return frequency_R < frequency_L
244
245
205 class HistoryMenu(E5ModelMenu): 246 class HistoryMenu(E5ModelMenu):
206 """ 247 """
207 Class implementing the history menu. 248 Class implementing the history menu.
208 249
209 @signal openUrl(QUrl, str) emitted to open a URL in the current tab 250 @signal openUrl(QUrl, str) emitted to open a URL in the current tab
221 E5ModelMenu.__init__(self, parent) 262 E5ModelMenu.__init__(self, parent)
222 263
223 self.__historyManager = None 264 self.__historyManager = None
224 self.__historyMenuModel = None 265 self.__historyMenuModel = None
225 self.__initialActions = [] 266 self.__initialActions = []
267 self.__mostVisitedMenu = None
226 268
227 self.setMaxRows(7) 269 self.setMaxRows(7)
228 270
229 self.activated.connect(self.__activated) 271 self.activated.connect(self.__activated)
230 self.setStatusBarTextRole(HistoryModel.UrlStringRole) 272 self.setStatusBarTextRole(HistoryModel.UrlStringRole)
270 Public method to add any actions after the tree. 312 Public method to add any actions after the tree.
271 """ 313 """
272 if len(self.__historyManager.history()) > 0: 314 if len(self.__historyManager.history()) > 0:
273 self.addSeparator() 315 self.addSeparator()
274 316
317 if self.__mostVisitedMenu is None:
318 self.__mostVisitedMenu = HistoryMostVisitedMenu(10, self)
319 self.__mostVisitedMenu.setTitle(self.trUtf8("Most Visited"))
320 self.__mostVisitedMenu.openUrl.connect(self.openUrl)
321 self.__mostVisitedMenu.newUrl.connect(self.newUrl)
322 self.addMenu(self.__mostVisitedMenu)
323 self.addSeparator()
324
275 act = self.addAction(UI.PixmapCache.getIcon("history.png"), 325 act = self.addAction(UI.PixmapCache.getIcon("history.png"),
276 self.trUtf8("Show All History...")) 326 self.trUtf8("Show All History..."))
277 act.triggered[()].connect(self.__showHistoryDialog) 327 act.triggered[()].connect(self.__showHistoryDialog)
278 act = self.addAction(UI.PixmapCache.getIcon("historyClear.png"), 328 act = self.addAction(UI.PixmapCache.getIcon("historyClear.png"),
279 self.trUtf8("Clear History...")) 329 self.trUtf8("Clear History..."))
306 if self.__historyManager is not None and \ 356 if self.__historyManager is not None and \
307 E5MessageBox.yesNo(self, 357 E5MessageBox.yesNo(self,
308 self.trUtf8("Clear History"), 358 self.trUtf8("Clear History"),
309 self.trUtf8("""Do you want to clear the history?""")): 359 self.trUtf8("""Do you want to clear the history?""")):
310 self.__historyManager.clear() 360 self.__historyManager.clear()
361
362
363 class HistoryMostVisitedMenu(E5ModelMenu):
364 """
365 Class implementing the most visited history menu.
366
367 @signal openUrl(QUrl, str) emitted to open a URL in the current tab
368 @signal newUrl(QUrl, str) emitted to open a URL in a new tab
369 """
370 openUrl = pyqtSignal(QUrl, str)
371 newUrl = pyqtSignal(QUrl, str)
372
373 def __init__(self, count, parent=None):
374 """
375 Constructor
376
377 @param count maximum number of entries to be shown (integer)
378 @param parent reference to the parent widget (QWidget)
379 """
380 E5ModelMenu.__init__(self, parent)
381
382 self.__historyMenuModel = None
383
384 self.setMaxRows(count + 1)
385
386 self.activated.connect(self.__activated)
387 self.setStatusBarTextRole(HistoryModel.UrlStringRole)
388
389 def __activated(self, idx):
390 """
391 Private slot handling the activated signal.
392
393 @param idx index of the activated item (QModelIndex)
394 """
395 if self._keyboardModifiers & Qt.ControlModifier:
396 self.newUrl.emit(
397 idx.data(HistoryModel.UrlRole),
398 idx.data(HistoryModel.TitleRole))
399 else:
400 self.openUrl.emit(
401 idx.data(HistoryModel.UrlRole),
402 idx.data(HistoryModel.TitleRole))
403
404 def prePopulated(self):
405 """
406 Public method to add any actions before the tree.
407
408 @return flag indicating if any actions were added (boolean)
409 """
410 if self.__historyMenuModel is None:
411 historyManager = Helpviewer.HelpWindow.HelpWindow.historyManager()
412 self.__historyMenuModel = \
413 HistoryMostVisitedMenuModel(historyManager.historyFilterModel(), self)
414 self.setModel(self.__historyMenuModel)
415 self.__historyMenuModel.sort(0)
416
417 return False

eric ide

mercurial