status_data = status_index.data().toString()
hostname_index = model.index(index.row(), 1, index.parent())
hostname_data = hostname_index.data().toString()
+ tags_index = model.index(index.row(), 3, index.parent())
if status_data == node_status['in']:
model.setData(status_index, QString(node_status['remove']))
if hostname_data in already_in_nodes: model.setData(status_index, QString(node_status['in']))
else: model.setData(status_index, QString(node_status['out']))
- model.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), hostname_index, hostname_index)
+ model.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), hostname_index, tags_index)
def currentChanged(self, current, previous):
model = current.model()
painter.restore()
+class NodeTagDelegate(QStyledItemDelegate):
+ def __init__(self, parent):
+ QStyledItemDelegate.__init__(self, parent)
+
+ def paint(self, painter, option, index):
+ model = index.model()
+ taglist = index.data().toStringList()
+ status_index = model.index(index.row(), 2, index.parent())
+ status_data = status_index.data().toString()
+
+ if taglist.isEmpty() or status_data not in (node_status['in'], ""):
+ return
+
+
+ fm = QFontMetrics(option.font)
+ rect = option.rect
+ rect.setHeight(rect.height() - 2)
+ rect.setX(rect.x() + 4)
+
+ for i in range(0, len(taglist), 2):
+ # This taglist is pretty much of a hack. Not quite sure the best
+ # way to use Qt data structures.
+ data = taglist[i]
+ status = taglist[i+1]
+ rect.setWidth(fm.width(QString(data)) + 8)
+ x, y, h, w = rect.x(), rect.y(), rect.height(), rect.width()
+
+ path = QPainterPath()
+ path.addRoundedRect(x, y, w, h, 4, 4)
+
+ painter.save()
+ painter.setRenderHint(QPainter.Antialiasing)
+ painter.drawRoundedRect(rect, 4, 4)
+
+ if status == 'in': # already in the slice
+ painter.fillPath(path, QColor("cyan"))
+ painter.setPen(QColor.fromRgb(0, 0, 0))
+ painter.drawText(option.rect, 0, QString(data))
+
+ elif status == 'add': # newly added to the slice
+ painter.fillPath(path, QColor.fromRgb(0, 250, 0))
+ painter.setPen(QColor.fromRgb(0, 0, 0))
+ painter.drawText(option.rect, 0, QString(data))
+
+ elif status == 'remove': # removed from the slice
+ painter.fillPath(path, QColor.fromRgb(250, 0, 0))
+ painter.setPen(QColor.fromRgb(0, 0, 0))
+ painter.drawText(option.rect, 0, QString(data))
+
+ painter.restore()
+ rect.setX(rect.x() + rect.width() + 4)
+
+
class TreeItem:
def __init__(self, data, parent=None):
self.parentItem = parent
self.filterModel = QSortFilterProxyModel(self) # enable filtering
self.nodeNameDelegate = NodeNameDelegate(self)
+ self.nodeTagDelegate = NodeTagDelegate(self)
refresh = QPushButton("Update Slice Data", self)
refresh.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
networks = rspec.get_network_list()
for network in networks:
self.network_names.append(network)
- attrs = ""
- for (name, value) in rspec.get_default_sliver_attributes(network):
- attrs += "%s/%s " % (name, value)
- networkItem = TreeItem([QString(network), QString(""), QString(""), QString(attrs)], self.nodeModel.rootItem)
-
+ data = [QString(network), QString(""), QString("")]
+ taglist = QStringList()
+ attrs = rspec.get_default_sliver_attributes(network)
+ for (name, value) in attrs:
+ taglist.append(QString("%s/%s" % (name, value)))
+ taglist.append(QString("in"))
+ data.append(taglist)
+ networkItem = TreeItem(data, self.nodeModel.rootItem)
all_nodes = rspec.get_node_list(network)
sliver_nodes = rspec.get_sliver_list(network)
available_nodes = filter(lambda x:x not in sliver_nodes, all_nodes)
already_in_nodes += sliver_nodes
for node in sliver_nodes:
- attrs = ""
- for (name, value) in rspec.get_sliver_attributes(node, network):
- attrs += "%s/%s " % (name, value)
- nodeItem = TreeItem([QString(""), QString("%s" % node), QString(node_status['in']), QString(attrs)], networkItem)
+ data = [QString(""), QString(node), QString(node_status['in'])]
+ taglist = QStringList()
+ attrs = rspec.get_sliver_attributes(node, network)
+ for (name, value) in attrs:
+ taglist.append(QString("%s/%s" % (name, value)))
+ taglist.append(QString("in"))
+ data.append(taglist)
+ nodeItem = TreeItem(data, networkItem)
+
+ attrs = rspec.get_sliver_attributes(node, network)
networkItem.appendChild(nodeItem)
for node in available_nodes:
self.filterModel.setDynamicSortFilter(True)
self.nodeView.setItemDelegateForColumn(1, self.nodeNameDelegate)
+ self.nodeView.setItemDelegateForColumn(3, self.nodeTagDelegate)
self.nodeView.setModel(self.filterModel)
self.nodeView.expandAll()
self.nodeView.resizeColumnToContents(1)