-
-class TreeItem:
- def __init__(self, data, parent=None):
- self.parentItem = parent
- self.itemData = data
- self.childItems = []
-
- def clear(self):
- for child in self.childItems:
- child.clear()
- del child
- del self.childItems
- self.childItems = []
-
- def allChildItems(self):
- all = []
- for c in self.childItems:
- all.append(c)
- if c.childItems:
- all.extend(c.allChildItems())
- return all
-
- def appendChild(self, child):
- self.childItems.append(child)
-
- def child(self, row):
- return self.childItems[row]
-
- def childCount(self):
- return len(self.childItems)
-
- def childNumber(self):
- if self.parentItem:
- return self.parentItem.childItems.index(self)
- return 0
-
- def columnCount(self):
- return len(self.itemData)
-
- def data(self, column):
- return self.itemData[column]
-
- def insertChildren(self, position, count, columns):
- if position < 0 or position > len(self.childItems):
- return False
-
- for row in range(count):
- data = self.data(columns)
- item = TreeItem(data, self)
- self.childItems.insert(position, item)
-
- return True
-
- def insertColumns(self, position, columns):
- if position < 0 or position > len(self.itemData):
- return False
-
- for column in range(columns):
- self.itemData.insert(position, QVariant())
-
- for child in self.childItems:
- child.insertColumns(position, columns)
-
- return True
-
- def setData(self, column, value):
- if column < 0 or column >= len(self.itemData):
- return False
-
- self.itemData[column] = value
- return True
-
- def parent(self):
- return self.parentItem
-
-
-class NodeModel(QAbstractItemModel):
- def __init__(self, parent):
- QAbstractItemModel.__init__(self, parent)
- self.__initRoot()
-
- def clear(self):
- self.rootItem.clear()
- self.__initRoot()
-
- def __initRoot(self):
- self.rootItem = TreeItem([QString("Testbed"), QString("Hostname"), QString("Status")])
-
- def getItem(self, index):
- if index.isValid():
- item = index.internalPointer()
- if isinstance(item, TreeItem):
- return item
- return self.rootItem
-
- def headerData(self, section, orientation, role):
- if orientation == Qt.Horizontal and role in (Qt.DisplayRole, Qt.EditRole):
- return self.rootItem.data(section)
- return QVariant()
-
- def index(self, row, column, parent):
- if not self.hasIndex(row, column, parent):
- return QModelIndex()
-
- parentItem = self.getItem(parent)
- childItem = parentItem.child(row)
- if childItem:
- return self.createIndex(row, column, childItem)
- else:
- return QModelIndex()
-
- def insertColumns(self, position, columns, parent):
- self.beginInsertColumns(parent, position, position + columns -1)
- ret = self.rootItem.insertColumns(position, columns)
- self.endInsertColumns()
- return ret
-
- def insertRows(self, position, rows, parent):
- parentItem = self.getItem(parent)
- self.beginInsertRows(parent, position, position + rows -1)
- ret = parentItem.insertChildren(position, rows, self.rootItem.columnCount())
- self.endInsertRows()
- return ret
-
- def parent(self, index):
- if not index.isValid():
- return QModelIndex()
-
- childItem = self.getItem(index)
- parentItem = childItem.parent()
- if parentItem is self.rootItem:
- return QModelIndex()
-
- return self.createIndex(parentItem.childNumber(), 0, parentItem)
-
- def rowCount(self, parent=QModelIndex()):
- parentItem = self.getItem(parent)
- return parentItem.childCount()
-
- def columnCount(self, parent=None):
- return self.rootItem.columnCount()
-
- def data(self, index, role):
- if not index.isValid():
- return QVariant()
-
- if role != Qt.DisplayRole and role != Qt.EditRole:
- return QVariant()
-
- item = self.getItem(index)
- return item.data(index.column())
-
- def nodestatus(self, index):
- if not index.isValid():
- return QVariant()
-
- item = self.getItem(index)
- return item.nodestatus(index.column())
-
- def flags(self, index):
- if not index.isValid():
- return 0
- return Qt.ItemIsEnabled | Qt.ItemIsSelectable# | Qt.ItemIsEditable
-
- def setData(self, index, value, role):
- if role != Qt.EditRole:
- return False
-
- item = self.getItem(index)
- ret = item.setData(index.column(), value)
- if ret:
- self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), index, index)
- return ret
-
-