From ded95ef0978b083674e1566ba04138b5128bb8c6 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> Date: Fri, 9 Jun 2023 09:33:13 +0200 Subject: [PATCH] Network: Add edge add and del command. --- src/Model/Network/Graph.py | 34 +++++++++++++++++++++------------ src/View/Network/GraphWidget.py | 14 ++++++++++++-- src/View/Network/UndoCommand.py | 27 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/Model/Network/Graph.py b/src/Model/Network/Graph.py index 93a407c6..eb91614a 100644 --- a/src/Model/Network/Graph.py +++ b/src/Model/Network/Graph.py @@ -103,10 +103,29 @@ class Graph(object): def insert_node(self, node): return self._add_node(node) + def remove_node(self, node_name:str): + self._nodes = list( + filter( + lambda n: n.name != node_name, + self._nodes + ) + ) + self._status.modified() + def create_node(self, x:float = 0.0, y:float = 0.0): node = self._create_node(x, y) return node + def _create_edge(self, n1:Node, n2:Node): + edge = self._edge_ctor( + self._edges_ids, + "", n1, n2, + status = self._status + ) + self._edges_ids += 1 + return edge + + def _add_edge(self, edge): # This edge already exists ? if any(filter(lambda e: (e.node1 == edge.node1 and @@ -115,28 +134,19 @@ class Graph(object): return None self._edges.append(edge) - self._edges_ids += 1 self._status.modified() return edge def add_edge(self, n1:Node, n2:Node): - edge = self._edge_ctor(self._edges_ids, - "", n1, n2, - status = self._status) + edge = self._create_edge(n1, n2) return self._add_edge(edge) def insert_edge(self, edge): return self._add_edge(edge) - def remove_node(self, node_name:str): - self._nodes = list( - filter( - lambda n: n.name != node_name, - self._nodes - ) - ) - self._status.modified() + def create_edge(self, n1:Node, n2:Node): + return self._create_edge(n1, n2) def remove_edge(self, edge_name:str): self._edges = list( diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py index eee76ee9..13a7d4f4 100644 --- a/src/View/Network/GraphWidget.py +++ b/src/View/Network/GraphWidget.py @@ -462,7 +462,12 @@ class GraphWidget(QGraphicsView): if node1 == node2: return - edge = self.graph.add_edge(node1.node, node2.node) + edge = self.graph.create_edge(node1.node, node2.node) + self._undo.push( + AddEdgeCommand( + self.graph, edge + ) + ) self.set_selected_item(None) self.set_selected_new_edge_src_node(None) # Reset the temporary line @@ -484,7 +489,11 @@ class GraphWidget(QGraphicsView): Nothing """ edge = item.edge - self.graph.remove_edge(edge.name) + self._undo.push( + DelEdgeCommand( + self.graph, edge + ) + ) # Clear all scene and redraw it self.scene().clear() @@ -776,6 +785,7 @@ class GraphWidget(QGraphicsView): def _menu_edge(self, event, pos, items, menu): delete = menu.addAction(_translate("Network", "Delete the reach")) + if self.graph.is_enable_edge(items[0].edge): enable = menu.addAction(_translate("Network", "Disable the reach")) is_enable = True diff --git a/src/View/Network/UndoCommand.py b/src/View/Network/UndoCommand.py index ea7e2657..72c4f8ae 100644 --- a/src/View/Network/UndoCommand.py +++ b/src/View/Network/UndoCommand.py @@ -52,6 +52,33 @@ class DelNodeCommand(QUndoCommand): self._graph.remove_node(self._node.name) +class AddEdgeCommand(QUndoCommand): + def __init__(self, graph, edge): + QUndoCommand.__init__(self) + + self._graph = graph + self._edge = edge + + def undo(self): + self._graph.remove_edge(self._edge.name) + + def redo(self): + self._graph.insert_edge(self._edge) + +class DelEdgeCommand(QUndoCommand): + def __init__(self, graph, edge): + QUndoCommand.__init__(self) + + self._graph = graph + self._edge = edge + + def undo(self): + self._graph.insert_edge(self._edge) + + def redo(self): + self._graph.remove_edge(self._edge.name) + + class SetCommand(QUndoCommand): def __init__(self, element, column, new_value): QUndoCommand.__init__(self) -- GitLab