summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/command_divelist.cpp
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-05-17 22:22:55 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-05-20 21:23:16 -0700
commiteba6e76b963115a77b5f8607bc6c3ea1040a466f (patch)
treee926eb7112a902561c1b66f4d6a342ec2a7134b5 /desktop-widgets/command_divelist.cpp
parentf0307abf50397da79671ce79707eb4ce1f78acd0 (diff)
downloadsubsurface-eba6e76b963115a77b5f8607bc6c3ea1040a466f.tar.gz
Undo: make "move dive computer to front" undoable
Instead of the elegant solution that just modifies the dive, keep two copies and add either the old or the new copy. This is primitive, but it trivially keeps the dives in the right order. The order might change on renumbering the dive computers. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'desktop-widgets/command_divelist.cpp')
-rw-r--r--desktop-widgets/command_divelist.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp
index c49159f5a..4c4a7e7d3 100644
--- a/desktop-widgets/command_divelist.cpp
+++ b/desktop-widgets/command_divelist.cpp
@@ -9,6 +9,7 @@
#include "core/qthelper.h"
#include "core/subsurface-qt/DiveListNotifier.h"
#include "qt-models/filtermodels.h"
+#include "../profile-widget/profilewidget2.h"
#include <array>
@@ -802,6 +803,57 @@ SplitDiveComputer::SplitDiveComputer(dive *d, int dc_num) : SplitDivesBase(d, sp
setText(tr("split dive computer"));
}
+MoveDiveComputerToFront::MoveDiveComputerToFront(dive *d, int dc_num)
+{
+ setText(tr("move dive computer to front"));
+
+ dive *new_dive = make_first_dc(d, dc_num);
+ if (!new_dive)
+ return;
+
+ diveToRemove.dives.push_back(d);
+
+ // Currently, the core code selects the dive -> this is not what we want, as
+ // we manually manage the selection post-command.
+ // TODO: Reset selection in core.
+ new_dive->selected = false;
+
+ // Reset references to trip and site in the new dive, as the undo command
+ // will add the dive to the trip and site.
+ new_dive->divetrip = nullptr;
+ new_dive->dive_site = nullptr;
+
+ diveToAdd.dives.resize(1);
+ diveToAdd.dives[0].dive.reset(new_dive);
+ diveToAdd.dives[0].trip = d->divetrip;
+ diveToAdd.dives[0].site = d->dive_site;
+}
+
+bool MoveDiveComputerToFront::workToBeDone()
+{
+ return !diveToRemove.dives.empty() || !diveToAdd.dives.empty();
+}
+
+void MoveDiveComputerToFront::redoit()
+{
+ DivesAndSitesToRemove addedDive = addDives(diveToAdd);
+ diveToAdd = removeDives(diveToRemove);
+ diveToRemove = std::move(addedDive);
+
+ // Select added dive and make it current
+ restoreSelection(diveToRemove.dives, diveToRemove.dives[0]);
+
+ // Update the profile to show the first dive computer
+ dc_number = 0;
+ MainWindow::instance()->graphics->replot(current_dive);
+}
+
+void MoveDiveComputerToFront::undoit()
+{
+ // Undo and redo do the same
+ redoit();
+}
+
MergeDives::MergeDives(const QVector <dive *> &dives)
{
setText(tr("merge dive"));