eric7/WebBrowser/History/HistoryModel.py

branch
eric7
changeset 8312
800c432b34c8
parent 8243
cc717c2ae956
child 8318
962bce857696
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2009 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the history model.
8 """
9
10 import contextlib
11
12 from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex, QUrl
13
14 import WebBrowser.WebBrowserWindow
15
16
17 class HistoryModel(QAbstractTableModel):
18 """
19 Class implementing the history model.
20 """
21 DateRole = Qt.ItemDataRole.UserRole + 1
22 DateTimeRole = Qt.ItemDataRole.UserRole + 2
23 UrlRole = Qt.ItemDataRole.UserRole + 3
24 UrlStringRole = Qt.ItemDataRole.UserRole + 4
25 TitleRole = Qt.ItemDataRole.UserRole + 5
26 VisitCountRole = Qt.ItemDataRole.UserRole + 6
27 MaxRole = VisitCountRole
28
29 def __init__(self, historyManager, parent=None):
30 """
31 Constructor
32
33 @param historyManager reference to the history manager object
34 (HistoryManager)
35 @param parent reference to the parent object (QObject)
36 """
37 super().__init__(parent)
38
39 self.__historyManager = historyManager
40
41 self.__headers = [
42 self.tr("Title"),
43 self.tr("Address"),
44 self.tr("Visit Count")
45 ]
46
47 self.__historyManager.historyReset.connect(self.historyReset)
48 self.__historyManager.entryRemoved.connect(self.historyReset)
49 self.__historyManager.entryAdded.connect(self.entryAdded)
50 self.__historyManager.entryUpdated.connect(self.entryUpdated)
51
52 def historyReset(self):
53 """
54 Public slot to reset the model.
55 """
56 self.beginResetModel()
57 self.endResetModel()
58
59 def entryAdded(self):
60 """
61 Public slot to handle the addition of a history entry.
62 """
63 self.beginInsertRows(QModelIndex(), 0, 0)
64 self.endInsertRows()
65
66 def entryUpdated(self, row):
67 """
68 Public slot to handle the update of a history entry.
69
70 @param row row number of the updated entry (integer)
71 """
72 idx = self.index(row, 0)
73 self.dataChanged.emit(idx, idx)
74
75 def headerData(self, section, orientation,
76 role=Qt.ItemDataRole.DisplayRole):
77 """
78 Public method to get the header data.
79
80 @param section section number (integer)
81 @param orientation header orientation (Qt.Orientation)
82 @param role data role (Qt.ItemDataRole)
83 @return header data
84 """
85 if (
86 orientation == Qt.Orientation.Horizontal and
87 role == Qt.ItemDataRole.DisplayRole
88 ):
89 with contextlib.suppress(IndexError):
90 return self.__headers[section]
91 return QAbstractTableModel.headerData(self, section, orientation, role)
92
93 def data(self, index, role=Qt.ItemDataRole.DisplayRole):
94 """
95 Public method to get data from the model.
96
97 @param index index of history entry to get data for (QModelIndex)
98 @param role data role (integer)
99 @return history entry data
100 """
101 lst = self.__historyManager.history()
102 if index.row() < 0 or index.row() > len(lst):
103 return None
104
105 itm = lst[index.row()]
106 if role == self.DateTimeRole:
107 return itm.dateTime
108 elif role == self.DateRole:
109 return itm.dateTime.date()
110 elif role == self.UrlRole:
111 return QUrl(itm.url)
112 elif role == self.UrlStringRole:
113 return itm.url
114 elif role == self.TitleRole:
115 return itm.userTitle()
116 elif role == self.VisitCountRole:
117 return itm.visitCount
118 elif role in [Qt.ItemDataRole.DisplayRole, Qt.ItemDataRole.EditRole]:
119 if index.column() == 0:
120 return itm.userTitle()
121 elif index.column() == 1:
122 return itm.url
123 elif index.column() == 2:
124 return itm.visitCount
125 elif (
126 role == Qt.ItemDataRole.DecorationRole and
127 index.column() == 0
128 ):
129 return WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(
130 QUrl(itm.url))
131
132 return None
133
134 def columnCount(self, parent=None):
135 """
136 Public method to get the number of columns.
137
138 @param parent index of parent (QModelIndex)
139 @return number of columns (integer)
140 """
141 if parent is None:
142 parent = QModelIndex()
143
144 if parent.isValid():
145 return 0
146 else:
147 return len(self.__headers)
148
149 def rowCount(self, parent=None):
150 """
151 Public method to determine the number of rows.
152
153 @param parent index of parent (QModelIndex)
154 @return number of rows (integer)
155 """
156 if parent is None:
157 parent = QModelIndex()
158
159 if parent.isValid():
160 return 0
161 else:
162 return len(self.__historyManager.history())
163
164 def removeRows(self, row, count, parent=None):
165 """
166 Public method to remove history entries from the model.
167
168 @param row row of the first history entry to remove (integer)
169 @param count number of history entries to remove (integer)
170 @param parent index of the parent entry (QModelIndex)
171 @return flag indicating successful removal (boolean)
172 """
173 if parent is None:
174 parent = QModelIndex()
175
176 if parent.isValid():
177 return False
178
179 lastRow = row + count - 1
180 self.beginRemoveRows(parent, row, lastRow)
181 lst = self.__historyManager.history()[:]
182 for index in range(lastRow, row - 1, -1):
183 del lst[index]
184 self.__historyManager.historyReset.disconnect(self.historyReset)
185 self.__historyManager.setHistory(lst)
186 self.__historyManager.historyReset.connect(self.historyReset)
187 self.endRemoveRows()
188 return True

eric ide

mercurial