diff --git a/api/IQGCCorePlugin.h b/api/IQGCCorePlugin.h deleted file mode 100644 index 6bd0fa859b56169baad0d7e91b9e577e088c9ef9..0000000000000000000000000000000000000000 --- a/api/IQGCCorePlugin.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include - -/// @file -/// @brief Core Plugin Interface for QGroundControl -/// @author Gus Grubba - -// Work In Progress - -class QGCApplication; -class IQGCApplication; -class IQGCOptions; -class IQGCQMLSource; - -class IQGCCorePlugin -{ -public: - IQGCCorePlugin(QObject*) {} - virtual ~IQGCCorePlugin() {} - -#if defined (QGC_DYNAMIC_PLUGIN) - virtual bool init (IQGCApplication* pApp) = 0; -#else - virtual bool init (QGCApplication* pApp) = 0; -#endif - virtual IQGCOptions* uiOptions () { return NULL; } - virtual IQGCQMLSource* settingsQML () { return NULL; } -}; - -#if defined (QGC_DYNAMIC_PLUGIN) -Q_DECLARE_INTERFACE(IQGCCorePlugin, "org.qgroundcontrol.qgccoreplugin") -#endif diff --git a/api/IQGCOptions.h b/api/IQGCOptions.h deleted file mode 100644 index f28544617625076e3943708ef3ca50698484a43c..0000000000000000000000000000000000000000 --- a/api/IQGCOptions.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -/// @file -/// @brief Core Plugin Interface for QGroundControl -/// @author Gus Grubba - -class IQGCOptions -{ -public: - IQGCOptions() {} - virtual ~IQGCOptions() {} - //! Should QGC colapse its settings menu into one single menu (Settings and Vehicle Setup)? - /*! - @return true if QGC should consolidate both menus into one. - */ - virtual bool colapseSettings () { return false; } - //! Should QGC use Maps as its default main view? - /*! - @return true if QGC should use Maps by default or false to show Video by default. - */ - virtual bool mainViewIsMap () { return true; } - //! Should QGC use virtual Joysticks? - /*! - @return false to disable Virtual Joysticks. - */ - virtual bool enableVirtualJoystick () { return true; } - //! Should QGC allow setting auto-connect options? - /*! - @return false to disable auto-connect options. - */ - virtual bool enableAutoConnectOptions () { return true; } - //! Should QGC allow setting video source options? - /*! - @return false to disable video source options. - */ - virtual bool enableVideoSourceOptions () { return true; } - //! Does your plugin defines its on video source? - /*! - @return true to define your own video source. - */ - virtual bool definesVideo () { return false; } - //! UDP port to use for (RTP) video source. - /*! - @return UDP Port to use. Return 0 to disable UDP RTP. - */ - virtual uint16_t videoUDPPort () { return 0; } - //! RTSP URL to use for video source. - /*! - @return RTSP url to use. Return "" to disable RTSP. - */ - virtual QString videoRSTPUrl () { return QString(); } -}; diff --git a/api/IQGCQMLSource.h b/api/IQGCQMLSource.h deleted file mode 100644 index 5e59c21692909db4140c672c34633bdb7d6e2fd6..0000000000000000000000000000000000000000 --- a/api/IQGCQMLSource.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include - -/// @file -/// @brief Core Plugin Interface for QGroundControl -/// @author Gus Grubba - -class IQGCQMLSource -{ -public: - IQGCQMLSource() {} - virtual ~IQGCQMLSource() {} - virtual QString pageUrl () { return QString(); } - virtual QString pageTitle () { return QString(); } - virtual QString pageIconUrl () { return QString(); } -}; diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 28a09d033a9cd6edea19934050aa4c25e8a6a1fd..f056999455f97c838b27fc3ac1900d0fb6e4b980 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -34,6 +34,34 @@ exists(user_config.pri):infile(user_config.pri, CONFIG) { message($$sprintf("Using user-supplied additional config: '%1' specified in user_config.pri", $$fromfile(user_config.pri, CONFIG))) } +# +# Custom Build +# +# QGC will create a "CUSTOMCLASS" object (exposed by your custom build +# and derived from QGCCorePlugin). +# This is the start of allowing custom Plugins, which will eventually use a +# more defined runtime plugin architecture and not require a QGC project +# file you would have to keep in sync with the upstream repo. +# + +# This allows you to ignore the custom build even if the custom build +# is present. It's useful to run "regular" builds to make sure you didn't +# break anything. + +contains (CONFIG, QGC_DISABLE_CUSTOM_BUILD) { + message("Disable custom build override") +} else { + exists($$PWD/custom/custom.pri) { + message("Found custom build") + CONFIG += CustomBuild + DEFINES += QGC_CUSTOM_BUILD + # custom.pri must define: + # CUSTOMCLASS = YourIQGCCorePluginDerivation + # CUSTOMHEADER = \"\\\"YourIQGCCorePluginDerivation.h\\\"\" + include($$PWD/custom/custom.pri) + } +} + # # Plugin configuration # @@ -69,34 +97,6 @@ contains (CONFIG, QGC_DISABLE_PX4_PLUGIN_FACTORY) { CONFIG += PX4FirmwarePluginFactory } -# -# Custom Build -# -# QGC will create a "CUSTOMCLASS" object (exposed by your custom build -# and derived from IQGCCorePlugin) and call its IQGCCorePlugin::init() method. -# This is the start of allowing custom Plugins, which will eventually use a -# more defined runtime plugin architecture and not require a QGC project -# file you would have to keep in sync with the upstream repo. -# - -# This allows you to ignore the custom build even if the custom build -# is present. It's useful to run "regular" builds to make sure you didn't -# break anything. - -contains (CONFIG, QGC_DISABLE_CUSTOM_BUILD) { - message("Disable custom build override") -} else { - exists($$PWD/custom/custom.pri) { - message("Found custom build") - CONFIG += CustomBuild - DEFINES += QGC_CUSTOM_BUILD - # custom.pri must define: - # CUSTOMCLASS = YourIQGCCorePluginDerivation - # CUSTOMHEADER = \"\\\"YourIQGCCorePluginDerivation.h\\\"\" - include($$PWD/custom/custom.pri) - } -} - # Bluetooth contains (DEFINES, QGC_DISABLE_BLUETOOTH) { message("Skipping support for Bluetooth (manual override from command line)") @@ -273,9 +273,9 @@ DEPENDPATH += \ INCLUDEPATH += . INCLUDEPATH += \ - api \ include/ui \ src \ + src/api \ src/AnalyzeView \ src/AutoPilotPlugins \ src/FlightDisplay \ @@ -336,10 +336,14 @@ FORMS += \ # HEADERS += \ - api/IQGCApplication.h \ - api/IQGCCorePlugin.h \ - api/IQGCOptions.h \ - api/IQGCQMLSource.h \ + src/api/QGCCorePlugin.h \ + src/api/QGCOptions.h \ + src/api/QGCSettings.h \ + +SOURCES += \ + src/api/QGCCorePlugin.cc \ + src/api/QGCOptions.cc \ + src/api/QGCSettings.cc \ # # Unit Test specific configuration goes here (requires full debug build with all plugins) diff --git a/src/FlightDisplay/FlightDisplayView.qml b/src/FlightDisplay/FlightDisplayView.qml index c739d322c1f8c2d8427d653c474f955f05137380..3eb92fd5e0f16a62763f9ff1e64a74056f5a894a 100644 --- a/src/FlightDisplay/FlightDisplayView.qml +++ b/src/FlightDisplay/FlightDisplayView.qml @@ -34,7 +34,7 @@ QGCView { QGCPalette { id: qgcPal; colorGroupEnabled: enabled } property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle - property bool _mainIsMap: QGroundControl.videoManager.hasVideo ? QGroundControl.loadBoolGlobalSetting(_mainIsMapKey, QGroundControl.mainViewIsMap) : true + property bool _mainIsMap: QGroundControl.videoManager.hasVideo ? QGroundControl.loadBoolGlobalSetting(_mainIsMapKey, QGroundControl.corePlugin.options.mainViewIsMap) : true property bool _isPipVisible: QGroundControl.videoManager.hasVideo ? QGroundControl.loadBoolGlobalSetting(_PIPVisibleKey, true) : false property real _roll: _activeVehicle ? _activeVehicle.roll.value : _defaultRoll diff --git a/src/FlightDisplay/VideoManager.cc b/src/FlightDisplay/VideoManager.cc index 86582d05d4aa568d2ec00f42a926d8dc359c40d4..a68e880aa97d5ecb774e63f08197ba3b8a9634ab 100644 --- a/src/FlightDisplay/VideoManager.cc +++ b/src/FlightDisplay/VideoManager.cc @@ -20,6 +20,9 @@ #include "ScreenToolsController.h" #include "VideoManager.h" +#include "QGCToolbox.h" +#include "QGCCorePlugin.h" +#include "QGCOptions.h" static const char* kVideoSourceKey = "VideoSource"; static const char* kVideoUDPPortKey = "VideoUDPPort"; @@ -41,34 +44,6 @@ VideoManager::VideoManager(QGCApplication* app) , _udpPort(5600) //-- Defalut Port 5600 == Solo UDP Port , _init(false) { - //-- Get saved settings -#if defined(QGC_GST_STREAMING) - QSettings settings; -#if defined(NO_UDP_VIDEO) - setVideoSource(settings.value(kVideoSourceKey, kRTSPStream).toString()); -#else - setVideoSource(settings.value(kVideoSourceKey, kUDPStream).toString()); -#endif - //-- Check if core plugin defines its own video requirements - if(qgcApp()->qgcOptions()->definesVideo()) { - if(qgcApp()->qgcOptions()->videoUDPPort()) { - setUdpPort(qgcApp()->qgcOptions()->videoUDPPort()); - setVideoSource(kUDPStream); - } else { - setVideoSource(kRTSPStream); - setRtspURL(qgcApp()->qgcOptions()->videoRSTPUrl()); - } - } else { - setUdpPort(settings.value(kVideoUDPPortKey, 5600).toUInt()); - setRtspURL(settings.value(kVideoRTSPUrlKey, "rtsp://192.168.42.1:554/live").toString()); //-- Example RTSP URL - } -#endif - _init = true; -#if defined(QGC_GST_STREAMING) - _updateVideo(); - connect(&_frameTimer, &QTimer::timeout, this, &VideoManager::_updateTimer); - _frameTimer.start(1000); -#endif } //----------------------------------------------------------------------------- @@ -84,6 +59,34 @@ VideoManager::setToolbox(QGCToolbox *toolbox) QGCTool::setToolbox(toolbox); QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); qmlRegisterUncreatableType("QGroundControl.VideoManager", 1, 0, "VideoManager", "Reference only"); + //-- Get saved settings +#if defined(QGC_GST_STREAMING) + QSettings settings; +#if defined(NO_UDP_VIDEO) + setVideoSource(settings.value(kVideoSourceKey, kRTSPStream).toString()); +#else + setVideoSource(settings.value(kVideoSourceKey, kUDPStream).toString()); +#endif + //-- Check if core plugin defines its own video requirements + if(qgcApp()->toolbox()->corePlugin()->options()->definesVideo()) { + if(qgcApp()->toolbox()->corePlugin()->options()->videoUDPPort()) { + setUdpPort(qgcApp()->toolbox()->corePlugin()->options()->videoUDPPort()); + setVideoSource(kUDPStream); + } else { + setVideoSource(kRTSPStream); + setRtspURL(qgcApp()->toolbox()->corePlugin()->options()->videoRSTPUrl()); + } + } else { + setUdpPort(settings.value(kVideoUDPPortKey, 5600).toUInt()); + setRtspURL(settings.value(kVideoRTSPUrlKey, "rtsp://192.168.42.1:554/live").toString()); //-- Example RTSP URL + } +#endif + _init = true; +#if defined(QGC_GST_STREAMING) + _updateVideo(); + connect(&_frameTimer, &QTimer::timeout, this, &VideoManager::_updateTimer); + _frameTimer.start(1000); +#endif } //----------------------------------------------------------------------------- diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 9847f4b8e5b9ba0e1b187dff3f1a4fbf48195267..578634b6d38f14565a374ba344bb7510e1c88d1d 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -83,10 +83,6 @@ #include "QGCMapPolygon.h" #include "ParameterManager.h" -#if defined(QGC_CUSTOM_BUILD) -#include CUSTOMHEADER -#endif - #ifndef NO_SERIAL_LINK #include "SerialLink.h" #endif @@ -188,15 +184,10 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) , _toolbox(NULL) , _bluetoothAvailable(false) , _lastKnownHomePosition(37.803784, -122.462276, 0.0) - , _pQGCOptions(NULL) - , _pCorePlugin(NULL) { Q_ASSERT(_app == NULL); _app = this; - //-- Scan and load plugins - _scanAndLoadPlugins(); - // This prevents usage of QQuickWidget to fail since it doesn't support native widget siblings #ifndef __android__ setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); @@ -358,9 +349,6 @@ QGCApplication::~QGCApplication() #endif shutdownVideoStreaming(); delete _toolbox; - if(_pCorePlugin) { - delete _pCorePlugin; - } } void QGCApplication::_initCommon(void) @@ -456,14 +444,6 @@ bool QGCApplication::_initForNormalAppBoot(void) } settings.sync(); - - //-- Initialize Core Plugin (if any) - if(_pCorePlugin) { - if(!_pCorePlugin->init(this)) { - return false; - } - } - return true; } @@ -708,41 +688,3 @@ void QGCApplication::setLastKnownHomePosition(QGeoCoordinate& lastKnownHomePosit settings.setValue(_lastKnownHomePositionAltKey, lastKnownHomePosition.altitude()); _lastKnownHomePosition = lastKnownHomePosition; } - -IQGCOptions* QGCApplication::qgcOptions() -{ - return _pQGCOptions; -} - -void QGCApplication::_scanAndLoadPlugins() -{ -#if defined (QGC_DYNAMIC_PLUGIN) - //-- Look for plugins (Dynamic) - QString filter = "*.core.so"; - QString path = QCoreApplication::applicationDirPath(); - QDirIterator it(path, QStringList() << filter, QDir::Files); - while(it.hasNext()) { - QString pluginFile = it.next(); - QPluginLoader loader(pluginFile); - QObject *plugin = loader.instance(); - if(plugin) { - _pCorePlugin = qobject_cast(plugin); - if(_pCorePlugin) { - _pQGCOptions = _pCorePlugin->uiOptions(); - return; - } - } else { - qWarning() << "Plugin" << pluginFile << " not loaded:" << loader.errorString(); - } - } -#elif defined (QGC_CUSTOM_BUILD) - //-- Create custom plugin (Static) - _pCorePlugin = (IQGCCorePlugin*) new CUSTOMCLASS(this); - if(_pCorePlugin) { - _pQGCOptions = _pCorePlugin->uiOptions(); - return; - } -#endif - //-- No plugins found, use default options - _pQGCOptions = new IQGCOptions; -} diff --git a/src/QGCApplication.h b/src/QGCApplication.h index 6a9dbf96644455ca7a4b3b1f820ff537e437df6b..002c88e39d1ab9fc889258d1c7d300d70afb9a8a 100644 --- a/src/QGCApplication.h +++ b/src/QGCApplication.h @@ -35,12 +35,6 @@ #include "UASMessageHandler.h" #include "FactSystem.h" -//-- Plugin Architecture -#include "IQGCApplication.h" -#include "IQGCCorePlugin.h" -#include "IQGCOptions.h" -#include "IQGCQMLSource.h" - #ifdef QGC_RTLAB_ENABLED #include "OpalLink.h" #endif @@ -123,11 +117,6 @@ public: QGeoCoordinate lastKnownHomePosition(void) { return _lastKnownHomePosition; } void setLastKnownHomePosition(QGeoCoordinate& lastKnownHomePosition); - /// Options (can be overwriten by a core plugin) - IQGCOptions* qgcOptions(); - /// Custom core plugin (NULL if none) - IQGCCorePlugin* customCorePlugin() { return _pCorePlugin; } - public slots: /// You can connect to this slot to show an information message box from a different thread. void informationMessageBoxOnMainThread(const QString& title, const QString& msg); @@ -179,7 +168,6 @@ private slots: private: void _loadCurrentStyle (); QObject* _rootQmlObject (); - void _scanAndLoadPlugins (); #ifdef __mobile__ QQmlApplicationEngine* _qmlAppEngine; @@ -218,9 +206,6 @@ private: /// Unit Test have access to creating and destroying singletons friend class UnitTest; - //-- Plugin Architecture - IQGCOptions* _pQGCOptions; - IQGCCorePlugin* _pCorePlugin; }; /// @brief Returns the QGCApplication object singleton. diff --git a/src/QGCToolbox.cc b/src/QGCToolbox.cc index 3e625d66a1bfa0e2a0ceb4198ca16dad615a7b4e..213c319969b45b284922c0b9762b70aac82bcd51 100644 --- a/src/QGCToolbox.cc +++ b/src/QGCToolbox.cc @@ -28,6 +28,12 @@ #include "PositionManager.h" #include "VideoManager.h" #include "MAVLinkLogManager.h" +#include "QGCCorePlugin.h" +#include "QGCOptions.h" + +#if defined(QGC_CUSTOM_BUILD) +#include CUSTOMHEADER +#endif QGCToolbox::QGCToolbox(QGCApplication* app) : _audioOutput(NULL) @@ -50,7 +56,10 @@ QGCToolbox::QGCToolbox(QGCApplication* app) , _qgcPositionManager(NULL) , _videoManager(NULL) , _mavlinkLogManager(NULL) + , _corePlugin(NULL) { + //-- Scan and load plugins + _scanAndLoadPlugins(app); _audioOutput = new GAudioOutput(app); _factSystem = new FactSystem(app); _firmwarePluginManager = new FirmwarePluginManager(app); @@ -75,6 +84,7 @@ QGCToolbox::QGCToolbox(QGCApplication* app) void QGCToolbox::setChildToolboxes(void) { + _corePlugin->setToolbox(this); _audioOutput->setToolbox(this); _factSystem->setToolbox(this); _firmwarePluginManager->setToolbox(this); @@ -115,6 +125,39 @@ QGCToolbox::~QGCToolbox() delete _uasMessageHandler; delete _followMe; delete _qgcPositionManager; + delete _corePlugin; +} + +void QGCToolbox::_scanAndLoadPlugins(QGCApplication* app) +{ +#if defined (QGC_DYNAMIC_PLUGIN) + //-- Look for plugins (Dynamic) + QString filter = "*.core.so"; + QString path = QCoreApplication::applicationDirPath(); + QDirIterator it(path, QStringList() << filter, QDir::Files); + while(it.hasNext()) { + QString pluginFile = it.next(); + QPluginLoader loader(pluginFile); + QObject *plugin = loader.instance(); + if(plugin) { + _pCorePlugin = qobject_cast(plugin); + if(_pCorePlugin) { + _pQGCOptions = _pCorePlugin->uiOptions(); + return; + } + } else { + qWarning() << "Plugin" << pluginFile << " not loaded:" << loader.errorString(); + } + } +#elif defined (QGC_CUSTOM_BUILD) + //-- Create custom plugin (Static) + _corePlugin = (QGCCorePlugin*) new CUSTOMCLASS(app); + if(_corePlugin) { + return; + } +#endif + //-- No plugins found, use default instance + _corePlugin = new QGCCorePlugin(app); } QGCTool::QGCTool(QGCApplication* app) diff --git a/src/QGCToolbox.h b/src/QGCToolbox.h index 8948fda3a0b92423eef2ecd811caeee1d4f9c3f0..607ab0a665df0ada4ceffd6068dc0c3c30e4c8ae 100644 --- a/src/QGCToolbox.h +++ b/src/QGCToolbox.h @@ -32,6 +32,7 @@ class UASMessageHandler; class QGCPositionManager; class VideoManager; class MAVLinkLogManager; +class QGCCorePlugin; /// This is used to manage all of our top level services/tools class QGCToolbox { @@ -56,6 +57,7 @@ public: QGCPositionManager* qgcPositionManager(void) { return _qgcPositionManager; } VideoManager* videoManager(void) { return _videoManager; } MAVLinkLogManager* mavlinkLogManager(void) { return _mavlinkLogManager; } + QGCCorePlugin* corePlugin(void) { return _corePlugin; } #ifndef __mobile__ GPSManager* gpsManager(void) { return _gpsManager; } @@ -63,6 +65,8 @@ public: private: void setChildToolboxes(void); + void _scanAndLoadPlugins(QGCApplication *app); + GAudioOutput* _audioOutput; FactSystem* _factSystem; @@ -84,6 +88,7 @@ private: QGCPositionManager* _qgcPositionManager; VideoManager* _videoManager; MAVLinkLogManager* _mavlinkLogManager; + QGCCorePlugin* _corePlugin; friend class QGCApplication; }; diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index 90a67453b3a663bb4b6748d6c9170fe138881353..2a8168db32061e1c2cccb1a2d6733f0a5a02fc93 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -45,6 +45,7 @@ QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app) , _missionCommandTree(NULL) , _videoManager(NULL) , _mavlinkLogManager(NULL) + , _corePlugin(NULL) , _virtualTabletJoystick(false) , _baseFontPointSize(0.0) { @@ -73,6 +74,7 @@ void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox) _missionCommandTree = toolbox->missionCommandTree(); _videoManager = toolbox->videoManager(); _mavlinkLogManager = toolbox->mavlinkLogManager(); + _corePlugin = toolbox->corePlugin(); } void QGroundControlQmlGlobal::saveGlobalSetting (const QString& key, const QString& value) @@ -353,68 +355,3 @@ QMap& QGroundControlQmlGlobal::nameToMetaDataMap(void) { return map; } - -bool QGroundControlQmlGlobal::colapseSettings() -{ - return qgcApp()->qgcOptions()->colapseSettings(); -} - -bool QGroundControlQmlGlobal::mainViewIsMap() -{ - return qgcApp()->qgcOptions()->mainViewIsMap(); -} - -bool QGroundControlQmlGlobal::enableVirtualJoystick() -{ - return qgcApp()->qgcOptions()->enableVirtualJoystick(); -} - -bool QGroundControlQmlGlobal::enableAutoConnectOptions() -{ - return qgcApp()->qgcOptions()->enableAutoConnectOptions(); -} - -bool QGroundControlQmlGlobal::enableVideoSourceOptions() -{ - return qgcApp()->qgcOptions()->enableVideoSourceOptions(); -} - -bool QGroundControlQmlGlobal::hasCustomSettings() -{ - if(qgcApp()->customCorePlugin()) { - if(qgcApp()->customCorePlugin()->settingsQML()) { - return !qgcApp()->customCorePlugin()->settingsQML()->pageUrl().isEmpty(); - } - } - return false; -} - -QString QGroundControlQmlGlobal::customSettingsURL() -{ - if(qgcApp()->customCorePlugin()) { - if(qgcApp()->customCorePlugin()->settingsQML()) { - return qgcApp()->customCorePlugin()->settingsQML()->pageUrl(); - } - } - return QString(); -} - -QString QGroundControlQmlGlobal::customSettingsTitle() -{ - if(qgcApp()->customCorePlugin()) { - if(qgcApp()->customCorePlugin()->settingsQML()) { - return qgcApp()->customCorePlugin()->settingsQML()->pageTitle(); - } - } - return QString(); -} - -QString QGroundControlQmlGlobal::customSettingsLogoUrl() -{ - if(qgcApp()->customCorePlugin()) { - if(qgcApp()->customCorePlugin()->settingsQML()) { - return qgcApp()->customCorePlugin()->settingsQML()->pageIconUrl(); - } - } - return QString(); -} diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h index d5664258792823d23020e11a4efb3572d6af9528..b0b01d09217cd9830ef7a3e7bc8965a5f8dabeae 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.h +++ b/src/QmlControls/QGroundControlQmlGlobal.h @@ -73,6 +73,7 @@ public: Q_PROPERTY(MissionCommandTree* missionCommandTree READ missionCommandTree CONSTANT) Q_PROPERTY(VideoManager* videoManager READ videoManager CONSTANT) Q_PROPERTY(MAVLinkLogManager* mavlinkLogManager READ mavlinkLogManager CONSTANT) + Q_PROPERTY(QGCCorePlugin* corePlugin READ corePlugin 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 @@ -86,19 +87,6 @@ public: Q_PROPERTY(bool virtualTabletJoystick READ virtualTabletJoystick WRITE setVirtualTabletJoystick NOTIFY virtualTabletJoystickChanged) Q_PROPERTY(qreal baseFontPointSize READ baseFontPointSize WRITE setBaseFontPointSize NOTIFY baseFontPointSizeChanged) - //------------------------------------------------------------------------- - //-- Options that can be set by plugins - Q_PROPERTY(bool colapseSettings READ colapseSettings CONSTANT) - Q_PROPERTY(bool mainViewIsMap READ mainViewIsMap CONSTANT) - Q_PROPERTY(bool enableVirtualJoystick READ enableVirtualJoystick CONSTANT) - Q_PROPERTY(bool enableAutoConnectOptions READ enableAutoConnectOptions CONSTANT) - Q_PROPERTY(bool enableVideoSourceOptions READ enableVideoSourceOptions CONSTANT) - - Q_PROPERTY(bool hasCustomSettings READ hasCustomSettings CONSTANT) - Q_PROPERTY(QString customSettingsURL READ customSettingsURL CONSTANT) - Q_PROPERTY(QString customSettingsTitle READ customSettingsTitle CONSTANT) - Q_PROPERTY(QString customSettingsLogoUrl READ customSettingsLogoUrl CONSTANT) - //------------------------------------------------------------------------- // MavLink Protocol Q_PROPERTY(bool isVersionCheckEnabled READ isVersionCheckEnabled WRITE setIsVersionCheckEnabled NOTIFY isVersionCheckEnabledChanged) @@ -183,6 +171,7 @@ public: MissionCommandTree* missionCommandTree () { return _missionCommandTree; } VideoManager* videoManager () { return _videoManager; } MAVLinkLogManager* mavlinkLogManager () { return _mavlinkLogManager; } + QGCCorePlugin* corePlugin () { return _corePlugin; } qreal zOrderTopMost () { return 1000; } qreal zOrderWidgets () { return 100; } @@ -198,16 +187,6 @@ public: bool isVersionCheckEnabled () { return _toolbox->mavlinkProtocol()->versionCheckEnabled(); } int mavlinkSystemID () { return _toolbox->mavlinkProtocol()->getSystemId(); } - bool colapseSettings (); - bool mainViewIsMap (); - bool enableVirtualJoystick (); - bool enableAutoConnectOptions(); - bool enableVideoSourceOptions(); - bool hasCustomSettings (); - QString customSettingsTitle (); - QString customSettingsURL (); - QString customSettingsLogoUrl (); - QGeoCoordinate lastKnownHomePosition() { return qgcApp()->lastKnownHomePosition(); } static Fact* offlineEditingFirmwareType (void); @@ -264,6 +243,7 @@ private: MissionCommandTree* _missionCommandTree; VideoManager* _videoManager; MAVLinkLogManager* _mavlinkLogManager; + QGCCorePlugin* _corePlugin; bool _virtualTabletJoystick; qreal _baseFontPointSize; diff --git a/src/Vehicle/MultiVehicleManager.cc b/src/Vehicle/MultiVehicleManager.cc index 9bac096f60e35eb40f3e16bec550fa3211a9ff81..5baa4fab65451ac1d53554284e4c3fac91b5218e 100644 --- a/src/Vehicle/MultiVehicleManager.cc +++ b/src/Vehicle/MultiVehicleManager.cc @@ -16,7 +16,7 @@ #include "QGroundControlQmlGlobal.h" #include "ParameterManager.h" -#ifdef __mobile__ +#if defined (__ios__) || defined(__android__) #include "MobileScreenMgr.h" #endif @@ -116,7 +116,7 @@ void MultiVehicleManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicle // Mark link as active link->setActive(true); -#ifdef __mobile__ +#if defined (__ios__) || defined(__android__) if(_vehicles.count() == 1) { //-- Once a vehicle is connected, keep screen from going off qCDebug(MultiVehicleManagerLog) << "QAndroidJniObject::keepScreenOn"; @@ -157,7 +157,7 @@ void MultiVehicleManager::_deleteVehiclePhase1(Vehicle* vehicle) emit parameterReadyVehicleAvailableChanged(false); emit vehicleRemoved(vehicle); -#ifdef __mobile__ +#if defined (__ios__) || defined(__android__) if(_vehicles.count() == 0) { //-- Once no vehicles are connected, we no longer need to keep screen from going off qCDebug(MultiVehicleManagerLog) << "QAndroidJniObject::restoreScreenOn"; diff --git a/src/VehicleSetup/SetupView.qml b/src/VehicleSetup/SetupView.qml index 89389ee4054a2e9eab37472c9d2644a01b5dd22e..54e0e0ffca0e88399ec81fda03280c05453be6d7 100644 --- a/src/VehicleSetup/SetupView.qml +++ b/src/VehicleSetup/SetupView.qml @@ -256,31 +256,17 @@ Rectangle { visible: !ScreenTools.isShortScreen } - SubMenuButton { - imageResource: "/res/gear-white.svg" - setupIndicator: false - exclusiveGroup: setupButtonGroup - text: "General" - visible: QGroundControl.colapseSettings - onClicked: panelLoader.setSource("GeneralSettings.qml") - } - - SubMenuButton { - imageResource: QGroundControl.customSettingsLogoUrl - setupIndicator: false - exclusiveGroup: setupButtonGroup - text: QGroundControl.customSettingsTitle - visible: QGroundControl.colapseSettings && QGroundControl.hasCustomSettings - onClicked: panelLoader.setSource(QGroundControl.customSettingsURL) - } - - SubMenuButton { - imageResource: "/res/waves.svg" - setupIndicator: false - exclusiveGroup: setupButtonGroup - text: "MAVLink" - visible: QGroundControl.colapseSettings - onClicked: panelLoader.setSource("MavlinkSettings.qml") + Repeater { + model: QGroundControl.corePlugin.settings + visible: QGroundControl.corePlugin.options.combineSettingsAndSetup + SubMenuButton { + imageResource: modelData.icon + setupIndicator: false + exclusiveGroup: setupButtonGroup + text: modelData.title + visible: QGroundControl.corePlugin.options.combineSettingsAndSetup + onClicked: panelLoader.setSource(modelData.url) + } } SubMenuButton { diff --git a/src/api/QGCCorePlugin.cc b/src/api/QGCCorePlugin.cc new file mode 100644 index 0000000000000000000000000000000000000000..605b7ef1e61dd09dd8ea8e5a04acc0b1d71ace9a --- /dev/null +++ b/src/api/QGCCorePlugin.cc @@ -0,0 +1,151 @@ +/**************************************************************************** + * + * (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 "QGCCorePlugin.h" +#include "QGCOptions.h" +#include "QGCSettings.h" + +#include +#include + +/// @file +/// @brief Core Plugin Interface for QGroundControl - Default Implementation +/// @author Gus Grubba + +class QGCCorePlugin_p +{ +public: + QGCCorePlugin_p() + : pGeneral(NULL) + , pCommLinks(NULL) + , pOfflineMaps(NULL) + , pMAVLink(NULL) + , pConsole(NULL) +#if defined(QT_DEBUG) + , pMockLink(NULL) + , pDebug(NULL) +#endif + , defaultOptions(NULL) + { + } + ~QGCCorePlugin_p() + { + if(pGeneral) + delete pGeneral; + if(pCommLinks) + delete pCommLinks; + if(pOfflineMaps) + delete pOfflineMaps; + if(pMAVLink) + delete pMAVLink; + if(pConsole) + delete pConsole; +#if defined(QT_DEBUG) + if(pMockLink) + delete pMockLink; + if(pDebug) + delete pDebug; +#endif + if(defaultOptions) + delete defaultOptions; + } + QGCSettings* pGeneral; + QGCSettings* pCommLinks; + QGCSettings* pOfflineMaps; + QGCSettings* pMAVLink; + QGCSettings* pConsole; +#if defined(QT_DEBUG) + QGCSettings* pMockLink; + QGCSettings* pDebug; +#endif + QVariantList settingsList; + QGCOptions* defaultOptions; +}; + +QGCCorePlugin::~QGCCorePlugin() +{ + if(_p) { + delete _p; + } +} + +QGCCorePlugin::QGCCorePlugin(QGCApplication *app) + : QGCTool(app) +{ + _p = new QGCCorePlugin_p; +} + +void QGCCorePlugin::setToolbox(QGCToolbox *toolbox) +{ + QGCTool::setToolbox(toolbox); + QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); + qmlRegisterUncreatableType("QGroundControl.QGCCorePlugin", 1, 0, "QGCCorePlugin", "Reference only"); + qmlRegisterUncreatableType("QGroundControl.QGCOptions", 1, 0, "QGCOptions", "Reference only"); +} + +QVariantList &QGCCorePlugin::settings() +{ + //-- If this hasn't been overridden, create default set of settings + if(!_p->pGeneral) { + QGCOptions* pOptions = options(); + //-- Default Settings + if(pOptions->enabledSettings() & QGCOptions::SETTINGS_GENERAL) { + _p->pGeneral = new QGCSettings(tr("General"), + QUrl::fromUserInput("qrc:/qml/GeneralSettings.qml"), + QUrl::fromUserInput("qrc:/res/gear-white.svg")); + _p->settingsList.append(QVariant::fromValue((QGCSettings*)_p->pGeneral)); + } + if(pOptions->enabledSettings() & QGCOptions::SETTINGS_COMM_LINKS) { + _p->pCommLinks = new QGCSettings(tr("Comm Links"), + QUrl::fromUserInput("qrc:/qml/LinkSettings.qml"), + QUrl::fromUserInput("qrc:/res/waves.svg")); + _p->settingsList.append(QVariant::fromValue((QGCSettings*)_p->pCommLinks)); + } + if(pOptions->enabledSettings() & QGCOptions::SETTINGS_OFFLINE_MAPS) { + _p->pOfflineMaps = new QGCSettings(tr("Offline Maps"), + QUrl::fromUserInput("qrc:/qml/OfflineMap.qml"), + QUrl::fromUserInput("qrc:/res/waves.svg")); + _p->settingsList.append(QVariant::fromValue((QGCSettings*)_p->pOfflineMaps)); + } + if(pOptions->enabledSettings() & QGCOptions::SETTINGS_MAVLINK) { + _p->pMAVLink = new QGCSettings(tr("MAVLink"), + QUrl::fromUserInput("qrc:/qml/MavlinkSettings.qml"), + QUrl::fromUserInput("qrc:/res/waves.svg")); + _p->settingsList.append(QVariant::fromValue((QGCSettings*)_p->pMAVLink)); + } + if(pOptions->enabledSettings() & QGCOptions::SETTINGS_CONSOLE) { + _p->pConsole = new QGCSettings(tr("Console"), + QUrl::fromUserInput("qrc:/QGroundControl/Controls/AppMessages.qml")); + _p->settingsList.append(QVariant::fromValue((QGCSettings*)_p->pConsole)); + } + #if defined(QT_DEBUG) + //-- These are always present on Debug builds + if(pOptions->enabledSettings() & QGCOptions::SETTINGS_MOCKLINK) { + _p->pMockLink = new QGCSettings(tr("Mock Link"), + QUrl::fromUserInput("qrc:/qml/MockLink.qml")); + _p->settingsList.append(QVariant::fromValue((QGCSettings*)_p->pMockLink)); + } + if(pOptions->enabledSettings() & QGCOptions::SETTINGS_DEBUG) { + _p->pDebug = new QGCSettings(tr("Debug"), + QUrl::fromUserInput("qrc:/qml/DebugWindow.qml")); + _p->settingsList.append(QVariant::fromValue((QGCSettings*)_p->pDebug)); + } + #endif + } + return _p->settingsList; +} + +QGCOptions* QGCCorePlugin::options() +{ + if(!_p->defaultOptions) { + _p->defaultOptions = new QGCOptions(); + } + return _p->defaultOptions; +} + diff --git a/src/api/QGCCorePlugin.h b/src/api/QGCCorePlugin.h new file mode 100644 index 0000000000000000000000000000000000000000..9d1a1afa03ff965cf157fad294b5638bb57ef943 --- /dev/null +++ b/src/api/QGCCorePlugin.h @@ -0,0 +1,54 @@ +/**************************************************************************** + * + * (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. + * + ****************************************************************************/ + +#pragma once + +#include "QGCToolbox.h" + +#include +#include + +/// @file +/// @brief Core Plugin Interface for QGroundControl +/// @author Gus Grubba + +// Work In Progress + +class QGCApplication; +class QGCOptions; +class QGCSettings; +class QGCCorePlugin_p; + +class QGCCorePlugin : public QGCTool +{ + Q_OBJECT +public: + QGCCorePlugin(QGCApplication* app); + ~QGCCorePlugin(); + + Q_PROPERTY(QVariantList settings READ settings CONSTANT) + Q_PROPERTY(QGCOptions* options READ options CONSTANT) + + //! The list of settings under the Settings Menu + /*! + @return A list of QGCSettings + */ + virtual QVariantList& settings (); + + //! Global options + /*! + @return An instance of QGCOptions + */ + virtual QGCOptions* options (); + + // Override from QGCTool + void setToolbox (QGCToolbox *toolbox); +private: + QGCCorePlugin_p* _p; +}; diff --git a/api/IQGCApplication.h b/src/api/QGCOptions.cc similarity index 58% rename from api/IQGCApplication.h rename to src/api/QGCOptions.cc index 79edce901b314bddbe5f4faed1032182eb9b8688..3b598fe3dfc19aa3e25ca86407540249674a8913 100644 --- a/api/IQGCApplication.h +++ b/src/api/QGCOptions.cc @@ -7,18 +7,13 @@ * ****************************************************************************/ +#include "QGCOptions.h" -/** - * @brief QGC Main Application Interface (used for Dynamic Loaded plugins) - * @author Gus Grubba - */ +/// @file +/// @brief Core Plugin Interface for QGroundControl - Application Options +/// @author Gus Grubba -#pragma once - -class IQGCApplication +QGCOptions::QGCOptions(QObject* parent) + : QObject(parent) { -public: - IQGCApplication() {} - virtual ~IQGCApplication() {} - //-- Not yet implemented -}; +} diff --git a/src/api/QGCOptions.h b/src/api/QGCOptions.h new file mode 100644 index 0000000000000000000000000000000000000000..b329472ed0d3a2565c87ea8e778d864662cedf00 --- /dev/null +++ b/src/api/QGCOptions.h @@ -0,0 +1,92 @@ +/**************************************************************************** + * + * (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. + * + ****************************************************************************/ + +#pragma once + +#include +#include + +/// @file +/// @brief Core Plugin Interface for QGroundControl - Application Options +/// @author Gus Grubba + +class QGCOptions : public QObject +{ + Q_OBJECT +public: + QGCOptions(QObject* parent = NULL); + + enum BaseSettings { + SETTINGS_GENERAL = 1 << 1, + SETTINGS_COMM_LINKS = 1 << 2, + SETTINGS_OFFLINE_MAPS = 1 << 3, + SETTINGS_MAVLINK = 1 << 4, + SETTINGS_CONSOLE = 1 << 5, + SETTINGS_MOCKLINK = 1 << 6, + SETTINGS_DEBUG = 1 << 7, + }; + + Q_ENUMS(BaseSettings) + + Q_PROPERTY(bool combineSettingsAndSetup READ combineSettingsAndSetup CONSTANT) + Q_PROPERTY(bool mainViewIsMap READ mainViewIsMap CONSTANT) + Q_PROPERTY(bool enableVirtualJoystick READ enableVirtualJoystick CONSTANT) + Q_PROPERTY(bool enableAutoConnectOptions READ enableAutoConnectOptions CONSTANT) + Q_PROPERTY(bool enableVideoSourceOptions READ enableVideoSourceOptions CONSTANT) + Q_PROPERTY(int enabledSettings READ enabledSettings CONSTANT) + Q_PROPERTY(bool definesVideo READ definesVideo CONSTANT) + Q_PROPERTY(uint16_t videoUDPPort READ videoUDPPort CONSTANT) + Q_PROPERTY(QString videoRSTPUrl READ videoRSTPUrl CONSTANT) + + //! Should QGC hide its settings menu and colapse it into one single menu (Settings and Vehicle Setup)? + /*! + @return true if QGC should consolidate both menus into one. + */ + virtual bool combineSettingsAndSetup () { return false; } + //! Should QGC use Maps as its default main view? + /*! + @return true if QGC should use Maps by default or false to show Video by default. + */ + virtual bool mainViewIsMap () { return true; } + //! Should QGC use virtual Joysticks? + /*! + @return false to disable Virtual Joysticks. + */ + virtual bool enableVirtualJoystick () { return true; } + //! Should QGC allow setting auto-connect options? + /*! + @return false to disable auto-connect options. + */ + virtual bool enableAutoConnectOptions () { return true; } + //! Should QGC allow setting video source options? + /*! + @return false to disable video source options. + */ + virtual bool enableVideoSourceOptions () { return true; } + //! Which settings are enabled? + /*! + @return BaseSettings bitmap of enabled settings + */ + virtual int enabledSettings () { return SETTINGS_GENERAL | SETTINGS_COMM_LINKS | SETTINGS_MAVLINK | SETTINGS_CONSOLE | SETTINGS_MOCKLINK | SETTINGS_DEBUG; } + //! Does your plugin defines its on video source? + /*! + @return true to define your own video source. + */ + virtual bool definesVideo () { return false; } + //! UDP port to use for (RTP) video source. + /*! + @return UDP Port to use. Return 0 to disable UDP RTP. + */ + virtual uint16_t videoUDPPort () { return 0; } + //! RTSP URL to use for video source. + /*! + @return RTSP url to use. Return "" to disable RTSP. + */ + virtual QString videoRSTPUrl () { return QString(); } +}; diff --git a/src/api/QGCSettings.cc b/src/api/QGCSettings.cc new file mode 100644 index 0000000000000000000000000000000000000000..6fbe9dbe336b6bda84e2913a817ff6356382ba0c --- /dev/null +++ b/src/api/QGCSettings.cc @@ -0,0 +1,21 @@ +/**************************************************************************** + * + * (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 "QGCSettings.h" + +/// @file +/// @brief Core Plugin Interface for QGroundControl. Settings element. +/// @author Gus Grubba + +QGCSettings::QGCSettings(QString title, QUrl url, QUrl icon) + : _title(title) + , _url(url) + , _icon(icon) +{ +} diff --git a/src/api/QGCSettings.h b/src/api/QGCSettings.h new file mode 100644 index 0000000000000000000000000000000000000000..682364cb20b796167f8a787e341001c26ebd6991 --- /dev/null +++ b/src/api/QGCSettings.h @@ -0,0 +1,37 @@ +/**************************************************************************** + * + * (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. + * + ****************************************************************************/ + +#pragma once + +#include +#include + +/// @file +/// @brief Core Plugin Interface for QGroundControl. Settings element. +/// @author Gus Grubba + +class QGCSettings : public QObject +{ + Q_OBJECT +public: + QGCSettings(QString title, QUrl url, QUrl icon = QUrl()); + + Q_PROPERTY(QString title READ title CONSTANT) + Q_PROPERTY(QUrl url READ url CONSTANT) + Q_PROPERTY(QUrl icon READ icon CONSTANT) + + virtual QString title () { return _title; } + virtual QUrl url () { return _url; } + virtual QUrl icon () { return _icon; } + +protected: + QString _title; + QUrl _url; + QUrl _icon; +}; diff --git a/src/ui/AppSettings.qml b/src/ui/AppSettings.qml index e807c815d798a871c712110acecece8b90408c9c..337aac725d54101f0820af470b351b632c004f32 100644 --- a/src/ui/AppSettings.qml +++ b/src/ui/AppSettings.qml @@ -30,13 +30,13 @@ Rectangle { readonly property real _buttonHeight: ScreenTools.isTinyScreen ? ScreenTools.defaultFontPixelHeight * 3 : ScreenTools.defaultFontPixelHeight * 2 readonly property real _buttonWidth: ScreenTools.defaultFontPixelWidth * 10 + property bool _first: true + QGCPalette { id: qgcPal } Component.onCompleted: { //-- Default to General Settings __rightPanel.source = "GeneralSettings.qml" - _generalButton.checked = true - panelActionGroup.current = _generalButton } QGCFlickable { @@ -81,90 +81,24 @@ Rectangle { visible: !ScreenTools.isShortScreen } - QGCButton { - id: _generalButton - height: _buttonHeight - text: qsTr("General") - exclusiveGroup: panelActionGroup - onClicked: { - if(__rightPanel.source != "GeneralSettings.qml") { - __rightPanel.source = "GeneralSettings.qml" - } - checked = true - } - } - - QGCButton { - height: _buttonHeight - text: qsTr("Comm Links") - exclusiveGroup: panelActionGroup - onClicked: { - if(__rightPanel.source != "LinkSettings.qml") { - __rightPanel.source = "LinkSettings.qml" - } - checked = true - } - } - - QGCButton { - height: _buttonHeight - text: qsTr("Offline Maps") - exclusiveGroup: panelActionGroup - onClicked: { - if(__rightPanel.source != "OfflineMap.qml") { - __rightPanel.source = "OfflineMap.qml" - } - checked = true - } - } - - QGCButton { - height: _buttonHeight - text: qsTr("MAVLink") - exclusiveGroup: panelActionGroup - onClicked: { - if(__rightPanel.source != "MavlinkSettings.qml") { - __rightPanel.source = "MavlinkSettings.qml" - } - checked = true - } - } - - QGCButton { - height: _buttonHeight - text: qsTr("Console") - exclusiveGroup: panelActionGroup - onClicked: { - if(__rightPanel.source != "QGroundControl/Controls/AppMessages.qml") { - __rightPanel.source = "QGroundControl/Controls/AppMessages.qml" - } - checked = true - } - } - - QGCButton { - height: _buttonHeight - text: qsTr("Mock Link") - visible: ScreenTools.isDebug - exclusiveGroup: panelActionGroup - onClicked: { - if(__rightPanel.source != "MockLink.qml") { - __rightPanel.source = "MockLink.qml" + Repeater { + model: QGroundControl.corePlugin.settings + QGCButton { + height: _buttonHeight + text: modelData.title + exclusiveGroup: panelActionGroup + onClicked: { + if(__rightPanel.source !== modelData.url) { + __rightPanel.source = modelData.url + } + checked = true } - checked = true - } - } - - QGCButton { - height: _buttonHeight - text: qsTr("Debug") - visible: ScreenTools.isDebug - exclusiveGroup: panelActionGroup - onClicked: { - if(__rightPanel.source != "DebugWindow.qml") { - __rightPanel.source = "DebugWindow.qml" + Component.onCompleted: { + if(_first) { + _first = false + checked = true + } } - checked = true } } } diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index ff6fbd4436809988450dd512d262831efa5bb945..1d81a84a1834d1ad6f9b8bc87d2a76e346c1af66 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -364,7 +364,7 @@ QGCView { text: qsTr("Virtual Joystick") checked: QGroundControl.virtualTabletJoystick onClicked: QGroundControl.virtualTabletJoystick = checked - visible: QGroundControl.enableVirtualJoystick + visible: QGroundControl.corePlugin.options.enableVirtualJoystick } //----------------------------------------------------------------- //-- Map Providers @@ -434,7 +434,7 @@ QGCView { height: autoConnectLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: QGroundControl.enableAutoConnectOptions + visible: QGroundControl.corePlugin.options.enableAutoConnectOptions QGCLabel { id: autoConnectLabel text: qsTr("Autoconnect to the following devices:") @@ -445,7 +445,7 @@ QGCView { height: autoConnectCol.height + (ScreenTools.defaultFontPixelHeight * 2) width: qgcView.width * 0.8 color: qgcPal.windowShade - visible: QGroundControl.enableAutoConnectOptions + visible: QGroundControl.corePlugin.options.enableAutoConnectOptions anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter Column { @@ -497,7 +497,7 @@ QGCView { Item { width: qgcView.width * 0.8 height: videoLabel.height - visible: QGroundControl.enableVideoSourceOptions + visible: QGroundControl.corePlugin.options.enableVideoSourceOptions anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { @@ -510,7 +510,7 @@ QGCView { height: videoCol.height + (ScreenTools.defaultFontPixelHeight * 2) width: qgcView.width * 0.8 color: qgcPal.windowShade - visible: QGroundControl.enableVideoSourceOptions + visible: QGroundControl.corePlugin.options.enableVideoSourceOptions anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter Column { diff --git a/src/ui/toolbar/MainToolBar.qml b/src/ui/toolbar/MainToolBar.qml index 41c6cdb40c417f32b926f269ce49b3f8f86033de..2d5670039a8e0c02cfe4f97b8a3aa03e061cfb7f 100644 --- a/src/ui/toolbar/MainToolBar.qml +++ b/src/ui/toolbar/MainToolBar.qml @@ -338,7 +338,7 @@ Rectangle { source: "/res/QGCLogoWhite" logo: true onClicked: toolBar.showSettingsView() - visible: !QGroundControl.colapseSettings + visible: !QGroundControl.corePlugin.options.combineSettingsAndSetup } QGCToolBarButton {