From 797de096838449dbc126b57727882a9e1bbeb516 Mon Sep 17 00:00:00 2001 From: Dylan Jeannin Date: Mon, 26 Oct 2026 16:55:01 +0100 Subject: [PATCH] InitialConditions: sort rows after each generation (single undo step), and fix undo of generation and sort (avoid STOP7 error on Hogneau example) --- src/View/InitialConditions/Table.py | 10 ++++++++++ src/View/InitialConditions/UndoCommand.py | 22 +++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) 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":