WeatherParam: SetData targets the object, and no longer the line index in the tab, which reduces the risk of error with multiple QUndoCommand, and rewrite of the logic for the other UndoCommand

temperature_test
Dylan Jeannin 2026-07-28 13:50:21 +02:00
parent 7b2c276643
commit 516efb64e8
4 changed files with 91 additions and 76 deletions

View File

@ -636,14 +636,38 @@ class WeatherParameters(SQLSubModel):
def add(self, index: int): def add(self, index: int):
value = Data(self._default_0, self._default_1, status=self._status) value = Data(self._default_0, self._default_1, status=self._status)
self._data.insert(index, value) self.insert(index, value)
self.modified()
return value return value
def insert(self, index: int, value): def insert(self, index: int, value):
visible_data = self.data
if index < len(visible_data):
index = self._data.index(visible_data[index])
else:
index = len(self._data)
self._data.insert(index, value) self._data.insert(index, value)
self.modified() self.modified()
def set_data_value(self, value, column, data):
value[column] = self._types[column](data)
self.modified()
def set_deleted(self, values, deleted):
for value in values:
if deleted:
value.set_as_deleted()
else:
value.set_as_not_deleted()
self.modified()
def reorder(self, values):
values = iter(values)
self._data = [
value if value.is_deleted() else next(values)
for value in self._data
]
self.modified()
def delete_i(self, indexes): def delete_i(self, indexes):
self._data = list( self._data = list(
map( map(
@ -692,10 +716,7 @@ class WeatherParameters(SQLSubModel):
return lst return lst
def _set_i_c_v(self, index, column, value): def _set_i_c_v(self, index, column, value):
v = self._data[index] self.set_data_value(self.get_i(index), column, value)
v[column] = self._types[column](value)
self._data[index] = v
self.modified()
def set_i_0(self, index: int, value): def set_i_0(self, index: int, value):
self._set_i_c_v(index, 0, value) self._set_i_c_v(index, 0, value)
@ -726,15 +747,13 @@ class WeatherParameters(SQLSubModel):
return new return new
def move_up(self, index): def move_up(self, index):
if index < len(self): if 0 < index < len(self):
next = index - 1 data = self.data
d = self._data data[index - 1], data[index] = data[index], data[index - 1]
d[index], d[next] = d[next], d[index] self.reorder(data)
self.modified()
def move_down(self, index): def move_down(self, index):
if index >= 0: if 0 <= index < len(self) - 1:
prev = index + 1 data = self.data
d = self._data data[index], data[index + 1] = data[index + 1], data[index]
d[index], d[prev] = d[prev], d[index] self.reorder(data)
self.modified()

View File

@ -102,6 +102,7 @@ class GeometryWindow(PamhyrWindow):
self.setup_plots() self.setup_plots()
self.setup_statusbar() self.setup_statusbar()
self.setup_connections() self.setup_connections()
self.update_meshing_action()
def setup_table(self): def setup_table(self):
if self._study.is_read_only(): if self._study.is_read_only():
@ -231,7 +232,16 @@ class GeometryWindow(PamhyrWindow):
def update_redraw(self): def update_redraw(self):
self._update(redraw=True) self._update(redraw=True)
def update_meshing_action(self):
enabled = (
not self._study.is_read_only()
and self._reach.number_profiles > 0
)
self.find(QAction, "action_meshing").setEnabled(enabled)
def _update(self, redraw=False, propagate=True): def _update(self, redraw=False, propagate=True):
self.update_meshing_action()
if redraw: if redraw:
self._plot_xy.redraw(data=self._reach) self._plot_xy.redraw(data=self._reach)
self._plot_rkc.redraw(data=self._reach) self._plot_rkc.redraw(data=self._reach)
@ -302,6 +312,9 @@ class GeometryWindow(PamhyrWindow):
self.tableView.model().blockSignals(False) self.tableView.model().blockSignals(False)
def edit_meshing(self): def edit_meshing(self):
if self._reach.number_profiles == 0:
return
rows = list( rows = list(
set( set(
(i.row() for i in self.tableView.selectedIndexes()) (i.row() for i in self.tableView.selectedIndexes())

View File

@ -145,35 +145,24 @@ class TableModel(PamhyrTableModel):
if row <= 0: if row <= 0:
return return
target = row + 2 self.layoutAboutToBeChanged.emit()
self._undo.push(
self.beginMoveRows(parent, row - 1, row - 1, parent, target)
self._undo_stack.push(
MoveCommand( MoveCommand(
self._data, "up", row self._data, "up", row
) )
) )
self.endMoveRows()
self.update() self.update()
def move_down(self, index, parent=QModelIndex()): def move_down(self, row, parent=QModelIndex()):
row = index.row() if row < 0 or row >= len(self._data) - 1:
if row >= len(self._data):
return return
target = row self.layoutAboutToBeChanged.emit()
self._undo.push(
self.beginMoveRows(parent, row + 1, row + 1, parent, target)
self._undo_stack.push(
MoveCommand( MoveCommand(
self._data, "down", row self._data, "down", row
) )
) )
self.endMoveRows()
self.update() self.update()
def paste(self, row, header, data): def paste(self, row, header, data):

View File

@ -31,17 +31,17 @@ class SetDataCommand(QUndoCommand):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._data = data self._data = data
self._index = index self._value = self._data.get_i(index)
self._column = column self._column = column
self._old = self._data.get_i(self._index)[self._column] self._old = self._value[self._column]
_type = self._data.get_type_column(self._column) _type = self._data.get_type_column(self._column)
self._new = _type(new_value) self._new = _type(new_value)
def undo(self): def undo(self):
self._data._set_i_c_v(self._index, self._column, self._old) self._data.set_data_value(self._value, self._column, self._old)
def redo(self): def redo(self):
self._data._set_i_c_v(self._index, self._column, self._new) self._data.set_data_value(self._value, self._column, self._new)
class AddCommand(QUndoCommand): class AddCommand(QUndoCommand):
@ -53,13 +53,13 @@ class AddCommand(QUndoCommand):
self._new = None self._new = None
def undo(self): def undo(self):
self._data.delete_i([self._index]) self._data.set_deleted([self._new], True)
def redo(self): def redo(self):
if self._new is None: if self._new is None:
self._new = self._data.add(self._index) self._new = self._data.add(self._index)
else: else:
self._data.insert(self._index, self._new) self._data.set_deleted([self._new], False)
class DelCommand(QUndoCommand): class DelCommand(QUndoCommand):
@ -75,10 +75,10 @@ class DelCommand(QUndoCommand):
self._wp.sort() self._wp.sort()
def undo(self): def undo(self):
self._data.set_as_not_deleted_i(self._rows) self._data.set_deleted([wp for row, wp in self._wp], False)
def redo(self): def redo(self):
self._data.set_as_deleted_i(self._rows) self._data.set_deleted([wp for row, wp in self._wp], True)
class SortCommand(QUndoCommand): class SortCommand(QUndoCommand):
@ -89,27 +89,17 @@ class SortCommand(QUndoCommand):
self._reverse = _reverse self._reverse = _reverse
self._old = self._data.data self._old = self._data.data
self._indexes = None self._new = sorted(
self._old,
key=lambda value: value[0],
reverse=self._reverse
)
def undo(self): def undo(self):
ll = self._data.data self._data.reorder(self._old)
self._data.sort(
key=lambda x: self._indexes[ll.index(x)]
)
def redo(self): def redo(self):
self._data.sort( self._data.reorder(self._new)
_reverse=self._reverse,
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):
@ -117,20 +107,16 @@ class MoveCommand(QUndoCommand):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._data = data self._data = data
self._up = up == "up" self._old = self._data.data
self._i = i self._new = self._old.copy()
other = i - 1 if up == "up" else i + 1
self._new[i], self._new[other] = self._new[other], self._new[i]
def undo(self): def undo(self):
if self._up: self._data.reorder(self._old)
self._data.move_up(self._i)
else:
self._data.move_down(self._i)
def redo(self): def redo(self):
if self._up: self._data.reorder(self._new)
self._data.move_up(self._i)
else:
self._data.move_down(self._i)
class PasteCommand(QUndoCommand): class PasteCommand(QUndoCommand):
@ -141,15 +127,18 @@ class PasteCommand(QUndoCommand):
self._row = row self._row = row
self._wps = list(wps) self._wps = list(wps)
self._wps.reverse() self._wps.reverse()
self._inserted = False
def undo(self): def undo(self):
self._data.delete_i( self._data.set_deleted(self._wps, True)
range(self._row, self._row + len(self._wps))
)
def redo(self): def redo(self):
if not self._inserted:
for wp in self._wps: for wp in self._wps:
self._data.insert(self._row, wp) self._data.insert(self._row, wp)
self._inserted = True
else:
self._data.set_deleted(self._wps, False)
class DuplicateCommand(QUndoCommand): class DuplicateCommand(QUndoCommand):
@ -160,10 +149,15 @@ class DuplicateCommand(QUndoCommand):
self._rows = rows self._rows = rows
self._wp = deepcopy(bc) self._wp = deepcopy(bc)
self._wp.reverse() self._wp.reverse()
self._inserted = False
def undo(self): def undo(self):
self._data.delete(self._wp) self._data.set_deleted(self._wp, True)
def redo(self): def redo(self):
if not self._inserted:
for bc in self._wp: for bc in self._wp:
self._data.insert(self._rows[0], bc) self._data.insert(self._rows[0], bc)
self._inserted = True
else:
self._data.set_deleted(self._wp, False)