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