From a44dc91ae94d5ea87d6d19eb975c51ac72d64aaa Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Thu, 8 Jun 2023 16:09:00 +0200
Subject: [PATCH] Network: Connect first undo command.

---
 src/View/Network/GraphWidget.py | 14 +++++++--
 src/View/Network/Table.py       | 26 ++++++++++++++--
 src/View/Network/UndoCommand.py | 53 +++++++++++++++++++++++++++++++++
 src/View/Network/Window.py      |  4 ++-
 4 files changed, 92 insertions(+), 5 deletions(-)
 create mode 100644 src/View/Network/UndoCommand.py

diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py
index 0971d851..8cdcff55 100644
--- a/src/View/Network/GraphWidget.py
+++ b/src/View/Network/GraphWidget.py
@@ -21,6 +21,8 @@ from Model.Network.Node import Node
 from Model.Network.Edge import Edge
 from Model.Network.Graph import Graph
 
+from View.Network.UndoCommand import *
+
 _translate = QCoreApplication.translate
 
 
@@ -424,13 +426,21 @@ class GraphWidget(QGraphicsView):
                 self.texts[i].rename()
 
     def enable_edge(self, edge, prev):
-        edge.edge.enable(enable = not prev)
+        self._undo.push(
+            EnableEdgeCommand(
+                edge.edge, not prev
+            )
+        )
         self.changeEdge.emit(self.sender())
         self.changeNode.emit(self.sender())
         self.display_update()
 
     def reverse_edge(self, edge):
-        edge.edge.reverse()
+        self._undo.push(
+            ReverseEdgeCommand(
+                edge.edge
+            )
+        )
         self.changeEdge.emit(self.sender())
         self.display_update()
 
diff --git a/src/View/Network/Table.py b/src/View/Network/Table.py
index 33bd3d33..3031350a 100644
--- a/src/View/Network/Table.py
+++ b/src/View/Network/Table.py
@@ -5,6 +5,7 @@ from Model.Network.Edge import Edge
 from Model.Network.Graph import Graph
 from View.ASubWindow import ASubWindow
 from View.Network.GraphWidget import GraphWidget
+from View.Network.UndoCommand import *
 
 from PyQt5.QtCore import (
     Qt, QRect, QVariant, QAbstractTableModel, pyqtSlot, pyqtSignal,
@@ -17,6 +18,7 @@ from PyQt5.QtWidgets import (
     QApplication,
 )
 
+
 class ComboBoxDelegate(QItemDelegate):
     def __init__(self, graph=None, parent=None):
         super(ComboBoxDelegate, self).__init__(parent)
@@ -140,9 +142,29 @@ class GraphTableModel(QAbstractTableModel):
                 if (self.headers[index.column()] == "node1" or
                     self.headers[index.column()] == "node2"):
                     node = self.graph.node(value)
-                    self.rows[index.row()][self.headers[index.column()]] = node
+                    self._undo.push(
+                        SetCommand(
+                            self.rows[index.row()],
+                            self.headers[index.column()],
+                            node
+                        )
+                    )
+                    # self.rows[index.row()][self.headers[index.column()]] = node
+                elif self.headers[index.column()] == "enable":
+                    self._undo.push(
+                        EnableEdgeCommand(
+                            self.rows[index.row()], value
+                        )
+                    )
                 else:
-                    self.rows[index.row()][self.headers[index.column()]] = value
+                    self._undo.push(
+                        SetCommand(
+                            self.rows[index.row()],
+                            self.headers[index.column()],
+                            value
+                        )
+                    )
+                    # self.rows[index.row()][self.headers[index.column()]] = value
 
                 self.dataChanged.emit(index, index, [Qt.DisplayRole])
                 self.layoutChanged.emit()
diff --git a/src/View/Network/UndoCommand.py b/src/View/Network/UndoCommand.py
new file mode 100644
index 00000000..f845ed81
--- /dev/null
+++ b/src/View/Network/UndoCommand.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+
+from copy import deepcopy
+from tools import trace, timer
+
+from PyQt5.QtWidgets import (
+    QMessageBox, QUndoCommand, QUndoStack,
+)
+
+from Model.Network.Node import Node
+from Model.Network.Edge import Edge
+from Model.Network.Graph import Graph
+
+class SetCommand(QUndoCommand):
+    def __init__(self, element, column, new_value):
+        QUndoCommand.__init__(self)
+
+        self._el = element
+        self._column = column
+        self._old = self._el[self._column]
+        self._new = new_value
+
+    def undo(self):
+        self._el[self._column] = self._old
+
+    def redo(self):
+        self._el[self._column] = self._new
+
+class EnableEdgeCommand(QUndoCommand):
+    def __init__(self, edge, enable):
+        QUndoCommand.__init__(self)
+
+        self._edge = edge
+        self._old = self._edge._enable
+        self._enable = enable
+
+    def undo(self):
+        self._edge.enable(enable = self._old)
+
+    def redo(self):
+        self._edge.enable(enable = self._enable)
+
+class ReverseEdgeCommand(QUndoCommand):
+    def __init__(self, edge):
+        QUndoCommand.__init__(self)
+
+        self._edge = edge
+
+    def undo(self):
+        self._edge.reverse()
+
+    def redo(self):
+        self._edge.reverse()
diff --git a/src/View/Network/Window.py b/src/View/Network/Window.py
index f3df8c15..8fdf3988 100644
--- a/src/View/Network/Window.py
+++ b/src/View/Network/Window.py
@@ -33,7 +33,9 @@ class NetworkWindow(ASubMainWindow):
 
         self.setup_title()
 
-        super(NetworkWindow, self).__init__(name=self._title, ui="Network", parent=parent)
+        super(NetworkWindow, self).__init__(
+            name=self._title, ui="Network", parent=parent
+        )
         self.ui.setWindowTitle(self._title)
 
         self.setup_sc()
-- 
GitLab