From 0c0d7f34811f7578370e049c1327cbb085484b5b Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Tue, 16 Apr 2024 15:15:30 +0200
Subject: [PATCH] Network: Fix edge delete whene there are multiple edge
 between two node.

---
 doc/dev/documentation.org         |  2 +-
 src/Model/Network/Graph.py        | 28 +++++++++-------------------
 src/Model/Network/test_network.py |  6 +++---
 src/View/Network/GraphWidget.py   |  4 ++++
 src/View/Network/UndoCommand.py   | 10 +++++-----
 5 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org
index bbef8dc2..6d5edf6c 100644
--- a/doc/dev/documentation.org
+++ b/doc/dev/documentation.org
@@ -636,7 +636,7 @@ class AddNodeCommand(QUndoCommand):
         self._node = node
 
     def undo(self):
-        self._graph.remove_node(self._node.name)
+        self._graph.remove_node(self._node)
 
     def redo(self):
         self._graph.insert_node(self._node)
diff --git a/src/Model/Network/Graph.py b/src/Model/Network/Graph.py
index 9fb48fa0..69ded845 100644
--- a/src/Model/Network/Graph.py
+++ b/src/Model/Network/Graph.py
@@ -142,26 +142,21 @@ 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._remove_associated_edge(node_name)
+    def remove_node(self, node):
+        self._nodes.remove(node)
+        self._remove_associated_edge(node)
         self._status.modified()
 
-    def _remove_associated_edge(self, node_name: str):
+    def _remove_associated_edge(self, node: str):
         edges = list(
             filter(
-                lambda e: (e.node1.name == node_name or
-                           e.node2.name == node_name),
+                lambda e: (e.node1 == node or
+                           e.node2 == node),
                 self._edges,
             )
         )
         for edge in edges:
-            self.remove_edge(edge.name)
+            self.remove_edge(edge)
 
     def create_node(self, x: float = 0.0, y: float = 0.0):
         node = self._create_node(x, y)
@@ -197,13 +192,8 @@ class Graph(object):
     def create_edge(self, n1: Node, n2: Node):
         return self._create_edge(n1, n2)
 
-    def remove_edge(self, edge_name: str):
-        self._edges = list(
-            filter(
-                lambda e: e.name != edge_name,
-                self._edges
-            )
-        )
+    def remove_edge(self, edge):
+        self._edges.remove(edge)
         self._status.modified()
 
     def is_upstream_node(self, node):
diff --git a/src/Model/Network/test_network.py b/src/Model/Network/test_network.py
index e9b5c428..23cbdcce 100644
--- a/src/Model/Network/test_network.py
+++ b/src/Model/Network/test_network.py
@@ -60,7 +60,7 @@ class GraphTestCase(unittest.TestCase):
 
         e0 = g.add_edge(n0, n1)
 
-        g.remove_edge(e0.name)
+        g.remove_edge(e0)
 
         self.assertEqual(g.nodes_counts(), 2)
         self.assertEqual(g.edges_counts(), 0)
@@ -73,7 +73,7 @@ class GraphTestCase(unittest.TestCase):
 
         e0 = g.add_edge(n0, n1)
 
-        g.remove_node(n0.name)
+        g.remove_node(n0)
 
         self.assertEqual(g.nodes_counts(), 1)
         self.assertEqual(g.edges_counts(), 0)
@@ -88,7 +88,7 @@ class GraphTestCase(unittest.TestCase):
         e0 = g.add_edge(n0, n1)
         e1 = g.add_edge(n1, n2)
 
-        g.remove_node(n1.name)
+        g.remove_node(n1)
 
         self.assertEqual(g.nodes_counts(), 2)
         self.assertEqual(g.edges_counts(), 0)
diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py
index 88a6ad07..5db5e7df 100644
--- a/src/View/Network/GraphWidget.py
+++ b/src/View/Network/GraphWidget.py
@@ -457,9 +457,13 @@ class GraphWidget(QGraphicsView):
         self.m_origin_y = 0.0
         self.clicked = False
 
+        self.setup_scene(min_size, max_size, size)
+
+    def setup_scene(self, min_size, max_size, size):
         scene = QGraphicsScene(self)
         scene.setItemIndexMethod(QGraphicsScene.NoIndex)
         scene.setSceneRect(0, 0, 2000, 2000)
+
         self.setScene(scene)
         self.setCacheMode(QGraphicsView.CacheBackground)
         self.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
diff --git a/src/View/Network/UndoCommand.py b/src/View/Network/UndoCommand.py
index 5c752c0d..1a77840e 100644
--- a/src/View/Network/UndoCommand.py
+++ b/src/View/Network/UndoCommand.py
@@ -40,7 +40,7 @@ class AddNodeCommand(QUndoCommand):
         self._node = node
 
     def undo(self):
-        self._graph.remove_node(self._node.name)
+        self._graph.remove_node(self._node)
 
     def redo(self):
         self._graph.insert_node(self._node)
@@ -85,9 +85,9 @@ class DelNodeCommand(QUndoCommand):
         )
 
         for edge in self._edges:
-            self._graph.remove_edge(edge.name)
+            self._graph.remove_edge(edge)
 
-        self._graph.remove_node(self._node.name)
+        self._graph.remove_node(self._node)
 
 
 class AddEdgeCommand(QUndoCommand):
@@ -98,7 +98,7 @@ class AddEdgeCommand(QUndoCommand):
         self._edge = edge
 
     def undo(self):
-        self._graph.remove_edge(self._edge.name)
+        self._graph.remove_edge(self._edge)
 
     def redo(self):
         self._graph.insert_edge(self._edge)
@@ -115,7 +115,7 @@ class DelEdgeCommand(QUndoCommand):
         self._graph.insert_edge(self._edge)
 
     def redo(self):
-        self._graph.remove_edge(self._edge.name)
+        self._graph.remove_edge(self._edge)
 
 
 class SetCommand(QUndoCommand):
-- 
GitLab