diff options
author | Rick Walsh <rickmwalsh@gmail.com> | 2016-07-06 22:40:28 +1000 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2016-07-09 12:07:25 -0700 |
commit | b1ed04a7f462d88b28b1abab881a0e1a8acc212a (patch) | |
tree | 3281beb6fb2789d790330e14a07266ec8df4c5c9 /qt-models | |
parent | 066f79223cf49cda5f762b3b9413774b8417cb9f (diff) | |
download | subsurface-b1ed04a7f462d88b28b1abab881a0e1a8acc212a.tar.gz |
Have divedatapoint store cylinder id instead of gasmix
Determining the correct cylinder index from a known gas mix can be
complicated, but it is trivial to look up the gasmix from the cylinder_t
structure.
It makes sense to remember which cylinder is being used. This simplifies
handling changing a cylinder's gas mix, either directly by the user, or
indirectly in the planner. It also permits tracking of multiple cylinders of
the same mix, e.g. independent twins / sidemount.
Signed-off-by: Rick Walsh <rickmwalsh@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-models')
-rw-r--r-- | qt-models/cylindermodel.cpp | 6 | ||||
-rw-r--r-- | qt-models/diveplannermodel.cpp | 113 | ||||
-rw-r--r-- | qt-models/diveplannermodel.h | 6 |
3 files changed, 36 insertions, 89 deletions
diff --git a/qt-models/cylindermodel.cpp b/qt-models/cylindermodel.cpp index 20b72077d..6ea27f167 100644 --- a/qt-models/cylindermodel.cpp +++ b/qt-models/cylindermodel.cpp @@ -296,8 +296,6 @@ bool CylindersModel::setData(const QModelIndex &index, const QVariant &value, in } break; } - if (addDiveMode) - DivePlannerPointsModel::instance()->tanksUpdated(); dataChanged(index, index); return true; } @@ -391,8 +389,8 @@ void CylindersModel::remove(const QModelIndex &index) } if (same_gas == -1 && ((DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING && - DivePlannerPointsModel::instance()->tankInUse(cyl->gasmix)) || - (DivePlannerPointsModel::instance()->currentMode() == DivePlannerPointsModel::NOTHING && + DivePlannerPointsModel::instance()->tankInUse(index.row())) || + (DivePlannerPointsModel::instance()->currentMode() == DivePlannerPointsModel::NOTHING && is_cylinder_used(&displayed_dive, index.row())))) { emit warningMessage(TITLE_OR_TEXT( tr("Cylinder cannot be removed"), diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp index 16a2e40eb..f44d94c17 100644 --- a/qt-models/diveplannermodel.cpp +++ b/qt-models/diveplannermodel.cpp @@ -25,24 +25,21 @@ void DivePlannerPointsModel::removeSelectedPoints(const QVector<int> &rows) void DivePlannerPointsModel::createSimpleDive() { - struct gasmix gas = {}; - // initialize the start time in the plan diveplan.when = displayed_dive.when; - if (isPlanner()) - // let's use the gas from the first cylinder - gas = displayed_dive.cylinder[0].gasmix; + // Use gas from the first cylinder + int cylinderid = 0; // If we're in drop_stone_mode, don't add a first point. // It will be added implicit. if (!prefs.drop_stone_mode) - addStop(M_OR_FT(15, 45), 1 * 60, &gas, 0, true); + addStop(M_OR_FT(15, 45), 1 * 60, cylinderid, 0, true); - addStop(M_OR_FT(15, 45), 20 * 60, &gas, 0, true); + addStop(M_OR_FT(15, 45), 20 * 60, 0, 0, true); if (!isPlanner()) { - addStop(M_OR_FT(5, 15), 42 * 60, &gas, 0, true); - addStop(M_OR_FT(5, 15), 45 * 60, &gas, 0, true); + addStop(M_OR_FT(5, 15), 42 * 60, 0, cylinderid, true); + addStop(M_OR_FT(5, 15), 45 * 60, 0, cylinderid, true); } } @@ -99,8 +96,8 @@ void DivePlannerPointsModel::loadFromDive(dive *d) j++; } if (samplecount) { - get_gas_at_time(d, &d->dc, lasttime, &gas); - addStop(depthsum / samplecount, newtime.seconds, &gas, 0, true); + int cylinderid = get_cylinderid_at_time(d, &d->dc, lasttime); + addStop(depthsum / samplecount, newtime.seconds, cylinderid, 0, true); lasttime = newtime; depthsum = 0; samplecount = 0; @@ -222,7 +219,7 @@ QVariant DivePlannerPointsModel::data(const QModelIndex &index, int role) const else return p.time / 60; case GAS: - return get_divepoint_gas_string(p); + return get_gas_string(displayed_dive.cylinder[p.cylinderid].gasmix); } } else if (role == Qt::DecorationRole) { switch (index.column()) { @@ -282,9 +279,8 @@ bool DivePlannerPointsModel::setData(const QModelIndex &index, const QVariant &v p.setpoint = po2; } break; case GAS: - QByteArray gasv = value.toByteArray(); - if (validate_gas(gasv.data(), &gas)) - p.gasmix = gas; + if (value.toInt() >= 0 && value.toInt() < MAX_CYLINDERS) + p.cylinderid = value.toInt(); break; } editStop(index.row(), p); @@ -292,15 +288,11 @@ bool DivePlannerPointsModel::setData(const QModelIndex &index, const QVariant &v return QAbstractItemModel::setData(index, value, role); } -void DivePlannerPointsModel::gaschange(const QModelIndex &index, QString newgas) +void DivePlannerPointsModel::gaschange(const QModelIndex &index, int newcylinderid) { - int i = index.row(); - gasmix oldgas = divepoints[i].gasmix; - gasmix gas = {}; - if (!validate_gas(newgas.toUtf8().data(), &gas)) - return; - while (i < rowCount() && gasmix_distance(&oldgas, &divepoints[i].gasmix) == 0) - divepoints[i++].gasmix = gas; + int i = index.row(), oldcylinderid = divepoints[i].cylinderid; + while (i < rowCount() && oldcylinderid == divepoints[i].cylinderid) + divepoints[i++].cylinderid = newcylinderid; emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); } @@ -589,13 +581,12 @@ int DivePlannerPointsModel::lastEnteredPoint() return -1; } -int DivePlannerPointsModel::addStop(int milimeters, int seconds, gasmix *gas_in, int ccpoint, bool entered) +int DivePlannerPointsModel::addStop(int milimeters, int seconds, int cylinderid_in, int ccpoint, bool entered) { - struct gasmix air = {}; - struct gasmix gas = {}; + int cylinderid; bool usePrevious = false; - if (gas_in) - gas = *gas_in; + if (cylinderid_in) + cylinderid = cylinderid_in; else usePrevious = true; if (recalcQ()) @@ -607,19 +598,14 @@ int DivePlannerPointsModel::addStop(int milimeters, int seconds, gasmix *gas_in, const divedatapoint t = divepoints.at(lastEnteredPoint()); milimeters = t.depth; seconds = t.time + 600; // 10 minutes. - gas = t.gasmix; + cylinderid = t.cylinderid; ccpoint = t.setpoint; } else if (seconds == 0 && milimeters == 0 && row == 0) { milimeters = M_OR_FT(5, 15); // 5m / 15ft seconds = 600; // 10 min - //Default to the first defined gas, if we got one. - cylinder_t *cyl = &displayed_dive.cylinder[0]; - if (cyl) - gas = cyl->gasmix; + // Default to the first cylinder + cylinderid = 0; } - if (!usePrevious) - if (!addGas(gas)) - qDebug("addGas failed"); // FIXME add error propagation // check if there's already a new stop before this one: for (int i = 0; i < row; i++) { @@ -640,13 +626,9 @@ int DivePlannerPointsModel::addStop(int milimeters, int seconds, gasmix *gas_in, // the segment is determined by the waypoint at the end. if (usePrevious) { if (row < divepoints.count()) { - gas = divepoints.at(row).gasmix; + cylinderid = divepoints.at(row).cylinderid; } else if (row > 0) { - gas = divepoints.at(row - 1).gasmix; - } else { - if (!addGas(air)) - qDebug("addGas failed"); // FIXME add error propagation - + cylinderid = divepoints.at(row - 1).cylinderid; } } @@ -655,7 +637,7 @@ int DivePlannerPointsModel::addStop(int milimeters, int seconds, gasmix *gas_in, divedatapoint point; point.depth = milimeters; point.time = seconds; - point.gasmix = gas; + point.cylinderid = cylinderid; point.setpoint = ccpoint; point.entered = entered; point.next = NULL; @@ -772,7 +754,7 @@ void DivePlannerPointsModel::rememberTanks() oldGases = collectGases(&displayed_dive); } -bool DivePlannerPointsModel::tankInUse(struct gasmix gasmix) +bool DivePlannerPointsModel::tankInUse(int cylinderid) { for (int j = 0; j < rowCount(); j++) { divedatapoint &p = divepoints[j]; @@ -780,45 +762,12 @@ bool DivePlannerPointsModel::tankInUse(struct gasmix gasmix) continue; if (!p.entered) // removing deco gases is ok continue; - if (gasmix_distance(&p.gasmix, &gasmix) < 100) + if (p.cylinderid == cylinderid) // tank is in use return true; } return false; } -void DivePlannerPointsModel::tanksUpdated() -{ - // we don't know exactly what changed - what we care about is - // "did a gas change on us". So we look through the diveplan to - // see if there is a gas that is now missing and if there is, we - // replace it with the matching new gas. - QVector<QPair<int, int> > gases = collectGases(&displayed_dive); - if (gases.count() == oldGases.count()) { - // either nothing relevant changed, or exactly ONE gasmix changed - for (int i = 0; i < gases.count(); i++) { - if (gases.at(i) != oldGases.at(i)) { - if (oldGases.count(oldGases.at(i)) > 1) { - // we had this gas more than once, so don't - // change segments that used this gas as it still exists - break; - } - for (int j = 0; j < rowCount(); j++) { - divedatapoint &p = divepoints[j]; - struct gasmix gas; - gas.o2.permille = oldGases.at(i).first; - gas.he.permille = oldGases.at(i).second; - if (gasmix_distance(&gas, &p.gasmix) < 100) { - p.gasmix.o2.permille = gases.at(i).first; - p.gasmix.he.permille = gases.at(i).second; - } - } - break; - } - } - } - emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); -} - void DivePlannerPointsModel::clear() { bool oldRecalc = setRecalc(false); @@ -843,12 +792,12 @@ void DivePlannerPointsModel::createTemporaryPlan() int deltaT = lastIndex != -1 ? p.time - at(lastIndex).time : p.time; lastIndex = i; if (i == 0 && prefs.drop_stone_mode) { - /* Okay, we add a fist segment where we go down to depth */ - plan_add_segment(&diveplan, p.depth / prefs.descrate, p.depth, p.gasmix, p.setpoint, true); + /* Okay, we add a first segment where we go down to depth */ + plan_add_segment(&diveplan, p.depth / prefs.descrate, p.depth, p.cylinderid, p.setpoint, true); deltaT -= p.depth / prefs.descrate; } if (p.entered) - plan_add_segment(&diveplan, deltaT, p.depth, p.gasmix, p.setpoint, true); + plan_add_segment(&diveplan, deltaT, p.depth, p.cylinderid, p.setpoint, true); } // what does the cache do??? @@ -857,7 +806,7 @@ void DivePlannerPointsModel::createTemporaryPlan() for (int i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = &displayed_dive.cylinder[i]; if (cyl->depth.mm) { - dp = create_dp(0, cyl->depth.mm, cyl->gasmix, 0); + dp = create_dp(0, cyl->depth.mm, i, 0); if (diveplan.dp) { dp->next = diveplan.dp; diveplan.dp = dp; diff --git a/qt-models/diveplannermodel.h b/qt-models/diveplannermodel.h index 0770aa077..da84119ce 100644 --- a/qt-models/diveplannermodel.h +++ b/qt-models/diveplannermodel.h @@ -30,7 +30,7 @@ public: virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); virtual Qt::ItemFlags flags(const QModelIndex &index) const; - void gaschange(const QModelIndex &index, QString newgas); + void gaschange(const QModelIndex &index, int newcylinderid); void removeSelectedPoints(const QVector<int> &rows); void setPlanMode(Mode mode); bool isPlanner(); @@ -42,7 +42,7 @@ public: bool recalcQ(); void tanksUpdated(); void rememberTanks(); - bool tankInUse(struct gasmix gasmix); + bool tankInUse(int cylinderid); void setupCylinders(); /** * @return the row number. @@ -59,7 +59,7 @@ public: public slots: - int addStop(int millimeters = 0, int seconds = 0, struct gasmix *gas = 0, int ccpoint = 0, bool entered = true); + int addStop(int millimeters = 0, int seconds = 0, int cylinderid_in = 0, int ccpoint = 0, bool entered = true); void addCylinder_clicked(); void setGFHigh(const int gfhigh); void triggerGFHigh(); |