From 2f0b5b2e31a368da2292e74af51b96eea8bdbed7 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Wed, 3 May 2023 17:14:12 +0200
Subject: [PATCH] BC: Edit: Add plot (not finish).

---
 .../BoundaryConditionWindow.py                |  2 +
 src/View/BoundaryCondition/Edit/Plot.py       | 67 +++++++++++++++++++
 src/View/BoundaryCondition/Edit/Table.py      | 17 ++---
 .../BoundaryCondition/Edit/UndoCommand.py     |  2 +-
 src/View/BoundaryCondition/Edit/Window.py     | 16 +++++
 src/View/BoundaryCondition/Edit/translate.py  | 11 +++
 src/View/ui/BoundaryConditions.ui             | 48 +++++++++----
 7 files changed, 139 insertions(+), 24 deletions(-)
 create mode 100644 src/View/BoundaryCondition/Edit/Plot.py
 create mode 100644 src/View/BoundaryCondition/Edit/translate.py

diff --git a/src/View/BoundaryCondition/BoundaryConditionWindow.py b/src/View/BoundaryCondition/BoundaryConditionWindow.py
index 07fdeb6f..0688b700 100644
--- a/src/View/BoundaryCondition/BoundaryConditionWindow.py
+++ b/src/View/BoundaryCondition/BoundaryConditionWindow.py
@@ -27,10 +27,12 @@ from View.BoundaryCondition.BCUndoCommand import (
     AddCommand, DelCommand, SortCommand,
     MoveCommand, PasteCommand, DuplicateCommand,
 )
+
 from Model.BoundaryCondition.BoundaryConditionTypes import (
     NotDefined, PonctualContribution,
     TimeOverZ, TimeOverDebit, ZOverDebit
 )
+
 from View.BoundaryCondition.translate import long_types
 from View.BoundaryCondition.Edit.Window import EditBoundaryConditionWindow
 
diff --git a/src/View/BoundaryCondition/Edit/Plot.py b/src/View/BoundaryCondition/Edit/Plot.py
new file mode 100644
index 00000000..be3ad854
--- /dev/null
+++ b/src/View/BoundaryCondition/Edit/Plot.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+from tools import timer, trace
+from View.Plot.APlot import APlot
+
+from PyQt5.QtCore import (
+    QCoreApplication
+)
+
+from View.BoundaryCondition.Edit.translate import *
+
+_translate = QCoreApplication.translate
+
+class Plot(APlot):
+    def __init__(self, canvas=None, data=None, toolbar=None):
+        super(Plot, self).__init__(
+            canvas=canvas,
+            data=data,
+            toolbar=toolbar
+        )
+
+    @timer
+    def draw(self):
+        self.canvas.axes.cla()
+        self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5)
+
+        if len(self.data) == 0:
+            self._init = False
+            return
+
+        # Plot data
+        x = list(map(lambda v: v[0], self.data.data))
+        y = list(map(lambda v: v[1], self.data.data))
+        self._line, = self.canvas.axes.plot(
+            x, y,
+            color='r', lw=1.,
+            markersize=5, marker='+',
+            picker=30
+        )
+
+        # Plot label
+        header = self.data.header
+        self.canvas.axes.set_xlabel(
+            table_headers[header[0]], color='black', fontsize=10
+        )
+        self.canvas.axes.set_ylabel(
+            table_headers[header[1]], color='black', fontsize=10
+        )
+
+        self.canvas.figure.tight_layout()
+        self.canvas.figure.canvas.draw_idle()
+        self.toolbar.update()
+
+        self._init = True
+
+    @timer
+    def update(self, ind=None):
+        if self._init == False:
+            self.draw()
+            return
+
+        # if ind is not None:
+
+        # else:
+
+        self.canvas.figure.tight_layout()
+        self.canvas.figure.canvas.draw_idle()
diff --git a/src/View/BoundaryCondition/Edit/Table.py b/src/View/BoundaryCondition/Edit/Table.py
index 9235bee8..1e9033d0 100644
--- a/src/View/BoundaryCondition/Edit/Table.py
+++ b/src/View/BoundaryCondition/Edit/Table.py
@@ -15,25 +15,20 @@ from PyQt5.QtWidgets import (
     QTableView, QAbstractItemView,
 )
 
+from Model.BoundaryCondition.BoundaryConditionTypes import (
+    NotDefined, PonctualContribution,
+    TimeOverZ, TimeOverDebit, ZOverDebit
+)
+
 from View.BoundaryCondition.Edit.UndoCommand import (
     SetDataCommand, AddCommand, DelCommand,
     SortCommand, MoveCommand, PasteCommand,
     DuplicateCommand,
 )
-
-from Model.BoundaryCondition.BoundaryConditionTypes import (
-    NotDefined, PonctualContribution,
-    TimeOverZ, TimeOverDebit, ZOverDebit
-)
+from View.BoundaryCondition.Edit.translate import *
 
 _translate = QCoreApplication.translate
 
-table_headers = {
-    "time": _translate("BoundaryCondition", "Time"),
-    "debit": _translate("BoundaryCondition", "Debit"),
-    "z": _translate("BoundaryCondition", "Z (m)")
-}
-
 
 class TableModel(QAbstractTableModel):
     def __init__(self, data=None, undo=None):
diff --git a/src/View/BoundaryCondition/Edit/UndoCommand.py b/src/View/BoundaryCondition/Edit/UndoCommand.py
index 7f3bbef5..c20288ff 100644
--- a/src/View/BoundaryCondition/Edit/UndoCommand.py
+++ b/src/View/BoundaryCondition/Edit/UndoCommand.py
@@ -79,7 +79,7 @@ class SortCommand(QUndoCommand):
 
     def redo(self):
         self._data.sort(
-            reverse=self._reverse,
+            _reverse=self._reverse,
             key=lambda x: x.name
         )
         if self._indexes is None:
diff --git a/src/View/BoundaryCondition/Edit/Window.py b/src/View/BoundaryCondition/Edit/Window.py
index 7de37c5e..5823a2ce 100644
--- a/src/View/BoundaryCondition/Edit/Window.py
+++ b/src/View/BoundaryCondition/Edit/Window.py
@@ -17,8 +17,11 @@ from PyQt5.QtWidgets import (
     QUndoStack, QShortcut, QAction, QItemDelegate,
 )
 
+from View.Plot.MplCanvas import MplCanvas
+
 from View.BoundaryCondition.translate import long_types
 from View.BoundaryCondition.Edit.Table import TableModel
+from View.BoundaryCondition.Edit.Plot import Plot
 
 _translate = QCoreApplication.translate
 
@@ -34,6 +37,7 @@ class EditBoundaryConditionWindow(ASubMainWindow, ListedSubWindow):
         self.setup_window()
         self.setup_sc()
         self.setup_table()
+        self.setup_plot()
         self.setup_connections()
 
     def setup_window(self):
@@ -67,6 +71,18 @@ class EditBoundaryConditionWindow(ASubMainWindow, ListedSubWindow):
         table.setSelectionBehavior(QAbstractItemView.SelectRows)
         table.setAlternatingRowColors(True)
 
+    def setup_plot(self):
+        self.canvas = MplCanvas(width=5, height=4, dpi=100)
+        self.canvas.setObjectName("canvas")
+        self.verticalLayout.addWidget(self.canvas)
+
+        self.plot = Plot(
+            canvas = self.canvas,
+            data = self._data,
+        )
+        self.plot.draw()
+
+
     def setup_connections(self):
         self.find(QAction, "action_add").triggered.connect(self.add)
         self.find(QAction, "action_del").triggered.connect(self.delete)
diff --git a/src/View/BoundaryCondition/Edit/translate.py b/src/View/BoundaryCondition/Edit/translate.py
new file mode 100644
index 00000000..e3fa7513
--- /dev/null
+++ b/src/View/BoundaryCondition/Edit/translate.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+
+from PyQt5.QtCore import QCoreApplication
+
+_translate = QCoreApplication.translate
+
+table_headers = {
+    "time": _translate("BoundaryCondition", "Time"),
+    "debit": _translate("BoundaryCondition", "Debit"),
+    "z": _translate("BoundaryCondition", "Z (m)")
+}
diff --git a/src/View/ui/BoundaryConditions.ui b/src/View/ui/BoundaryConditions.ui
index 8a0f8f96..5d68ac0a 100644
--- a/src/View/ui/BoundaryConditions.ui
+++ b/src/View/ui/BoundaryConditions.ui
@@ -25,19 +25,43 @@
   <widget class="QWidget" name="centralwidget">
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="0">
-     <widget class="QSplitter" name="splitter">
-      <property name="sizePolicy">
-       <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
-        <horstretch>0</horstretch>
-        <verstretch>0</verstretch>
-       </sizepolicy>
+     <widget class="QTabWidget" name="tabWidget">
+      <property name="currentIndex">
+       <number>0</number>
       </property>
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-      <widget class="QTableView" name="tableView"/>
-      <widget class="QWidget" name="verticalLayoutWidget">
-       <layout class="QVBoxLayout" name="verticalLayout"/>
+      <widget class="QWidget" name="tab">
+       <attribute name="title">
+        <string>Liquid</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_2">
+        <item row="0" column="0">
+         <widget class="QSplitter" name="splitter">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <widget class="QTableView" name="tableView"/>
+          <widget class="QWidget" name="verticalLayoutWidget">
+           <layout class="QVBoxLayout" name="verticalLayout"/>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_2">
+       <attribute name="title">
+        <string>Solid</string>
+       </attribute>
+      </widget>
+      <widget class="QWidget" name="tab_3">
+       <attribute name="title">
+        <string>Suspension</string>
+       </attribute>
       </widget>
      </widget>
     </item>
-- 
GitLab