|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2010 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the web databases model. |
|
8 """ |
|
9 |
|
10 from __future__ import unicode_literals |
|
11 |
|
12 import sys |
|
13 |
|
14 from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt |
|
15 from PyQt5.QtWebKit import QWebSecurityOrigin, QWebDatabase |
|
16 |
|
17 |
|
18 class WebDatabasesModel(QAbstractItemModel): |
|
19 """ |
|
20 Class implementing the web databases model. |
|
21 """ |
|
22 def __init__(self, parent=None): |
|
23 """ |
|
24 Constructor |
|
25 |
|
26 @param parent reference to the parent object (QObject) |
|
27 """ |
|
28 super(WebDatabasesModel, self).__init__(parent) |
|
29 self.__headers = [ |
|
30 self.tr("Name"), |
|
31 self.tr("Size") |
|
32 ] |
|
33 |
|
34 self.__data = [] |
|
35 for origin in QWebSecurityOrigin.allOrigins(): |
|
36 self.__data.append([origin, origin.databases()]) |
|
37 |
|
38 def removeRows(self, row, count, parent=None): |
|
39 """ |
|
40 Public method to remove databases from the model. |
|
41 |
|
42 @param row row of the first database to remove (integer) |
|
43 @param count number of databases to remove (integer) |
|
44 @param parent index of the security origin (QModelIndex) |
|
45 @return flag indicating successful removal (boolean) |
|
46 """ |
|
47 if parent is None: |
|
48 parent = QModelIndex() |
|
49 |
|
50 if row < 0 or count <= 0 or row + count > self.rowCount(parent): |
|
51 return False |
|
52 |
|
53 if parent.isValid(): |
|
54 self.beginRemoveRows(parent, row, row + count - 1) |
|
55 parentRow = parent.row() |
|
56 for db in self.__data[parentRow][1][row:row + count]: |
|
57 QWebDatabase.removeDatabase(db) |
|
58 del self.__data[parentRow][1][row:row + count] |
|
59 self.endRemoveRows() |
|
60 else: |
|
61 for parentRow in range(row, row + count): |
|
62 self.beginRemoveRows(self.index(parentRow, 0, parent), |
|
63 0, len(self.__data[parentRow][1]) - 1) |
|
64 for db in self.__data[parentRow][1]: |
|
65 QWebDatabase.removeDatabase(db) |
|
66 del self.__data[parentRow][1][:] |
|
67 self.endRemoveRows() |
|
68 |
|
69 return True |
|
70 |
|
71 def headerData(self, section, orientation, role=Qt.DisplayRole): |
|
72 """ |
|
73 Public method to get the header data. |
|
74 |
|
75 @param section section number (integer) |
|
76 @param orientation header orientation (Qt.Orientation) |
|
77 @param role data role (integer) |
|
78 @return header data |
|
79 """ |
|
80 if orientation == Qt.Horizontal and role == Qt.DisplayRole: |
|
81 try: |
|
82 return self.__headers[section] |
|
83 except IndexError: |
|
84 pass |
|
85 return QAbstractItemModel.headerData(self, section, orientation, role) |
|
86 |
|
87 def data(self, index, role=Qt.DisplayRole): |
|
88 """ |
|
89 Public method to get data from the model. |
|
90 |
|
91 @param index index of entry to get data for (QModelIndex) |
|
92 @param role data role (integer) |
|
93 @return entry data |
|
94 """ |
|
95 if not index.isValid() or index.model() != self: |
|
96 return None |
|
97 |
|
98 if role == Qt.DisplayRole: |
|
99 parent = index.parent() |
|
100 if not parent.isValid(): |
|
101 # security origin |
|
102 origin = self.__data[index.row()][0] |
|
103 if index.column() == 0: |
|
104 if origin.host() == "": |
|
105 return self.tr("Local") |
|
106 elif origin.port() == 0: |
|
107 return "{0}://{1}".format( |
|
108 origin.scheme(), |
|
109 origin.host(), |
|
110 ) |
|
111 else: |
|
112 return "{0}://{1}:{2}".format( |
|
113 origin.scheme(), |
|
114 origin.host(), |
|
115 origin.port(), |
|
116 ) |
|
117 elif index.column() == 1: |
|
118 return self.__dataString(origin.databaseUsage()) |
|
119 else: |
|
120 # web database |
|
121 db = self.__data[parent.row()][1][index.row()] |
|
122 if index.column() == 0: |
|
123 return self.tr("{0} ({1})").format( |
|
124 db.displayName(), db.name()) |
|
125 elif index.column() == 1: |
|
126 return self.__dataString(db.size()) |
|
127 |
|
128 return None |
|
129 |
|
130 def columnCount(self, parent=None): |
|
131 """ |
|
132 Public method to get the number of columns. |
|
133 |
|
134 @param parent index of parent (QModelIndex) |
|
135 @return number of columns (integer) |
|
136 """ |
|
137 if parent is None: |
|
138 parent = QModelIndex() |
|
139 |
|
140 if parent.column() > 0: |
|
141 return 0 |
|
142 else: |
|
143 return len(self.__headers) |
|
144 |
|
145 def rowCount(self, parent=None): |
|
146 """ |
|
147 Public method to determine the number of rows. |
|
148 |
|
149 @param parent index of parent (QModelIndex) |
|
150 @return number of rows (integer) |
|
151 """ |
|
152 if parent is None: |
|
153 parent = QModelIndex() |
|
154 |
|
155 if parent.column() > 0: |
|
156 return 0 |
|
157 |
|
158 if not parent.isValid(): |
|
159 return len(self.__data) |
|
160 else: |
|
161 return len(self.__data[parent.row()][1]) |
|
162 |
|
163 def index(self, row, column, parent=None): |
|
164 """ |
|
165 Public method to get a model index for an entry. |
|
166 |
|
167 @param row row number (integer) |
|
168 @param column column number (integer) |
|
169 @param parent index of the parent (QModelIndex) |
|
170 @return index (QModelIndex) |
|
171 """ |
|
172 if parent is None: |
|
173 parent = QModelIndex() |
|
174 |
|
175 if row < 0 or column < 0 or \ |
|
176 row >= self.rowCount(parent) or column >= self.columnCount(parent): |
|
177 return QModelIndex() |
|
178 |
|
179 if parent.isValid(): |
|
180 return self.createIndex(row, column, parent.row()) |
|
181 else: |
|
182 return self.createIndex(row, column, sys.maxsize) |
|
183 |
|
184 def parent(self, index=None): |
|
185 """ |
|
186 Public method to get the index of the parent entry. |
|
187 |
|
188 @param index index of the child entry (QModelIndex) |
|
189 @return index of the parent entry (QModelIndex) |
|
190 """ |
|
191 if index is None: |
|
192 index = QModelIndex() |
|
193 |
|
194 if not index.isValid(): |
|
195 return QModelIndex() |
|
196 |
|
197 if index.internalId() == sys.maxsize: |
|
198 return QModelIndex() |
|
199 |
|
200 return self.createIndex(index.internalId(), 0) |
|
201 |
|
202 def hasChildren(self, parent=None): |
|
203 """ |
|
204 Public method to check, if a parent node has some children. |
|
205 |
|
206 @param parent index of the parent node (QModelIndex) |
|
207 @return flag indicating the presence of children (boolean) |
|
208 """ |
|
209 if parent is None: |
|
210 parent = QModelIndex() |
|
211 |
|
212 if not parent.isValid(): |
|
213 return True |
|
214 |
|
215 if parent.internalId() == sys.maxsize: |
|
216 return True |
|
217 |
|
218 return False |
|
219 |
|
220 def __dataString(self, size): |
|
221 """ |
|
222 Private method to generate a formatted data string. |
|
223 |
|
224 @param size size to be formatted (integer) |
|
225 @return formatted data string (string) |
|
226 """ |
|
227 unit = "" |
|
228 if size < 1024: |
|
229 unit = self.tr("bytes") |
|
230 elif size < 1024 * 1024: |
|
231 size /= 1024 |
|
232 unit = self.tr("kB") |
|
233 else: |
|
234 size /= 1024 * 1024 |
|
235 unit = self.tr("MB") |
|
236 return "{0:.1f} {1}".format(size, unit) |