Ejemplo n.º 1
0
class VariableModel(QAbstractItemModel):
    def __init__(self, do, parent=None):
        QAbstractItemModel.__init__(self, parent)
        self._vars = VariableList(TreeVariableFactory, do)

        do.signalProxy.cleanupModels.connect(self.clear)
        do.signalProxy.aboutToUpdateVariables.connect(self.__unmarkAll)

    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()

        parentItem = parent.internalPointer() if parent.isValid() else None
        if parentItem:
            childItem = parentItem._child(row)
        else:
            childItem = self._vars[row]

        return self.createIndex(row, column, childItem)

    def parent(self, index):
        if not index.isValid():
            return QModelIndex()

        childItem = index.internalPointer()
        parentItem = childItem._parent

        if not parentItem:
            return QModelIndex()

        return self.createIndex(parentItem._row, 0, parentItem)

    def rowCount(self, parent):
        if parent.column() > 0:
            return 0

        if not parent.isValid():
            return len(self._vars)
        else:
            return parent.internalPointer()._childCount()

    def columnCount(self, _):
        return 3

    def data(self, index, role):
        if not index.isValid():
            return None

        item = index.internalPointer()
        ret = None
        if role == Qt.DisplayRole:
            if index.column() == 0:
                ret = item.exp
            elif index.column() == 1:
                ret = item.type
            elif index.column() == 2:
                ret = item.value

        elif role == Qt.EditRole:
            if index.column() == 2:
                ret = item.value

        elif role == Qt.DecorationRole:
            if index.column() == 0:
                if item.access in ['private', 'protected']:
                    iconprefix = item.access + "_"
                else:
                    iconprefix = ""

                icon = None
                if not item.inScope:
                    return QPixmap(":/icons/images/outofscope.png")
                elif not isinstance(item, StdVariable):
                    icon = QPixmap(":/icons/images/" + iconprefix + "struct.png")
                else:  # leave item
                    icon = QPixmap(":/icons/images/" + iconprefix + "var.png")

                # overlay for arguments
                if icon and item.arg:
                    ol = QPixmap(":/icons/images/overlay_arg.png")
                    p = QPainter(icon)
                    p.drawPixmap(ol.rect(), ol)
                elif icon and item.exp == "Return value":
                    ol = QPixmap(":/icons/images/overlay_ret.png")
                    p = QPainter(icon)
                    p.drawPixmap(ol.rect(), ol)
                return icon

        elif role == Qt.BackgroundRole:
            if not item.inScope:
                ret = QBrush(Qt.gray)
            elif index.column() == 2:
                if item.marked and item.inScope:
                    ret = QBrush(Qt.yellow)

        return ret

    def headerData(self, section, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return ["Expression", "Type", "Value"][section]
        return None

    def addVar(self, name):
        self.beginInsertRows(QModelIndex(), len(self._vars), len(self._vars))
        var = self._vars.addVarByName(name)
        var.setNodeData(len(self._vars) - 1, None, self)
        self.endInsertRows()
        return var

    def hasChildren(self, parent):
        if not parent.isValid():
            return True

        return parent.internalPointer()._hasChildren()

    def emitDataChanged(self, tl, br):
        self.dataChanged.emit(tl, br)

    def mimeTypes(self):
        return [variable.MIME_TYPE]

    def mimeData(self, indexes):
        if len(indexes) == 1:
            item = indexes[0].internalPointer()
            d = QMimeData()
            d.setData(variable.MIME_TYPE, item.uniqueName)
            return d
        else:
            return None

    def flags(self, index):
        if not index.isValid():
            return Qt.ItemIsDropEnabled

        item = index.internalPointer()
        if not item.inScope:
            return Qt.ItemIsEnabled | Qt.ItemIsSelectable

        ret = Qt.ItemIsEnabled | Qt.ItemIsSelectable

        if index.column() == 2:
            ret |= Qt.ItemIsEditable
        elif index.column() == 0:
            ret |= Qt.ItemIsDragEnabled

        return ret

    def removeVar(self, var):
        pos = self._vars._vars.index(var)
        self.removeRows(pos, 1, QModelIndex())

    def removeRows(self, position, rows, parent):
        """ removes the selected row in the model
        @param position   int, starting position of selection
        @param rows       int, number of rows to delete beginning at starting position
        @param parent     TreeItem, parent item containing items to delete
        """
        parentItem = parent.internalPointer()
        if parentItem:
            logging.error("Cannot remove a child variable.")
            return False

        self.beginRemoveRows(parent, position, position + rows - 1)
        for i in range(position, position + rows):
            self._vars.removeIdx(i)

        # fix the _row members of the remaining elements
        for offset, var in enumerate(self._vars[position:]):
            var._row = position + offset
        self.endRemoveRows()
        return True

    def clear(self):
        self.beginResetModel()
        self._vars.clear()
        self.endResetModel()

    def setData(self, index, value, role):
        if index.isValid() and role == Qt.EditRole:
            index.internalPointer().assignValue(value)
            return True
        return False

    def __unmarkAll(self):
        for i in self._vars._vars:
            i.unmarkAll()
Ejemplo n.º 2
0
class VariableModel(QAbstractItemModel):
    def __init__(self, do, parent=None):
        QAbstractItemModel.__init__(self, parent)
        self._vars = VariableList(TreeVariableFactory, do)

        do.signalProxy.cleanupModels.connect(self.clear)
        do.signalProxy.aboutToUpdateVariables.connect(self.__unmarkAll)

    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()

        parentItem = parent.internalPointer() if parent.isValid() else None
        if parentItem:
            childItem = parentItem._child(row)
        else:
            childItem = self._vars[row]

        return self.createIndex(row, column, childItem)

    def parent(self, index):
        if not index.isValid():
            return QModelIndex()

        childItem = index.internalPointer()
        parentItem = childItem._parent

        if not parentItem:
            return QModelIndex()

        return self.createIndex(parentItem._row, 0, parentItem)

    def rowCount(self, parent):
        if parent.column() > 0:
            return 0

        if not parent.isValid():
            return len(self._vars)
        else:
            return parent.internalPointer()._childCount()

    def columnCount(self, _):
        return 3

    def data(self, index, role):
        if not index.isValid():
            return None

        item = index.internalPointer()
        ret = None
        if role == Qt.DisplayRole:
            if index.column() == 0:
                ret = item.exp
            elif index.column() == 1:
                ret = item.type
            elif index.column() == 2:
                ret = item.value

        elif role == Qt.EditRole:
            if index.column() == 2:
                ret = item.value

        elif role == Qt.DecorationRole:
            if index.column() == 0:
                if item.access in ['private', 'protected']:
                    iconprefix = item.access + "_"
                else:
                    iconprefix = ""

                icon = None
                if not item.inScope:
                    return QPixmap(":/icons/images/outofscope.png")
                elif not isinstance(item, StdVariable):
                    icon = QPixmap(":/icons/images/" + iconprefix +
                                   "struct.png")
                else:  # leave item
                    icon = QPixmap(":/icons/images/" + iconprefix + "var.png")

                # overlay for arguments
                if icon and item.arg:
                    ol = QPixmap(":/icons/images/overlay_arg.png")
                    p = QPainter(icon)
                    p.drawPixmap(ol.rect(), ol)
                elif icon and item.exp == "Return value":
                    ol = QPixmap(":/icons/images/overlay_ret.png")
                    p = QPainter(icon)
                    p.drawPixmap(ol.rect(), ol)
                return icon

        elif role == Qt.BackgroundRole:
            if not item.inScope:
                ret = QBrush(Qt.gray)
            elif index.column() == 2:
                if item.marked and item.inScope:
                    ret = QBrush(Qt.yellow)

        return ret

    def headerData(self, section, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return ["Expression", "Type", "Value"][section]
        return None

    def addVar(self, name):
        self.beginInsertRows(QModelIndex(), len(self._vars), len(self._vars))
        var = self._vars.addVarByName(name)
        var.setNodeData(len(self._vars) - 1, None, self)
        self.endInsertRows()
        return var

    def hasChildren(self, parent):
        if not parent.isValid():
            return True

        return parent.internalPointer()._hasChildren()

    def emitDataChanged(self, tl, br):
        self.dataChanged.emit(tl, br)

    def mimeTypes(self):
        return QStringList([variable.MIME_TYPE])

    def mimeData(self, indexes):
        if len(indexes) == 1:
            item = indexes[0].internalPointer()
            d = QMimeData()
            d.setData(variable.MIME_TYPE, item.uniqueName)
            return d
        else:
            return None

    def flags(self, index):
        if not index.isValid():
            return Qt.ItemIsDropEnabled

        item = index.internalPointer()
        if not item.inScope:
            return Qt.ItemIsEnabled | Qt.ItemIsSelectable

        ret = Qt.ItemIsEnabled | Qt.ItemIsSelectable

        if index.column() == 2:
            ret |= Qt.ItemIsEditable
        elif index.column() == 0:
            ret |= Qt.ItemIsDragEnabled

        return ret

    def removeVar(self, var):
        pos = self._vars._vars.index(var)
        self.removeRows(pos, 1, QModelIndex())

    def removeRows(self, position, rows, parent):
        """ removes the selected row in the model
        @param position   int, starting position of selection
        @param rows       int, number of rows to delete beginning at starting position
        @param parent     TreeItem, parent item containing items to delete
        """
        parentItem = parent.internalPointer()
        if parentItem:
            logging.error("Cannot remove a child variable.")
            return False

        self.beginRemoveRows(parent, position, position + rows - 1)
        for i in xrange(position, position + rows):
            self._vars.removeIdx(i)

        # fix the _row members of the remaining elements
        for offset, var in enumerate(self._vars[position:]):
            var._row = position + offset
        self.endRemoveRows()
        return True

    def clear(self):
        self.beginResetModel()
        self._vars.clear()
        self.endResetModel()

    def setData(self, index, value, role):
        if index.isValid() and role == Qt.EditRole:
            index.internalPointer().assignValue(value.toString())
            return True
        return False

    def __unmarkAll(self):
        for i in self._vars._vars:
            i.unmarkAll()