From cb344122665ea5c0867dd25014aa22ca98e5ef4d Mon Sep 17 00:00:00 2001 From: Andy Bavier Date: Fri, 18 Feb 2011 10:52:03 -0500 Subject: [PATCH] Draw boxes around tag values Associate a status ("in", "add", "remove") with each tag. Draw a colored box around the tag that represents its status. --- sface/screens/mainscreen.py | 85 ++++++++++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 10 deletions(-) diff --git a/sface/screens/mainscreen.py b/sface/screens/mainscreen.py index 968d683..7b4bc67 100644 --- a/sface/screens/mainscreen.py +++ b/sface/screens/mainscreen.py @@ -35,6 +35,7 @@ class NodeView(QTreeView): 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'])) @@ -44,7 +45,7 @@ class NodeView(QTreeView): 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() @@ -105,6 +106,59 @@ class NodeNameDelegate(QStyledItemDelegate): 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 @@ -299,6 +353,7 @@ class SliceWidget(QWidget): 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) @@ -418,11 +473,14 @@ class SliceWidget(QWidget): 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) @@ -430,10 +488,16 @@ class SliceWidget(QWidget): 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: @@ -447,6 +511,7 @@ class SliceWidget(QWidget): 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) -- 2.43.0