Helpviewer/OfflineStorage/WebDatabasesModel.py

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

eric ide

mercurial