Helpviewer/OfflineStorage/WebDatabasesModel.py

changeset 353
c548890dff9b
child 791
9ec2ac20e54e
diff -r 049fc2fc04ac -r c548890dff9b Helpviewer/OfflineStorage/WebDatabasesModel.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Helpviewer/OfflineStorage/WebDatabasesModel.py	Sat Jun 19 16:37:10 2010 +0200
@@ -0,0 +1,212 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the web databases model.
+"""
+
+import sys
+
+from PyQt4.QtCore import QAbstractItemModel, QModelIndex, Qt
+from PyQt4.QtWebKit import QWebSecurityOrigin, QWebDatabase
+
+class WebDatabasesModel(QAbstractItemModel):
+    """
+    Class implementing the web databases model.
+    """
+    def __init__(self, parent = None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (QObject)
+        """
+        QAbstractItemModel.__init__(self, parent)
+        self.__headers = [
+            self.trUtf8("Name"), 
+            self.trUtf8("Size")
+        ]
+        
+        self.__data = []
+        for origin in QWebSecurityOrigin.allOrigins():
+            self.__data.append([origin, origin.databases()])
+    
+    def removeRows(self, row, count, parent = QModelIndex()):
+        """
+        Public method to remove databases from the model.
+        
+        @param row row of the first database to remove (integer)
+        @param count number of databases to remove (integer)
+        @param parent index of the security origin (QModelIndex)
+        @return flag indicating successful removal (boolean)
+        """
+        if row < 0 or count <= 0 or row + count > self.rowCount(parent):
+            return False
+        
+        if parent.isValid():
+            self.beginRemoveRows(parent, row, row + count - 1)
+            parentRow = parent.row()
+            for db in self.__data[parentRow][1][row:row + count]:
+                QWebDatabase.removeDatabase(db)
+            del self.__data[parentRow][1][row:row + count]
+            self.endRemoveRows()
+        else:
+            for parentRow in range(row, row + count):
+                self.beginRemoveRows(self.index(parentRow, 0, parent), 
+                                     0, len(self.__data[parentRow][1]) - 1)
+                for db in self.__data[parentRow][1]:
+                    QWebDatabase.removeDatabase(db)
+                del self.__data[parentRow][1][:]
+                self.endRemoveRows()
+        
+        return True
+    
+    def headerData(self, section, orientation, role = Qt.DisplayRole):
+        """
+        Public method to get the header data.
+        
+        @param section section number (integer)
+        @param orientation header orientation (Qt.Orientation)
+        @param role data role (integer)
+        @return header data
+        """
+        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
+            try:
+                return self.__headers[section]
+            except IndexError:
+                pass
+        return QAbstractItemModel.headerData(self, section, orientation, role)
+    
+    def data(self, index, role = Qt.DisplayRole):
+        """
+        Public method to get data from the model.
+        
+        @param index index of entry to get data for (QModelIndex)
+        @param role data role (integer)
+        @return entry data
+        """
+        if not index.isValid() or index.model() != self:
+            return None
+        
+        if role == Qt.DisplayRole:
+            parent = index.parent()
+            if not parent.isValid():
+                # security origin
+                origin = self.__data[index.row()][0]
+                if index.column() == 0:
+                    if origin.host() == "":
+                        return self.trUtf8("Local")
+                    elif origin.port() == 0:
+                        return "{0}://{1}".format(
+                            origin.scheme(), 
+                            origin.host(), 
+                        )
+                    else:
+                        return "{0}://{1}:{2}".format(
+                            origin.scheme(), 
+                            origin.host(), 
+                            origin.port(), 
+                        )
+                elif index.column() == 1:
+                    return self.__dataString(origin.databaseUsage())
+            else:
+                # web database
+                db = self.__data[parent.row()][1][index.row()]
+                if index.column() == 0:
+                    return self.trUtf8("{0} ({1})").format(db.displayName(), db.name())
+                elif index.column() == 1:
+                    return self.__dataString(db.size())
+    
+    def columnCount(self, parent = QModelIndex()):
+        """
+        Public method to get the number of columns.
+        
+        @param parent index of parent (QModelIndex)
+        @return number of columns (integer)
+        """
+        if parent.column() > 0:
+            return 0
+        else:
+            return len(self.__headers)
+    
+    def rowCount(self, parent = QModelIndex()):
+        """
+        Public method to determine the number of rows.
+        
+        @param parent index of parent (QModelIndex)
+        @return number of rows (integer)
+        """
+        if parent.column() > 0:
+            return 0
+        
+        if not parent.isValid():
+            return len(self.__data)
+        else:
+            return len(self.__data[parent.row()][1])
+    
+    def index(self, row, column, parent = QModelIndex()):
+        """
+        Public method to get a model index for an entry.
+        
+        @param row row number (integer)
+        @param column column number (integer)
+        @param parent index of the parent (QModelIndex)
+        @return index (QModelIndex)
+        """
+        if row < 0 or column < 0 or \
+           row >= self.rowCount(parent) or column >= self.columnCount(parent):
+            return QModelIndex()
+        
+        if parent.isValid():
+            return self.createIndex(row, column, parent.row())
+        else:
+            return self.createIndex(row, column, sys.maxsize)
+    
+    def parent(self, index = QModelIndex()):
+        """
+        Public method to get the index of the parent entry.
+        
+        @param index index of the child entry (QModelIndex)
+        @return index of the parent entry (QModelIndex)
+        """
+        if not index.isValid():
+            return QModelIndex()
+        
+        if index.internalId() == sys.maxsize:
+            return QModelIndex()
+        
+        return self.createIndex(index.internalId(), 0)
+    
+    def hasChildren(self, parent = QModelIndex()):
+        """
+        Public method to check, if a parent node has some children.
+        
+        @param parent index of the parent node (QModelIndex)
+        @return flag indicating the presence of children (boolean)
+        """
+        if not parent.isValid():
+            return True
+        
+        if parent.internalId() == sys.maxsize:
+            return True
+        
+        return False
+    
+    def __dataString(self, size):
+        """
+        Private method to generate a formatted data string.
+        
+        @param size size to be formatted (integer)
+        @return formatted data string (string)
+        """
+        unit = ""
+        if size < 1024:
+            unit = self.trUtf8("bytes")
+        elif size < 1024 * 1024:
+            size /= 1024
+            unit = self.trUtf8("kB")
+        else:
+            size /= 1024 * 1024
+            unit = self.trUtf8("MB")
+        return "{0:.1f} {1}".format(size, unit)

eric ide

mercurial