From f1d82b2f8665e3de72a97b39bcde63d6c5c739f1 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Fri, 12 May 2023 16:15:34 +0200
Subject: [PATCH] LC: Update with functional window LC and Edit.

---
 .../LateralContribution.py                    |   2 +-
 src/Model/Network/Graph.py                    |  16 +++
 src/Model/River.py                            |  13 +-
 .../LateralContribution/Edit/UndoCommand.py   |  26 ++--
 src/View/LateralContribution/Edit/Window.py   |   8 +-
 src/View/LateralContribution/Table.py         |  24 ++--
 src/View/LateralContribution/UndoCommand.py   |  12 +-
 src/View/LateralContribution/Window.py        |   8 +-
 src/View/LateralContribution/translate.py     |   4 +-
 src/View/ui/EditLateralContribution.ui        | 118 ++++++++++++++++++
 10 files changed, 183 insertions(+), 48 deletions(-)
 create mode 100644 src/View/ui/EditLateralContribution.ui

diff --git a/src/Model/LateralContribution/LateralContribution.py b/src/Model/LateralContribution/LateralContribution.py
index 81e6c1f7..086bb628 100644
--- a/src/Model/LateralContribution/LateralContribution.py
+++ b/src/Model/LateralContribution/LateralContribution.py
@@ -38,7 +38,7 @@ class LateralContribution(object):
         self._name = name
 
     @property
-    def bctype(self):
+    def lctype(self):
         return self._type
 
     @property
diff --git a/src/Model/Network/Graph.py b/src/Model/Network/Graph.py
index 3748dbed..59553e0c 100644
--- a/src/Model/Network/Graph.py
+++ b/src/Model/Network/Graph.py
@@ -30,6 +30,9 @@ class Graph(object):
     def edges(self):
         return self._edges
 
+    def edges_names(self):
+        return list(map(lambda e: e.name, self._edges))
+
     def nodes_counts(self):
         return len(self._nodes)
 
@@ -63,6 +66,19 @@ class Graph(object):
 
         return node[0]
 
+    def edge(self, edge_name:str):
+        edge =  list(
+            filter(
+                lambda e: e.name == edge_name,
+                self._edges
+            )
+        )
+
+        if len(edge) == 0:
+            return None
+
+        return edge[0]
+
     def _add_node(self, node):
         self._nodes.append(node)
         self._nodes_ids += 1
diff --git a/src/Model/River.py b/src/Model/River.py
index 077cc7db..0f13e6f7 100644
--- a/src/Model/River.py
+++ b/src/Model/River.py
@@ -7,12 +7,8 @@ from Model.Network.Graph import Graph
 from Model.Geometry.Profile import Profile
 from Model.Geometry.Reach import Reach
 
-from Model.BoundaryCondition.BoundaryCondition import (
-    BoundaryCondition
-)
-from Model.BoundaryCondition.BoundaryConditionList import (
-    BoundaryConditionList
-)
+from Model.BoundaryCondition.BoundaryConditionList import BoundaryConditionList
+from Model.LateralContribution.LateralContributionList import LateralContributionList
 
 
 class RiverNode(Node):
@@ -60,11 +56,16 @@ class River(Graph):
 
         self._current_reach = None
         self._boundary_condition = BoundaryConditionList()
+        self._lateral_contribution = LateralContributionList()
 
     @property
     def boundary_condition(self):
         return self._boundary_condition
 
+    @property
+    def lateral_contribution(self):
+        return self._lateral_contribution
+
     def has_current_reach(self):
         return self._current_reach is not None
 
diff --git a/src/View/LateralContribution/Edit/UndoCommand.py b/src/View/LateralContribution/Edit/UndoCommand.py
index 7039fa30..b5963b76 100644
--- a/src/View/LateralContribution/Edit/UndoCommand.py
+++ b/src/View/LateralContribution/Edit/UndoCommand.py
@@ -49,13 +49,13 @@ class DelCommand(QUndoCommand):
         self._data = data
         self._rows = rows
 
-        self._bc = []
+        self._lc = []
         for row in rows:
-            self._bc.append((row, self._data.get_i(row)))
-        self._bc.sort()
+            self._lc.append((row, self._data.get_i(row)))
+        self._lc.sort()
 
     def undo(self):
-        for row, el in self._bc:
+        for row, el in self._lc:
             self._data.insert(row, el)
 
     def redo(self):
@@ -114,19 +114,19 @@ class MoveCommand(QUndoCommand):
 
 
 class PasteCommand(QUndoCommand):
-    def __init__(self, data, row, bcs):
+    def __init__(self, data, row, lcs):
         QUndoCommand.__init__(self)
 
         self._data = data
         self._row = row
-        self._bcs = bcs
-        self._bcs.reverse()
+        self._lcs = lcs
+        self._lcs.reverse()
 
     def undo(self):
-        self._data.delete(self._bcs)
+        self._data.delete(self._lcs)
 
     def redo(self):
-        for bc in self._bcs:
+        for bc in self._lcs:
             self._data.insert(self._row, bc)
 
 
@@ -136,12 +136,12 @@ class DuplicateCommand(QUndoCommand):
 
         self._data = data
         self._rows = rows
-        self._bc = deepcopy(bc)
-        self._bc.reverse()
+        self._lc = deepcopy(bc)
+        self._lc.reverse()
 
     def undo(self):
-        self._data.delete(self._bc)
+        self._data.delete(self._lc)
 
     def redo(self):
-        for bc in self._bcs:
+        for bc in self._lcs:
             self._data.insert(self._rows[0], bc)
diff --git a/src/View/LateralContribution/Edit/Window.py b/src/View/LateralContribution/Edit/Window.py
index f8754cf1..537f4dad 100644
--- a/src/View/LateralContribution/Edit/Window.py
+++ b/src/View/LateralContribution/Edit/Window.py
@@ -38,7 +38,7 @@ class EditLateralContributionWindow(ASubMainWindow, ListedSubWindow):
         self.compute_title()
 
         super(EditLateralContributionWindow, self).__init__(
-            name=self._title, ui="EditLateralContributions", parent=parent
+            name=self._title, ui="EditLateralContribution", parent=parent
         )
 
         self.ui.setWindowTitle(self._title)
@@ -50,13 +50,13 @@ class EditLateralContributionWindow(ASubMainWindow, ListedSubWindow):
 
     def compute_title(self):
         if self._data is not None:
-            node_name = (self._data.node.name if self._data.node is not None
+            edge_name = (self._data.edge.name if self._data.edge is not None
                          else _translate("LateralContribution", "Not associate"))
             self._title = (
-                _translate("Edit boundary condition", self._title) +
+                _translate("Edit Lateral contribution", self._title) +
                 f" - {self._study.name} " +
                 f" - {self._data.name} " +
-                f"({long_types[self._data.bctype]} - {node_name})"
+                f"({long_types[self._data.lctype]} - {edge_name})"
             )
 
     def setup_sc(self):
diff --git a/src/View/LateralContribution/Table.py b/src/View/LateralContribution/Table.py
index 1ffdb431..9577ff1a 100644
--- a/src/View/LateralContribution/Table.py
+++ b/src/View/LateralContribution/Table.py
@@ -16,7 +16,7 @@ from PyQt5.QtWidgets import (
 )
 
 from View.LateralContribution.UndoCommand import (
-    SetNameCommand, SetNodeCommand, SetTypeCommand,
+    SetNameCommand, SetEdgeCommand, SetTypeCommand,
     AddCommand, DelCommand, SortCommand,
     MoveCommand, PasteCommand, DuplicateCommand,
 )
@@ -45,8 +45,8 @@ class ComboBoxDelegate(QItemDelegate):
                 map(
                     lambda k: long_types[k],
                     filter(
-                        lambda k: self._tab in BC_types[k].compatibility(),
-                        BC_types.keys()
+                        lambda k: self._tab in LC_types[k].compatibility(),
+                        LC_types.keys()
                     )
                 )
             )
@@ -56,7 +56,7 @@ class ComboBoxDelegate(QItemDelegate):
         else:
             self.editor.addItems(
                 [_translate("LateralContribution", "Not associate")] +
-                self._data.nodes_names()
+                self._data.edges_names()
             )
 
         self.editor.setCurrentText(index.data(Qt.DisplayRole))
@@ -90,7 +90,7 @@ class TableModel(QAbstractTableModel):
         self._data = data
         self._undo = undo
         self._tab = tab
-        self._lcs = self._data.boundary_condition
+        self._lcs = self._data.lateral_contribution
 
     def flags(self, index):
         options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
@@ -114,10 +114,10 @@ class TableModel(QAbstractTableModel):
         if self._headers[column] == "name":
             return self._lcs.get(self._tab, row).name
         elif self._headers[column] == "type":
-            t = self._lcs.get(self._tab, row).bctype
+            t = self._lcs.get(self._tab, row).lctype
             return long_types[t]
-        elif self._headers[column] == "node":
-            n = self._lcs.get(self._tab, row).node
+        elif self._headers[column] == "edge":
+            n = self._lcs.get(self._tab, row).edge
             if n is None:
                 return _translate("LateralContribution", "Not associate")
             return n.name
@@ -147,13 +147,13 @@ class TableModel(QAbstractTableModel):
             key = next(k for k, v in long_types.items() if v == value)
             self._undo.push(
                 SetTypeCommand(
-                    self._lcs, self._tab,row, BC_types[key]
+                    self._lcs, self._tab,row, LC_types[key]
                 )
             )
-        elif self._headers[column] == "node":
+        elif self._headers[column] == "edge":
             self._undo.push(
-                SetNodeCommand(
-                    self._lcs, self._tab,row, self._data.node(value)
+                SetEdgeCommand(
+                    self._lcs, self._tab,row, self._data.edge(value)
                 )
             )
 
diff --git a/src/View/LateralContribution/UndoCommand.py b/src/View/LateralContribution/UndoCommand.py
index 19c80068..5140a9d9 100644
--- a/src/View/LateralContribution/UndoCommand.py
+++ b/src/View/LateralContribution/UndoCommand.py
@@ -26,21 +26,21 @@ class SetNameCommand(QUndoCommand):
     def redo(self):
         self._lcs.get(self._tab, self._index).name = self._new
 
-class SetNodeCommand(QUndoCommand):
-    def __init__(self, lcs, tab, index, node):
+class SetEdgeCommand(QUndoCommand):
+    def __init__(self, lcs, tab, index, edge):
         QUndoCommand.__init__(self)
 
         self._lcs = lcs
         self._tab = tab
         self._index = index
-        self._old = self._lcs.get(self._tab, self._index).node
-        self._new = node
+        self._old = self._lcs.get(self._tab, self._index).edge
+        self._new = edge
 
     def undo(self):
-        self._lcs.get(self._tab, self._index).node = self._old
+        self._lcs.get(self._tab, self._index).edge = self._old
 
     def redo(self):
-        self._lcs.get(self._tab, self._index).node = self._new
+        self._lcs.get(self._tab, self._index).edge = self._new
 
 class SetTypeCommand(QUndoCommand):
     def __init__(self, lcs, tab, index, _type):
diff --git a/src/View/LateralContribution/Window.py b/src/View/LateralContribution/Window.py
index 90bb87ea..36f58b27 100644
--- a/src/View/LateralContribution/Window.py
+++ b/src/View/LateralContribution/Window.py
@@ -23,7 +23,7 @@ from PyQt5.QtWidgets import (
 )
 
 from View.LateralContribution.UndoCommand import (
-    SetNameCommand, SetNodeCommand, SetTypeCommand,
+    SetNameCommand, SetEdgeCommand, SetTypeCommand,
     AddCommand, DelCommand, SortCommand,
     MoveCommand, PasteCommand, DuplicateCommand,
 )
@@ -88,9 +88,9 @@ class LateralContributionWindow(ASubMainWindow, ListedSubWindow):
                 tab = t,
                 parent=self
             )
-            self._delegate_node = ComboBoxDelegate(
+            self._delegate_edge = ComboBoxDelegate(
                 data = self._study.river,
-                mode = "node",
+                mode = "edge",
                 tab = t,
                 parent=self
             )
@@ -99,7 +99,7 @@ class LateralContributionWindow(ASubMainWindow, ListedSubWindow):
                 1, self._delegate_type
             )
             table.setItemDelegateForColumn(
-                2, self._delegate_node
+                2, self._delegate_edge
             )
 
             table.setSelectionBehavior(QAbstractItemView.SelectRows)
diff --git a/src/View/LateralContribution/translate.py b/src/View/LateralContribution/translate.py
index a4a0175a..82b875c5 100644
--- a/src/View/LateralContribution/translate.py
+++ b/src/View/LateralContribution/translate.py
@@ -20,10 +20,10 @@ long_types = {
 table_headers = {
     "name": _translate("LateralContribution", "Name"),
     "type": _translate("LateralContribution", "Type"),
-    "node": _translate("LateralContribution", "Node")
+    "edge": _translate("LateralContribution", "Edge")
 }
 
-BC_types = {
+LC_types = {
     "ND": NotDefined,
     "PC": PonctualContribution,
     "TZ": TimeOverZ,
diff --git a/src/View/ui/EditLateralContribution.ui b/src/View/ui/EditLateralContribution.ui
new file mode 100644
index 00000000..6a36a552
--- /dev/null
+++ b/src/View/ui/EditLateralContribution.ui
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>450</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <property name="locale">
+   <locale language="English" country="Europe"/>
+  </property>
+  <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>
+      </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="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>22</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QToolBar" name="toolBar">
+   <property name="windowTitle">
+    <string>toolBar</string>
+   </property>
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+   <addaction name="action_add"/>
+   <addaction name="action_del"/>
+   <addaction name="action_sort"/>
+  </widget>
+  <action name="action_add">
+   <property name="checkable">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset>
+     <normaloff>ressources/gtk-add.png</normaloff>ressources/gtk-add.png</iconset>
+   </property>
+   <property name="text">
+    <string>Add</string>
+   </property>
+   <property name="toolTip">
+    <string>Add a new point in boundary condition or lateral contribution</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+N</string>
+   </property>
+  </action>
+  <action name="action_del">
+   <property name="icon">
+    <iconset>
+     <normaloff>ressources/gtk-remove.png</normaloff>ressources/gtk-remove.png</iconset>
+   </property>
+   <property name="text">
+    <string>Delete</string>
+   </property>
+   <property name="toolTip">
+    <string>Delete current selected rows</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+D</string>
+   </property>
+  </action>
+  <action name="action_sort">
+   <property name="icon">
+    <iconset>
+     <normaloff>ressources/gtk-sort-ascending.png</normaloff>ressources/gtk-sort-ascending.png</iconset>
+   </property>
+   <property name="text">
+    <string>Sort</string>
+   </property>
+   <property name="toolTip">
+    <string>Sort boundary condition point</string>
+   </property>
+  </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
-- 
GitLab