Commit 45972261 authored by Pierre-Antoine Rouby's avatar Pierre-Antoine Rouby
Browse files

IC: Implement copy/paste command.

Showing with 85 additions and 5 deletions
+85 -5
......@@ -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()
......
......@@ -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()
......
......@@ -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):
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment