Undo: make editing of dive-time an undoable operation

The whole undo system assumes that the indexes in the dive table
do not change under its feet. On desktop, there seems only one
exception left: editing of the dive time. To circumvent this,
hook editing of the dive-time to the already existing UndoShiftTime
command.

This introduces a temporary UI-inconsistency: this is the only
edit that is reflected in the undo-list. This will be fixed in
due course, when other edit actions are also made undoable.

UndoShiftTime is changed to take pointers to dives (which should
be stable by now) instead of uniq-ids.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-07-22 09:23:47 +02:00 committed by Dirk Hohndel
parent ba9c35215e
commit dd9af8e72e
4 changed files with 16 additions and 24 deletions

View file

@ -240,18 +240,13 @@ void ShiftTimesDialog::buttonClicked(QAbstractButton *button)
if (amount != 0) {
// DANGER, DANGER - this could get our dive_table unsorted...
int i;
struct dive *dive;
QVector<int> affectedDives;
for_each_dive (i, dive) {
if (!dive->selected)
continue;
affectedDives.append(dive->id);
struct dive *d;
QVector<dive *> affectedDives;
for_each_dive (i, d) {
if (d->selected)
affectedDives.append(d);
}
MainWindow::instance()->undoStack->push(new UndoShiftTime(affectedDives, amount));
MainWindow::instance()->dive_list()->rememberSelection();
MainWindow::instance()->refreshDisplay();
MainWindow::instance()->dive_list()->restoreSelection();
}
}
}

View file

@ -864,10 +864,6 @@ void MainTab::acceptChanges()
}
if (displayed_dive.watertemp.mkelvin != cd->watertemp.mkelvin)
MODIFY_DIVES(selectedDives, EDIT_VALUE(watertemp.mkelvin));
if (displayed_dive.when != cd->when) {
time_t offset = cd->when - displayed_dive.when;
MODIFY_DIVES(selectedDives, mydive->when -= offset;);
}
if (displayed_dive.dive_site_uuid != cd->dive_site_uuid)
MODIFY_DIVES(selectedDives, EDIT_VALUE(dive_site_uuid));
@ -969,6 +965,12 @@ void MainTab::acceptChanges()
invalidate_dive_cache(d);
}
}
if (displayed_dive.when != cd->when) {
timestamp_t offset = cd->when - displayed_dive.when;
if (offset)
MainWindow::instance()->undoStack->push(new UndoShiftTime(selectedDives, (int)offset));
}
}
if (editMode != TRIP && current_dive->divetrip) {
current_dive->divetrip->when = current_dive->when;
@ -987,9 +989,6 @@ void MainTab::acceptChanges()
int scrolledBy = MainWindow::instance()->dive_list()->verticalScrollBar()->sliderPosition();
resetPallete();
if (editMode == MANUALLY_ADDED_DIVE) {
// since a newly added dive could be in the middle of the dive_table we need
// to resort the dive list and make sure the newly added dive gets selected again
sort_table(&dive_table);
MainWindow::instance()->dive_list()->reload(DiveTripModel::CURRENT, true);
int newDiveNr = get_divenr(get_dive_by_uniq_id(addedId));
MainWindow::instance()->dive_list()->unselectDives();
@ -1002,7 +1001,6 @@ void MainTab::acceptChanges()
if (do_replot)
MainWindow::instance()->graphics()->replot();
MainWindow::instance()->dive_list()->rememberSelection();
sort_table(&dive_table);
MainWindow::instance()->refreshDisplay();
MainWindow::instance()->dive_list()->restoreSelection();
}

View file

@ -147,7 +147,7 @@ void UndoDeleteDive::redo()
}
UndoShiftTime::UndoShiftTime(QVector<int> changedDives, int amount)
UndoShiftTime::UndoShiftTime(const QVector<dive *> &changedDives, int amount)
: diveList(changedDives), timeChanged(amount)
{
setText(tr("delete %n dive(s)", "", changedDives.size()));
@ -155,10 +155,9 @@ UndoShiftTime::UndoShiftTime(QVector<int> changedDives, int amount)
void UndoShiftTime::undo()
{
for (int i = 0; i < diveList.count(); i++) {
dive *d = get_dive_by_uniq_id(diveList.at(i));
for (dive *d: diveList)
d->when -= timeChanged;
}
// Changing times may have unsorted the dive table
sort_table(&dive_table);
mark_divelist_changed(true);

View file

@ -189,13 +189,13 @@ private:
class UndoShiftTime : public QUndoCommand {
Q_DECLARE_TR_FUNCTIONS(Command)
public:
UndoShiftTime(QVector<int> changedDives, int amount);
UndoShiftTime(const QVector<dive *> &changedDives, int amount);
private:
void undo() override;
void redo() override;
// For redo and undo
QVector<int> diveList;
QVector<dive *> diveList;
int timeChanged;
};