From d610dfef7ec2cbc2ad9f06bc5b874a61d6e02dcb Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Wed, 26 Apr 2023 14:46:48 +0200
Subject: [PATCH] ASubWindow, geometry: Prepare copy/paste from other source
 and minor change.

---
 src/Model/Geometry/ProfileXYZ.py              |  3 ++-
 src/View/ASubWindow.py                        | 26 +++++++++++++++++++
 src/View/Geometry/GeometryWindow.py           |  1 -
 .../Geometry/Profile/ProfileUndoCommand.py    |  8 ++++--
 src/View/Geometry/Profile/ProfileWindow.py    |  2 ++
 5 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py
index 043f43b5..bd9dec94 100644
--- a/src/Model/Geometry/ProfileXYZ.py
+++ b/src/Model/Geometry/ProfileXYZ.py
@@ -109,10 +109,11 @@ class ProfileXYZ(Profile):
             index: The index of new profile.
 
         Returns:
-            Nothing.
+            The new point.
         """
         point = PointXYZ(0., 0., 0.)
         self._points.insert(index, point)
+        return point
 
     def filter_isnan(self, lst):
         """Returns the input list without 'nan' element
diff --git a/src/View/ASubWindow.py b/src/View/ASubWindow.py
index 03b0f9f3..a47a839a 100644
--- a/src/View/ASubWindow.py
+++ b/src/View/ASubWindow.py
@@ -1,6 +1,9 @@
 # -*- coding: utf-8 -*-
 
 import os
+import csv
+
+from io import StringIO
 
 from PyQt5.QtCore import Qt
 
@@ -21,6 +24,29 @@ class WindowToolKit(object):
     def __init__(self, parent=None):
         super(WindowToolKit, self).__init__()
 
+    def parseClipboardTable(self):
+        clip = QApplication.clipboard()
+        mime = clip.mimeData()
+        # print(mime.formats())
+        data = mime.data('text/plain').data().decode()
+
+        has_header = csv.Sniffer().has_header(data)
+        print(f"header? {has_header}")
+
+        header = []
+        values = []
+
+        stream = StringIO(data)
+        rows = csv.reader(stream, delimiter='\t')
+        for l, row in enumerate(rows):
+            if has_header and l == 0:
+                header = row.copy()
+                continue
+
+            values.append(row)
+
+        return header, values
+
     def file_dialog(self, select_file=True, callback=lambda x: None):
         """Open a new file dialog and send result to callback function
 
diff --git a/src/View/Geometry/GeometryWindow.py b/src/View/Geometry/GeometryWindow.py
index 8a6929b1..3818b2b3 100644
--- a/src/View/Geometry/GeometryWindow.py
+++ b/src/View/Geometry/GeometryWindow.py
@@ -3,7 +3,6 @@
 import os
 import pathlib
 import sys
-import csv
 import time
 
 from copy import deepcopy
diff --git a/src/View/Geometry/Profile/ProfileUndoCommand.py b/src/View/Geometry/Profile/ProfileUndoCommand.py
index 0797c6a5..7036d661 100644
--- a/src/View/Geometry/Profile/ProfileUndoCommand.py
+++ b/src/View/Geometry/Profile/ProfileUndoCommand.py
@@ -53,12 +53,16 @@ class AddCommand(QUndoCommand):
 
         self._profile = profile
         self._index = index
+        self._point = None
 
     def undo(self):
-        self._profile.delete(self._index)
+        self._profile.delete([self._index])
 
     def redo(self):
-        self._profile.insert(self._index)
+        if self._point is None:
+            self._point = self._profile.insert(self._index)
+        else:
+            self._profile.insert_point(self._index, self._point)
 
 class DelCommand(QUndoCommand):
     def __init__(self, profile, rows):
diff --git a/src/View/Geometry/Profile/ProfileWindow.py b/src/View/Geometry/Profile/ProfileWindow.py
index e84751e0..d17d98d0 100644
--- a/src/View/Geometry/Profile/ProfileWindow.py
+++ b/src/View/Geometry/Profile/ProfileWindow.py
@@ -143,6 +143,7 @@ class ProfileWindow(QMainWindow):
         else:
             row = self.index_selected_row()
             self._model.insert_row(row + 1)
+        self.update_plot()
 
     def delete_row(self):
         rows = sorted(
@@ -155,6 +156,7 @@ class ProfileWindow(QMainWindow):
 
         if len(rows) > 0:
             self._model.remove_rows(rows)
+            self.update_plot()
 
     def sort_X_ascending(self):
         self._model.sort('x', order=Qt.AscendingOrder)
-- 
GitLab