summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-01-11 16:52:02 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2021-01-11 09:31:36 -0800
commit1a0f6f53ede1a945c9964fc9de73780a94cd8217 (patch)
treeacb1ecf31435dc335d187680161eb6acd008c1b4 /commands
parentcd32c280ae063e143faebf9c5cf497e6dce3abb7 (diff)
downloadsubsurface-1a0f6f53ede1a945c9964fc9de73780a94cd8217.tar.gz
undo: set dive mode to CCR in undo command, not profile code
When setting a CCR setpoint, the profile code(!) would turn the dive into a CCR dive. Not only should the display layer not alter dives, this also means that the action is not undoable. Move that to the appropriate undo command, where it makes more sense, but obviously also makes things more complicated. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'commands')
-rw-r--r--commands/command_event.cpp15
-rw-r--r--commands/command_event.h10
2 files changed, 22 insertions, 3 deletions
diff --git a/commands/command_event.cpp b/commands/command_event.cpp
index 5c71aaebd..4e29b452c 100644
--- a/commands/command_event.cpp
+++ b/commands/command_event.cpp
@@ -74,11 +74,24 @@ AddEventDivemodeSwitch::AddEventDivemodeSwitch(struct dive *d, int dcNr, int sec
}
AddEventSetpointChange::AddEventSetpointChange(struct dive *d, int dcNr, int seconds, pressure_t pO2) :
- AddEventBase(d, dcNr, create_event(seconds, SAMPLE_EVENT_PO2, 0, pO2.mbar, QT_TRANSLATE_NOOP("gettextFromC", "SP change")))
+ AddEventBase(d, dcNr, create_event(seconds, SAMPLE_EVENT_PO2, 0, pO2.mbar, QT_TRANSLATE_NOOP("gettextFromC", "SP change"))),
+ divemode(CCR)
{
setText(Command::Base::tr("Add set point change")); // TODO: format pO2 value in bar or psi.
}
+void AddEventSetpointChange::undoit()
+{
+ AddEventBase::undoit();
+ std::swap(get_dive_dc(d, dcNr)->divemode, divemode);
+}
+
+void AddEventSetpointChange::redoit()
+{
+ AddEventBase::redoit();
+ std::swap(get_dive_dc(d, dcNr)->divemode, divemode);
+}
+
RenameEvent::RenameEvent(struct dive *d, int dcNr, struct event *ev, const char *name) : EventBase(d, dcNr),
eventToAdd(clone_event_rename(ev, name)),
eventToRemove(ev)
diff --git a/commands/command_event.h b/commands/command_event.h
index b9662ecd4..fbf48c425 100644
--- a/commands/command_event.h
+++ b/commands/command_event.h
@@ -5,6 +5,7 @@
#define COMMAND_EVENT_H
#include "command_base.h"
+#include "core/divemode.h"
// We put everything in a namespace, so that we can shorten names without polluting the global namespace
namespace Command {
@@ -35,10 +36,11 @@ private:
class AddEventBase : public EventBase {
public:
AddEventBase(struct dive *d, int dcNr, struct event *ev); // Takes ownership of event!
-private:
- bool workToBeDone() override;
+protected:
void undoit() override;
void redoit() override;
+private:
+ bool workToBeDone() override;
OwningEventPtr eventToAdd; // for redo
event *eventToRemove; // for undo
@@ -57,6 +59,10 @@ public:
class AddEventSetpointChange : public AddEventBase {
public:
AddEventSetpointChange(struct dive *d, int dcNr, int seconds, pressure_t pO2);
+private:
+ divemode_t divemode; // Wonderful: this may change the divemode of the dive to CCR
+ void undoit() override;
+ void redoit() override;
};
class RenameEvent : public EventBase {