From 5dcc82d81e928357e8b9839a57ca5d80e26224bc Mon Sep 17 00:00:00 2001 From: Dylan Jeannin Date: Mon, 6 Jul 2026 11:47:37 +0200 Subject: [PATCH] WeatherParameters: Correct add and implement del function on tab_spec --- src/View/WeatherParameters/Table.py | 55 ++++++++++++++++------- src/View/WeatherParameters/UndoCommand.py | 17 ++++--- src/View/WeatherParameters/Window.py | 14 +++++- 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/src/View/WeatherParameters/Table.py b/src/View/WeatherParameters/Table.py index f9176719..0fedcc68 100644 --- a/src/View/WeatherParameters/Table.py +++ b/src/View/WeatherParameters/Table.py @@ -68,8 +68,8 @@ class ComboBoxDelegate(QItemDelegate): self.editor = QComboBox(parent) if self._mode == "rk": - wp = None - if self._weather_param_lst is not None: + wp = index.model().get(index.row()) + if wp is None and self._weather_param_lst is not None: wp = self._weather_param_lst.get(index.row()) if wp is None or wp.reach is None: self.editor.addItems( @@ -102,8 +102,8 @@ class ComboBoxDelegate(QItemDelegate): if self._mode == "rk": value = None - wp = None - if self._weather_param_lst is not None: + wp = index.model().get(index.row()) + if wp is None and self._weather_param_lst is not None: wp = self._weather_param_lst.get(index.row()) if wp is not None and wp.reach is not None: profiles = list( @@ -152,6 +152,22 @@ class WeatherParametersTableModel(PamhyrTableModel): self._setup_lst() self.layoutChanged.emit() + def get(self, row): + if row < 0 or row >= len(self._lst): + return None + return self._lst[row] + + def _global_row(self, row): + wp = self.get(row) + if wp is None: + return None + return self._data.index(wp) + + def _global_insert_row(self, row): + if row < len(self._lst): + return self._global_row(row) + return len(self._data) + def rowCount(self, parent): return len(self._lst) @@ -191,32 +207,36 @@ class WeatherParametersTableModel(PamhyrTableModel): column = index.column() try: + global_row = self._global_row(row) + if global_row is None: + return False + if self._headers[column] == "start_rk": - _edge = self._data.get(row).reach + _edge = self._data.get(global_row).reach _begin_rk = next( p for p in _edge.reach.profiles if p.pamhyr_id == value ) self._undo.push( SetBeginCommand( - self._data, row, _begin_rk + self._data, global_row, _begin_rk ) ) elif self._headers[column] == "end_rk": - _edge = self._data.get(row).reach + _edge = self._data.get(global_row).reach _end_rk = next( p for p in _edge.reach.profiles if p.pamhyr_id == value ) self._undo.push( SetEndCommand( - self._data, row, _end_rk + self._data, global_row, _end_rk ) ) elif self._headers[column] == "reach": self._undo.push( SetEdgeCommand( - self._data, row, self._river.edge(value) + self._data, global_row, self._river.edge(value) ) ) except Exception as e: @@ -227,11 +247,12 @@ class WeatherParametersTableModel(PamhyrTableModel): return True def add(self, row, parent=QModelIndex()): - self.beginInsertRows(parent, row, row - 1) + self.beginInsertRows(parent, row, row) self._undo.push( AddCommand( - self._data, self._type, self._lst, row + self._data, self._type, self._lst, + self._global_insert_row(row) ) ) @@ -241,15 +262,17 @@ class WeatherParametersTableModel(PamhyrTableModel): def delete(self, rows, parent=QModelIndex()): self.beginRemoveRows(parent, rows[0], rows[-1]) - data_rows = { - id(ica): i for i, ica in enumerate(self._data._data) + id(wp): i for i, wp in enumerate(self._data.lst) } self._undo.push( DelCommand( - self._data, - self._data._data, - [data_rows[id(self._lst[row])] for row in rows] + wps=self._data, + rows=[ + data_rows[id(self._lst[row])] + for row in rows + if 0 <= row < len(self._lst) + ] ) ) diff --git a/src/View/WeatherParameters/UndoCommand.py b/src/View/WeatherParameters/UndoCommand.py index 85c628cb..2be40ae8 100644 --- a/src/View/WeatherParameters/UndoCommand.py +++ b/src/View/WeatherParameters/UndoCommand.py @@ -150,21 +150,20 @@ class AddCommand(QUndoCommand): class DelCommand(QUndoCommand): - def __init__(self, data, wps_spec, rows): + def __init__(self, wps, rows): QUndoCommand.__init__(self) - self._data = data - self._wps_spec = wps_spec + self._wps = wps self._rows = rows - self._ic = [] + self._wp = [] for row in rows: - self._ic.append((row, self._wps_spec[row])) - self._ic.sort() + self._wp.append(self._wps.get(row)) def undo(self): - for row, el in self._ic: - self._data.insert(row, el) + for el in self._wp: + el.set_as_not_deleted() def redo(self): - self._data.delete_i(self._rows) + for el in self._wp: + el.set_as_deleted() diff --git a/src/View/WeatherParameters/Window.py b/src/View/WeatherParameters/Window.py index 64a99b62..133e8817 100644 --- a/src/View/WeatherParameters/Window.py +++ b/src/View/WeatherParameters/Window.py @@ -238,6 +238,18 @@ class WeatherParametersWindow(PamhyrWindow): ) ) + def index_selected_rows_spec(self): + table = self.table_spec + return list( + # Delete duplicate + set( + map( + lambda i: i.row(), + table.selectedIndexes() + ) + ) + ) + def move_up(self): row = self.index_selected_row() self._table.move_up(row) @@ -326,7 +338,7 @@ class WeatherParametersWindow(PamhyrWindow): self._table_spec.add(rows[0]) def delete(self): - rows = self.index_selected_rows() + rows = self.index_selected_rows_spec() if len(rows) == 0: return self._table_spec.delete(rows)