diff --git a/src/Model/River.py b/src/Model/River.py index 35bf7ab711b529c300199bbcee665014b1790693..580d2b8fa59999ef85e38cb29ca59aa3b0bff60e 100644 --- a/src/Model/River.py +++ b/src/Model/River.py @@ -14,6 +14,8 @@ from Model.Stricklers.StricklersList import StricklersList from Model.Section.SectionList import SectionList from Model.SolverParameters.SolverParametersList import SolverParametersList +from Solver.Solvers import solver_type_list + class RiverNode(Node): def __init__(self, id:str, name:str, x:float, y:float, @@ -110,7 +112,10 @@ class River(Graph): if solver in self._parameters: return self._parameters[solver] - new = SolverParametersList(status = self._status) + new = SolverParametersList( + solver_type = solver_type_list[solver], + status = self._status + ) self._parameters[solver] = new self._status.modified() return self._parameters[solver] diff --git a/src/Model/SolverParameters/SolverParametersList.py b/src/Model/SolverParameters/SolverParametersList.py index 0d656d0dc71a03176a0dad2c1c0bc509c54b9d68..ee3b9b4076640c274127884315b97f7ff0f16967 100644 --- a/src/Model/SolverParameters/SolverParametersList.py +++ b/src/Model/SolverParameters/SolverParametersList.py @@ -34,13 +34,25 @@ class Parameter(object): self._status.modified() + @classmethod + def from_tuple(cls, data, status): + new = cls(status = status) + new["name"] = data[0] + new["value"] = data[1] + + return new class SolverParametersList(object): - def __init__(self, status = None): + def __init__(self, solver_type = None, status = None): super(SolverParametersList, self).__init__() self._status = status - self._parameters = [] + self._parameters = list( + map( + lambda t: Parameter.from_tuple(t, self._status), + solver_type.default_parameters() + ) + ) def __len__(self): return len(self._parameters) diff --git a/src/Solver/GenericSolver.py b/src/Solver/GenericSolver.py index 53bc6f0d3c446878a05950a3459c0ffed4c18048..8f5b0afb31885863669c5ff9cf85a5d7181fd3f7 100644 --- a/src/Solver/GenericSolver.py +++ b/src/Solver/GenericSolver.py @@ -12,6 +12,6 @@ class GenericSolver(AbstractSolver): @classmethod def default_parameters(cls): - lst = super(Mage, cls).default_parameters() + lst = super(GenericSolver, cls).default_parameters() return lst diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py index 61d8a316eba5eebc1df8b937cba019a5021e0701..94c1e7a0079db94a62b717e4680d4d9a2ed93bc0 100644 --- a/src/Solver/Mage.py +++ b/src/Solver/Mage.py @@ -17,7 +17,7 @@ class Mage(GenericSolver): lst = super(Mage, cls).default_parameters() lst += [ - ("time_step", "300"), + ("mage_time_step", "300"), ] return lst diff --git a/src/View/SolverParameters/Table.py b/src/View/SolverParameters/Table.py index b46281318d558ebfc7a7e149ba7fd7d5e968cc84..5d84ed6f82c1d7aa5d496691ee7f9c11cb918178 100644 --- a/src/View/SolverParameters/Table.py +++ b/src/View/SolverParameters/Table.py @@ -18,6 +18,8 @@ from PyQt5.QtWidgets import ( from View.SolverParameters.UndoCommand import * from View.SolverParameters.translate import * +from Solver.Solvers import solver_long_name, solver_type_list + _translate = QCoreApplication.translate class TableModel(QAbstractTableModel): @@ -32,7 +34,9 @@ class TableModel(QAbstractTableModel): def flags(self, index): options = Qt.ItemIsEnabled | Qt.ItemIsSelectable - if self._headers[self._column] == "value": + column = index.column() + + if self._headers[column] == "value": options |= Qt.ItemIsEditable return options @@ -49,9 +53,15 @@ class TableModel(QAbstractTableModel): row = index.row() column = index.column() + cname = self._headers[column] - if 0 <= column < len(self._headers): - return self._params.get(row)[self._headers[column]] + if cname == "name": + value = self._params.get(row)[cname] + if value in names: + value = names[value] + return value + elif cname == "value": + return self._params.get(row)[cname] return QVariant() @@ -71,7 +81,8 @@ class TableModel(QAbstractTableModel): if self._headers[column] == "value": self._undo.push( SetCommand( - self._params, row, "value", value + self._params, row, + "value", value ) ) diff --git a/src/View/SolverParameters/UndoCommand.py b/src/View/SolverParameters/UndoCommand.py index d5d2f3a3ee5b11120bdcdf5e3bc2401fa58a2678..6a8dc1eb211c5183479ec51b03def2e4b5bf6e24 100644 --- a/src/View/SolverParameters/UndoCommand.py +++ b/src/View/SolverParameters/UndoCommand.py @@ -20,7 +20,7 @@ class SetCommand(QUndoCommand): self._new = new_value def undo(self): - self._data.get(self._index)[column] = self._old + self._data.get(self._index)[self._column] = self._old def redo(self): - self._data.get(self._index)[column] = self._new + self._data.get(self._index)[self._column] = self._new diff --git a/src/View/SolverParameters/Window.py b/src/View/SolverParameters/Window.py index c98e3e1a3cb6700f1be3aa5f47f18013c0299550..c5aa264af62aa658dfc7c667dcd7a6e67f5591db 100644 --- a/src/View/SolverParameters/Window.py +++ b/src/View/SolverParameters/Window.py @@ -20,12 +20,15 @@ from PyQt5.QtWidgets import ( QFileDialog, QTableView, QAbstractItemView, QUndoStack, QShortcut, QAction, QItemDelegate, QComboBox, QVBoxLayout, QHeaderView, QTabWidget, + QWidget, QGridLayout, ) from View.SolverParameters.UndoCommand import * from View.SolverParameters.Table import TableModel from View.SolverParameters.translate import * +from Solver.Solvers import solver_long_name, solver_type_list + _translate = QCoreApplication.translate @@ -47,7 +50,10 @@ class SolverParametersWindow(ASubMainWindow, ListedSubWindow): self.ui.setWindowTitle(title) def setup_sc(self): - self._undo_stack = QUndoStack() + self._undo_stack = {} + + for st in solver_type_list: + self._undo_stack[st] = QUndoStack() self.undo_sc = QShortcut(QKeySequence.Undo, self) self.redo_sc = QShortcut(QKeySequence.Redo, self) @@ -56,20 +62,38 @@ class SolverParametersWindow(ASubMainWindow, ListedSubWindow): def setup_table(self): self._table = {} + self._tab_widget = self.find(QTabWidget, f"tabWidget") + + for st in solver_type_list: + # Create table + widget = QWidget() + widget.setObjectName(f"tab_{st}") + + grid = QGridLayout() - for t in ["mage"]: - table = self.find(QTableView, f"tableView_{t}") - self._table[t] = TableModel( + table = QTableView() + table.setObjectName(f"tableView_{st}") + + self._table[st] = TableModel( data = self._study.river, - undo = self._undo_stack, - tab = t, + undo = self._undo_stack[st], + tab = st, ) - table.setModel(self._table[t]) + table.setModel(self._table[st]) table.setSelectionBehavior(QAbstractItemView.SelectRows) table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) table.setAlternatingRowColors(True) + # Add table to tab + grid.addWidget(table, 0, 0) + widget.setLayout(grid) + table.setParent(widget) + + # Create tab + self._tab_widget.addTab(widget, f"{solver_long_name[st]}") + + def setup_connections(self): self.undo_sc.activated.connect(self.undo) self.redo_sc.activated.connect(self.redo) diff --git a/src/View/SolverParameters/translate.py b/src/View/SolverParameters/translate.py index 3103dcb99a612723efa99f5ac6b98a3b9cba0a37..5d8a3a7d3d299abcb75a7a04c51fa2d474a2fbc2 100644 --- a/src/View/SolverParameters/translate.py +++ b/src/View/SolverParameters/translate.py @@ -20,7 +20,6 @@ yes_no = { _translate("SolverParameters", "No"): "No", _translate("SolverParameters", "Y"): "y", _translate("SolverParameters", "N"): "n", - } names = { diff --git a/src/View/ui/SolverParameters.ui b/src/View/ui/SolverParameters.ui index abfb658d6b59deb486f831d2a2048c9b2fd1572d..2cffbcc589f77052f4fa2aee5eb9a0c6f07f8594 100644 --- a/src/View/ui/SolverParameters.ui +++ b/src/View/ui/SolverParameters.ui @@ -21,32 +21,8 @@ <item row="0" column="0"> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> - <number>0</number> + <number>-1</number> </property> - <widget class="QWidget" name="tab_mage"> - <attribute name="title"> - <string>Mage</string> - </attribute> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> - <widget class="QTableView" name="tableView_mage"/> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_rubarbe"> - <attribute name="title"> - <string>Rubarbe</string> - </attribute> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Not implemented yet !</string> - </property> - </widget> - </item> - </layout> - </widget> </widget> </item> </layout>