From dd9af8e72e169256f2d3ea53cff9d5bbd8feb9fa Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 22 Jul 2018 09:23:47 +0200 Subject: 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 --- desktop-widgets/simplewidgets.cpp | 15 +++++---------- desktop-widgets/tab-widgets/maintab.cpp | 14 ++++++-------- desktop-widgets/undocommands.cpp | 7 +++---- desktop-widgets/undocommands.h | 4 ++-- 4 files changed, 16 insertions(+), 24 deletions(-) (limited to 'desktop-widgets') diff --git a/desktop-widgets/simplewidgets.cpp b/desktop-widgets/simplewidgets.cpp index 25345551a..b7f985bc9 100644 --- a/desktop-widgets/simplewidgets.cpp +++ b/desktop-widgets/simplewidgets.cpp @@ -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 affectedDives; - for_each_dive (i, dive) { - if (!dive->selected) - continue; - - affectedDives.append(dive->id); + struct dive *d; + QVector 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(); } } } diff --git a/desktop-widgets/tab-widgets/maintab.cpp b/desktop-widgets/tab-widgets/maintab.cpp index ee0ed9578..7f1e6cbc2 100644 --- a/desktop-widgets/tab-widgets/maintab.cpp +++ b/desktop-widgets/tab-widgets/maintab.cpp @@ -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(); } diff --git a/desktop-widgets/undocommands.cpp b/desktop-widgets/undocommands.cpp index 9a56b4e9d..16f87fa23 100644 --- a/desktop-widgets/undocommands.cpp +++ b/desktop-widgets/undocommands.cpp @@ -147,7 +147,7 @@ void UndoDeleteDive::redo() } -UndoShiftTime::UndoShiftTime(QVector changedDives, int amount) +UndoShiftTime::UndoShiftTime(const QVector &changedDives, int amount) : diveList(changedDives), timeChanged(amount) { setText(tr("delete %n dive(s)", "", changedDives.size())); @@ -155,10 +155,9 @@ UndoShiftTime::UndoShiftTime(QVector 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); diff --git a/desktop-widgets/undocommands.h b/desktop-widgets/undocommands.h index 128c62e51..da30c27a0 100644 --- a/desktop-widgets/undocommands.h +++ b/desktop-widgets/undocommands.h @@ -189,13 +189,13 @@ private: class UndoShiftTime : public QUndoCommand { Q_DECLARE_TR_FUNCTIONS(Command) public: - UndoShiftTime(QVector changedDives, int amount); + UndoShiftTime(const QVector &changedDives, int amount); private: void undo() override; void redo() override; // For redo and undo - QVector diveList; + QVector diveList; int timeChanged; }; -- cgit v1.2.3-70-g09d2