diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2018-09-08 19:58:11 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-10-11 16:22:27 -0700 |
commit | b19adecb9f679b3b4523d679e65dedc2849d50e6 (patch) | |
tree | 4002a578dcfab0470e1bff0c27b6fa25a2484aa3 /qt-models | |
parent | e0fcf99d0ac3ec23e6009a55b6e59c47c668081b (diff) | |
download | subsurface-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')
-rw-r--r-- | qt-models/diveplannermodel.cpp | 45 |
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(); } |