From: Linus Torvalds <torva...@linux-foundation.org>
Date: Wed, 24 Feb 2016 14:42:56 -0800
Subject: [PATCH 1/2] Don't use "get_volume_string()" for cylinder size string

We had two totally different usage cases for "get_volume_string()": one
that did the obvious "show this volume as a string", and one that tried
to show a cylinder size.

The function used a magic third argument (the working pressure of the
cylinder) to distinguish between the two cases, but it still got it
wrong.

A metric cylinder doesn't necessarily have a working pressure at all,
and the size is a wet size in liters.  We'd pass in zero as the working
pressure, and if the volume units were set to cubic feet, the logic in
"get_volume_string()" would happily convert the metric wet size into the
wet size in cubic feet.

But that's completely wrong.  An imperial cylinder size simply isn't a
wet size.  If you don't have a working pressure, you cannot convert the
cylinder size to cubic feet.  End of story.

So instead of having "get_volume_string()" have magical behavior
depending on working pressure, and getting it wrong anyway, just make
get_volume_string do a pure volume conversion, and create a whole new
function for showing the size of a cylinder.

Now, if the cylinder doesn't have a working pressure, we just show the
metric size, even if the user had asked for cubic feet.

Signed-off-by: Linus Torvalds <torva...@linux-foundation.org>
---
 qt-models/cylindermodel.cpp                        | 28 +++++++++++++++++++++-
 subsurface-core/helpers.h                          |  2 +-
 subsurface-core/qthelper.cpp                       | 10 +-------
 subsurface-core/subsurface-qt/DiveObjectHelper.cpp |  2 +-
 4 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/qt-models/cylindermodel.cpp b/qt-models/cylindermodel.cpp
index 8341d36081eb..cfeabd557ace 100644
--- a/qt-models/cylindermodel.cpp
+++ b/qt-models/cylindermodel.cpp
@@ -23,6 +23,32 @@ CylindersModel *CylindersModel::instance()
        return self.data();
 }
 
+static QString get_cylinder_string(cylinder_t *cyl)
+{
+       QString unit;
+       int decimals;
+       unsigned int ml = cyl->type.size.mliter;
+       pressure_t wp = cyl->type.workingpressure;
+       double value;
+
+       // We cannot use "get_volume_units()", because even when
+       // using imperial units we may need to show the size in
+       // liters: if we don't have a working pressure, we cannot
+       // convert the cylinder size to cuft.
+       if (wp.mbar && prefs.units.volume == units::CUFT) {
+               value = ml_to_cuft(ml) * bar_to_atm(wp.mbar / 1000.0);
+               decimals = (value > 20.0) ? 0 : (value > 2.0) ? 1 : 2;
+               unit = "cuft";
+       } else {
+               value = ml / 1000.0;
+               decimals = 1;
+               unit = "ℓ";
+       }
+
+       return QString("%1").arg(value, 0, 'f', decimals) + unit;
+}
+
+
 static QVariant percent_string(fraction_t fraction)
 {
        int permille = fraction.permille;
@@ -78,7 +104,7 @@ QVariant CylindersModel::data(const QModelIndex &index, int 
role) const
                        break;
                case SIZE:
                        if (cyl->type.size.mliter)
-                               ret = get_volume_string(cyl->type.size, true, 
cyl->type.workingpressure.mbar);
+                               ret = get_cylinder_string(cyl);
                        break;
                case WORKINGPRESS:
                        if (cyl->type.workingpressure.mbar)
diff --git a/subsurface-core/helpers.h b/subsurface-core/helpers.h
index 44f25f5fa430..f88da015cf48 100644
--- a/subsurface-core/helpers.h
+++ b/subsurface-core/helpers.h
@@ -19,7 +19,7 @@ QString get_weight_unit();
 QString get_cylinder_used_gas_string(cylinder_t *cyl, bool showunit = false);
 QString get_temperature_string(temperature_t temp, bool showunit = false);
 QString get_temp_unit();
-QString get_volume_string(volume_t volume, bool showunit = false, int mbar = 
0);
+QString get_volume_string(volume_t volume, bool showunit = false);
 QString get_volume_unit();
 QString get_pressure_string(pressure_t pressure, bool showunit = false);
 QString get_pressure_unit();
diff --git a/subsurface-core/qthelper.cpp b/subsurface-core/qthelper.cpp
index bfc7fc57bcd8..d1c6a8826e02 100644
--- a/subsurface-core/qthelper.cpp
+++ b/subsurface-core/qthelper.cpp
@@ -678,19 +678,11 @@ QString get_temp_unit()
                return QString(UTF8_DEGREE "F");
 }
 
-QString get_volume_string(volume_t volume, bool showunit, int mbar)
+QString get_volume_string(volume_t volume, bool showunit)
 {
        const char *unit;
        int decimals;
        double value = get_volume_units(volume.mliter, &decimals, &unit);
-       if (mbar) {
-               // we are showing a tank size
-               // fix the weird imperial way of denominating size and provide
-               // reasonable number of decimals
-               if (prefs.units.volume == units::CUFT)
-                       value *= bar_to_atm(mbar / 1000.0);
-               decimals = (value > 20.0) ? 0 : (value > 2.0) ? 1 : 2;
-       }
        return QString("%1%2").arg(value, 0, 'f', decimals).arg(showunit ? unit 
: "");
 }
 
diff --git a/subsurface-core/subsurface-qt/DiveObjectHelper.cpp 
b/subsurface-core/subsurface-qt/DiveObjectHelper.cpp
index 376380b8ce52..bea9556b2aee 100644
--- a/subsurface-core/subsurface-qt/DiveObjectHelper.cpp
+++ b/subsurface-core/subsurface-qt/DiveObjectHelper.cpp
@@ -26,7 +26,7 @@ static QString getFormattedCylinder(struct dive *dive, 
unsigned int idx)
        if (!desc && idx > 0)
                return QString(EMPTY_DIVE_STRING);
        QString fmt = desc ? QString(desc) : QObject::tr("unknown");
-       fmt += ", " + get_volume_string(cyl->type.size, true, 0);
+       fmt += ", " + get_volume_string(cyl->type.size, true);
        fmt += ", " + get_pressure_string(cyl->type.workingpressure, true);
        fmt += ", " + get_pressure_string(cyl->start, false) + " - " + 
get_pressure_string(cyl->end, true);
        fmt += ", " + get_gas_string(cyl->gasmix);
-- 
2.7.2.334.g7c0da37

_______________________________________________
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to