diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py index 4eeb522532718c5af99ef064bede44d4d24a84b0..d77e2498d96dd71c65666c9805c8ed5a033d3ff1 100644 --- a/src/Model/InitialConditions/InitialConditions.py +++ b/src/Model/InitialConditions/InitialConditions.py @@ -266,6 +266,9 @@ class InitialConditions(SQLSubModel): def __len__(self): return len(self._data) + def lst(self): + return self._data + @property def reach(self): return self._reach @@ -295,6 +298,15 @@ class InitialConditions(SQLSubModel): self._data.insert(index, n) self._status.modified() + def new_from_data(self, kp, discharge, elevation): + n = Data(reach=self._reach, status=self._status) + + n['kp'] = kp + n['discharge'] = discharge + n['elevation'] = elevation + + return n + def insert(self, index, data): self._data.insert(index, data) self._status.modified() diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py index ee67a8acdd7f0d959b6cf8dcf94a33076159d510..9144a809878ea35a16f0fb78cb4beb238879574e 100644 --- a/src/View/InitialConditions/Table.py +++ b/src/View/InitialConditions/Table.py @@ -197,7 +197,7 @@ class InitialConditionTableModel(PamhyrTableModel): self.endMoveRows() self.layoutChanged.emit() - def move_down(self, index, parent=QModelIndex()): + def move_down(self, row, parent=QModelIndex()): if row > len(self._lst): return @@ -214,6 +214,36 @@ class InitialConditionTableModel(PamhyrTableModel): self.endMoveRows() self.layoutChanged.emit() + def paste(self, index, header, data): + if len(header) != 0: + logger.error("Unexpected header in IC past data") + return + + if len(data) == 0: + logger.error("Empty data") + return + + if len(data[0]) != 3: + logger.error(f"Unexpected data size: [{data[0]}, ...]") + return + + self.layoutAboutToBeChanged.emit() + + self._undo.push( + PasteCommand( + self._lst, index, + list( + map( + lambda d: self._lst.new_from_data(*d), + data + ) + ) + ) + ) + + self.layoutAboutToBeChanged.emit() + self.layoutChanged.emit() + def undo(self): self._undo.undo() self.layoutChanged.emit() diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py index 74262f5a5a307748029042f51111e7f293e8ceb3..78532521b430972427d8f33cd84590b2c4a3be99 100644 --- a/src/View/InitialConditions/Window.py +++ b/src/View/InitialConditions/Window.py @@ -18,7 +18,7 @@ import logging -from tools import trace, timer +from tools import trace, timer, logger_exception from View.Tools.PamhyrWindow import PamhyrWindow @@ -241,11 +241,49 @@ class InitialConditionsWindow(PamhyrWindow): self._update() def _copy(self): - logger.info("TODO: copy") - self._update() + rows = list( + map( + lambda row: row.row(), + self.tableView.selectionModel().selectedRows() + ) + ) + + table = list( + map( + lambda eic: list( + map( + lambda k: eic[1][k], + ["kp", "discharge", "elevation"] + ) + ), + filter( + lambda eic: eic[0] in rows, + enumerate(self._ics.lst()) + ) + ) + ) + + self.copyTableIntoClipboard(table) def _paste(self): - logger.info("TODO: paste") + header, data = self.parseClipboardTable() + + if len(data) + len(header) == 0: + return + + logger.debug( + "IC: Paste: " + + f"header = {header}, " + + f"data = {data}" + ) + + try: + row = 0 if len(self._ics.lst()) == 0 else self.index_selected_row() + # self._table.paste(row, header, data) + self._table.paste(row, [], data) + except Exception as e: + logger_exception(e) + self._update() def _undo(self):