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 |