diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py index 0290f817..d3799496 100644 --- a/src/View/InitialConditions/Table.py +++ b/src/View/InitialConditions/Table.py @@ -376,9 +376,19 @@ class InitialConditionTableModel(PamhyrTableModel): self.layoutChanged.emit() def generate(self, generator, param, option): + self.layoutAboutToBeChanged.emit() + + self._undo.beginMacro(f"generate {generator}") self._undo.push( GenerateCommand( self._lst, generator, param, option ) ) + self._undo.push( + SortCommand( + self._lst, False + ) + ) + self._undo.endMacro() + self.layoutChanged.emit() diff --git a/src/View/InitialConditions/UndoCommand.py b/src/View/InitialConditions/UndoCommand.py index d5af00f5..95f1ee47 100644 --- a/src/View/InitialConditions/UndoCommand.py +++ b/src/View/InitialConditions/UndoCommand.py @@ -100,15 +100,19 @@ class SortCommand(QUndoCommand): self._indexes = None def undo(self): - ll = self._ics.data + order = { + id(x): self._indexes[i] + for i, x in enumerate(self._ics.data) + } self._ics.sort( - key=lambda x: self._indexes[ll.index(x)] + key=lambda x: order.get(id(x), len(order)) ) def redo(self): self._ics.sort( reverse=self._reverse, - key=lambda x: x["rk"].rk + key=lambda x: ((x["rk"] is None), + 0.0 if x["rk"] is None else x["rk"].rk) ) if self._indexes is None: self._indexes = list( @@ -182,11 +186,19 @@ class GenerateCommand(QUndoCommand): self._ics = ics self._param = param self._option = option - self._copy = self._ics.data + # All the rows, with their deleted flag: the generation marks the + # previous rows as deleted (clear_data) + self._copy = list(self._ics._data) + self._deleted = [d.is_deleted() for d in self._copy] self._generator = generator def undo(self): - self._ics.data = self._copy + for data, deleted in zip(self._copy, self._deleted): + if deleted: + data.set_as_deleted() + else: + data.set_as_not_deleted() + self._ics.data = list(self._copy) def redo(self): if self._generator == "growing":