diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 71745883d6a412be0488a6e3cd5d2163219a686b..af36a4f52719241d13eb0b887b7f2bbfebba35d2 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -46,6 +46,7 @@ const FactMetaData::AppSettingsTranslation_s FactMetaData::_rgAppSettingsTransla { "meters", "meters", false, UnitsSettings::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "cm/px", "cm/px", false, UnitsSettings::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "m/s", "m/s", true, UnitsSettings::SpeedUnitsMetersPerSecond, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, + { "C", "C", false, UnitsSettings::TemperatureUnitsCelsius, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "m^2", "m^2", false, UnitsSettings::AreaUnitsSquareMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "m", "ft", false, UnitsSettings::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, { "meters", "ft", false, UnitsSettings::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, @@ -59,6 +60,7 @@ const FactMetaData::AppSettingsTranslation_s FactMetaData::_rgAppSettingsTransla { "m/s", "mph", true, UnitsSettings::SpeedUnitsMilesPerHour, FactMetaData::_metersPerSecondToMilesPerHour, FactMetaData::_milesPerHourToMetersPerSecond }, { "m/s", "km/h", true, UnitsSettings::SpeedUnitsKilometersPerHour, FactMetaData::_metersPerSecondToKilometersPerHour, FactMetaData::_kilometersPerHourToMetersPerSecond }, { "m/s", "kn", true, UnitsSettings::SpeedUnitsKnots, FactMetaData::_metersPerSecondToKnots, FactMetaData::_knotsToMetersPerSecond }, + { "C", "F", false, UnitsSettings::TemperatureUnitsFarenheit, FactMetaData::_celsiusToFarenheit, FactMetaData::_farenheitToCelsius }, }; const char* FactMetaData::_decimalPlacesJsonKey = "decimalPlaces"; @@ -685,6 +687,16 @@ QVariant FactMetaData::_inchesToCentimeters(const QVariant& inches) return QVariant(inches.toDouble() * constants.inchesToCentimeters); } +QVariant FactMetaData::_celsiusToFarenheit(const QVariant& celsius) +{ + return QVariant(celsius.toDouble() * (9.0 / 5.0) + 32); +} + +QVariant FactMetaData::_farenheitToCelsius(const QVariant& farenheit) +{ + return QVariant((farenheit.toDouble() - 32) * (5.0 / 9.0)); +} + void FactMetaData::setRawUnits(const QString& rawUnits) { _rawUnits = rawUnits; @@ -774,9 +786,11 @@ void FactMetaData::_setAppSettingsTranslators(void) for (size_t i=0; irawUnits == _rawUnits.toLower() && + if ((pAppSettingsTranslation->rawUnits == _rawUnits && // Temperature + (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->temperatureUnits()->rawValue().toUInt())) || + (pAppSettingsTranslation->rawUnits == _rawUnits.toLower() && // Speed and Distance ((pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->speedUnits()->rawValue().toUInt()) || - (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->distanceUnits()->rawValue().toUInt()))) { + (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->distanceUnits()->rawValue().toUInt())))) { _cookedUnits = pAppSettingsTranslation->cookedUnits; setTranslators(pAppSettingsTranslation->rawTranslator, pAppSettingsTranslation->cookedTranslator); return; diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index c88ee72409e4ad7ce07678e4c040cbc1d1ae6f58..2dd480f77adc959c58cec94bb398a285686ef4eb 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -193,6 +193,8 @@ private: static QVariant _normToPercent(const QVariant& normalized); static QVariant _centimetersToInches(const QVariant& centimeters); static QVariant _inchesToCentimeters(const QVariant& inches); + static QVariant _celsiusToFarenheit(const QVariant& celsius); + static QVariant _farenheitToCelsius(const QVariant& farenheit); struct AppSettingsTranslation_s { const char* rawUnits; diff --git a/src/Settings/UnitsSettings.cc b/src/Settings/UnitsSettings.cc index 0d5c6e0d6df29fd8ecaf43ea5839bb286874866b..cd5988891cbfadc336882b45e70f667bf769a0c9 100644 --- a/src/Settings/UnitsSettings.cc +++ b/src/Settings/UnitsSettings.cc @@ -16,12 +16,14 @@ const char* UnitsSettings::unitsSettingsGroupName = "Units"; const char* UnitsSettings::distanceUnitsSettingsName = "DistanceUnits"; const char* UnitsSettings::areaUnitsSettingsName = "AreaUnits"; const char* UnitsSettings::speedUnitsSettingsName = "SpeedUnits"; +const char* UnitsSettings::temperatureUnitsSettingsName = "TemperatureUnits"; UnitsSettings::UnitsSettings(QObject* parent) : SettingsGroup(unitsSettingsGroupName, QString() /* root settings group */, parent) , _distanceUnitsFact(NULL) , _areaUnitsFact(NULL) , _speedUnitsFact(NULL) + , _temperatureUnitsFact(NULL) { QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); qmlRegisterUncreatableType("QGroundControl.SettingsManager", 1, 0, "UnitsSettings", "Reference only"); @@ -92,3 +94,24 @@ Fact* UnitsSettings::speedUnits(void) return _speedUnitsFact; } + +Fact* UnitsSettings::temperatureUnits(void) +{ + if (!_temperatureUnitsFact) { + // Units settings can't be loaded from json since it creates an infinite loop of meta data loading. + QStringList enumStrings; + QVariantList enumValues; + + enumStrings << "Celsius" << "Farenheit"; + enumValues << QVariant::fromValue((uint32_t)TemperatureUnitsCelsius) << QVariant::fromValue((uint32_t)TemperatureUnitsFarenheit); + + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, this); + metaData->setName(temperatureUnitsSettingsName); + metaData->setEnumInfo(enumStrings, enumValues); + metaData->setRawDefaultValue(TemperatureUnitsCelsius); + + _temperatureUnitsFact = new SettingsFact(QString() /* no settings group */, metaData, this); + } + + return _temperatureUnitsFact; +} diff --git a/src/Settings/UnitsSettings.h b/src/Settings/UnitsSettings.h index 3ede8765a39cd7bd0bdd929ae9a7aec3d377c953..1d09201c5cc49533689ddb620e77b1c352a58300 100644 --- a/src/Settings/UnitsSettings.h +++ b/src/Settings/UnitsSettings.h @@ -41,28 +41,38 @@ public: SpeedUnitsKnots, }; + enum TemperatureUnits { + TemperatureUnitsCelsius = 0, + TemperatureUnitsFarenheit, + }; + Q_ENUMS(DistanceUnits) Q_ENUMS(AreaUnits) Q_ENUMS(SpeedUnits) + Q_ENUMS(TemperatureUnits) Q_PROPERTY(Fact* distanceUnits READ distanceUnits CONSTANT) Q_PROPERTY(Fact* areaUnits READ areaUnits CONSTANT) Q_PROPERTY(Fact* speedUnits READ speedUnits CONSTANT) + Q_PROPERTY(Fact* temperatureUnits READ temperatureUnits CONSTANT) Fact* distanceUnits (void); Fact* areaUnits (void); Fact* speedUnits (void); + Fact* temperatureUnits (void); static const char* unitsSettingsGroupName; static const char* distanceUnitsSettingsName; static const char* areaUnitsSettingsName; static const char* speedUnitsSettingsName; + static const char* temperatureUnitsSettingsName; private: SettingsFact* _distanceUnitsFact; SettingsFact* _areaUnitsFact; SettingsFact* _speedUnitsFact; + SettingsFact* _temperatureUnitsFact; }; #endif diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index cc853858727291c25c13194bfa825ca344399fcd..a4360b72fab2060b6971d52d5e22dac224c2be99 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -88,9 +88,9 @@ QGCView { Repeater { id: unitsRepeater - model: [ QGroundControl.settingsManager.unitsSettings.distanceUnits, QGroundControl.settingsManager.unitsSettings.areaUnits, QGroundControl.settingsManager.unitsSettings.speedUnits ] + model: [ QGroundControl.settingsManager.unitsSettings.distanceUnits, QGroundControl.settingsManager.unitsSettings.areaUnits, QGroundControl.settingsManager.unitsSettings.speedUnits, QGroundControl.settingsManager.unitsSettings.temperatureUnits ] - property var names: [ qsTr("Distance:"), qsTr("Area:"), qsTr("Speed:") ] + property var names: [ qsTr("Distance:"), qsTr("Area:"), qsTr("Speed:"), qsTr("Temperature:") ] Row { spacing: ScreenTools.defaultFontPixelWidth