summaryrefslogtreecommitdiffstats
path: root/qt-models/diveplannermodel.cpp
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-09-08 19:58:11 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-10-11 16:22:27 -0700
commitb19adecb9f679b3b4523d679e65dedc2849d50e6 (patch)
tree4002a578dcfab0470e1bff0c27b6fa25a2484aa3 /qt-models/diveplannermodel.cpp
parente0fcf99d0ac3ec23e6009a55b6e59c47c668081b (diff)
downloadsubsurface-b19adecb9f679b3b4523d679e65dedc2849d50e6.tar.gz
Undo: make adding of planned dive undo-able
Planned dives were still added by directly calling core code. This could confuse the undo-machinery, leading to crashes. Instead, use the proper undo-command. The problem is that as opposed to the other AddDive-commands, planned dives may belong to a trip. Thus, the interface to the AddDive command was changed to respect the divetrip field. Make sure that the other callers reset that field (actually, it should never be set). Add a comment describing the perhaps surprising interface (the passed-in dive, usually displayed dive, is reset). Moreover, a dive cloned in the planner is not assigned a new number. Thus, add an argument to the AddDive-command, which expresses whether a new number should be generated for the to-be-added dive. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'qt-models/diveplannermodel.cpp')
-rw-r--r--qt-models/diveplannermodel.cpp45
1 files changed, 22 insertions, 23 deletions
diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp
index b2d71d1ef..bab57e0df 100644
--- a/qt-models/diveplannermodel.cpp
+++ b/qt-models/diveplannermodel.cpp
@@ -7,6 +7,7 @@
#include "core/device.h"
#include "core/qthelper.h"
#include "core/settings/qPrefDivePlanner.h"
+#include "desktop-widgets/command.h"
#include "core/gettextfromc.h"
#include <QApplication>
#include <QTextDocument>
@@ -1110,15 +1111,9 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
computeVariations(plan_copy, &ds_after_previous_dives);
free(cache);
- if (!current_dive || displayed_dive.id != current_dive->id) {
- // we were planning a new dive, not re-planning an existing on
- record_dive(clone_dive(&displayed_dive));
- } else if (current_dive && displayed_dive.id == current_dive->id) {
- // we are replanning a dive - make sure changes are reflected
- // correctly in the dive structure and copy it back into the dive table
- displayed_dive.maxdepth.mm = 0;
- displayed_dive.dc.maxdepth.mm = 0;
- fixup_dive(&displayed_dive);
+
+ // Fixup planner notes.
+ if (current_dive && displayed_dive.id == current_dive->id) {
// Try to identify old planner output and remove only this part
// Treat user provided text as plain text.
QTextDocument notesDocument;
@@ -1134,24 +1129,28 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
oldnotes.append(displayed_dive.notes);
displayed_dive.notes = copy_qstring(oldnotes);
// If we save as new create a copy of the dive here
- if (replanCopy) {
- struct dive *copy = alloc_dive();
- copy_dive(current_dive, copy);
- copy->id = 0;
- copy->selected = false;
- copy->divetrip = NULL;
- if (current_dive->divetrip)
- add_dive_to_trip(copy, current_dive->divetrip);
- record_dive(copy);
- }
+ }
+
+ setPlanMode(NOTHING);
+ planCreated(); // This signal will exit the profile from planner state. This must be *before* adding the dive,
+ // so that the Undo-commands update the display accordingly (see condition in updateDiveInfo().
+
+ // Now, add or modify the dive.
+ if (!current_dive || displayed_dive.id != current_dive->id) {
+ // we were planning a new dive, not re-planning an existing one
+ displayed_dive.divetrip = nullptr; // Should not be necessary, just in case!
+ Command::addDive(&displayed_dive, autogroup, true);
+ } else if (replanCopy) {
+ // we were planning an old dive and save as a new dive
+ displayed_dive.id = dive_getUniqID(); // Things will break horribly if we create dives with the same id.
+ Command::addDive(&displayed_dive, false, false);
+ } else {
+ // we were planning an old dive and rewrite the plan
+ mark_divelist_changed(true);
copy_dive(&displayed_dive, current_dive);
}
- mark_divelist_changed(true);
- sort_table(&dive_table);
// Remove and clean the diveplan, so we don't delete
// the dive by mistake.
free_dps(&diveplan);
- setPlanMode(NOTHING);
- planCreated();
}