File indexing completed on 2024-05-19 16:31:41
0001 /* 0002 * SPDX-FileCopyrightText: 2018 Friedrich W. H. Kossebau <kossebau@kde.org> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "util.h" 0008 0009 // KF 0010 #include <KLocalizedString> 0011 #include <KUnitConversion/Value> 0012 // Qt 0013 #include <QIcon> 0014 #include <QLocale> 0015 #include <QPixmap> 0016 // Std 0017 #include <cmath> 0018 0019 template<typename T> T clampValue(T value, int decimals) 0020 { 0021 const T mul = std::pow(static_cast<T>(10), decimals); 0022 return int(value * mul) / mul; 0023 } 0024 0025 Util::Util(QObject *parent) 0026 : QObject(parent) 0027 { 0028 } 0029 0030 KUnitConversion::Converter Util::m_converter; 0031 0032 QString Util::existingWeatherIconName(const QString &iconName) const 0033 { 0034 const bool isValid = !iconName.isEmpty() && QIcon::hasThemeIcon(iconName); 0035 return isValid ? iconName : QStringLiteral("weather-not-available"); 0036 } 0037 0038 QString Util::temperatureToDisplayString(int displayUnitType, double value, int valueUnitType, bool rounded, bool degreesOnly) const 0039 { 0040 KUnitConversion::Value v(value, static_cast<KUnitConversion::UnitId>(valueUnitType)); 0041 v = v.convertTo(static_cast<KUnitConversion::UnitId>(displayUnitType)); 0042 0043 const QString unit = degreesOnly ? i18nc("Degree, unit symbol", "°") : v.unit().symbol(); 0044 0045 if (rounded) { 0046 int tempNumber = qRound(v.number()); 0047 return i18nc("temperature unitsymbol", "%1 %2", tempNumber, unit); 0048 } 0049 0050 const QString formattedTemp = QLocale().toString(clampValue(v.number(), 1), 'f', 1); 0051 return i18nc("temperature unitsymbol", "%1 %2", formattedTemp, unit); 0052 } 0053 0054 QString Util::valueToDisplayString(int displayUnitType, double value, int valueUnitType, int precision) const 0055 { 0056 KUnitConversion::Value v(value, static_cast<KUnitConversion::UnitId>(valueUnitType)); 0057 v = v.convertTo(static_cast<KUnitConversion::UnitId>(displayUnitType)); 0058 0059 // TODO: fix KUnitConversion to do locale encoded values and use that 0060 const QString formattedValue = QLocale().toString(clampValue(v.number(), precision), 'f', precision); 0061 return i18nc("value unitsymbol", "%1 %2", formattedValue, v.unit().symbol()); 0062 } 0063 0064 QString Util::percentToDisplayString(double value) const 0065 { 0066 const QString formattedPercentValue = QLocale().toString(clampValue(value, 0), 'f', 0); 0067 return i18nc("value percentsymbol", "%1 %", formattedPercentValue); 0068 } 0069 0070 QString Util::nameFromUnitId(KUnitConversion::UnitId unitId) 0071 { 0072 const KUnitConversion::Unit unit = m_converter.unit(unitId); 0073 QString unitDescription = i18nc("@item %1 is a unit description and %2 its unit symbol", "%1 (%2)", unit.description(), unit.symbol()); 0074 return unitDescription; 0075 }