--- a/Helpviewer/AdBlock/AdBlockModel.py Mon Jul 30 19:19:29 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,319 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2009 - 2012 Detlev Offenbach <detlev@die-offenbachs.de> -# - -""" -Module implementing a model for the AdBlock dialog. -""" - -from PyQt4.QtCore import Qt, QAbstractItemModel, QModelIndex - -import Helpviewer.HelpWindow - - -class AdBlockModel(QAbstractItemModel): - """ - Class implementing a model for the AdBlock dialog. - """ - def __init__(self, parent=None): - """ - Constructor - - @param parent reference to the parent object (QObject) - """ - super().__init__(parent) - - self.__manager = Helpviewer.HelpWindow.HelpWindow.adblockManager() - self.__manager.rulesChanged.connect(self.__rulesChanged) - - def __rulesChanged(self): - """ - Private slot to handle changes in rules. - """ - self.reset() - - def rule(self, index): - """ - Public method to get the rule given it's index. - - @param index index of the rule (QModelIndex) - @return reference to the rule (AdBlockRule) - """ - parent = index.internalPointer() - return parent.allRules()[index.row()] - - def subscription(self, index): - """ - Public method to get the subscription given it's index. - - @param index index of the subscription (QModelIndex) - @return reference to the subscription (AdBlockSubscription) - """ - parent = index.internalPointer() - if parent is not None: - return None - row = index.row() - if row < 0 or row >= len(self.__manager.subscriptions()): - return None - return self.__manager.subscriptions()[row] - - def subscriptionIndex(self, subscription): - """ - Public method to get the index of a subscription. - - @param subscription reference to the subscription (AdBlockSubscription) - @return index of the subscription (QModelIndex) - """ - try: - row = self.__manager.subscriptions().index(subscription) - if row < 0 or row >= len(self.__manager.subscriptions()): - return QModelIndex() - return self.createIndex(row, 0, 0) - except ValueError: - return QModelIndex() - - 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: - if section == 0: - return self.trUtf8("Rule") - 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 bookmark to get data for (QModelIndex) - @param role data role (integer) - @return bookmark data - """ - if not index.isValid() or index.model() != self or index.column() != 0: - return None - - if role in [Qt.EditRole, Qt.DisplayRole]: - if index.parent().isValid(): - r = self.rule(index) - return r.filter() - else: - sub = self.subscription(index) - if sub is not None: - return sub.title() - - elif role == Qt.CheckStateRole: - if index.parent().isValid(): - r = self.rule(index) - if r.isEnabled(): - return Qt.Checked - else: - return Qt.Unchecked - else: - sub = self.subscription(index) - if sub is not None: - if sub.isEnabled(): - return Qt.Checked - else: - return Qt.Unchecked - - return None - - 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 1 - - 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.__manager.subscriptions()) - - if parent.internalPointer() is not None: - return 0 - - parentNode = self.subscription(parent) - if parentNode is not None: - return len(parentNode.allRules()) - - return 0 - - def index(self, row, column, parent=QModelIndex()): - """ - Public method to get a model index for a node cell. - - @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 not parent.isValid(): - return self.createIndex(row, column, None) - - parentNode = self.subscription(parent) - return self.createIndex(row, column, parentNode) - - def parent(self, index=QModelIndex()): - """ - Public method to get the index of the parent node. - - @param index index of the child node (QModelIndex) - @return index of the parent node (QModelIndex) - """ - if not index.isValid(): - return QModelIndex() - - parent = index.internalPointer() - if parent is None: - return QModelIndex() - - parentRow = self.__manager.subscriptions().index(parent) - return self.createIndex(parentRow, 0, None) - - def flags(self, index): - """ - Public method to get flags for a node cell. - - @param index index of the node cell (QModelIndex) - @return flags (Qt.ItemFlags) - """ - if not index.isValid(): - return Qt.NoItemFlags - - flags = Qt.ItemIsSelectable - - if index.parent().isValid(): - flags |= Qt.ItemIsUserCheckable | Qt.ItemIsEditable - - parentNode = self.subscription(index.parent()) - if parentNode is not None and parentNode.isEnabled(): - flags |= Qt.ItemIsEnabled - else: - flags |= Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsEnabled - - return flags - - def removeRows(self, row, count, parent=QModelIndex()): - """ - Public method to remove bookmarks from the model. - - @param row row of the first bookmark to remove (integer) - @param count number of bookmarks to remove (integer) - @param index of the parent bookmark node (QModelIndex) - @return flag indicating successful removal (boolean) - """ - if row < 0 or count <= 0 or row + count > self.rowCount(parent): - return False - - if not parent.isValid(): - self.__manager.rulesChanged.disconnect(self.__rulesChanged) - self.beginRemoveRows(QModelIndex(), row, row + count - 1) - for subscription in self.__manager.subscriptions()[row:row + count]: - self.__manager.removeSubscription(subscription) - self.endRemoveRows() - self.__manager.rulesChanged.connect(self.__rulesChanged) - return True - else: - sub = self.subscription(parent) - if sub is not None: - self.__manager.rulesChanged.disconnect(self.__rulesChanged) - self.beginRemoveRows(parent, row, row + count - 1) - for i in reversed(list(range(row, row + count))): - sub.removeRule(i) - self.endRemoveRows() - self.__manager.rulesChanged.connect(self.__rulesChanged) - return True - - return False - - def setData(self, index, value, role=Qt.EditRole): - """ - Public method to set the data of a node cell. - - @param index index of the node cell (QModelIndex) - @param value value to be set - @param role role of the data (integer) - @return flag indicating success (boolean) - """ - if not index.isValid() or \ - index.model() != self or \ - index.column() != 0 or \ - (self.flags(index) & Qt.ItemIsEditable) == 0: - return False - - self.__manager.rulesChanged.disconnect(self.__rulesChanged) - changed = False - - if role in [Qt.EditRole, Qt.DisplayRole]: - if index.parent().isValid(): - sub = self.subscription(index.parent()) - if sub is not None: - r = self.rule(index) - r.setFilter(value) - sub.replaceRule(r, index.row()) - self.dataChanged.emit(index, index) - changed = True - else: - sub = self.subscription(index) - if sub is not None: - sub.setTitle(value) - self.dataChanged.emit(index, index) - changed = True - - elif role == Qt.CheckStateRole: - if index.parent().isValid(): - sub = self.subscription(index.parent()) - if sub is not None: - r = self.rule(index) - r.setEnabled(value == Qt.Checked) - sub.replaceRule(r, index.row()) - self.dataChanged.emit(index, index) - changed = True - else: - sub = self.subscription(index) - if sub is not None: - sub.setEnabled(value == Qt.Checked) - self.dataChanged.emit(index, index) - changed = True - - self.__manager.rulesChanged.connect(self.__rulesChanged) - return changed - - 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.internalPointer() is None: - return True - - return False