diff options
-rw-r--r-- | core/dive.c | 15 | ||||
-rw-r--r-- | core/dive.h | 1 | ||||
-rw-r--r-- | qt-models/cylindermodel.cpp | 36 | ||||
-rw-r--r-- | qt-models/diveplannermodel.cpp | 19 |
4 files changed, 39 insertions, 32 deletions
diff --git a/core/dive.c b/core/dive.c index 84d476958..59bbef9c8 100644 --- a/core/dive.c +++ b/core/dive.c @@ -1858,7 +1858,7 @@ static int sort_event(struct event *a, struct event *b) static int same_gas(struct event *a, struct event *b) { if (a->type == b->type && a->flags == b->flags && a->value == b->value && !strcmp(a->name, b->name) && - a->gas.mix.o2.permille == b->gas.mix.o2.permille && a->gas.mix.he.permille == b->gas.mix.he.permille) { + same_gasmix(&a->gas.mix, &b->gas.mix)) { return true; } return false; @@ -2078,6 +2078,19 @@ int same_gasmix(struct gasmix *a, struct gasmix *b) return a->o2.permille == b->o2.permille && a->he.permille == b->he.permille; } +int same_gasmix_cylinder(cylinder_t *cyl, int cylid, struct dive *dive, bool check_unused) +{ + struct gasmix *mygas = &cyl->gasmix; + for (int i = 0; i < MAX_CYLINDERS; i++) { + if (i == cylid || cylinder_none(&dive->cylinder[i])) + continue; + struct gasmix *gas2 = &dive->cylinder[i].gasmix; + if (gasmix_distance(mygas, gas2) == 0 && (is_cylinder_used(dive, i) || check_unused)) + return i; + } + return -1; +} + static int pdiff(pressure_t a, pressure_t b) { return a.mbar && b.mbar && a.mbar != b.mbar; diff --git a/core/dive.h b/core/dive.h index 51524500f..f361cfcb2 100644 --- a/core/dive.h +++ b/core/dive.h @@ -368,6 +368,7 @@ static inline bool dive_cache_is_valid(const struct dive *dive) extern int get_cylinder_idx_by_use(struct dive *dive, enum cylinderuse cylinder_use_type); extern void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[]); +extern int same_gasmix_cylinder(cylinder_t *cyl, int cylid, struct dive *dive, bool check_unused); /* when selectively copying dive information, which parts should be copied? */ struct dive_components { diff --git a/qt-models/cylindermodel.cpp b/qt-models/cylindermodel.cpp index d0675ed8a..545341c78 100644 --- a/qt-models/cylindermodel.cpp +++ b/qt-models/cylindermodel.cpp @@ -139,7 +139,6 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const int mapping[MAX_CYLINDERS]; int same_gas = -1; cylinder_t *cyl = &displayed_dive.cylinder[index.row()]; - struct gasmix *mygas = &cyl->gasmix; switch (role) { case Qt::BackgroundRole: { @@ -233,15 +232,8 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const case Qt::DecorationRole: case Qt::SizeHintRole: if (index.column() == REMOVE) { - same_gas = -1; - for (int i = 0; i < MAX_CYLINDERS; i++) { - mapping[i] = i; - if (i == index.row() || cylinder_none(&displayed_dive.cylinder[i])) - continue; - struct gasmix *gas2 = &displayed_dive.cylinder[i].gasmix; - if (gasmix_distance(mygas, gas2) == 0 && is_cylinder_used(&displayed_dive, i)) - same_gas = i; - } + same_gas = same_gasmix_cylinder(cyl, index.row(), &displayed_dive, false); + if ((in_planner() || same_gas == -1) && ((DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING && DivePlannerPointsModel::instance()->tankInUse(index.row())) || @@ -256,15 +248,8 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const case Qt::ToolTipRole: switch (index.column()) { case REMOVE: - same_gas = -1; - for (int i = 0; i < MAX_CYLINDERS; i++) { - mapping[i] = i; - if (i == index.row() || cylinder_none(&displayed_dive.cylinder[i])) - continue; - struct gasmix *gas2 = &displayed_dive.cylinder[i].gasmix; - if (gasmix_distance(mygas, gas2) == 0 && is_cylinder_used(&displayed_dive, i)) - same_gas = i; - } + same_gas = same_gasmix_cylinder(cyl, index.row(), &displayed_dive, false); + if ((in_planner() || same_gas == -1) && ((DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING && DivePlannerPointsModel::instance()->tankInUse(index.row())) || @@ -558,17 +543,9 @@ void CylindersModel::remove(const QModelIndex &index) if (index.column() != REMOVE) { return; } - int same_gas = -1; cylinder_t *cyl = &displayed_dive.cylinder[index.row()]; - struct gasmix *mygas = &cyl->gasmix; - for (int i = 0; i < MAX_CYLINDERS; i++) { - mapping[i] = i; - if (i == index.row() || cylinder_none(&displayed_dive.cylinder[i])) - continue; - struct gasmix *gas2 = &displayed_dive.cylinder[i].gasmix; - if (gasmix_distance(mygas, gas2) == 0 && is_cylinder_used(&displayed_dive, i)) - same_gas = i; - } + int same_gas = same_gasmix_cylinder(cyl, index.row(), &displayed_dive, false); + if ((in_planner() || same_gas == -1) && ((DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING && DivePlannerPointsModel::instance()->tankInUse(index.row())) || @@ -604,6 +581,7 @@ void CylindersModel::remove(const QModelIndex &index) dc_cylinder_renumber(&displayed_dive, dc, mapping); dc = dc->next; } + dataChanged(index, index); } void CylindersModel::updateDecoDepths(pressure_t olddecopo2) diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp index 482647575..57866b9e8 100644 --- a/qt-models/diveplannermodel.cpp +++ b/qt-models/diveplannermodel.cpp @@ -181,7 +181,14 @@ QStringList &DivePlannerPointsModel::getGasList() cylinder_t *cyl = &displayed_dive.cylinder[i]; if (cylinder_nodata(cyl)) break; - list.push_back(get_gas_string(cyl->gasmix)); + /* Check if we have the same gasmix two or more times + * If yes return more verbose string */ + int same_gas = same_gasmix_cylinder(cyl, i, &displayed_dive, true); + if (same_gas == -1) + list.push_back(get_gas_string(cyl->gasmix)); + else + list.push_back(get_gas_string(cyl->gasmix) + QString(" (%1 %2 ").arg(tr("cyl.")).arg(i + 1) + + cyl->type.description + ")"); } return list; } @@ -258,7 +265,15 @@ QVariant DivePlannerPointsModel::data(const QModelIndex &index, int role) const else return p.time / 60; case GAS: - return get_gas_string(displayed_dive.cylinder[p.cylinderid].gasmix); + /* Check if we have the same gasmix two or more times + * If yes return more verbose string */ + int same_gas = same_gasmix_cylinder(&displayed_dive.cylinder[p.cylinderid], p.cylinderid, &displayed_dive, true); + if (same_gas == -1) + return get_gas_string(displayed_dive.cylinder[p.cylinderid].gasmix); + else + return get_gas_string(displayed_dive.cylinder[p.cylinderid].gasmix) + + QString(" (%1 %2 ").arg(tr("cyl.")).arg(p.cylinderid + 1) + + displayed_dive.cylinder[p.cylinderid].type.description + ")"; } } else if (role == Qt::DecorationRole) { switch (index.column()) { |