From 288aff9dbb58b6e18cf12f4d04502d60f18e74a9 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Wed, 24 Feb 2016 14:42:56 -0800 Subject: 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. [Dirk Hohndel: added call to translation functions for the units] Signed-off-by: Linus Torvalds Signed-off-by: Dirk Hohndel --- qt-models/cylindermodel.cpp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'qt-models') diff --git a/qt-models/cylindermodel.cpp b/qt-models/cylindermodel.cpp index 8341d3608..f5eb764db 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 = CylindersModel::tr("cuft"); + } else { + value = ml / 1000.0; + decimals = 1; + unit = CylindersModel::tr("ℓ"); + } + + 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) -- cgit v1.2.3-70-g09d2