diff --git a/src/view/NetworkWindow.py b/src/view/NetworkWindow.py index a540d03fb725eefbea7abf91ffeffa0030f4fb44..72c61a0b017251994336a7aab7c8530e60c74a19 100644 --- a/src/view/NetworkWindow.py +++ b/src/view/NetworkWindow.py @@ -177,6 +177,7 @@ class NetworkWindow(ASubWindow): # Connection self.nodes_model.dataChanged.connect(self.reachs_model.update) + self.nodes_model.dataChanged.connect(self.graph_widget.rename_nodes) self.reachs_model.dataChanged.connect(self.nodes_model.update) self.graph_widget.changeEdge.connect(self.reachs_model.update) self.graph_widget.changeNode.connect(self.nodes_model.update) diff --git a/src/view/network/GraphWidget.py b/src/view/network/GraphWidget.py index bd817c65e2daf1087feca8a9ff94c02619567076..cfca8bdc0324dfa333bcc06fd40787aaf433fd57 100644 --- a/src/view/network/GraphWidget.py +++ b/src/view/network/GraphWidget.py @@ -17,7 +17,7 @@ from PyQt5.QtGui import ( ) from PyQt5.QtWidgets import ( QApplication, QGraphicsItem, QGraphicsScene, - QGraphicsView, QStyle + QGraphicsView, QStyle, QGraphicsTextItem, ) class LandMark(QGraphicsItem): @@ -79,7 +79,7 @@ class NodeItem(QGraphicsItem): def boundingRect(self): adjust = 2.0 - return QRectF(-10 - adjust, -10 - adjust, 23 + adjust, 23 + adjust) + return QRectF(-10 - adjust, -10 - adjust, 20 + adjust, 20 + adjust) def shape(self): path = QPainterPath() @@ -111,12 +111,6 @@ class NodeItem(QGraphicsItem): return super(NodeItem, self).itemChange(change, value) def mousePressEvent(self, event): - # Switch selected node - # if not self.graph.selectedItem() is self: - # self.graph.setSelectedItem(self) - # elif self.graph.selectedItem() is self: - # self.graph.setSelectedNewEdgeSrcNode(self) - self.update() super(NodeItem, self).mousePressEvent(event) @@ -217,6 +211,36 @@ class EdgeItem(QGraphicsItem): painter.drawPolygon(QPolygonF([line_center, arrow_p1, arrow_p2])) +class NodeText(QGraphicsTextItem): + def __init__(self, node_item): + super(NodeText, self).__init__() + + self.item = node_item + self.setPlainText(self.item.node.name) + self.setDefaultTextColor(Qt.black) + #self.setPos(self.item.pos()) + self.set_custom_pos(self.item.pos()) + self.setZValue(2) + + def set_custom_pos(self, pos): + x = pos.x() + y = pos.y() - 42 + + self.setPos(QPointF(x,y)) + + + def paint(self, painter, option, widget): + color = QColor(Qt.white) + color.setAlpha(128) + + painter.setBrush(color) + painter.drawRect(self.boundingRect()) + + super(NodeText, self).paint(painter, option, widget) + + def rename(self): + self.setPlainText(self.item.node.name) + class NewEdgeLine(QGraphicsItem): def __init__(self, src, dest): super(NewEdgeLine, self).__init__() @@ -263,10 +287,11 @@ class GraphWidget(QGraphicsView): self.node_items = [] self.edge_items = [] + self.texts = {} scene = QGraphicsScene(self) scene.setItemIndexMethod(QGraphicsScene.NoIndex) - scene.setSceneRect(0, 0, 1000, 1000) + scene.setSceneRect(0, 0, 2000, 2000) self.setScene(scene) self.setCacheMode(QGraphicsView.CacheBackground) self.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate) @@ -285,9 +310,12 @@ class GraphWidget(QGraphicsView): def create_items(self): self.node_items = [] self.edge_items = [] + self.texts = {} for node in self.graph.nodes(): inode = NodeItem(node, self) + self.texts[inode] = NodeText(inode) + self.scene().addItem(self.texts[inode]) self.scene().addItem(inode) self.node_items.append(inode) @@ -321,6 +349,8 @@ class GraphWidget(QGraphicsView): inode = NodeItem(node, self) self.scene().addItem(inode) self.node_items.append(inode) + self.texts[inode] = NodeText(inode) + self.scene().addItem(self.texts[inode]) self.changeNode.emit(self.sender()) @@ -333,6 +363,8 @@ class GraphWidget(QGraphicsView): ) ) + self.setSelectedItem(None) + for edge in edges: self.graph.remove_edge(edge.edge.name) @@ -343,13 +375,20 @@ class GraphWidget(QGraphicsView): self.changeNode.emit(self.sender()) self.changeEdge.emit(self.sender()) + def rename_nodes(self): + for i in self.texts: + if type(i) == NodeItem: + self.texts[i].rename() + def add_edge(self, node1, node2): if node1 == node2: return + edge = self.graph.add_edge(node1.node, node2.node) # iedge = EdgeItem(node1, node2, edge, self) # self.scene().addItem(iedge) # self.edge_items.append(iedge) + self.setSelectedItem(None) self.setSelectedNewEdgeSrcNode(None) self.tmp_line = None @@ -387,16 +426,21 @@ class GraphWidget(QGraphicsView): def nodeChangePosition(self, pos, node): node.node.setPos(pos.x(), pos.y()) + self.texts[node].set_custom_pos(pos) + self.texts[node].update() def selectedItem(self): return self._selectedItem - def setSelectedItem(self, node): - previous_node = self._selectedItem - self._selectedItem = node + def setSelectedItem(self, item): + previous_item = self._selectedItem + self._selectedItem = item - if previous_node: - previous_node.update() + if previous_item: + previous_item.update() + + if item: + item.update() def selectedNewEdgeSrcNode(self): return self._selectedNewEdgeSrcNode @@ -518,5 +562,6 @@ class GraphWidget(QGraphicsView): self.tmp_line.dest = pos self.tmp_line.update() - self.update() - super(GraphWidget, self).mouseMoveEvent(event) + if self._state == "move": + self.update() + super(GraphWidget, self).mouseMoveEvent(event)