diff --git a/src/Model/Network/Graph.py b/src/Model/Network/Graph.py index 93a407c60d09867e935d332b358997c157979ddf..eb91614a782299d94f9978d95792fe4f68b03e31 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 eee76ee9eeae2c3c95d13bfae274133313370b73..13a7d4f4aaf4ddf411830b2da208ad905db03744 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 ea7e2657eae1eddb6603fe04cbf956a7bcc2b1df..72c4f8ae8f9a1ddeec47a9776f8e624025faf194 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)