summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/command_edit_trip.cpp
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-02-24 21:22:33 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-04-12 18:19:07 +0300
commitd7d408a99e7459ec1a5fc2d9953e72924054b834 (patch)
tree2f283ef63c4e5c0352b648374f99043530b4520c /desktop-widgets/command_edit_trip.cpp
parent9fd87fa08081116ba12812ddea0a43be61019cbb (diff)
downloadsubsurface-d7d408a99e7459ec1a5fc2d9953e72924054b834.tar.gz
Undo: implement undo of dive trip editing
This is copying the dive editing code. It uses an OO design with virtual functions for getting and setting the values. It doesn't use templates though, as both fields of strig type. This feels a bit over-engineered, but it is 1) consistent with the dive edit code and 2) the number / types of dive trip fields might increase. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'desktop-widgets/command_edit_trip.cpp')
-rw-r--r--desktop-widgets/command_edit_trip.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/desktop-widgets/command_edit_trip.cpp b/desktop-widgets/command_edit_trip.cpp
new file mode 100644
index 000000000..4dc680e2d
--- /dev/null
+++ b/desktop-widgets/command_edit_trip.cpp
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include "command_edit_trip.h"
+#include "command_private.h"
+#include "core/divelist.h" // for mark_divelist_changed(). TODO: remove
+#include "core/qthelper.h"
+
+namespace Command {
+
+EditTripBase::EditTripBase(dive_trip *tripIn, const QString &newValue) : trip(tripIn),
+ value(newValue)
+{
+}
+
+// Note: Virtual functions cannot be called in the constructor.
+// Therefore, setting of the title is done here.
+bool EditTripBase::workToBeDone()
+{
+ setText(tr("Edit %1").arg(fieldName()));
+ return data(trip) != value;
+}
+
+void EditTripBase::undo()
+{
+ QString old = data(trip);
+ set(trip, value);
+ value = old;
+
+ emit diveListNotifier.tripChanged(trip, fieldId());
+ mark_divelist_changed(true);
+}
+
+// Undo and redo do the same as just the stored value is exchanged
+void EditTripBase::redo()
+{
+ undo();
+}
+
+// Implementation of virtual functions
+
+// ***** Location *****
+void EditTripLocation::set(dive_trip *t, const QString &s) const
+{
+ free(t->location);
+ t->location = copy_qstring(s);
+}
+
+QString EditTripLocation::data(dive_trip *t) const
+{
+ return QString(t->location);
+}
+
+QString EditTripLocation::fieldName() const
+{
+ return tr("trip location");
+}
+
+TripField EditTripLocation::fieldId() const
+{
+ return TripField::LOCATION;
+}
+
+// ***** Notes *****
+void EditTripNotes::set(dive_trip *t, const QString &s) const
+{
+ free(t->notes);
+ t->notes = copy_qstring(s);
+}
+
+QString EditTripNotes::data(dive_trip *t) const
+{
+ return QString(t->notes);
+}
+
+QString EditTripNotes::fieldName() const
+{
+ return tr("trip notes");
+}
+
+TripField EditTripNotes::fieldId() const
+{
+ return TripField::NOTES;
+}
+
+} // namespace Command