summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/dive.c30
-rw-r--r--core/dive.h1
-rw-r--r--qt-models/diveplannermodel.cpp22
-rw-r--r--qt-models/diveplannermodel.h1
4 files changed, 47 insertions, 7 deletions
diff --git a/core/dive.c b/core/dive.c
index 3bba4179c..1658d3bdd 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -127,6 +127,11 @@ int event_is_gaschange(const struct event *ev)
ev->type == SAMPLE_EVENT_GASCHANGE2;
}
+bool event_is_divemodechange(const struct event *ev)
+{
+ return same_string(ev->name, "modechange");
+}
+
struct event *create_event(unsigned int time, int type, int flags, int value, const char *name)
{
int gas_index = -1;
@@ -573,6 +578,31 @@ void copy_events(const struct divecomputer *s, struct divecomputer *d)
*pev = NULL;
}
+/* copies all events from all dive computers before a given time
+ this is used when editing a dive in the planner to preserve the events
+ of the old dive */
+void copy_events_until(const struct dive *sd, struct dive *dd, int time)
+{
+ if (!sd || !dd)
+ return;
+
+ const struct divecomputer *s = &sd->dc;
+ struct divecomputer *d = &dd->dc;
+
+ while (s && d) {
+ const struct event *ev;
+ ev = s->events;
+ while (ev != NULL) {
+ // Don't add events the planner knows about
+ if (ev->time.seconds < time && !event_is_gaschange(ev) && !event_is_divemodechange(ev))
+ add_event(d, ev->time.seconds, ev->type, ev->flags, ev->value, ev->name);
+ ev = ev->next;
+ }
+ s = s->next;
+ d = d->next;
+ }
+}
+
int nr_cylinders(const struct dive *dive)
{
return dive->cylinders.nr;
diff --git a/core/dive.h b/core/dive.h
index 0d2dbc2a6..f15204a4a 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -352,6 +352,7 @@ extern struct dive *merge_dives(const struct dive *a, const struct dive *b, int
extern struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded);
extern struct event *clone_event(const struct event *src_ev);
extern void copy_events(const struct divecomputer *s, struct divecomputer *d);
+extern void copy_events_until(const struct dive *sd, struct dive *dd, int time);
extern void free_events(struct event *ev);
extern void copy_cylinders(const struct cylinder_table *s, struct cylinder_table *d);
extern void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only);
diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp
index 09d08c79a..f9823c12d 100644
--- a/qt-models/diveplannermodel.cpp
+++ b/qt-models/diveplannermodel.cpp
@@ -150,6 +150,7 @@ void DivePlannerPointsModel::loadFromDive(dive *d)
addStop(0, d->dc.duration.seconds,cylinderid, last_sp.mbar, true, current_divemode);
recalc = oldRec;
DiveTypeSelectionModel::instance()->repopulate();
+ preserved_until = d->duration;
emitDataChanged();
}
@@ -844,10 +845,13 @@ void DivePlannerPointsModel::remove(const QModelIndex &index)
int i;
int rows = rowCount();
if (QApplication::keyboardModifiers() & Qt::ControlModifier) {
+ preserved_until.seconds = divepoints.at(index.row()).time;
beginRemoveRows(QModelIndex(), index.row(), rows - 1);
for (i = rows - 1; i >= index.row(); i--)
divepoints.remove(i);
} else {
+ if (index.row() == rows -1)
+ preserved_until.seconds = divepoints.at(rows - 1).time;
beginRemoveRows(QModelIndex(), index.row(), index.row());
divepoints.remove(index.row());
}
@@ -916,6 +920,7 @@ void DivePlannerPointsModel::clear()
endRemoveRows();
}
cylinders.clear();
+ preserved_until.seconds = 0;
setRecalc(oldRecalc);
}
@@ -1219,17 +1224,20 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
#if not defined(SUBSURFACE_MOBILE) && not defined(SUBSURFACE_TESTING)
Command::addDive(&displayed_dive, autogroup, true);
#endif // SUBSURFACE_MOBILE SUBSURFACE_TESTING
- } 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.
+ } else {
+ copy_events_until(current_dive, &displayed_dive, preserved_until.seconds);
+ 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.
#if not defined(SUBSURFACE_MOBILE) && not defined(SUBSURFACE_TESTING)
- Command::addDive(&displayed_dive, false, false);
+ Command::addDive(&displayed_dive, false, false);
#endif // SUBSURFACE_MOBILE SUBSURFACE_TESTING
- } else {
- // we were planning an old dive and rewrite the plan
+ } else {
+ // we were planning an old dive and rewrite the plan
#if not defined(SUBSURFACE_MOBILE) && not defined(SUBSURFACE_TESTING)
- Command::replanDive(&displayed_dive);
+ Command::replanDive(&displayed_dive);
#endif // SUBSURFACE_MOBILE SUBSURFACE_TESTING
+ }
}
// Remove and clean the diveplan, so we don't delete
diff --git a/qt-models/diveplannermodel.h b/qt-models/diveplannermodel.h
index 4d0967a26..7866591a6 100644
--- a/qt-models/diveplannermodel.h
+++ b/qt-models/diveplannermodel.h
@@ -136,6 +136,7 @@ private:
QDateTime startTime;
int instanceCounter = 0;
struct deco_state ds_after_previous_dives;
+ duration_t preserved_until;
};
#endif