From b32a6e7fb46af5ab6fedad4dc7648dca49731c84 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Thu, 20 Apr 2023 16:24:56 +0200
Subject: [PATCH] geometry: Active undo/redo shortcut.

---
 src/View/Geometry/GeometryWindow.py   | 40 +++++++++++++++++++--------
 src/View/Geometry/ReachUndoCommand.py |  2 +-
 src/View/Geometry/qtableview_reach.py | 10 ++++---
 3 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/src/View/Geometry/GeometryWindow.py b/src/View/Geometry/GeometryWindow.py
index 8b792219..ef2a3e5e 100644
--- a/src/View/Geometry/GeometryWindow.py
+++ b/src/View/Geometry/GeometryWindow.py
@@ -9,12 +9,16 @@ import time
 from tools import timer
 
 from PyQt5 import QtWidgets
+from PyQt5.QtGui import (
+    QKeySequence,
+)
 from PyQt5.QtCore import (
     QModelIndex, Qt, QSettings, pyqtSlot,
     QItemSelectionModel, QCoreApplication, QSize
 )
 from PyQt5.QtWidgets import (
-    QApplication, QMainWindow, QFileDialog, QCheckBox
+    QApplication, QMainWindow, QFileDialog, QCheckBox,
+    QUndoStack, QShortcut,
 )
 
 from View.Geometry.PlotXY import PlotXY
@@ -29,8 +33,6 @@ from View.ASubWindow import WindowToolKit
 _translate = QCoreApplication.translate
 
 
-
-
 class GeometryWindow(QMainWindow, WindowToolKit):
     def __init__(self, model=None, parent=None):
         self.parent = parent
@@ -48,19 +50,26 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self._tablemodel = None
 
         self.setup_window()
+        self.setup_undo()
         self.setup_model()
         self.setup_plots()
-        # self.setup_undo()
         self.setup_connections()
         self.changed_slider_value()
 
     def setup_window(self):
         self.setWindowTitle(f"{self.ui.mainwindow_title} - {self._reach.name}")
 
+    def setup_undo(self):
+        self._undo_stack = QUndoStack()
+
+        self.undo_sc = QShortcut(QKeySequence.Undo, self)
+        self.redo_sc = QShortcut(QKeySequence.Redo, self)
+
     def setup_model(self):
         self._tablemodel = qtableview_reach.PandasModelEditable(
             headers = self.ui.tableView_header,
-            reach = self._reach
+            reach = self._reach,
+            undo = self._undo_stack
         )
         self.tableView.setModel(self._tablemodel)
         self.tableView.setItemDelegate(qtableview_reach.Delegate())
@@ -71,12 +80,6 @@ class GeometryWindow(QMainWindow, WindowToolKit):
             self.plot_kpc()
             self.plot_ac()
 
-    # def setup_undo(self):
-        # self.undoAction = self.undoStack.createUndoAction(self, self.tr("&Undo"))
-        # self.undoAction.setShortcuts(QKeySequence.Undo)
-        # self.redoAction = self.undoStack.createRedoAction(self, self.tr("&Redo"))
-        # self.redoAction.setShortcuts(QKeySequence.Redo)
-
     def setup_connections(self):
         self.ui.btn_open.clicked.connect(self.open_file_dialog)
         self.ui.btn_sort_asc.clicked.connect(self.sort_ascending)
@@ -93,6 +96,9 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self.ui.btn_slider_down.clicked.connect(self.increment_value_slider)
         self.ui.btn_move_up.clicked.connect(self.changed_profile_slot)
 
+        self.undo_sc.activated.connect(self.undo)
+        self.redo_sc.activated.connect(self.redo)
+
         # Profile selection when line change in table
         self.tableView.selectionModel()\
                       .selectionChanged\
@@ -412,6 +418,18 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self._tablemodel.move_row_up(row)
         self.select_current_profile()
 
+    def undo(self):
+        self._tablemodel.undo()
+        self.select_current_profile()
+        self.update_plot_xy()
+        self.update_plot_kpc()
+
+    def redo(self):
+        self._tablemodel.redo()
+        self.select_current_profile()
+        self.update_plot_xy()
+        self.update_plot_kpc()
+
     def handleSave(self):
         options = QFileDialog.Options()
         DEFAULT_DIRECTORY = '/home/'
diff --git a/src/View/Geometry/ReachUndoCommand.py b/src/View/Geometry/ReachUndoCommand.py
index efedd047..7aacde6f 100644
--- a/src/View/Geometry/ReachUndoCommand.py
+++ b/src/View/Geometry/ReachUndoCommand.py
@@ -41,7 +41,7 @@ class AddCommand(QUndoCommand):
         self._index = index
 
     def undo(self):
-        self._reach.delete([self._index])
+        self._reach.delete(self._index)
 
     def redo(self):
         self._reach.insert(self._index)
diff --git a/src/View/Geometry/qtableview_reach.py b/src/View/Geometry/qtableview_reach.py
index d6e9321d..b965d21b 100644
--- a/src/View/Geometry/qtableview_reach.py
+++ b/src/View/Geometry/qtableview_reach.py
@@ -9,7 +9,10 @@ import numpy as np
 import pandas as pd
 
 from PyQt5 import (
-    QtGui, QtWidgets
+    QtGui, QtWidgets,
+)
+from PyQt5.QtGui import (
+    QKeySequence,
 )
 from PyQt5.QtCore import (
     Qt, QAbstractTableModel, QModelIndex,
@@ -27,12 +30,11 @@ _translate = QCoreApplication.translate
 
 
 class PandasModelEditable(QAbstractTableModel):
-    def __init__(self, reach, headers=None):
+    def __init__(self, reach, headers=None, undo=None):
         QAbstractTableModel.__init__(self)
         data_list = []
 
-        self._undo_stack = QUndoStack()
-
+        self._undo_stack = undo
         self._reach = reach
 
         if headers is None:
-- 
GitLab