summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--profile.c11
-rw-r--r--qt-ui/maintab.ui26
-rw-r--r--qt-ui/models.cpp114
3 files changed, 86 insertions, 65 deletions
diff --git a/profile.c b/profile.c
index 0601f8eaa..9f7d97d44 100644
--- a/profile.c
+++ b/profile.c
@@ -68,6 +68,7 @@ static void dump_pi (struct plot_info *pi)
}
#define ROUND_UP(x,y) ((((x)+(y)-1)/(y))*(y))
+#define DIV_UP(x,y) (((x)+(y)-1)/(y))
/*
* When showing dive profiles, we scale things to the
@@ -989,12 +990,14 @@ static void calculate_deco_information(struct dive *dive, struct divecomputer *d
fo2 = get_o2(&dive->cylinder[cylinderindex].gasmix);
fhe = get_he(&dive->cylinder[cylinderindex].gasmix);
double ratio = (double)fhe / (1000.0 - fo2);
+ int ccrdive = 0;
if (entry->po2) {
/* we have an O2 partial pressure in the sample - so this
* is likely a CC dive... use that instead of the value
* from the cylinder info */
double po2 = entry->po2 > amb_pressure ? amb_pressure : entry->po2;
+ ccrdive = 1;
entry->po2 = po2;
entry->phe = (amb_pressure - po2) * ratio;
entry->pn2 = amb_pressure - po2 - entry->phe;
@@ -1040,7 +1043,7 @@ static void calculate_deco_information(struct dive *dive, struct divecomputer *d
for (j = t0+1; j <= t1; j++) {
int depth = interpolate(entry[-1].depth, entry[0].depth, j - t0, t1 - t0);
double min_pressure = add_segment(depth_to_mbar(depth, dive) / 1000.0,
- &dive->cylinder[cylinderindex].gasmix, 1, entry->po2 * 1000, dive);
+ &dive->cylinder[cylinderindex].gasmix, 1, ccrdive ? entry->po2 * 1000 : 0, dive);
tissue_tolerance = min_pressure;
}
if (t0 == t1)
@@ -1165,7 +1168,7 @@ static void plot_string(struct plot_data *entry, char *buf, int bufsize,
if (entry->ndl) {
/* this is a safety stop as we still have ndl */
if (entry->stoptime)
- snprintf(buf, bufsize, _("%s\nSafetystop:%umin @ %.0f %s"), buf2, entry->stoptime / 60,
+ snprintf(buf, bufsize, _("%s\nSafetystop:%umin @ %.0f %s"), buf2, DIV_UP(entry->stoptime, 60),
depthvalue, depth_unit);
else
snprintf(buf, bufsize, _("%s\nSafetystop:unkn time @ %.0f %s"), buf2,
@@ -1173,7 +1176,7 @@ static void plot_string(struct plot_data *entry, char *buf, int bufsize,
} else {
/* actual deco stop */
if (entry->stoptime)
- snprintf(buf, bufsize, _("%s\nDeco:%umin @ %.0f %s"), buf2, entry->stoptime / 60,
+ snprintf(buf, bufsize, _("%s\nDeco:%umin @ %.0f %s"), buf2, DIV_UP(entry->stoptime, 60),
depthvalue, depth_unit);
else
snprintf(buf, bufsize, _("%s\nDeco:unkn time @ %.0f %s"), buf2,
@@ -1185,7 +1188,7 @@ static void plot_string(struct plot_data *entry, char *buf, int bufsize,
snprintf(buf, bufsize, _("%s\nIn deco"), buf2);
} else if (has_ndl) {
memcpy(buf2, buf, bufsize);
- snprintf(buf, bufsize, _("%s\nNDL:%umin"), buf2, entry->ndl / 60);
+ snprintf(buf, bufsize, _("%s\nNDL:%umin"), buf2, DIV_UP(entry->ndl, 60));
}
if (entry->cns) {
memcpy(buf2, buf, bufsize);
diff --git a/qt-ui/maintab.ui b/qt-ui/maintab.ui
index c42dc4638..a89adfd2b 100644
--- a/qt-ui/maintab.ui
+++ b/qt-ui/maintab.ui
@@ -14,7 +14,7 @@
<string>TabWidget</string>
</property>
<property name="currentIndex">
- <number>1</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="notesTab">
<attribute name="title">
@@ -259,7 +259,7 @@
<string>Dive Info</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
+ <item row="1" column="2">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>SAC</string>
@@ -278,7 +278,7 @@
</layout>
</widget>
</item>
- <item row="0" column="1">
+ <item row="1" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Gases Used</string>
@@ -297,7 +297,7 @@
</layout>
</widget>
</item>
- <item row="1" column="0">
+ <item row="2" column="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>OTU</string>
@@ -316,7 +316,7 @@
</layout>
</widget>
</item>
- <item row="4" column="0">
+ <item row="0" column="0">
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Date</string>
@@ -335,7 +335,7 @@
</layout>
</widget>
</item>
- <item row="5" column="0">
+ <item row="3" column="0">
<widget class="QGroupBox" name="groupBox_10">
<property name="title">
<string>Air Pressure</string>
@@ -354,7 +354,7 @@
</layout>
</widget>
</item>
- <item row="4" column="1">
+ <item row="3" column="1">
<widget class="QGroupBox" name="groupBox_9">
<property name="title">
<string>Air Temperature</string>
@@ -373,7 +373,7 @@
</layout>
</widget>
</item>
- <item row="0" column="2">
+ <item row="1" column="1">
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Gas Consumed</string>
@@ -392,7 +392,7 @@
</layout>
</widget>
</item>
- <item row="1" column="1">
+ <item row="2" column="0">
<widget class="QGroupBox" name="groupBox_6">
<property name="title">
<string>Max. Depth</string>
@@ -411,7 +411,7 @@
</layout>
</widget>
</item>
- <item row="1" column="2">
+ <item row="2" column="1">
<widget class="QGroupBox" name="groupBox_7">
<property name="title">
<string>Ave. Depth</string>
@@ -430,7 +430,7 @@
</layout>
</widget>
</item>
- <item row="4" column="2">
+ <item row="3" column="2">
<widget class="QGroupBox" name="groupBox_8">
<property name="title">
<string>Water Temperature</string>
@@ -449,7 +449,7 @@
</layout>
</widget>
</item>
- <item row="5" column="1">
+ <item row="0" column="2">
<widget class="QGroupBox" name="groupBox_12">
<property name="title">
<string>Interval</string>
@@ -468,7 +468,7 @@
</layout>
</widget>
</item>
- <item row="5" column="2">
+ <item row="0" column="1">
<widget class="QGroupBox" name="groupBox_11">
<property name="title">
<string>Dive Time</string>
diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp
index 3b2940a6c..0288e7107 100644
--- a/qt-ui/models.cpp
+++ b/qt-ui/models.cpp
@@ -59,6 +59,16 @@ int CylindersModel::columnCount(const QModelIndex& parent) const
return COLUMNS;
}
+static QVariant percent_string(fraction_t fraction)
+{
+ int permille = fraction.permille;
+
+ if (!permille)
+ return QVariant();
+
+ return QString("%1%").arg(permille / 10.0, 0, 'f', 1);
+}
+
QVariant CylindersModel::data(const QModelIndex& index, int role) const
{
QVariant ret;
@@ -68,9 +78,21 @@ QVariant CylindersModel::data(const QModelIndex& index, int role) const
cylinder_t *cyl = &current->cylinder[index.row()];
switch (role) {
- case Qt::FontRole:
- ret = defaultModelFont();
+ case Qt::FontRole: {
+ QFont font = defaultModelFont();
+ switch (index.column()) {
+ case START:
+ if (!cyl->start.mbar)
+ font.setItalic(true);
+ break;
+ case END:
+ if (!cyl->end.mbar)
+ font.setItalic(true);
+ break;
+ }
+ ret = font;
break;
+ }
case Qt::TextAlignmentRole:
ret = Qt::AlignHCenter;
break;
@@ -84,12 +106,16 @@ QVariant CylindersModel::data(const QModelIndex& index, int role) const
// we can't use get_volume_string because the idiotic imperial tank
// sizes take working pressure into account...
if (cyl->type.size.mliter) {
- if (prefs.units.volume == prefs.units.CUFT) {
- int cuft = 0.5 + ml_to_cuft(gas_volume(cyl, cyl->type.workingpressure));
- ret = QString("%1cuft").arg(cuft);
+ double volume;
+ int mbar = cyl->type.workingpressure.mbar;
+
+ if (mbar && prefs.units.volume == prefs.units.CUFT) {
+ volume = ml_to_cuft(cyl->type.size.mliter);
+ volume *= bar_to_atm(mbar / 1000.0);
} else {
- ret = QString("%1l").arg(cyl->type.size.mliter / 1000.0, 0, 'f', 1);
+ volume = cyl->type.size.mliter / 1000.0;
}
+ ret = QString("%1").arg(volume, 0, 'f', 1);
}
break;
case WORKINGPRESS:
@@ -98,17 +124,21 @@ QVariant CylindersModel::data(const QModelIndex& index, int role) const
break;
case START:
if (cyl->start.mbar)
- ret = get_pressure_string(cyl->start, TRUE);
+ ret = get_pressure_string(cyl->start, FALSE);
+ else if (cyl->sample_start.mbar)
+ ret = get_pressure_string(cyl->sample_start, FALSE);
break;
case END:
if (cyl->end.mbar)
- ret = get_pressure_string(cyl->end, TRUE );
+ ret = get_pressure_string(cyl->end, FALSE);
+ else if (cyl->sample_end.mbar)
+ ret = get_pressure_string(cyl->sample_end, FALSE);
break;
case O2:
- ret = QString("%1%").arg((cyl->gasmix.o2.permille + 5) / 10);
+ ret = percent_string(cyl->gasmix.o2);
break;
case HE:
- ret = QString("%1%").arg((cyl->gasmix.he.permille + 5) / 10);
+ ret = percent_string(cyl->gasmix.he);
break;
}
break;
@@ -164,28 +194,21 @@ bool CylindersModel::setData(const QModelIndex& index, const QVariant& value, in
if (value.toDouble() != 0.0) {
TankInfoModel *tanks = TankInfoModel::instance();
QModelIndexList matches = tanks->match(tanks->index(0,0), Qt::DisplayRole, cyl->type.description);
- if (prefs.units.volume == prefs.units.CUFT) {
- if (cyl->type.workingpressure.mbar == 0) {
- // this is a hack as we can't store a wet size
- // without working pressure in cuft mode
- // so we assume it's an aluminum tank at 3000psi
- cyl->type.workingpressure.mbar = psi_to_mbar(3000);
- if (!matches.isEmpty())
- tanks->setData(tanks->index(matches.first().row(), TankInfoModel::BAR), cyl->type.workingpressure.mbar / 1000.0);
- }
- if (cyl->type.size.mliter != wet_volume(value.toDouble(), cyl->type.workingpressure)) {
- mark_divelist_changed(TRUE);
- cyl->type.size.mliter = wet_volume(value.toDouble(), cyl->type.workingpressure);
- if (!matches.isEmpty())
- tanks->setData(tanks->index(matches.first().row(), TankInfoModel::ML), cyl->type.size.mliter);
- }
+ int mbar = cyl->type.workingpressure.mbar;
+ int mliter;
+
+ if (mbar && prefs.units.volume == prefs.units.CUFT) {
+ double liters = cuft_to_l(value.toDouble());
+ liters /= bar_to_atm(mbar / 1000.0);
+ mliter = rint(liters * 1000);
} else {
- if (cyl->type.size.mliter != value.toDouble() * 1000.0) {
- mark_divelist_changed(TRUE);
- cyl->type.size.mliter = value.toDouble() * 1000.0;
- if (!matches.isEmpty())
- tanks->setData(tanks->index(matches.first().row(), TankInfoModel::ML), cyl->type.size.mliter);
- }
+ mliter = rint(value.toDouble() * 1000);
+ }
+ if (cyl->type.size.mliter != mliter) {
+ mark_divelist_changed(TRUE);
+ cyl->type.size.mliter = mliter;
+ if (!matches.isEmpty())
+ tanks->setData(tanks->index(matches.first().row(), TankInfoModel::ML), cyl->type.size.mliter);
}
}
}
@@ -227,14 +250,14 @@ bool CylindersModel::setData(const QModelIndex& index, const QVariant& value, in
}
break;
case O2:
- if (CHANGED(toInt, "%", "%")) {
- cyl->gasmix.o2.permille = value.toInt() * 10;
+ if (CHANGED(toDouble, "%", "%")) {
+ cyl->gasmix.o2.permille = value.toDouble() * 10 + 0.5;
mark_divelist_changed(TRUE);
}
break;
case HE:
- if (CHANGED(toInt, "%", "%")) {
- cyl->gasmix.he.permille = value.toInt() * 10;
+ if (CHANGED(toDouble, "%", "%")) {
+ cyl->gasmix.he.permille = value.toDouble() * 10 + 0.5;
mark_divelist_changed(TRUE);
}
break;
@@ -408,7 +431,7 @@ bool WeightModel::setData(const QModelIndex& index, const QVariant& value, int r
if (prefs.units.weight == prefs.units.LBS)
ws->weight.grams = lbs_to_grams(value.toDouble());
else
- ws->weight.grams = value.toDouble() * 1000.0;
+ ws->weight.grams = value.toDouble() * 1000.0 + 0.5;
// now update the ws_info
WSInfoModel *wsim = WSInfoModel::instance();
QModelIndexList matches = wsim->match(wsim->index(0,0), Qt::DisplayRole, ws->description);
@@ -678,22 +701,17 @@ QVariant TankInfoModel::data(const QModelIndex& index, int role) const
if (role == Qt::FontRole){
return defaultModelFont();
}
+ if (role == Qt::DisplayRole || role == Qt::EditRole) {
+ struct tank_info *info = &tank_info[index.row()];
+ int ml = info->ml;
+ double bar = (info->psi) ? psi_to_bar(info->psi) : info->bar;
- struct tank_info *info = &tank_info[index.row()];
-
- int ml = info->ml;
-
- int bar = ((info->psi) ? psi_to_bar(info->psi) : info->bar) * 1000 + 0.5;
+ if (info->cuft && info->psi)
+ ml = cuft_to_l(info->cuft) * 1000 / bar_to_atm(bar);
- if (info->cuft && info->psi) {
- pressure_t p;
- p.mbar = psi_to_mbar(info->psi);
- ml = wet_volume(info->cuft, p);
- }
- if (role == Qt::DisplayRole || role == Qt::EditRole) {
switch(index.column()) {
case BAR:
- ret = bar;
+ ret = bar * 1000;
break;
case ML:
ret = ml;