From 616e11370b926cf7dcd24b88116e5609a436a751 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 18 Feb 2017 11:59:50 -0800 Subject: [PATCH] Add/use new SettingsManager implementation * Holds all the settings for the app * Allows core plugin to override default values --- qgroundcontrol.pro | 2 + qgroundcontrol.qrc | 2 +- src/FactSystem/FactMetaData.cc | 41 +++---- src/FactSystem/SettingsFact.cc | 11 +- src/FactSystem/SettingsFact.h | 2 +- src/FlightMap/MapScale.qml | 9 +- src/MissionEditor/MissionSettingsEditor.qml | 23 ++-- src/MissionManager/MissionCommandTree.cc | 8 +- src/MissionManager/MissionCommandTree.h | 4 +- src/MissionManager/MissionController.cc | 8 +- src/MissionManager/RallyPointController.cc | 3 +- src/MissionManager/SimpleMissionItem.cc | 3 +- src/MissionManager/SimpleMissionItemTest.cc | 5 +- src/QGCToolbox.cc | 8 ++ src/QGCToolbox.h | 3 + src/QmlControls/QGroundControlQmlGlobal.cc | 151 +----------------------- src/QmlControls/QGroundControlQmlGlobal.h | 95 +++------------ src/QmlControls/QGroundControlQmlGlobal.json | 58 --------- src/SettingsManager.cc | 170 +++++++++++++++++++++++++++ src/SettingsManager.h | 112 ++++++++++++++++++ src/SettingsManager.json | 58 +++++++++ src/Vehicle/MultiVehicleManager.cc | 6 +- src/Vehicle/Vehicle.cc | 23 ++-- src/Vehicle/Vehicle.h | 2 + src/api/QGCCorePlugin.cc | 7 ++ src/api/QGCCorePlugin.h | 6 + src/ui/preferences/GeneralSettings.qml | 11 +- 27 files changed, 482 insertions(+), 349 deletions(-) delete mode 100644 src/QmlControls/QGroundControlQmlGlobal.json create mode 100644 src/SettingsManager.cc create mode 100644 src/SettingsManager.h create mode 100644 src/SettingsManager.json diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 955bc2f..71fe844 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -474,6 +474,7 @@ HEADERS += \ src/QmlControls/RCChannelMonitorController.h \ src/QmlControls/ScreenToolsController.h \ src/QtLocationPlugin/QMLControl/QGCMapEngineManager.h \ + src/SettingsManager.h \ src/Vehicle/MAVLinkLogManager.h \ src/VehicleSetup/JoystickConfigController.h \ src/audio/QGCAudioWorker.h \ @@ -635,6 +636,7 @@ SOURCES += \ src/QmlControls/RCChannelMonitorController.cc \ src/QmlControls/ScreenToolsController.cc \ src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc \ + src/SettingsManager.cc \ src/Vehicle/MAVLinkLogManager.cc \ src/VehicleSetup/JoystickConfigController.cc \ src/audio/QGCAudioWorker.cpp \ diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index 48fdc14..8e9e8fc 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -168,7 +168,7 @@ src/Vehicle/GPSFact.json src/Vehicle/WindFact.json src/Vehicle/VibrationFact.json - src/QmlControls/QGroundControlQmlGlobal.json + src/SettingsManager.json src/MissionManager/RallyPoint.FactMetaData.json src/MissionManager/FWLandingPattern.FactMetaData.json src/MissionManager/Survey.FactMetaData.json diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 51fe0d0..6d9f47f 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -14,8 +14,9 @@ /// @author Don Gagne #include "FactMetaData.h" -#include "QGroundControlQmlGlobal.h" +#include "SettingsManager.h" #include "JsonHelper.h" +#include "QGCApplication.h" #include #include @@ -45,21 +46,21 @@ const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] // Translations driven by app settings const FactMetaData::AppSettingsTranslation_s FactMetaData::_rgAppSettingsTranslations[] = { - { "m", "m", false, QGroundControlQmlGlobal::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, - { "meters", "meters", false, QGroundControlQmlGlobal::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, - { "m/s", "m/s", true, QGroundControlQmlGlobal::SpeedUnitsMetersPerSecond, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, - { "m^2", "m^2", false, QGroundControlQmlGlobal::AreaUnitsSquareMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, - { "m", "ft", false, QGroundControlQmlGlobal::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, - { "meters", "ft", false, QGroundControlQmlGlobal::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, - { "m^2", "km^2", false, QGroundControlQmlGlobal::AreaUnitsSquareKilometers, FactMetaData::_squareMetersToSquareKilometers, FactMetaData::_squareKilometersToSquareMeters }, - { "m^2", "ha", false, QGroundControlQmlGlobal::AreaUnitsHectares, FactMetaData::_squareMetersToHectares, FactMetaData::_hectaresToSquareMeters }, - { "m^2", "ft^2", false, QGroundControlQmlGlobal::AreaUnitsSquareFeet, FactMetaData::_squareMetersToSquareFeet, FactMetaData::_squareFeetToSquareMeters }, - { "m^2", "ac", false, QGroundControlQmlGlobal::AreaUnitsAcres, FactMetaData::_squareMetersToAcres, FactMetaData::_acresToSquareMeters }, - { "m^2", "mi^2", false, QGroundControlQmlGlobal::AreaUnitsSquareMiles, FactMetaData::_squareMetersToSquareMiles, FactMetaData::_squareMilesToSquareMeters }, - { "m/s", "ft/s", true, QGroundControlQmlGlobal::SpeedUnitsFeetPerSecond, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, - { "m/s", "mph", true, QGroundControlQmlGlobal::SpeedUnitsMilesPerHour, FactMetaData::_metersPerSecondToMilesPerHour, FactMetaData::_milesPerHourToMetersPerSecond }, - { "m/s", "km/h", true, QGroundControlQmlGlobal::SpeedUnitsKilometersPerHour, FactMetaData::_metersPerSecondToKilometersPerHour, FactMetaData::_kilometersPerHourToMetersPerSecond }, - { "m/s", "kn", true, QGroundControlQmlGlobal::SpeedUnitsKnots, FactMetaData::_metersPerSecondToKnots, FactMetaData::_knotsToMetersPerSecond }, + { "m", "m", false, SettingsManager::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, + { "meters", "meters", false, SettingsManager::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, + { "m/s", "m/s", true, SettingsManager::SpeedUnitsMetersPerSecond, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, + { "m^2", "m^2", false, SettingsManager::AreaUnitsSquareMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, + { "m", "ft", false, SettingsManager::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, + { "meters", "ft", false, SettingsManager::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, + { "m^2", "km^2", false, SettingsManager::AreaUnitsSquareKilometers, FactMetaData::_squareMetersToSquareKilometers, FactMetaData::_squareKilometersToSquareMeters }, + { "m^2", "ha", false, SettingsManager::AreaUnitsHectares, FactMetaData::_squareMetersToHectares, FactMetaData::_hectaresToSquareMeters }, + { "m^2", "ft^2", false, SettingsManager::AreaUnitsSquareFeet, FactMetaData::_squareMetersToSquareFeet, FactMetaData::_squareFeetToSquareMeters }, + { "m^2", "ac", false, SettingsManager::AreaUnitsAcres, FactMetaData::_squareMetersToAcres, FactMetaData::_acresToSquareMeters }, + { "m^2", "mi^2", false, SettingsManager::AreaUnitsSquareMiles, FactMetaData::_squareMetersToSquareMiles, FactMetaData::_squareMilesToSquareMeters }, + { "m/s", "ft/s", true, SettingsManager::SpeedUnitsFeetPerSecond, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, + { "m/s", "mph", true, SettingsManager::SpeedUnitsMilesPerHour, FactMetaData::_metersPerSecondToMilesPerHour, FactMetaData::_milesPerHourToMetersPerSecond }, + { "m/s", "km/h", true, SettingsManager::SpeedUnitsKilometersPerHour, FactMetaData::_metersPerSecondToKilometersPerHour, FactMetaData::_kilometersPerHourToMetersPerSecond }, + { "m/s", "kn", true, SettingsManager::SpeedUnitsKnots, FactMetaData::_metersPerSecondToKnots, FactMetaData::_knotsToMetersPerSecond }, }; const char* FactMetaData::_decimalPlacesJsonKey = "decimalPlaces"; @@ -612,8 +613,8 @@ void FactMetaData::_setAppSettingsTranslators(void) const AppSettingsTranslation_s* pAppSettingsTranslation = &_rgAppSettingsTranslations[i]; if (pAppSettingsTranslation->rawUnits == _rawUnits.toLower() && - ((pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == QGroundControlQmlGlobal::speedUnits()->rawValue().toUInt()) || - (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == QGroundControlQmlGlobal::distanceUnits()->rawValue().toUInt()))) { + ((pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->speedUnits()->rawValue().toUInt()) || + (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->distanceUnits()->rawValue().toUInt()))) { _cookedUnits = pAppSettingsTranslation->cookedUnits; setTranslators(pAppSettingsTranslation->rawTranslator, pAppSettingsTranslation->cookedTranslator); return; @@ -628,7 +629,7 @@ const FactMetaData::AppSettingsTranslation_s* FactMetaData::_findAppSettingsDist const AppSettingsTranslation_s* pAppSettingsTranslation = &_rgAppSettingsTranslations[i]; if (pAppSettingsTranslation->rawUnits == rawUnits && - (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == QGroundControlQmlGlobal::distanceUnits()->rawValue().toUInt())) { + (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->distanceUnits()->rawValue().toUInt())) { return pAppSettingsTranslation; } } @@ -642,7 +643,7 @@ const FactMetaData::AppSettingsTranslation_s* FactMetaData::_findAppSettingsArea const AppSettingsTranslation_s* pAppSettingsTranslation = &_rgAppSettingsTranslations[i]; if (pAppSettingsTranslation->rawUnits == rawUnits && - (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == QGroundControlQmlGlobal::areaUnits()->rawValue().toUInt()) + (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->areaUnits()->rawValue().toUInt()) ) { return pAppSettingsTranslation; } diff --git a/src/FactSystem/SettingsFact.cc b/src/FactSystem/SettingsFact.cc index a3fb182..71b2ddc 100644 --- a/src/FactSystem/SettingsFact.cc +++ b/src/FactSystem/SettingsFact.cc @@ -9,6 +9,8 @@ #include "SettingsFact.h" +#include "QGCCorePlugin.h" +#include "QGCApplication.h" #include @@ -18,8 +20,8 @@ SettingsFact::SettingsFact(QObject* parent) } -SettingsFact::SettingsFact(QString settingGroup, QString settingName, FactMetaData::ValueType_t type, const QVariant& defaultValue, QObject* parent) - : Fact(0, settingName, type, parent) +SettingsFact::SettingsFact(QString settingGroup, FactMetaData* metaData, QObject* parent) + : Fact(0, metaData->name(), metaData->type(), parent) , _settingGroup(settingGroup) { QSettings settings; @@ -28,7 +30,10 @@ SettingsFact::SettingsFact(QString settingGroup, QString settingName, FactMetaDa settings.beginGroup(_settingGroup); } - _rawValue = settings.value(_name, defaultValue); + // Allow core plugin a chance to override the default value + metaData->setRawDefaultValue(qgcApp()->toolbox()->corePlugin()->overrideSettingsDefault(metaData->name(), metaData->rawDefaultValue())); + setMetaData(metaData); + _rawValue = settings.value(_name, metaData->rawDefaultValue()); connect(this, &Fact::rawValueChanged, this, &SettingsFact::_rawValueChanged); } diff --git a/src/FactSystem/SettingsFact.h b/src/FactSystem/SettingsFact.h index 7058245..0984d47 100644 --- a/src/FactSystem/SettingsFact.h +++ b/src/FactSystem/SettingsFact.h @@ -23,7 +23,7 @@ class SettingsFact : public Fact public: SettingsFact(QObject* parent = NULL); - SettingsFact(QString settingGroup, QString settingName, FactMetaData::ValueType_t type, const QVariant& defaultValue, QObject* parent = NULL); + SettingsFact(QString settingGroup, FactMetaData* metaData, QObject* parent = NULL); SettingsFact(const SettingsFact& other, QObject* parent = NULL); const SettingsFact& operator=(const SettingsFact& other); diff --git a/src/FlightMap/MapScale.qml b/src/FlightMap/MapScale.qml index 26a5dfb..a861e41 100644 --- a/src/FlightMap/MapScale.qml +++ b/src/FlightMap/MapScale.qml @@ -10,9 +10,10 @@ import QtQuick 2.4 import QtQuick.Controls 1.3 -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.ScreenTools 1.0 +import QGroundControl 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.SettingsManager 1.0 /// Map scale control Item { @@ -114,7 +115,7 @@ Item { var rightCoord = mapControl.toCoordinate(Qt.point(scaleLinePixelLength, scale.y)) var scaleLineMeters = Math.round(leftCoord.distanceTo(rightCoord)) - if (QGroundControl.distanceUnits.value == QGroundControl.DistanceUnitsFeet) { + if (QGroundControl.settingsManager.distanceUnits.value == QGroundControl.settingsManager.DistanceUnitsFeet) { calculateFeetRatio(scaleLineMeters, scaleLinePixelLength) } else { calculateMetersRatio(scaleLineMeters, scaleLinePixelLength) diff --git a/src/MissionEditor/MissionSettingsEditor.qml b/src/MissionEditor/MissionSettingsEditor.qml index a780518..3e71144 100644 --- a/src/MissionEditor/MissionSettingsEditor.qml +++ b/src/MissionEditor/MissionSettingsEditor.qml @@ -2,12 +2,13 @@ import QtQuick 2.5 import QtQuick.Controls 1.2 import QtQuick.Layouts 1.2 -import QGroundControl 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Vehicle 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.FactControls 1.0 -import QGroundControl.Palette 1.0 +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Vehicle 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FactControls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.SettingsManager 1.0 // Editor for Mission Settings Rectangle { @@ -121,7 +122,7 @@ Rectangle { Layout.fillWidth: true } FactComboBox { - fact: QGroundControl.offlineEditingFirmwareType + fact: QGroundControl.settingsManager.offlineEditingFirmwareType indexModel: false visible: _showOfflineEditingCombos Layout.preferredWidth: _fieldWidth @@ -145,7 +146,7 @@ Rectangle { } FactComboBox { id: offlineVehicleCombo - fact: QGroundControl.offlineEditingVehicleType + fact: QGroundControl.settingsManager.offlineEditingVehicleType indexModel: false visible: _showOfflineEditingCombos Layout.preferredWidth: _fieldWidth @@ -169,7 +170,7 @@ Rectangle { Layout.fillWidth: true } FactTextField { - fact: QGroundControl.offlineEditingCruiseSpeed + fact: QGroundControl.settingsManager.offlineEditingCruiseSpeed visible: _showCruiseSpeed Layout.preferredWidth: _fieldWidth } @@ -181,7 +182,7 @@ Rectangle { Layout.fillWidth: true } FactTextField { - fact: QGroundControl.offlineEditingHoverSpeed + fact: QGroundControl.settingsManager.offlineEditingHoverSpeed visible: _showHoverSpeed Layout.preferredWidth: _fieldWidth } @@ -195,7 +196,7 @@ Rectangle { QGCLabel { text: qsTr("Hover speed:"); Layout.fillWidth: true } FactTextField { Layout.preferredWidth: _fieldWidth - fact: QGroundControl.offlineEditingHoverSpeed + fact: QGroundControl.settingsManager.offlineEditingHoverSpeed } } diff --git a/src/MissionManager/MissionCommandTree.cc b/src/MissionManager/MissionCommandTree.cc index 1a261c1..31f69f5 100644 --- a/src/MissionManager/MissionCommandTree.cc +++ b/src/MissionManager/MissionCommandTree.cc @@ -17,11 +17,13 @@ #include "QGroundControlQmlGlobal.h" #include "MissionCommandUIInfo.h" #include "MissionCommandList.h" +#include "SettingsManager.h" #include MissionCommandTree::MissionCommandTree(QGCApplication* app, bool unitTest) : QGCTool(app) + , _settingsManager(NULL) , _unitTest(unitTest) { } @@ -30,6 +32,8 @@ void MissionCommandTree::setToolbox(QGCToolbox* toolbox) { QGCTool::setToolbox(toolbox); + _settingsManager = toolbox->settingsManager(); + #ifdef UNITTEST_BUILD if (_unitTest) { // Load unit testing tree @@ -249,7 +253,7 @@ void MissionCommandTree::_baseVehicleInfo(Vehicle* vehicle, MAV_AUTOPILOT& baseF baseVehicleType = _baseVehicleType(vehicle->vehicleType()); } else { // No Vehicle means offline editing - baseFirmwareType = _baseFirmwareType((MAV_AUTOPILOT)QGroundControlQmlGlobal::offlineEditingFirmwareType()->rawValue().toInt()); - baseVehicleType = _baseVehicleType((MAV_TYPE)QGroundControlQmlGlobal::offlineEditingVehicleType()->rawValue().toInt()); + baseFirmwareType = _baseFirmwareType((MAV_AUTOPILOT)_settingsManager->offlineEditingFirmwareType()->rawValue().toInt()); + baseVehicleType = _baseVehicleType((MAV_TYPE)_settingsManager->offlineEditingVehicleType()->rawValue().toInt()); } } diff --git a/src/MissionManager/MissionCommandTree.h b/src/MissionManager/MissionCommandTree.h index 624bada..2ac3237 100644 --- a/src/MissionManager/MissionCommandTree.h +++ b/src/MissionManager/MissionCommandTree.h @@ -19,6 +19,7 @@ class MissionCommandUIInfo; class MissionCommandList; +class SettingsManager; #ifdef UNITTEST_BUILD class MissionCommandTreeTest; #endif @@ -87,7 +88,8 @@ private: /// Collapsed hierarchy for specific vehicle type QMap> _availableCategories; - bool _unitTest; ///< true: running in unit test mode + SettingsManager* _settingsManager; + bool _unitTest; ///< true: running in unit test mode #ifdef UNITTEST_BUILD friend class MissionCommandTreeTest; diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 70011b7..53a2098 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -20,6 +20,7 @@ #include "JsonHelper.h" #include "ParameterManager.h" #include "QGroundControlQmlGlobal.h" +#include "SettingsManager.h" #ifndef __mobile__ #include "MainWindow.h" @@ -431,17 +432,18 @@ bool MissionController::_loadJsonMissionFileV2(Vehicle* vehicle, const QJsonObje // Mission Settings QGeoCoordinate homeCoordinate; + SettingsManager* settingsManager = qgcApp()->toolbox()->settingsManager(); if (!JsonHelper::loadGeoCoordinate(json[_jsonPlannedHomePositionKey], true /* altitudeRequired */, homeCoordinate, errorString)) { return false; } if (json.contains(_jsonVehicleTypeKey) && vehicle->isOfflineEditingVehicle()) { - QGroundControlQmlGlobal::offlineEditingVehicleType()->setRawValue(json[_jsonVehicleTypeKey].toDouble()); + settingsManager->offlineEditingVehicleType()->setRawValue(json[_jsonVehicleTypeKey].toDouble()); } if (json.contains(_jsonCruiseSpeedKey)) { - QGroundControlQmlGlobal::offlineEditingCruiseSpeed()->setRawValue(json[_jsonCruiseSpeedKey].toDouble()); + settingsManager->offlineEditingCruiseSpeed()->setRawValue(json[_jsonCruiseSpeedKey].toDouble()); } if (json.contains(_jsonHoverSpeedKey)) { - QGroundControlQmlGlobal::offlineEditingHoverSpeed()->setRawValue(json[_jsonHoverSpeedKey].toDouble()); + settingsManager->offlineEditingHoverSpeed()->setRawValue(json[_jsonHoverSpeedKey].toDouble()); } SimpleMissionItem* homeItem = new SimpleMissionItem(vehicle, visualItems); diff --git a/src/MissionManager/RallyPointController.cc b/src/MissionManager/RallyPointController.cc index 5a6a090..66e0b76 100644 --- a/src/MissionManager/RallyPointController.cc +++ b/src/MissionManager/RallyPointController.cc @@ -21,6 +21,7 @@ #include "JsonHelper.h" #include "SimpleMissionItem.h" #include "QGroundControlQmlGlobal.h" +#include "SettingsManager.h" #ifndef __mobile__ #include "QGCFileDialog.h" @@ -267,7 +268,7 @@ void RallyPointController::addPoint(QGeoCoordinate point) if (_points.count()) { defaultAlt = qobject_cast(_points[_points.count() - 1])->coordinate().altitude(); } else { - defaultAlt = QGroundControlQmlGlobal::defaultMissionItemAltitude()->rawValue().toDouble(); + defaultAlt = qgcApp()->toolbox()->settingsManager()->defaultMissionItemAltitude()->rawValue().toDouble(); } point.setAltitude(defaultAlt); RallyPoint* newPoint = new RallyPoint(point, this); diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index 5464ddf..3d6c0de 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -18,6 +18,7 @@ #include "MissionCommandTree.h" #include "MissionCommandUIInfo.h" #include "QGroundControlQmlGlobal.h" +#include "SettingsManager.h" FactMetaData* SimpleMissionItem::_altitudeMetaData = NULL; FactMetaData* SimpleMissionItem::_commandMetaData = NULL; @@ -529,7 +530,7 @@ void SimpleMissionItem::_syncFrameToAltitudeRelativeToHome(void) void SimpleMissionItem::setDefaultsForCommand(void) { // We set these global defaults first, then if there are param defaults they will get reset - _missionItem.setParam7(QGroundControlQmlGlobal::defaultMissionItemAltitude()->rawValue().toDouble()); + _missionItem.setParam7(qgcApp()->toolbox()->settingsManager()->defaultMissionItemAltitude()->rawValue().toDouble()); MAV_CMD command = (MAV_CMD)this->command(); const MissionCommandUIInfo* uiInfo = _commandTree->getUIInfo(_vehicle, command); diff --git a/src/MissionManager/SimpleMissionItemTest.cc b/src/MissionManager/SimpleMissionItemTest.cc index a517288..cf453d3 100644 --- a/src/MissionManager/SimpleMissionItemTest.cc +++ b/src/MissionManager/SimpleMissionItemTest.cc @@ -12,6 +12,7 @@ #include "SimpleMissionItem.h" #include "QGCApplication.h" #include "QGroundControlQmlGlobal.h" +#include "SettingsManager.h" const SimpleMissionItemTest::ItemInfo_t SimpleMissionItemTest::_rgItemInfo[] = { { MAV_CMD_NAV_WAYPOINT, MAV_FRAME_GLOBAL_RELATIVE_ALT }, @@ -140,7 +141,7 @@ void SimpleMissionItemTest::_testDefaultValues(void) item.missionItem().setCommand(MAV_CMD_NAV_WAYPOINT); item.missionItem().setFrame(MAV_FRAME_GLOBAL_RELATIVE_ALT); - QCOMPARE(item.missionItem().param7(), QGroundControlQmlGlobal::defaultMissionItemAltitude()->rawValue().toDouble()); + QCOMPARE(item.missionItem().param7(), qgcApp()->toolbox()->settingsManager()->defaultMissionItemAltitude()->rawValue().toDouble()); } void SimpleMissionItemTest::_testSignals(void) @@ -225,7 +226,7 @@ void SimpleMissionItemTest::_testSignals(void) // dirtyChanged // Check that changing to the same coordinate does not signal - simpleMissionItem.setCoordinate(QGeoCoordinate(50.1234567, 60.1234567, QGroundControlQmlGlobal::defaultMissionItemAltitude()->rawValue().toDouble())); + simpleMissionItem.setCoordinate(QGeoCoordinate(50.1234567, 60.1234567, qgcApp()->toolbox()->settingsManager()->defaultMissionItemAltitude()->rawValue().toDouble())); QVERIFY(multiSpy->checkNoSignals()); // Check that actually changing coordinate signals correctly diff --git a/src/QGCToolbox.cc b/src/QGCToolbox.cc index 5ca81d9..f67e57b 100644 --- a/src/QGCToolbox.cc +++ b/src/QGCToolbox.cc @@ -29,6 +29,7 @@ #include "MAVLinkLogManager.h" #include "QGCCorePlugin.h" #include "QGCOptions.h" +#include "SettingsManager.h" #if defined(QGC_CUSTOM_BUILD) #include CUSTOMHEADER @@ -55,7 +56,11 @@ QGCToolbox::QGCToolbox(QGCApplication* app) , _videoManager(NULL) , _mavlinkLogManager(NULL) , _corePlugin(NULL) + , _settingsManager(NULL) { + // SettingsManager must be first so settings are available to any subsequent tools + _settingsManager = new SettingsManager(app); + //-- Scan and load plugins _scanAndLoadPlugins(app); _audioOutput = new GAudioOutput(app); @@ -81,6 +86,9 @@ QGCToolbox::QGCToolbox(QGCApplication* app) void QGCToolbox::setChildToolboxes(void) { + // SettingsManager must be first so settings are available to any subsequent tools + _settingsManager->setToolbox(this); + _corePlugin->setToolbox(this); _audioOutput->setToolbox(this); _factSystem->setToolbox(this); diff --git a/src/QGCToolbox.h b/src/QGCToolbox.h index 717bae8..762996f 100644 --- a/src/QGCToolbox.h +++ b/src/QGCToolbox.h @@ -32,6 +32,7 @@ class QGCPositionManager; class VideoManager; class MAVLinkLogManager; class QGCCorePlugin; +class SettingsManager; /// This is used to manage all of our top level services/tools class QGCToolbox { @@ -56,6 +57,7 @@ public: VideoManager* videoManager(void) { return _videoManager; } MAVLinkLogManager* mavlinkLogManager(void) { return _mavlinkLogManager; } QGCCorePlugin* corePlugin(void) { return _corePlugin; } + SettingsManager* settingsManager(void) { return _settingsManager; } #ifndef __mobile__ GPSManager* gpsManager(void) { return _gpsManager; } @@ -86,6 +88,7 @@ private: VideoManager* _videoManager; MAVLinkLogManager* _mavlinkLogManager; QGCCorePlugin* _corePlugin; + SettingsManager* _settingsManager; friend class QGCApplication; }; diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index fab9727..df23461 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -19,19 +19,6 @@ static const char* kQmlGlobalKeyName = "QGCQml"; -SettingsFact* QGroundControlQmlGlobal::_distanceUnitsFact = NULL; -FactMetaData* QGroundControlQmlGlobal::_distanceUnitsMetaData = NULL; -SettingsFact* QGroundControlQmlGlobal::_areaUnitsFact = NULL; -FactMetaData* QGroundControlQmlGlobal::_areaUnitsMetaData = NULL; -SettingsFact* QGroundControlQmlGlobal::_speedUnitsFact = NULL; -FactMetaData* QGroundControlQmlGlobal::_speedUnitsMetaData = NULL; -SettingsFact* QGroundControlQmlGlobal::_offlineEditingFirmwareTypeFact = NULL; -SettingsFact* QGroundControlQmlGlobal::_offlineEditingVehicleTypeFact = NULL; -SettingsFact* QGroundControlQmlGlobal::_offlineEditingCruiseSpeedFact = NULL; -SettingsFact* QGroundControlQmlGlobal::_offlineEditingHoverSpeedFact = NULL; -SettingsFact* QGroundControlQmlGlobal::_batteryPercentRemainingAnnounceFact = NULL; -SettingsFact* QGroundControlQmlGlobal::_defaultMissionItemAltitudeFact = NULL; - const char* QGroundControlQmlGlobal::_virtualTabletJoystickKey = "VirtualTabletJoystick"; const char* QGroundControlQmlGlobal::_baseFontPointSizeKey = "BaseDeviceFontPointSize"; const char* QGroundControlQmlGlobal::_missionAutoLoadDirKey = "MissionAutoLoadDir"; @@ -48,6 +35,7 @@ QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app) , _mavlinkLogManager(NULL) , _corePlugin(NULL) , _firmwarePluginManager(NULL) + , _settingsManager(NULL) , _virtualTabletJoystick(false) , _baseFontPointSize(0.0) { @@ -67,6 +55,7 @@ QGroundControlQmlGlobal::~QGroundControlQmlGlobal() void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox) { QGCTool::setToolbox(toolbox); + _flightMapSettings = toolbox->flightMapSettings(); _linkManager = toolbox->linkManager(); _multiVehicleManager = toolbox->multiVehicleManager(); @@ -77,6 +66,7 @@ void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox) _mavlinkLogManager = toolbox->mavlinkLogManager(); _corePlugin = toolbox->corePlugin(); _firmwarePluginManager = toolbox->firmwarePluginManager(); + _settingsManager = toolbox->settingsManager(); } void QGroundControlQmlGlobal::saveGlobalSetting (const QString& key, const QString& value) @@ -224,131 +214,6 @@ void QGroundControlQmlGlobal::setBaseFontPointSize(qreal size) } } -SettingsFact* QGroundControlQmlGlobal::_createSettingsFact(const QString& name) -{ - SettingsFact* fact; - FactMetaData* metaData = nameToMetaDataMap()[name]; - - fact = new SettingsFact(QString(), name, metaData->type(), metaData->rawDefaultValue()); - fact->setMetaData(metaData); - - return fact; -} - -Fact* QGroundControlQmlGlobal::offlineEditingFirmwareType(void) -{ - if (!_offlineEditingFirmwareTypeFact) { - _offlineEditingFirmwareTypeFact = _createSettingsFact(QStringLiteral("OfflineEditingFirmwareType")); - } - - return _offlineEditingFirmwareTypeFact; -} - -Fact* QGroundControlQmlGlobal::offlineEditingVehicleType(void) -{ - if (!_offlineEditingVehicleTypeFact) { - _offlineEditingVehicleTypeFact = _createSettingsFact(QStringLiteral("OfflineEditingVehicleType")); - } - - return _offlineEditingVehicleTypeFact; -} - -Fact* QGroundControlQmlGlobal::offlineEditingCruiseSpeed(void) -{ - if (!_offlineEditingCruiseSpeedFact) { - _offlineEditingCruiseSpeedFact = _createSettingsFact(QStringLiteral("OfflineEditingCruiseSpeed")); - } - return _offlineEditingCruiseSpeedFact; -} - -Fact* QGroundControlQmlGlobal::offlineEditingHoverSpeed(void) -{ - if (!_offlineEditingHoverSpeedFact) { - _offlineEditingHoverSpeedFact = _createSettingsFact(QStringLiteral("OfflineEditingHoverSpeed")); - } - return _offlineEditingHoverSpeedFact; -} - -Fact* QGroundControlQmlGlobal::distanceUnits(void) -{ - if (!_distanceUnitsFact) { - // Distance/Area/Speed units settings can't be loaded from json since it creates an infinite loop of meta data loading. - QStringList enumStrings; - QVariantList enumValues; - - _distanceUnitsFact = new SettingsFact(QString(), "DistanceUnits", FactMetaData::valueTypeUint32, DistanceUnitsMeters); - _distanceUnitsMetaData = new FactMetaData(FactMetaData::valueTypeUint32); - - enumStrings << "Feet" << "Meters"; - enumValues << QVariant::fromValue((uint32_t)DistanceUnitsFeet) << QVariant::fromValue((uint32_t)DistanceUnitsMeters); - - _distanceUnitsMetaData->setEnumInfo(enumStrings, enumValues); - _distanceUnitsFact->setMetaData(_distanceUnitsMetaData); - } - - return _distanceUnitsFact; - -} - -Fact* QGroundControlQmlGlobal::areaUnits(void) -{ - if (!_areaUnitsFact) { - // Distance/Area/Speed units settings can't be loaded from json since it creates an infinite loop of meta data loading. - QStringList enumStrings; - QVariantList enumValues; - - _areaUnitsFact = new SettingsFact(QString(), "AreaUnits", FactMetaData::valueTypeUint32, AreaUnitsSquareMeters); - _areaUnitsMetaData = new FactMetaData(FactMetaData::valueTypeUint32); - - enumStrings << "SquareFeet" << "SquareMeters" << "SquareKilometers" << "Hectares" << "Acres" << "SquareMiles"; - enumValues << QVariant::fromValue((uint32_t)AreaUnitsSquareFeet) << QVariant::fromValue((uint32_t)AreaUnitsSquareMeters) << QVariant::fromValue((uint32_t)AreaUnitsSquareKilometers) << QVariant::fromValue((uint32_t)AreaUnitsHectares) << QVariant::fromValue((uint32_t)AreaUnitsAcres) << QVariant::fromValue((uint32_t)AreaUnitsSquareMiles); - - _areaUnitsMetaData->setEnumInfo(enumStrings, enumValues); - _areaUnitsFact->setMetaData(_areaUnitsMetaData); - } - - return _areaUnitsFact; - -} - -Fact* QGroundControlQmlGlobal::speedUnits(void) -{ - if (!_speedUnitsFact) { - // Distance/Area/Speed units settings can't be loaded from json since it creates an infinite loop of meta data loading. - QStringList enumStrings; - QVariantList enumValues; - - _speedUnitsFact = new SettingsFact(QString(), "SpeedUnits", FactMetaData::valueTypeUint32, SpeedUnitsMetersPerSecond); - _speedUnitsMetaData = new FactMetaData(FactMetaData::valueTypeUint32); - - enumStrings << "Feet/second" << "Meters/second" << "Miles/hour" << "Kilometers/hour" << "Knots"; - enumValues << QVariant::fromValue((uint32_t)SpeedUnitsFeetPerSecond) << QVariant::fromValue((uint32_t)SpeedUnitsMetersPerSecond) << QVariant::fromValue((uint32_t)SpeedUnitsMilesPerHour) << QVariant::fromValue((uint32_t)SpeedUnitsKilometersPerHour) << QVariant::fromValue((uint32_t)SpeedUnitsKnots); - - _speedUnitsMetaData->setEnumInfo(enumStrings, enumValues); - _speedUnitsFact->setMetaData(_speedUnitsMetaData); - } - - return _speedUnitsFact; -} - -Fact* QGroundControlQmlGlobal::batteryPercentRemainingAnnounce(void) -{ - if (!_batteryPercentRemainingAnnounceFact) { - _batteryPercentRemainingAnnounceFact = _createSettingsFact(QStringLiteral("batteryPercentRemainingAnnounce")); - } - - return _batteryPercentRemainingAnnounceFact; -} - -Fact* QGroundControlQmlGlobal::defaultMissionItemAltitude(void) -{ - if (!_defaultMissionItemAltitudeFact) { - _defaultMissionItemAltitudeFact = _createSettingsFact(QStringLiteral("DefaultMissionItemAltitude")); - } - - return _defaultMissionItemAltitudeFact; -} - int QGroundControlQmlGlobal::supportedFirmwareCount() { return _firmwarePluginManager->knownFirmwareTypes().count(); @@ -363,16 +228,6 @@ bool QGroundControlQmlGlobal::linesIntersect(QPointF line1A, QPointF line1B, QPo intersectPoint != line1A && intersectPoint != line1B; } -QMap& QGroundControlQmlGlobal::nameToMetaDataMap(void) { - static QMap map; - - if (map.isEmpty()) { - map = FactMetaData::createMapFromJsonFile(":/json/QGroundControlQmlGlobal.json", NULL); - } - - return map; -} - QString QGroundControlQmlGlobal::missionAutoLoadDir(void) { QSettings settings; diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h index 7a912e5..bbd0489 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.h +++ b/src/QmlControls/QGroundControlQmlGlobal.h @@ -37,32 +37,6 @@ public: QGroundControlQmlGlobal(QGCApplication* app); ~QGroundControlQmlGlobal(); - enum DistanceUnits { - DistanceUnitsFeet = 0, - DistanceUnitsMeters - }; - - enum AreaUnits { - AreaUnitsSquareFeet = 0, - AreaUnitsSquareMeters, - AreaUnitsSquareKilometers, - AreaUnitsHectares, - AreaUnitsAcres, - AreaUnitsSquareMiles, - }; - - enum SpeedUnits { - SpeedUnitsFeetPerSecond = 0, - SpeedUnitsMetersPerSecond, - SpeedUnitsMilesPerHour, - SpeedUnitsKilometersPerHour, - SpeedUnitsKnots, - }; - - Q_ENUMS(DistanceUnits) - Q_ENUMS(AreaUnits) - Q_ENUMS(SpeedUnits) - Q_PROPERTY(FlightMapSettings* flightMapSettings READ flightMapSettings CONSTANT) Q_PROPERTY(LinkManager* linkManager READ linkManager CONSTANT) Q_PROPERTY(MultiVehicleManager* multiVehicleManager READ multiVehicleManager CONSTANT) @@ -72,6 +46,9 @@ public: Q_PROPERTY(VideoManager* videoManager READ videoManager CONSTANT) Q_PROPERTY(MAVLinkLogManager* mavlinkLogManager READ mavlinkLogManager CONSTANT) Q_PROPERTY(QGCCorePlugin* corePlugin READ corePlugin CONSTANT) + Q_PROPERTY(SettingsManager* settingsManager READ settingsManager CONSTANT) + + Q_PROPERTY(int supportedFirmwareCount READ supportedFirmwareCount CONSTANT) Q_PROPERTY(qreal zOrderTopMost READ zOrderTopMost CONSTANT) ///< z order for top most items, toolbar, main window sub view Q_PROPERTY(qreal zOrderWidgets READ zOrderWidgets CONSTANT) ///< z order value to widgets, for example: zoom controls, hud widgetss @@ -91,17 +68,6 @@ public: Q_PROPERTY(bool isVersionCheckEnabled READ isVersionCheckEnabled WRITE setIsVersionCheckEnabled NOTIFY isVersionCheckEnabledChanged) Q_PROPERTY(int mavlinkSystemID READ mavlinkSystemID WRITE setMavlinkSystemID NOTIFY mavlinkSystemIDChanged) - Q_PROPERTY(Fact* offlineEditingFirmwareType READ offlineEditingFirmwareType CONSTANT) - Q_PROPERTY(Fact* offlineEditingVehicleType READ offlineEditingVehicleType CONSTANT) - Q_PROPERTY(Fact* offlineEditingCruiseSpeed READ offlineEditingCruiseSpeed CONSTANT) - Q_PROPERTY(Fact* offlineEditingHoverSpeed READ offlineEditingHoverSpeed CONSTANT) - Q_PROPERTY(Fact* distanceUnits READ distanceUnits CONSTANT) - Q_PROPERTY(Fact* areaUnits READ areaUnits CONSTANT) - Q_PROPERTY(Fact* speedUnits READ speedUnits CONSTANT) - Q_PROPERTY(Fact* batteryPercentRemainingAnnounce READ batteryPercentRemainingAnnounce CONSTANT) - Q_PROPERTY(Fact* defaultMissionItemAltitude READ defaultMissionItemAltitude CONSTANT) - Q_PROPERTY(int supportedFirmwareCount READ supportedFirmwareCount CONSTANT) - Q_PROPERTY(QGeoCoordinate lastKnownHomePosition READ lastKnownHomePosition CONSTANT) Q_PROPERTY(QGeoCoordinate flightMapPosition MEMBER _flightMapPosition NOTIFY flightMapPositionChanged) Q_PROPERTY(double flightMapZoom MEMBER _flightMapZoom NOTIFY flightMapZoomChanged) @@ -163,19 +129,20 @@ public: // Property accesors - FlightMapSettings* flightMapSettings () { return _flightMapSettings; } - LinkManager* linkManager () { return _linkManager; } - MultiVehicleManager* multiVehicleManager () { return _multiVehicleManager; } - QGCMapEngineManager* mapEngineManager () { return _mapEngineManager; } - QGCPositionManager* qgcPositionManger () { return _qgcPositionManager; } - MissionCommandTree* missionCommandTree () { return _missionCommandTree; } - VideoManager* videoManager () { return _videoManager; } - MAVLinkLogManager* mavlinkLogManager () { return _mavlinkLogManager; } - QGCCorePlugin* corePlugin () { return _corePlugin; } - - qreal zOrderTopMost () { return 1000; } - qreal zOrderWidgets () { return 100; } - qreal zOrderMapItems () { return 50; } + FlightMapSettings* flightMapSettings () { return _flightMapSettings; } + LinkManager* linkManager () { return _linkManager; } + MultiVehicleManager* multiVehicleManager () { return _multiVehicleManager; } + QGCMapEngineManager* mapEngineManager () { return _mapEngineManager; } + QGCPositionManager* qgcPositionManger () { return _qgcPositionManager; } + MissionCommandTree* missionCommandTree () { return _missionCommandTree; } + VideoManager* videoManager () { return _videoManager; } + MAVLinkLogManager* mavlinkLogManager () { return _mavlinkLogManager; } + QGCCorePlugin* corePlugin () { return _corePlugin; } + SettingsManager* settingsManager () { return _settingsManager; } + + qreal zOrderTopMost () { return 1000; } + qreal zOrderWidgets () { return 100; } + qreal zOrderMapItems () { return 50; } bool isDarkStyle () { return _app->styleIsDark(); } bool isAudioMuted () { return _toolbox->audioOutput()->isMuted(); } @@ -189,16 +156,6 @@ public: QGeoCoordinate lastKnownHomePosition() { return qgcApp()->lastKnownHomePosition(); } - static Fact* offlineEditingFirmwareType (void); - static Fact* offlineEditingVehicleType (void); - static Fact* offlineEditingCruiseSpeed (void); - static Fact* offlineEditingHoverSpeed (void); - static Fact* distanceUnits (void); - static Fact* areaUnits (void); - static Fact* speedUnits (void); - static Fact* batteryPercentRemainingAnnounce(void); - static Fact* defaultMissionItemAltitude (void); - int supportedFirmwareCount (); void setIsDarkStyle (bool dark); @@ -238,9 +195,6 @@ signals: void missionAutoLoadDirChanged (QString missionAutoLoadDir); private: - static SettingsFact* _createSettingsFact(const QString& name); - static QMap& nameToMetaDataMap(void); - FlightMapSettings* _flightMapSettings; LinkManager* _linkManager; MultiVehicleManager* _multiVehicleManager; @@ -251,26 +205,13 @@ private: MAVLinkLogManager* _mavlinkLogManager; QGCCorePlugin* _corePlugin; FirmwarePluginManager* _firmwarePluginManager; + SettingsManager* _settingsManager; bool _virtualTabletJoystick; qreal _baseFontPointSize; QGeoCoordinate _flightMapPosition; double _flightMapZoom; - // These are static so they are available to C++ code as well as Qml - static SettingsFact* _offlineEditingFirmwareTypeFact; - static SettingsFact* _offlineEditingVehicleTypeFact; - static SettingsFact* _offlineEditingCruiseSpeedFact; - static SettingsFact* _offlineEditingHoverSpeedFact; - static SettingsFact* _distanceUnitsFact; - static FactMetaData* _distanceUnitsMetaData; - static SettingsFact* _areaUnitsFact; - static FactMetaData* _areaUnitsMetaData; - static SettingsFact* _speedUnitsFact; - static FactMetaData* _speedUnitsMetaData; - static SettingsFact* _batteryPercentRemainingAnnounceFact; - static SettingsFact* _defaultMissionItemAltitudeFact; - static const char* _virtualTabletJoystickKey; static const char* _baseFontPointSizeKey; static const char* _missionAutoLoadDirKey; diff --git a/src/QmlControls/QGroundControlQmlGlobal.json b/src/QmlControls/QGroundControlQmlGlobal.json deleted file mode 100644 index e58a6e2..0000000 --- a/src/QmlControls/QGroundControlQmlGlobal.json +++ /dev/null @@ -1,58 +0,0 @@ -[ -{ - "name": "OfflineEditingFirmwareType", - "shortDescription": "Offline editing firmware type", - "type": "uint32", - "enumStrings": "ArduPilot,PX4 Pro,Mavlink Generic", - "enumValues": "3,12,0", - "defaultValue": 3 -}, -{ - "name": "OfflineEditingVehicleType", - "shortDescription": "Offline editing vehicle type", - "type": "uint32", - "enumStrings": "Fixed Wing,Multi-Rotor,VTOL,Rover,Sub", - "enumValues": "1,2,19,10,12", - "defaultValue": 1 -}, -{ - "name": "OfflineEditingCruiseSpeed", - "shortDescription": "Offline editing cruise speed", - "longDescription": "This value defines the cruising speed for forward flight vehicles for use in calculating mission duration when not connected to a vehicle.", - "type": "double", - "defaultValue": 16.0, - "min": 1.0, - "units": "m/s", - "decimalPlaces": 2 -}, -{ - "name": "OfflineEditingHoverSpeed", - "shortDescription": "Offline editing hover speed", - "longDescription": "This value defines the cruising speed for multi-rotor vehicles for use in calculating mission duration when not connected to a vehicle.", - "type": "double", - "defaultValue": 4.0, - "min": 1.0, - "units": "m/s", - "decimalPlaces": 2 -}, -{ - "name": "batteryPercentRemainingAnnounce", - "shortDescription": "Announce battery remaining percent", - "longDescription": "QGroundControl will announce the remaining battery percent when it falls below the specified percentage.", - "type": "uint32", - "defaultValue": 30, - "units": "%", - "min": 0, - "max": 100 -}, -{ - "name": "DefaultMissionItemAltitude", - "shortDescription": "Default value for altitude", - "longDescription": "This value specifies the default altitude for new items added to a mission.", - "type": "double", - "defaultValue": 50.0, - "min": 0.0, - "units": "meters", - "decimalPlaces": 2 -} -] diff --git a/src/SettingsManager.cc b/src/SettingsManager.cc new file mode 100644 index 0000000..0408440 --- /dev/null +++ b/src/SettingsManager.cc @@ -0,0 +1,170 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "SettingsManager.h" +#include "QGCApplication.h" + +QGC_LOGGING_CATEGORY(SettingsManagerLog, "SettingsManagerLog") + +const char* SettingsManager::offlineEditingFirmwareTypeSettingsName = "OfflineEditingFirmwareType"; +const char* SettingsManager::offlineEditingVehicleTypeSettingsName = "OfflineEditingVehicleType"; +const char* SettingsManager::offlineEditingCruiseSpeedSettingsName = "OfflineEditingCruiseSpeed"; +const char* SettingsManager::offlineEditingHoverSpeedSettingsName = "OfflineEditingHoverSpeed"; +const char* SettingsManager::distanceUnitsSettingsName = "DistanceUnits"; +const char* SettingsManager::areaUnitsSettingsName = "AreaUnits"; +const char* SettingsManager::speedUnitsSettingsName = "SpeedUnits"; +const char* SettingsManager::batteryPercentRemainingAnnounceSettingsName = "batteryPercentRemainingAnnounce"; +const char* SettingsManager::defaultMissionItemAltitudeSettingsName = "DefaultMissionItemAltitude"; + +SettingsManager::SettingsManager(QGCApplication* app) + : QGCTool(app) + , _offlineEditingFirmwareTypeFact(NULL) + , _offlineEditingVehicleTypeFact(NULL) + , _offlineEditingCruiseSpeedFact(NULL) + , _offlineEditingHoverSpeedFact(NULL) + , _distanceUnitsFact(NULL) + , _areaUnitsFact(NULL) + , _speedUnitsFact(NULL) + , _batteryPercentRemainingAnnounceFact(NULL) + , _defaultMissionItemAltitudeFact(NULL) +{ + +} + +void SettingsManager::setToolbox(QGCToolbox *toolbox) +{ + QGCTool::setToolbox(toolbox); + QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); + qmlRegisterUncreatableType("QGroundControl.SettingsManager", 1, 0, "SettingsManager", "Reference only"); + + _nameToMetaDataMap = FactMetaData::createMapFromJsonFile(":/json/SettingsManager.json", this); +} + +SettingsFact* SettingsManager::_createSettingsFact(const QString& name) +{ + return new SettingsFact(QString() /* no settings group */, _nameToMetaDataMap[name], this); +} + +Fact* SettingsManager::offlineEditingFirmwareType(void) +{ + if (!_offlineEditingFirmwareTypeFact) { + _offlineEditingFirmwareTypeFact = _createSettingsFact(offlineEditingFirmwareTypeSettingsName); + } + + return _offlineEditingFirmwareTypeFact; +} + +Fact* SettingsManager::offlineEditingVehicleType(void) +{ + if (!_offlineEditingVehicleTypeFact) { + _offlineEditingVehicleTypeFact = _createSettingsFact(offlineEditingVehicleTypeSettingsName); + } + + return _offlineEditingVehicleTypeFact; +} + +Fact* SettingsManager::offlineEditingCruiseSpeed(void) +{ + if (!_offlineEditingCruiseSpeedFact) { + _offlineEditingCruiseSpeedFact = _createSettingsFact(offlineEditingCruiseSpeedSettingsName); + } + return _offlineEditingCruiseSpeedFact; +} + +Fact* SettingsManager::offlineEditingHoverSpeed(void) +{ + if (!_offlineEditingHoverSpeedFact) { + _offlineEditingHoverSpeedFact = _createSettingsFact(offlineEditingHoverSpeedSettingsName); + } + return _offlineEditingHoverSpeedFact; +} + +Fact* SettingsManager::batteryPercentRemainingAnnounce(void) +{ + if (!_batteryPercentRemainingAnnounceFact) { + _batteryPercentRemainingAnnounceFact = _createSettingsFact(batteryPercentRemainingAnnounceSettingsName); + } + + return _batteryPercentRemainingAnnounceFact; +} + +Fact* SettingsManager::defaultMissionItemAltitude(void) +{ + if (!_defaultMissionItemAltitudeFact) { + _defaultMissionItemAltitudeFact = _createSettingsFact(defaultMissionItemAltitudeSettingsName); + } + + return _defaultMissionItemAltitudeFact; +} + +Fact* SettingsManager::distanceUnits(void) +{ + if (!_distanceUnitsFact) { + // Distance/Area/Speed units settings can't be loaded from json since it creates an infinite loop of meta data loading. + QStringList enumStrings; + QVariantList enumValues; + + enumStrings << "Feet" << "Meters"; + enumValues << QVariant::fromValue((uint32_t)DistanceUnitsFeet) << QVariant::fromValue((uint32_t)DistanceUnitsMeters); + + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, this); + metaData->setName(distanceUnitsSettingsName); + metaData->setEnumInfo(enumStrings, enumValues); + metaData->setRawDefaultValue(DistanceUnitsMeters); + + _distanceUnitsFact = new SettingsFact(QString() /* no settings group */, metaData, this); + + } + + return _distanceUnitsFact; + +} + +Fact* SettingsManager::areaUnits(void) +{ + if (!_areaUnitsFact) { + // Distance/Area/Speed units settings can't be loaded from json since it creates an infinite loop of meta data loading. + QStringList enumStrings; + QVariantList enumValues; + + enumStrings << "SquareFeet" << "SquareMeters" << "SquareKilometers" << "Hectares" << "Acres" << "SquareMiles"; + enumValues << QVariant::fromValue((uint32_t)AreaUnitsSquareFeet) << QVariant::fromValue((uint32_t)AreaUnitsSquareMeters) << QVariant::fromValue((uint32_t)AreaUnitsSquareKilometers) << QVariant::fromValue((uint32_t)AreaUnitsHectares) << QVariant::fromValue((uint32_t)AreaUnitsAcres) << QVariant::fromValue((uint32_t)AreaUnitsSquareMiles); + + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, this); + metaData->setName(areaUnitsSettingsName); + metaData->setEnumInfo(enumStrings, enumValues); + metaData->setRawDefaultValue(AreaUnitsSquareMeters); + + _areaUnitsFact = new SettingsFact(QString() /* no settings group */, metaData, this); + } + + return _areaUnitsFact; + +} + +Fact* SettingsManager::speedUnits(void) +{ + if (!_speedUnitsFact) { + // Distance/Area/Speed units settings can't be loaded from json since it creates an infinite loop of meta data loading. + QStringList enumStrings; + QVariantList enumValues; + + enumStrings << "Feet/second" << "Meters/second" << "Miles/hour" << "Kilometers/hour" << "Knots"; + enumValues << QVariant::fromValue((uint32_t)SpeedUnitsFeetPerSecond) << QVariant::fromValue((uint32_t)SpeedUnitsMetersPerSecond) << QVariant::fromValue((uint32_t)SpeedUnitsMilesPerHour) << QVariant::fromValue((uint32_t)SpeedUnitsKilometersPerHour) << QVariant::fromValue((uint32_t)SpeedUnitsKnots); + + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, this); + metaData->setName(speedUnitsSettingsName); + metaData->setEnumInfo(enumStrings, enumValues); + metaData->setRawDefaultValue(SpeedUnitsMetersPerSecond); + + _speedUnitsFact = new SettingsFact(QString() /* no settings group */, metaData, this); + } + + return _speedUnitsFact; +} diff --git a/src/SettingsManager.h b/src/SettingsManager.h new file mode 100644 index 0000000..bae2fd3 --- /dev/null +++ b/src/SettingsManager.h @@ -0,0 +1,112 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#ifndef SettingsManager_H +#define SettingsManager_H + +#include "QGCLoggingCategory.h" +#include "Joystick.h" +#include "MultiVehicleManager.h" +#include "QGCToolbox.h" + +#include + +Q_DECLARE_LOGGING_CATEGORY(SettingsManagerLog) + +/// Provides access to all app settings +class SettingsManager : public QGCTool +{ + Q_OBJECT + +public: + SettingsManager(QGCApplication* app); + + enum DistanceUnits { + DistanceUnitsFeet = 0, + DistanceUnitsMeters + }; + + enum AreaUnits { + AreaUnitsSquareFeet = 0, + AreaUnitsSquareMeters, + AreaUnitsSquareKilometers, + AreaUnitsHectares, + AreaUnitsAcres, + AreaUnitsSquareMiles, + }; + + enum SpeedUnits { + SpeedUnitsFeetPerSecond = 0, + SpeedUnitsMetersPerSecond, + SpeedUnitsMilesPerHour, + SpeedUnitsKilometersPerHour, + SpeedUnitsKnots, + }; + + Q_ENUMS(DistanceUnits) + Q_ENUMS(AreaUnits) + Q_ENUMS(SpeedUnits) + + Q_PROPERTY(Fact* offlineEditingFirmwareType READ offlineEditingFirmwareType CONSTANT) + Q_PROPERTY(Fact* offlineEditingVehicleType READ offlineEditingVehicleType CONSTANT) + Q_PROPERTY(Fact* offlineEditingCruiseSpeed READ offlineEditingCruiseSpeed CONSTANT) + Q_PROPERTY(Fact* offlineEditingHoverSpeed READ offlineEditingHoverSpeed CONSTANT) + Q_PROPERTY(Fact* distanceUnits READ distanceUnits CONSTANT) + Q_PROPERTY(Fact* areaUnits READ areaUnits CONSTANT) + Q_PROPERTY(Fact* speedUnits READ speedUnits CONSTANT) + Q_PROPERTY(Fact* batteryPercentRemainingAnnounce READ batteryPercentRemainingAnnounce CONSTANT) + Q_PROPERTY(Fact* defaultMissionItemAltitude READ defaultMissionItemAltitude CONSTANT) + + Fact* offlineEditingFirmwareType (void); + Fact* offlineEditingVehicleType (void); + Fact* offlineEditingCruiseSpeed (void); + Fact* offlineEditingHoverSpeed (void); + Fact* distanceUnits (void); + Fact* areaUnits (void); + Fact* speedUnits (void); + Fact* batteryPercentRemainingAnnounce(void); + Fact* defaultMissionItemAltitude (void); + + // Override from QGCTool + virtual void setToolbox(QGCToolbox *toolbox); + + static const char* offlineEditingFirmwareTypeSettingsName; + static const char* offlineEditingVehicleTypeSettingsName; + static const char* offlineEditingCruiseSpeedSettingsName; + static const char* offlineEditingHoverSpeedSettingsName; + static const char* distanceUnitsSettingsName; + static const char* areaUnitsSettingsName; + static const char* speedUnitsSettingsName; + static const char* batteryPercentRemainingAnnounceSettingsName; + static const char* defaultMissionItemAltitudeSettingsName; + +public slots: + +signals: + +private slots: + +private: + SettingsFact* _createSettingsFact(const QString& name); + + QMap _nameToMetaDataMap; + + SettingsFact* _offlineEditingFirmwareTypeFact; + SettingsFact* _offlineEditingVehicleTypeFact; + SettingsFact* _offlineEditingCruiseSpeedFact; + SettingsFact* _offlineEditingHoverSpeedFact; + SettingsFact* _distanceUnitsFact; + SettingsFact* _areaUnitsFact; + SettingsFact* _speedUnitsFact; + SettingsFact* _batteryPercentRemainingAnnounceFact; + SettingsFact* _defaultMissionItemAltitudeFact; +}; + +#endif diff --git a/src/SettingsManager.json b/src/SettingsManager.json new file mode 100644 index 0000000..e58a6e2 --- /dev/null +++ b/src/SettingsManager.json @@ -0,0 +1,58 @@ +[ +{ + "name": "OfflineEditingFirmwareType", + "shortDescription": "Offline editing firmware type", + "type": "uint32", + "enumStrings": "ArduPilot,PX4 Pro,Mavlink Generic", + "enumValues": "3,12,0", + "defaultValue": 3 +}, +{ + "name": "OfflineEditingVehicleType", + "shortDescription": "Offline editing vehicle type", + "type": "uint32", + "enumStrings": "Fixed Wing,Multi-Rotor,VTOL,Rover,Sub", + "enumValues": "1,2,19,10,12", + "defaultValue": 1 +}, +{ + "name": "OfflineEditingCruiseSpeed", + "shortDescription": "Offline editing cruise speed", + "longDescription": "This value defines the cruising speed for forward flight vehicles for use in calculating mission duration when not connected to a vehicle.", + "type": "double", + "defaultValue": 16.0, + "min": 1.0, + "units": "m/s", + "decimalPlaces": 2 +}, +{ + "name": "OfflineEditingHoverSpeed", + "shortDescription": "Offline editing hover speed", + "longDescription": "This value defines the cruising speed for multi-rotor vehicles for use in calculating mission duration when not connected to a vehicle.", + "type": "double", + "defaultValue": 4.0, + "min": 1.0, + "units": "m/s", + "decimalPlaces": 2 +}, +{ + "name": "batteryPercentRemainingAnnounce", + "shortDescription": "Announce battery remaining percent", + "longDescription": "QGroundControl will announce the remaining battery percent when it falls below the specified percentage.", + "type": "uint32", + "defaultValue": 30, + "units": "%", + "min": 0, + "max": 100 +}, +{ + "name": "DefaultMissionItemAltitude", + "shortDescription": "Default value for altitude", + "longDescription": "This value specifies the default altitude for new items added to a mission.", + "type": "double", + "defaultValue": 50.0, + "min": 0.0, + "units": "meters", + "decimalPlaces": 2 +} +] diff --git a/src/Vehicle/MultiVehicleManager.cc b/src/Vehicle/MultiVehicleManager.cc index fdab658..45d3656 100644 --- a/src/Vehicle/MultiVehicleManager.cc +++ b/src/Vehicle/MultiVehicleManager.cc @@ -15,6 +15,7 @@ #include "FollowMe.h" #include "QGroundControlQmlGlobal.h" #include "ParameterManager.h" +#include "SettingsManager.h" #if defined (__ios__) || defined(__android__) #include "MobileScreenMgr.h" @@ -62,8 +63,9 @@ void MultiVehicleManager::setToolbox(QGCToolbox *toolbox) connect(_mavlinkProtocol, &MAVLinkProtocol::vehicleHeartbeatInfo, this, &MultiVehicleManager::_vehicleHeartbeatInfo); - _offlineEditingVehicle = new Vehicle(static_cast(QGroundControlQmlGlobal::offlineEditingFirmwareType()->rawValue().toInt()), - static_cast(QGroundControlQmlGlobal::offlineEditingVehicleType()->rawValue().toInt()), + SettingsManager* settingsManager = toolbox->settingsManager(); + _offlineEditingVehicle = new Vehicle(static_cast(settingsManager->offlineEditingFirmwareType()->rawValue().toInt()), + static_cast(settingsManager->offlineEditingVehicleType()->rawValue().toInt()), _firmwarePluginManager, this); } diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index 349e305..0ad9378 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -27,6 +27,7 @@ #include "FollowMe.h" #include "MissionCommandTree.h" #include "QGroundControlQmlGlobal.h" +#include "SettingsManager.h" QGC_LOGGING_CATEGORY(VehicleLog, "VehicleLog") @@ -75,6 +76,7 @@ Vehicle::Vehicle(LinkInterface* link, , _autopilotPlugin(NULL) , _mavlink(NULL) , _soloFirmware(false) + , _settingsManager(qgcApp()->toolbox()->settingsManager()) , _joystickMode(JoystickModeRC) , _joystickEnabled(false) , _uas(NULL) @@ -99,8 +101,8 @@ Vehicle::Vehicle(LinkInterface* link, , _onboardControlSensorsUnhealthy(0) , _gpsRawIntMessageAvailable(false) , _globalPositionIntMessageAvailable(false) - , _cruiseSpeed(QGroundControlQmlGlobal::offlineEditingCruiseSpeed()->rawValue().toDouble()) - , _hoverSpeed(QGroundControlQmlGlobal::offlineEditingHoverSpeed()->rawValue().toDouble()) + , _cruiseSpeed(_settingsManager->offlineEditingCruiseSpeed()->rawValue().toDouble()) + , _hoverSpeed(_settingsManager->offlineEditingHoverSpeed()->rawValue().toDouble()) , _telemetryRRSSI(0) , _telemetryLRSSI(0) , _telemetryRXErrors(0) @@ -231,6 +233,9 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, , _firmwarePlugin(NULL) , _firmwarePluginInstanceData(NULL) , _autopilotPlugin(NULL) + , _mavlink(NULL) + , _soloFirmware(false) + , _settingsManager(qgcApp()->toolbox()->settingsManager()) , _joystickMode(JoystickModeRC) , _joystickEnabled(false) , _uas(NULL) @@ -255,8 +260,8 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, , _onboardControlSensorsUnhealthy(0) , _gpsRawIntMessageAvailable(false) , _globalPositionIntMessageAvailable(false) - , _cruiseSpeed(QGroundControlQmlGlobal::offlineEditingCruiseSpeed()->rawValue().toDouble()) - , _hoverSpeed(QGroundControlQmlGlobal::offlineEditingHoverSpeed()->rawValue().toDouble()) + , _cruiseSpeed(_settingsManager->offlineEditingCruiseSpeed()->rawValue().toDouble()) + , _hoverSpeed(_settingsManager->offlineEditingHoverSpeed()->rawValue().toDouble()) , _connectionLost(false) , _connectionLostEnabled(true) , _missionManager(NULL) @@ -318,10 +323,10 @@ void Vehicle::_commonInit(void) connect(_rallyPointManager, &RallyPointManager::error, this, &Vehicle::_rallyPointManagerError); // Offline editing vehicle tracks settings changes for offline editing settings - connect(QGroundControlQmlGlobal::offlineEditingFirmwareType(), &Fact::rawValueChanged, this, &Vehicle::_offlineFirmwareTypeSettingChanged); - connect(QGroundControlQmlGlobal::offlineEditingVehicleType(), &Fact::rawValueChanged, this, &Vehicle::_offlineVehicleTypeSettingChanged); - connect(QGroundControlQmlGlobal::offlineEditingCruiseSpeed(), &Fact::rawValueChanged, this, &Vehicle::_offlineCruiseSpeedSettingChanged); - connect(QGroundControlQmlGlobal::offlineEditingHoverSpeed(), &Fact::rawValueChanged, this, &Vehicle::_offlineHoverSpeedSettingChanged); + connect(_settingsManager->offlineEditingFirmwareType(), &Fact::rawValueChanged, this, &Vehicle::_offlineFirmwareTypeSettingChanged); + connect(_settingsManager->offlineEditingVehicleType(), &Fact::rawValueChanged, this, &Vehicle::_offlineVehicleTypeSettingChanged); + connect(_settingsManager->offlineEditingCruiseSpeed(), &Fact::rawValueChanged, this, &Vehicle::_offlineCruiseSpeedSettingChanged); + connect(_settingsManager->offlineEditingHoverSpeed(), &Fact::rawValueChanged, this, &Vehicle::_offlineHoverSpeedSettingChanged); // Build FactGroup object model @@ -786,7 +791,7 @@ void Vehicle::_handleSysStatus(mavlink_message_t& message) } _batteryFactGroup.percentRemaining()->setRawValue(sysStatus.battery_remaining); - if (sysStatus.battery_remaining > 0 && sysStatus.battery_remaining < QGroundControlQmlGlobal::batteryPercentRemainingAnnounce()->rawValue().toInt()) { + if (sysStatus.battery_remaining > 0 && sysStatus.battery_remaining < _settingsManager->batteryPercentRemainingAnnounce()->rawValue().toInt()) { if (!_lowBatteryAnnounceTimer.isValid() || _lowBatteryAnnounceTimer.elapsed() > _lowBatteryAnnounceRepeatMSecs) { _lowBatteryAnnounceTimer.restart(); _say(QString("%1 low battery: %2 percent remaining").arg(_vehicleIdSpeech()).arg(sysStatus.battery_remaining)); diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index 29d8b13..8a8fea4 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -37,6 +37,7 @@ class RallyPointManager; class ParameterManager; class JoystickManager; class UASMessage; +class SettingsManager; Q_DECLARE_LOGGING_CATEGORY(VehicleLog) @@ -775,6 +776,7 @@ private: AutoPilotPlugin* _autopilotPlugin; MAVLinkProtocol* _mavlink; bool _soloFirmware; + SettingsManager* _settingsManager; QList _links; diff --git a/src/api/QGCCorePlugin.cc b/src/api/QGCCorePlugin.cc index 89eac8c..eab76cc 100644 --- a/src/api/QGCCorePlugin.cc +++ b/src/api/QGCCorePlugin.cc @@ -139,3 +139,10 @@ QGCOptions* QGCCorePlugin::options() return _p->defaultOptions; } +QVariant QGCCorePlugin::overrideSettingsDefault(QString name, QVariant defaultValue) +{ + Q_UNUSED(name); + + // No overrides for base plugin + return defaultValue; +} diff --git a/src/api/QGCCorePlugin.h b/src/api/QGCCorePlugin.h index 492da62..b668a9d 100644 --- a/src/api/QGCCorePlugin.h +++ b/src/api/QGCCorePlugin.h @@ -54,6 +54,12 @@ public: */ virtual QGCOptions* options (); + /// Allows the core plugin to override the default value for the specified setting + /// @param name - Setting name + /// @param defaultValue - Standard default value for setting + /// @return New default value for setting, if no override just return passed in defaultValue + virtual QVariant overrideSettingsDefault(QString name, QVariant defaultValue); + // Override from QGCTool void setToolbox (QGCToolbox *toolbox); private: diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index a02c919..f0f231b 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -23,6 +23,7 @@ import QGroundControl.ScreenTools 1.0 import QGroundControl.MultiVehicleManager 1.0 import QGroundControl.Palette 1.0 import QGroundControl.Controllers 1.0 +import QGroundControl.SettingsManager 1.0 QGCView { id: qgcView @@ -31,7 +32,7 @@ QGCView { anchors.fill: parent anchors.margins: ScreenTools.defaultFontPixelWidth - property Fact _percentRemainingAnnounce: QGroundControl.batteryPercentRemainingAnnounce + property Fact _percentRemainingAnnounce: QGroundControl.settingsManager.batteryPercentRemainingAnnounce property real _labelWidth: ScreenTools.defaultFontPixelWidth * 15 property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 30 @@ -93,7 +94,7 @@ QGCView { FactComboBox { id: distanceUnitsCombo width: _editFieldWidth - fact: QGroundControl.distanceUnits + fact: QGroundControl.settingsManager.distanceUnits indexModel: false } } @@ -107,7 +108,7 @@ QGCView { FactComboBox { id: areaUnitsCombo width: _editFieldWidth - fact: QGroundControl.areaUnits + fact: QGroundControl.settingsManager.areaUnits indexModel: false } } @@ -121,7 +122,7 @@ QGCView { FactComboBox { id: speedUnitsCombo width: _editFieldWidth - fact: QGroundControl.speedUnits + fact: QGroundControl.settingsManager.speedUnits indexModel: false } } @@ -326,7 +327,7 @@ QGCView { } FactTextField { id: defaultItemAltitudeField - fact: QGroundControl.defaultMissionItemAltitude + fact: QGroundControl.settingsManager.defaultMissionItemAltitude } } //-----------------------------------------------------------------