diff --git a/src/View/BoundaryCondition/Edit/Table.py b/src/View/BoundaryCondition/Edit/Table.py index 6536bd0d14a7e948e1f157a603ca6299da89c9b9..8850ec4681c84a35c2b133e6fc14d08f08f4aa1b 100644 --- a/src/View/BoundaryCondition/Edit/Table.py +++ b/src/View/BoundaryCondition/Edit/Table.py @@ -25,6 +25,7 @@ from tools import trace, timer from View.ASubWindow import ASubMainWindow, AWidget from View.ListedSubWindow import ListedSubWindow +from View.Tools.PamhyrTable import PamhyrTableModel from PyQt5.QtCore import ( Qt, QVariant, QAbstractTableModel, @@ -152,26 +153,7 @@ class ExTimeDelegate(QItemDelegate): self.commitData.emit(self.sender()) -class TableModel(QAbstractTableModel): - def __init__(self, data=None, mode="time", undo=None): - super(QAbstractTableModel, self).__init__() - self._headers = data.header - self._data = data - self._mode = mode - self._undo = undo - - def flags(self, index): - options = Qt.ItemIsEnabled | Qt.ItemIsSelectable - options |= Qt.ItemIsEditable - - return options - - def rowCount(self, parent): - return len(self._data) - - def columnCount(self, parent): - return len(self._headers) - +class TableModel(PamhyrTableModel): def data(self, index, role): if role == Qt.TextAlignmentRole: return Qt.AlignHCenter | Qt.AlignVCenter @@ -189,7 +171,7 @@ class TableModel(QAbstractTableModel): if self._data.get_type_column(column) == float: value = f"{v:.4f}" elif self._data.header[column] == "time": - if self._mode == "time": + if self._opt_data == "time": t0 = datetime.fromtimestamp(0) t = datetime.fromtimestamp(v) value = str(t - t0) @@ -200,12 +182,6 @@ class TableModel(QAbstractTableModel): return value - def headerData(self, section, orientation, role): - if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal: - return table_headers[self._headers[section]] - - return QVariant() - def setData(self, index, value, role=Qt.EditRole): if not index.isValid() or role != Qt.EditRole: return False @@ -315,12 +291,3 @@ class TableModel(QAbstractTableModel): self.layoutAboutToBeChanged.emit() self.layoutChanged.emit() - - - def undo(self): - self._undo.undo() - self.layoutChanged.emit() - - def redo(self): - self._undo.redo() - self.layoutChanged.emit() diff --git a/src/View/BoundaryCondition/Edit/Window.py b/src/View/BoundaryCondition/Edit/Window.py index 7f35759f99bd966624aa0a5ee4a33675eac6803d..180eb11b655c2a598d104e35e0d8d993bbd4c9f0 100644 --- a/src/View/BoundaryCondition/Edit/Window.py +++ b/src/View/BoundaryCondition/Edit/Window.py @@ -16,6 +16,8 @@ # -*- coding: utf-8 -*- +import logging + from tools import timer, trace from View.ASubWindow import ASubMainWindow, AWidget @@ -42,12 +44,15 @@ from View.Plot.MplCanvas import MplCanvas from View.Plot.navigation_toolbar_2qt import PamHyrNavigationToolbar2QT from View.BoundaryCondition.translate import long_types +from View.BoundaryCondition.Edit.translate import table_headers from View.BoundaryCondition.Edit.UndoCommand import SetMetaDataCommand from View.BoundaryCondition.Edit.Table import TableModel, ExTimeDelegate from View.BoundaryCondition.Edit.Plot import Plot _translate = QCoreApplication.translate +logger = logging.getLogger() + class WD50Sigma(AWidget): d50Changed = pyqtSignal(float) sigmaChanged = pyqtSignal(float) @@ -141,24 +146,29 @@ class EditBoundaryConditionWindow(ASubMainWindow, ListedSubWindow): self._d50sigma.set_sigma(self._data.sigma) def setup_table(self): + headers = {} + for h in self._data.header: + headers[h] = table_headers[h] + + self._delegate_time = ExTimeDelegate( + data = self._data, + mode = self._study.time_system, + parent = self + ) + table = self.find(QTableView, "tableView") self._table = TableModel( + table_view = table, + table_headers = headers, + editable_headers = self._data.header, + delegates = { + "time": self._delegate_time, + }, data = self._data, undo = self._undo_stack, - mode = self._study.time_system + opt_data = self._study.time_system ) - if self._data.header[0] == "time": - self._delegate_time = ExTimeDelegate( - data = self._data, - mode = self._study.time_system, - parent = self - ) - - table.setItemDelegateForColumn( - 0, self._delegate_time - ) - table.setModel(self._table) table.setSelectionBehavior(QAbstractItemView.SelectRows) table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) diff --git a/src/View/BoundaryCondition/Table.py b/src/View/BoundaryCondition/Table.py index fd39a13aff69623acbfe805d358d8824cbc23b99..377d9aab41c6cec5dd78ea8bb2f085ad89c94d32 100644 --- a/src/View/BoundaryCondition/Table.py +++ b/src/View/BoundaryCondition/Table.py @@ -39,6 +39,8 @@ from Model.BoundaryCondition.BoundaryConditionTypes import ( TimeOverZ, TimeOverDischarge, ZOverDischarge ) +from View.Tools.PamhyrTable import PamhyrTableModel + from View.BoundaryCondition.UndoCommand import ( SetNameCommand, SetNodeCommand, SetTypeCommand, AddCommand, DelCommand, SortCommand, @@ -104,26 +106,13 @@ class ComboBoxDelegate(QItemDelegate): self.commitData.emit(self.sender()) -class TableModel(QAbstractTableModel): - def __init__(self, data=None, undo=None, tab=""): - super(QAbstractTableModel, self).__init__() - self._headers = list(table_headers.keys()) - self._data = data - self._undo = undo - self._tab = tab - self._bcs = self._data.boundary_condition - - def flags(self, index): - options = Qt.ItemIsEnabled | Qt.ItemIsSelectable - options |= Qt.ItemIsEditable - - return options +class TableModel(PamhyrTableModel): + def _setup_lst(self): + self._lst = self._data.boundary_condition + self._tab = self._opt_data def rowCount(self, parent): - return self._bcs.len(self._tab) - - def columnCount(self, parent): - return len(self._headers) + return self._lst.len(self._tab) def data(self, index, role): if role != Qt.ItemDataRole.DisplayRole: @@ -133,24 +122,18 @@ class TableModel(QAbstractTableModel): column = index.column() if self._headers[column] == "name": - return self._bcs.get(self._tab, row).name + return self._lst.get(self._tab, row).name elif self._headers[column] == "type": - t = self._bcs.get(self._tab, row).bctype + t = self._lst.get(self._tab, row).bctype return long_types[t] elif self._headers[column] == "node": - n = self._bcs.get(self._tab, row).node + n = self._lst.get(self._tab, row).node if n is None: return _translate("BoundaryCondition", "Not associate") return n.name return QVariant() - def headerData(self, section, orientation, role): - if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal: - return table_headers[self._headers[section]] - - return QVariant() - def setData(self, index, value, role=Qt.EditRole): if not index.isValid() or role != Qt.EditRole: return False @@ -162,20 +145,20 @@ class TableModel(QAbstractTableModel): if self._headers[column] == "name": self._undo.push( SetNameCommand( - self._bcs, self._tab,row, value + self._lst, self._tab,row, value ) ) elif self._headers[column] == "type": key = next(k for k, v in long_types.items() if v == value) self._undo.push( SetTypeCommand( - self._bcs, self._tab,row, BC_types[key] + self._lst, self._tab,row, BC_types[key] ) ) elif self._headers[column] == "node": self._undo.push( SetNodeCommand( - self._bcs, self._tab,row, self._data.node(value) + self._lst, self._tab,row, self._data.node(value) ) ) except Exception as e: @@ -190,7 +173,7 @@ class TableModel(QAbstractTableModel): self._undo.push( AddCommand( - self._bcs, self._tab,row + self._lst, self._tab,row ) ) @@ -202,7 +185,7 @@ class TableModel(QAbstractTableModel): self._undo.push( DelCommand( - self._bcs, self._tab,rows + self._lst, self._tab, rows ) ) @@ -214,7 +197,7 @@ class TableModel(QAbstractTableModel): self._undo.push( SortCommand( - self._bcs, self._tab,False + self._lst, self._tab, False ) ) @@ -231,7 +214,7 @@ class TableModel(QAbstractTableModel): self._undo_stack.push( MoveCommand( - self._bcs, self._tab,"up", row + self._lst, self._tab, "up", row ) ) @@ -239,7 +222,7 @@ class TableModel(QAbstractTableModel): self.layoutChanged.emit() def move_down(self, index, parent=QModelIndex()): - if row > len(self._bcs): + if row > len(self._lst): return target = row @@ -248,7 +231,7 @@ class TableModel(QAbstractTableModel): self._undo_stack.push( MoveCommand( - self._bcs, self._tab,"down", row + self._lst, self._tab, "down", row ) ) diff --git a/src/View/BoundaryCondition/Window.py b/src/View/BoundaryCondition/Window.py index a2853590260278704db9f768cd50a8e6f17cc1cd..09372dcabed1de2b6d9a8f9af29a583f74346937 100644 --- a/src/View/BoundaryCondition/Window.py +++ b/src/View/BoundaryCondition/Window.py @@ -93,14 +93,6 @@ class BoundaryConditionWindow(ASubMainWindow, ListedSubWindow): self._table = {} for t in ["liquid", "solid", "suspenssion"]: - table = self.find(QTableView, f"tableView_{t}") - self._table[t] = TableModel( - data = self._study.river, - undo = self._undo_stack, - tab = t, - ) - table.setModel(self._table[t]) - self._delegate_type = ComboBoxDelegate( data = self._study.river, mode = "type", @@ -114,13 +106,20 @@ class BoundaryConditionWindow(ASubMainWindow, ListedSubWindow): parent=self ) - table.setItemDelegateForColumn( - 1, self._delegate_type - ) - table.setItemDelegateForColumn( - 2, self._delegate_node + table = self.find(QTableView, f"tableView_{t}") + self._table[t] = TableModel( + table_view = table, + table_headers = table_headers, + editable_headers = ["name", "type", "node"], + delegates = { + "type": self._delegate_type, + "node": self._delegate_node, + }, + data = self._study.river, + undo = self._undo_stack, + opt_data = t, ) - + table.setModel(self._table[t]) table.setSelectionBehavior(QAbstractItemView.SelectRows) table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) table.setAlternatingRowColors(True) diff --git a/src/View/Tools/PamhyrTable.py b/src/View/Tools/PamhyrTable.py index 8d266ca2eb3dc5243fee205d4918ea192b761fc1..44e765e70b33ed825d6d2ec2a7fd89f544adb8f5 100644 --- a/src/View/Tools/PamhyrTable.py +++ b/src/View/Tools/PamhyrTable.py @@ -80,7 +80,8 @@ class PamhyrTableModel(QAbstractTableModel): editable_headers=[], delegates = {}, data=None, - undo=None): + undo=None, + opt_data=None): super(PamhyrTableModel, self).__init__() self._table_view = table_view @@ -91,6 +92,7 @@ class PamhyrTableModel(QAbstractTableModel): self._delegates = delegates self._data = data + self._opt_data = opt_data self._undo = undo self._lst = [] @@ -98,7 +100,7 @@ class PamhyrTableModel(QAbstractTableModel): self._setup_lst() def _setup_lst(self): - self._lst = self.data + self._lst = self._data def flags(self, index): column = index.column() @@ -135,18 +137,3 @@ class PamhyrTableModel(QAbstractTableModel): def redo(self): self._undo.redo() self.layoutChanged.emit() - - def add(self, row, parent=QModelIndex()): - raise NotImplementedMethodeError(self, self.add) - - def delete(self, rows, parent=QModelIndex()): - raise NotImplementedMethodeError(self, self.delete) - - def sort(self, _reverse, parent=QModelIndex()): - raise NotImplementedMethodeError(self, self.sort) - - def move_up(self, row, parent=QModelIndex()): - raise NotImplementedMethodeError(self, self.move_up) - - def move_down(self, index, parent=QModelIndex()): - raise NotImplementedMethodeError(self, self.move_down)