eric6/Helpviewer/OfflineStorage/WebDatabasesModel.py

changeset 6942
2602857055c5
parent 6891
93f82da09f22
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
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)

eric ide

mercurial