summaryrefslogtreecommitdiffstats
path: root/qt-ui
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-11-18 11:55:56 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-11-18 11:55:56 -0800
commit8ae8c81d3d47e5ba6b7ea292c92a9527fc85994f (patch)
tree52a3b5676d1d01a6d0b823346022d6fcd77f855f /qt-ui
parent3801b765fff847adff1899c7d54484b0bb100c87 (diff)
downloadsubsurface-8ae8c81d3d47e5ba6b7ea292c92a9527fc85994f.tar.gz
Fix various issues with the dive add / edit manual dive code
- get_gas_from_events does NOT always set o2/he. It only updates them IFF a matching event is found; so we need to make sure we start out with a valid gas mix - the way we tried to restore the edited dive in case of an edit to a manually added that is cancelled was completely bogus. Way too complex when we can simply and reliably simply store the dive and then copy it back Fixes #270 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui')
-rw-r--r--qt-ui/diveplanner.cpp38
-rw-r--r--qt-ui/diveplanner.h4
-rw-r--r--qt-ui/maintab.cpp4
3 files changed, 20 insertions, 26 deletions
diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp
index 39fe0548f..aefb4ef65 100644
--- a/qt-ui/diveplanner.cpp
+++ b/qt-ui/diveplanner.cpp
@@ -442,28 +442,30 @@ void DivePlannerPointsModel::loadFromDive(dive* d)
* as soon as the model is modified, it will
* remove all samples from the current dive.
* */
- struct dive *backupDive = alloc_dive();
- backupDive->when = current_dive->when; // do we need anything else?
- copy_samples(current_dive, backupDive);
- copy_cylinders(current_dive, backupDive);
- copy_events(current_dive, backupDive);
- backupSamples.clear();
- for(int i = 0; i < d->dc.samples-1; i++){
- backupSamples.push_back( d->dc.sample[i]);
- }
+ memcpy(&backupDive, current_dive, sizeof(struct dive));
+ copy_samples(current_dive, &backupDive);
+ copy_events(current_dive, &backupDive);
copy_cylinders(current_dive, stagingDive); // this way the correct cylinder data is shown
CylindersModel::instance()->setDive(stagingDive);
int lasttime = 0;
- Q_FOREACH(const sample &s, backupSamples){
- int o2 = 0, he = 0;
+ // we start with the first gas and see if it was changed
+ int o2 = backupDive.cylinder[0].gasmix.o2.permille;
+ int he = backupDive.cylinder[0].gasmix.he.permille;
+ for (int i = 0; i < backupDive.dc.samples; i++) {
+ const sample &s = backupDive.dc.sample[i];
if (s.time.seconds == 0)
continue;
- get_gas_from_events(&backupDive->dc, lasttime, &o2, &he);
+ get_gas_from_events(&backupDive.dc, lasttime, &o2, &he);
plannerModel->addStop(s.depth.mm, s.time.seconds, o2, he, 0);
lasttime = s.time.seconds;
}
}
+void DivePlannerPointsModel::restoreBackupDive()
+{
+ memcpy(current_dive, &backupDive, sizeof(struct dive));
+}
+
void DivePlannerPointsModel::copyCylinders(dive *d)
{
copy_cylinders(stagingDive, d);
@@ -1412,18 +1414,6 @@ void DivePlannerPointsModel::createTemporaryPlan()
#endif
}
-void DivePlannerPointsModel::undoEdition()
-{
- clear();
- Q_FOREACH(const sample &s, backupSamples){
- if (s.time.seconds > 0) {
- int o2, he;
- get_gas_from_events(&current_dive->dc, s.time.seconds, &o2, &he);
- plannerModel->addStop(s.depth.mm, s.time.seconds, o2, he, 0);
- }
- }
-}
-
void DivePlannerPointsModel::deleteTemporaryPlan()
{
deleteTemporaryPlan(diveplan.dp);
diff --git a/qt-ui/diveplanner.h b/qt-ui/diveplanner.h
index a310cf045..1d15fb766 100644
--- a/qt-ui/diveplanner.h
+++ b/qt-ui/diveplanner.h
@@ -61,7 +61,8 @@ public slots:
void createTemporaryPlan();
void deleteTemporaryPlan();
void loadFromDive(dive* d);
- void undoEdition();
+ void restoreBackupDive();
+
signals:
void planCreated();
void planCanceled();
@@ -73,6 +74,7 @@ private:
Mode mode;
QVector<divedatapoint> divepoints;
struct dive *tempDive;
+ struct dive backupDive;
void deleteTemporaryPlan(struct divedatapoint *dp);
QVector<sample> backupSamples; // For editing added dives.
struct dive *stagingDive;
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
index 16350f709..7c94ab4c8 100644
--- a/qt-ui/maintab.cpp
+++ b/qt-ui/maintab.cpp
@@ -565,7 +565,9 @@ void MainTab::rejectChanges()
// clean up
DivePlannerPointsModel::instance()->cancelPlan();
} else if (lastMode == MANUALLY_ADDED_DIVE ) {
- DivePlannerPointsModel::instance()->undoEdition(); // that's BOGUS... just copy the original dive back and be done with it...
+ // when we tried to edit a manually added dive, we destroyed
+ // the dive we edited, so let's just restore it from backup
+ DivePlannerPointsModel::instance()->restoreBackupDive();
}
struct dive *curr = current_dive;
ui.notes->setText(notesBackup[curr].notes );