From 7d84163610b839f982198a9c662d90f914b25141 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Mon, 28 Sep 2015 15:10:41 -0700 Subject: [PATCH] New FlightMapSettings for map settings --- QGCApplication.pro | 3 + src/FlightDisplay/FlightDisplayView.cc | 16 --- src/FlightDisplay/FlightDisplayView.h | 3 - src/FlightMap/FlightMapSettings.cc | 140 +++++++++++++++++++++ src/FlightMap/FlightMapSettings.h | 79 ++++++++++++ src/HomePositionManager.cc | 3 + src/QGCApplication.cc | 26 ++-- src/QmlControls/QGroundControlQmlGlobal.cc | 1 + src/QmlControls/QGroundControlQmlGlobal.h | 8 +- 9 files changed, 248 insertions(+), 31 deletions(-) create mode 100644 src/FlightMap/FlightMapSettings.cc create mode 100644 src/FlightMap/FlightMapSettings.h diff --git a/QGCApplication.pro b/QGCApplication.pro index cd9af36b4..ae1829ba5 100644 --- a/QGCApplication.pro +++ b/QGCApplication.pro @@ -141,6 +141,7 @@ INCLUDEPATH += \ src/AutoPilotPlugins \ src/comm \ src/FlightDisplay \ + src/FlightMap \ src/input \ src/Joystick \ src/lib/qmapcontrol \ @@ -239,6 +240,7 @@ HEADERS += \ src/comm/UDPLink.h \ src/FlightDisplay/FlightDisplayWidget.h \ src/FlightDisplay/FlightDisplayView.h \ + src/FlightMap/FlightMapSettings.h \ src/GAudioOutput.h \ src/HomePositionManager.h \ src/Joystick/Joystick.h \ @@ -374,6 +376,7 @@ SOURCES += \ src/comm/UDPLink.cc \ src/FlightDisplay/FlightDisplayWidget.cc \ src/FlightDisplay/FlightDisplayView.cc \ + src/FlightMap/FlightMapSettings.cc \ src/GAudioOutput.cc \ src/HomePositionManager.cc \ src/Joystick/Joystick.cc \ diff --git a/src/FlightDisplay/FlightDisplayView.cc b/src/FlightDisplay/FlightDisplayView.cc index 34cfa13e8..8b19e357e 100644 --- a/src/FlightDisplay/FlightDisplayView.cc +++ b/src/FlightDisplay/FlightDisplayView.cc @@ -91,19 +91,3 @@ FlightDisplayView::FlightDisplayView(QWidget *parent) FlightDisplayView::~FlightDisplayView() { } - -void FlightDisplayView::saveSetting(const QString &name, const QString& value) -{ - QSettings settings; - QString key(kMainFlightDisplayViewGroup); - key += "/" + name; - settings.setValue(key, value); -} - -QString FlightDisplayView::loadSetting(const QString &name, const QString& defaultValue) -{ - QSettings settings; - QString key(kMainFlightDisplayViewGroup); - key += "/" + name; - return settings.value(key, defaultValue).toString(); -} diff --git a/src/FlightDisplay/FlightDisplayView.h b/src/FlightDisplay/FlightDisplayView.h index e97c29001..7fe374b2e 100644 --- a/src/FlightDisplay/FlightDisplayView.h +++ b/src/FlightDisplay/FlightDisplayView.h @@ -38,9 +38,6 @@ public: Q_PROPERTY(bool hasVideo READ hasVideo CONSTANT) - Q_INVOKABLE void saveSetting (const QString &key, const QString& value); - Q_INVOKABLE QString loadSetting (const QString &key, const QString& defaultValue); - #if defined(QGC_GST_STREAMING) bool hasVideo () { return true; } #else diff --git a/src/FlightMap/FlightMapSettings.cc b/src/FlightMap/FlightMapSettings.cc new file mode 100644 index 000000000..a27e5978f --- /dev/null +++ b/src/FlightMap/FlightMapSettings.cc @@ -0,0 +1,140 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2015 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#include "FlightMapSettings.h" + +#include +#include + +IMPLEMENT_QGC_SINGLETON(FlightMapSettings, FlightMapSettings) + +const char* FlightMapSettings::_defaultMapProvider = "Bing"; // Bing is default since it support full street/satellite/hybrid set +const char* FlightMapSettings::_settingsGroup = "FlightMapSettings"; +const char* FlightMapSettings::_mapProviderKey = "MapProvider"; +const char* FlightMapSettings::_mapTypeKey = "MapType"; + +FlightMapSettings::FlightMapSettings(QObject* parent) + : QObject(parent) + , _mapProvider(_defaultMapProvider) +{ + qmlRegisterUncreatableType ("QGroundControl", 1, 0, "FlightMapSetting", "Reference only"); + + _supportedMapProviders << "Bing" << "Google" << "Open"; + + _loadSettings(); +} + +FlightMapSettings::~FlightMapSettings() +{ + +} + +void FlightMapSettings::_storeSettings(void) +{ + QSettings settings; + + settings.beginGroup(_settingsGroup); + settings.setValue(_mapProviderKey, _supportedMapProviders.contains(_mapProvider) ? _mapProvider : _defaultMapProvider); +} + +void FlightMapSettings::_loadSettings(void) +{ + QSettings settings; + + settings.beginGroup(_settingsGroup); + _mapProvider = settings.value(_mapProviderKey, _defaultMapProvider).toString(); + + if (!_supportedMapProviders.contains(_mapProvider)) { + _mapProvider = _defaultMapProvider; + } + + _setMapTypesForCurrentProvider(); +} + +QString FlightMapSettings::mapProvider(void) +{ + return _mapProvider; +} + +void FlightMapSettings::setMapProvider(const QString& mapProvider) +{ + if (_supportedMapProviders.contains(mapProvider)) { + _mapProvider = mapProvider; + _storeSettings(); + _setMapTypesForCurrentProvider(); + emit mapProviderChanged(mapProvider); + } +} + +void FlightMapSettings::_setMapTypesForCurrentProvider(void) +{ + _mapTypes.clear(); + + if (_mapProvider == "Bing") { + _mapTypes << "Street Map" << "Satellite Map" << "Hybrid Map"; + } else if (_mapProvider == "Google") { + _mapTypes << "Street Map" << "Satellite Map" << "Terrain Map"; + } else if (_mapProvider == "Open") { + _mapTypes << "Street Map"; + } + + emit mapTypesChanged(_mapTypes); +} + +QString FlightMapSettings::mapTypeForMapName(const QString& mapName) +{ + QSettings settings; + + settings.beginGroup(_settingsGroup); + settings.beginGroup(mapName); + settings.beginGroup(_mapProvider); + return settings.value(_mapTypeKey, "Street Map").toString(); +} + +void FlightMapSettings::setMapTypeForMapName(const QString& mapName, const QString& mapType) +{ + QSettings settings; + + settings.beginGroup(_settingsGroup); + settings.beginGroup(mapName); + settings.beginGroup(_mapProvider); + settings.setValue(_mapTypeKey, mapType); +} + +void FlightMapSettings::saveMapSetting (const QString &mapName, const QString& key, const QString& value) +{ + QSettings settings; + + settings.beginGroup(_settingsGroup); + settings.beginGroup(mapName); + settings.setValue(key, value); +} + +QString FlightMapSettings::loadMapSetting (const QString &mapName, const QString& key, const QString& defaultValue) +{ + QSettings settings; + + settings.beginGroup(_settingsGroup); + settings.beginGroup(mapName); + return settings.value(key, defaultValue).toString(); +} diff --git a/src/FlightMap/FlightMapSettings.h b/src/FlightMap/FlightMapSettings.h new file mode 100644 index 000000000..8de843e7c --- /dev/null +++ b/src/FlightMap/FlightMapSettings.h @@ -0,0 +1,79 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009 - 2015 QGROUNDCONTROL PROJECT + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + +======================================================================*/ + +#ifndef FlightMapSettings_H +#define FlightMapSettings_H + +#include "QGCSingleton.h" + +#include + +class FlightMapSettings : public QObject +{ + Q_OBJECT + + DECLARE_QGC_SINGLETON(FlightMapSettings, FlightMapSettings) + +public: + /// mapProvider is either Bing, Google or Open to specify to set of maps available + Q_PROPERTY(QString mapProvider READ mapProvider WRITE setMapProvider NOTIFY mapProviderChanged) + + /// Map types associated with current map provider + Q_PROPERTY(QStringList mapTypes MEMBER _mapTypes NOTIFY mapTypesChanged) + + Q_INVOKABLE QString mapTypeForMapName(const QString& mapName); + Q_INVOKABLE void setMapTypeForMapName(const QString& mapName, const QString& mapType); + + Q_INVOKABLE void saveMapSetting (const QString &mapName, const QString& key, const QString& value); + Q_INVOKABLE QString loadMapSetting (const QString &mapName, const QString& key, const QString& defaultValue); + + // Property accessors + + QString mapProvider(void); + void setMapProvider(const QString& mapProvider); + +signals: + void mapProviderChanged(const QString& mapProvider); + void mapTypesChanged(const QStringList& mapTypes); + +private: + /// @brief All access to FlightMapSettings singleton is through FlightMapSettings::instance + FlightMapSettings(QObject* parent = NULL); + ~FlightMapSettings(); + + void _storeSettings(void); + void _loadSettings(void); + + void _setMapTypesForCurrentProvider(void); + + QString _mapProvider; ///< Current map provider + QStringList _supportedMapProviders; + QStringList _mapTypes; ///< Map types associated with current map provider + + static const char* _defaultMapProvider; + static const char* _settingsGroup; + static const char* _mapProviderKey; + static const char* _mapTypeKey; +}; + +#endif diff --git a/src/HomePositionManager.cc b/src/HomePositionManager.cc index d8ca76e01..5c07db78c 100644 --- a/src/HomePositionManager.cc +++ b/src/HomePositionManager.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include "UAS.h" #include "UASInterface.h" @@ -51,6 +52,8 @@ HomePositionManager::HomePositionManager(QObject* parent) , homeLon(8.549444) , homeAlt(470.0) { + qmlRegisterUncreatableType ("QGroundControl", 1, 0, "HomePositionManager", "Reference only"); + _loadSettings(); } diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index c795fe028..099c023ff 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -83,6 +83,7 @@ #include "MissionManager.h" #include "QGroundControlQmlGlobal.h" #include "HomePositionManager.h" +#include "FlightMapSettings.h" #ifndef __ios__ #include "SerialLink.h" @@ -313,7 +314,6 @@ void QGCApplication::_initCommon(void) qmlRegisterUncreatableType ("QGroundControl.JoystickManager", 1, 0, "JoystickManager", "Reference only"); qmlRegisterUncreatableType ("QGroundControl.JoystickManager", 1, 0, "Joystick", "Reference only"); qmlRegisterUncreatableType ("QGroundControl", 1, 0, "QmlObjectListModel", "Reference only"); - qmlRegisterUncreatableType ("QGroundControl", 1, 0, "HomePositionManager", "Reference only"); qmlRegisterType ("QGroundControl.Controllers", 1, 0, "ViewWidgetController"); qmlRegisterType ("QGroundControl.Controllers", 1, 0, "ParameterEditorController"); @@ -550,6 +550,16 @@ void QGCApplication::_createSingletons(void) { // The order here is important since the singletons reference each other + // No dependencies + FlightMapSettings* flightMapSettings = FlightMapSettings::_createSingleton(); + Q_UNUSED(flightMapSettings); + Q_ASSERT(flightMapSettings); + + // No dependencies + HomePositionManager* homePositionManager = HomePositionManager::_createSingleton(); + Q_UNUSED(homePositionManager); + Q_ASSERT(homePositionManager); + // No dependencies FirmwarePlugin* firmwarePlugin = GenericFirmwarePlugin::_createSingleton(); Q_UNUSED(firmwarePlugin); @@ -584,22 +594,17 @@ void QGCApplication::_createSingletons(void) Q_UNUSED(linkManager); Q_ASSERT(linkManager); - // Needs LinkManager - HomePositionManager* uasManager = HomePositionManager::_createSingleton(); - Q_UNUSED(uasManager); - Q_ASSERT(uasManager); - - // Need HomePositionManager + // Need MultiVehicleManager AutoPilotPluginManager* pluginManager = AutoPilotPluginManager::_createSingleton(); Q_UNUSED(pluginManager); Q_ASSERT(pluginManager); - // Need HomePositionManager + // Need MultiVehicleManager UASMessageHandler* messageHandler = UASMessageHandler::_createSingleton(); Q_UNUSED(messageHandler); Q_ASSERT(messageHandler); - // Needs HomePositionManager + // Needs MultiVehicleManager FactSystem* factSystem = FactSystem::_createSingleton(); Q_UNUSED(factSystem); Q_ASSERT(factSystem); @@ -631,7 +636,6 @@ void QGCApplication::_destroySingletons(void) FactSystem::_deleteSingleton(); UASMessageHandler::_deleteSingleton(); AutoPilotPluginManager::_deleteSingleton(); - HomePositionManager::_deleteSingleton(); LinkManager::_deleteSingleton(); GAudioOutput::_deleteSingleton(); JoystickManager::_deleteSingleton(); @@ -640,6 +644,8 @@ void QGCApplication::_destroySingletons(void) GenericFirmwarePlugin::_deleteSingleton(); PX4FirmwarePlugin::_deleteSingleton(); APMFirmwarePlugin::_deleteSingleton(); + HomePositionManager::_deleteSingleton(); + FlightMapSettings::_deleteSingleton(); } void QGCApplication::informationMessageBoxOnMainThread(const QString& title, const QString& msg) diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index 1261e059b..8912f375e 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -29,6 +29,7 @@ QGroundControlQmlGlobal::QGroundControlQmlGlobal(QObject* parent) : QObject(parent) , _homePositionManager(HomePositionManager::instance()) + , _flightMapSettings(FlightMapSettings::instance()) { } diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h index 72fcfff8d..5091dae46 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.h +++ b/src/QmlControls/QGroundControlQmlGlobal.h @@ -30,6 +30,7 @@ #include #include "HomePositionManager.h" +#include "FlightMapSettings.h" class QGroundControlQmlGlobal : public QObject { @@ -39,14 +40,17 @@ public: QGroundControlQmlGlobal(QObject* parent = NULL); ~QGroundControlQmlGlobal(); - Q_PROPERTY(HomePositionManager* homePositionManager READ homePositionManager CONSTANT) + Q_PROPERTY(HomePositionManager* homePositionManager READ homePositionManager CONSTANT) + Q_PROPERTY(FlightMapSettings* flightMapSettings READ flightMapSettings CONSTANT) // Property accesors - HomePositionManager* homePositionManager(void) { return _homePositionManager; } + HomePositionManager* homePositionManager(void) { return _homePositionManager; } + FlightMapSettings* flightMapSettings(void) { return _flightMapSettings; } private: HomePositionManager* _homePositionManager; + FlightMapSettings* _flightMapSettings; }; #endif -- 2.22.0