BoundaryConditionsData: fix multidelete + relative undo/redo

master v2.0.0rc3
Dylan Jeannin 2026-07-24 13:17:55 +02:00
parent 5cf0a0ec76
commit defcb3af84
2 changed files with 45 additions and 28 deletions

View File

@ -143,21 +143,43 @@ class TableModel(PamhyrTableModel):
self.update() self.update()
def delete(self, rows, parent=QModelIndex()): def delete(self, rows, parent=QModelIndex()):
self.beginRemoveRows(parent, rows[0], rows[-1]) if not rows:
return
rows = list(map( rows = sorted(set(rows))
lambda r: self.get_true_data_row(r), rows = [
rows)) self.get_true_data_row(row)
for row in rows
]
self._undo.push( # A multiple selection may contain non-contiguous rows. A model reset
DelCommand( # accurately represents this atomic undo command, unlike one
self._data, rows # beginRemoveRows() call spanning rows that are not all removed.
self.beginResetModel()
try:
self._undo.push(
DelCommand(
self._data, rows
)
) )
) finally:
self.endResetModel()
self.endRemoveRows()
self.update() self.update()
def undo(self):
self.beginResetModel()
try:
self._undo.undo()
finally:
self.endResetModel()
def redo(self):
self.beginResetModel()
try:
self._undo.redo()
finally:
self.endResetModel()
def sort(self, _reverse, parent=QModelIndex()): def sort(self, _reverse, parent=QModelIndex()):
self.layoutAboutToBeChanged.emit() self.layoutAboutToBeChanged.emit()

View File

@ -97,12 +97,11 @@ class DelCommand(QUndoCommand):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._data = data self._data = data
self._rows = rows self._rows = sorted(set(rows))
self._bc = [
self._bc = [] self._data.get_i(row)
for row in rows: for row in self._rows
self._bc.append(self._data.get_i(row)) ]
self._bc.sort()
def undo(self): def undo(self):
for el in self._bc: for el in self._bc:
@ -120,13 +119,17 @@ class SortCommand(QUndoCommand):
self._data = data self._data = data
self._reverse = _reverse self._reverse = _reverse
self._old = self._data.data # Keep the order of the complete underlying list, including soft
self._indexes = None # deleted items. ``data`` only exposes visible items and therefore
# cannot reliably restore a sort after a delete/undelete operation.
self._old_positions = {
id(item): index
for index, item in enumerate(self._data._data)
}
def undo(self): def undo(self):
ll = self._data.data
self._data.sort( self._data.sort(
key=lambda x: self._indexes[ll.index(x)] key=lambda item: self._old_positions[id(item)]
) )
def redo(self): def redo(self):
@ -134,14 +137,6 @@ class SortCommand(QUndoCommand):
_reverse=self._reverse, _reverse=self._reverse,
key=lambda x: x[0] key=lambda x: x[0]
) )
if self._indexes is None:
self._indexes = list(
map(
lambda p: self._old.index(p),
self._data.data
)
)
self._old = None
class MoveCommand(QUndoCommand): class MoveCommand(QUndoCommand):