From c18132c8f9f9c72dbb074630923098db727a0949 Mon Sep 17 00:00:00 2001
From: Gus Grubba <gus@auterion.com>
Date: Thu, 2 Jan 2020 15:19:20 -0500
Subject: [PATCH] Disable MAVLink inspector for platforms that do not support
 it. Move analyze page list model to the core plugin.

---
 QGCCommon.pri                             |  4 +++
 qgroundcontrol.pro                        | 14 ++++++--
 src/AnalyzeView/AnalyzeView.qml           | 55 ++++---------------------------
 src/QGCApplication.cc                     |  7 ++--
 src/QmlControls/QGroundControlQmlGlobal.h |  7 ++++
 src/api/QGCCorePlugin.cc                  | 16 +++++++++
 src/api/QGCCorePlugin.h                   |  6 ++++
 7 files changed, 55 insertions(+), 54 deletions(-)

diff --git a/QGCCommon.pri b/QGCCommon.pri
index 92b6af4..8244f9f 100644
--- a/QGCCommon.pri
+++ b/QGCCommon.pri
@@ -25,6 +25,7 @@ linux {
         DEFINES += QGC_ENABLE_NFC RW_SUPPORT
         DEFINES += QGC_GST_TAISYNC_ENABLED
         DEFINES += QGC_GST_MICROHARD_ENABLED 
+        DEFINES += QGC_ENABLE_MAVLINK_INSPECTOR
         linux-clang {
             message("Linux clang")
             QMAKE_CXXFLAGS += -Qunused-arguments -fcolor-diagnostics
@@ -52,6 +53,7 @@ linux {
             message("Android Arm 32 bit build")
         } else:equals(ANDROID_TARGET_ARCH, arm64-v8a)  {
             DEFINES += __androidArm64__
+            DEFINES += QGC_ENABLE_MAVLINK_INSPECTOR
             message("Android Arm 64 bit build")
         } else:equals(ANDROID_TARGET_ARCH, x86)  {
             CONFIG += Androidx86Build
@@ -71,6 +73,7 @@ linux {
         DEFINES += __STDC_LIMIT_MACROS
         DEFINES += QGC_GST_TAISYNC_ENABLED
         DEFINES += QGC_GST_MICROHARD_ENABLED 
+        DEFINES += QGC_ENABLE_MAVLINK_INSPECTOR
     } else {
         error("Unsupported Windows toolchain, only Visual Studio 2017 64 bit is supported")
     }
@@ -82,6 +85,7 @@ linux {
         CONFIG  -= x86
         DEFINES += QGC_GST_TAISYNC_ENABLED
         DEFINES += QGC_GST_MICROHARD_ENABLED 
+        DEFINES += QGC_ENABLE_MAVLINK_INSPECTOR
         equals(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 5) {
                 QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
         } else {
diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro
index 3b0d8c3..0e0761b 100644
--- a/qgroundcontrol.pro
+++ b/qgroundcontrol.pro
@@ -263,7 +263,6 @@ QT += \
     svg \
     widgets \
     xml \
-    charts \
     texttospeech
 
 # Multimedia only used if QVC is enabled
@@ -573,7 +572,6 @@ HEADERS += \
     src/AnalyzeView/LogDownloadController.h \
     src/AnalyzeView/PX4LogParser.h \
     src/AnalyzeView/ULogParser.h \
-    src/AnalyzeView/MAVLinkInspectorController.h \
     src/AnalyzeView/MavlinkConsoleController.h \
     src/Audio/AudioOutput.h \
     src/Camera/QGCCameraControl.h \
@@ -815,7 +813,6 @@ SOURCES += \
     src/AnalyzeView/LogDownloadController.cc \
     src/AnalyzeView/PX4LogParser.cc \
     src/AnalyzeView/ULogParser.cc \
-    src/AnalyzeView/MAVLinkInspectorController.cc \
     src/AnalyzeView/MavlinkConsoleController.cc \
     src/Audio/AudioOutput.cc \
     src/Camera/QGCCameraControl.cc \
@@ -1231,6 +1228,17 @@ SOURCES += \
     src/FactSystem/SettingsFact.cc \
 
 #-------------------------------------------------------------------------------------
+# MAVLink Inspector
+contains (DEFINES, QGC_ENABLE_MAVLINK_INSPECTOR) {
+    HEADERS += \
+        src/AnalyzeView/MAVLinkInspectorController.h
+    SOURCES += \
+        src/AnalyzeView/MAVLinkInspectorController.cc
+    QT += \
+        charts
+}
+
+#-------------------------------------------------------------------------------------
 # Taisync
 contains (DEFINES, QGC_GST_TAISYNC_ENABLED) {
     INCLUDEPATH += \
diff --git a/src/AnalyzeView/AnalyzeView.qml b/src/AnalyzeView/AnalyzeView.qml
index 989d875..5f1d0f7 100644
--- a/src/AnalyzeView/AnalyzeView.qml
+++ b/src/AnalyzeView/AnalyzeView.qml
@@ -91,64 +91,21 @@ Rectangle {
                 visible:                !ScreenTools.isShortScreen
             }
 
-            ListModel {
-                id: desktopModel
-                ListElement {
-                    buttonImage:        "/qmlimages/LogDownloadIcon"
-                    buttonText:         qsTr("Log Download")
-                    pageSource:         "LogDownloadPage.qml"
-                }
-                ListElement {
-                    buttonImage:        "/qmlimages/GeoTagIcon"
-                    buttonText:         qsTr("GeoTag Images")
-                    pageSource:         "GeoTagPage.qml"
-                }
-                ListElement {
-                    buttonImage:        "/qmlimages/MavlinkConsoleIcon"
-                    buttonText:         qsTr("MAVLink Console")
-                    pageSource:         "MavlinkConsolePage.qml"
-                }
-                ListElement {
-                    buttonImage:        "/qmlimages/MAVLinkInspector"
-                    buttonText:         qsTr("MAVLink Inspector")
-                    pageSource:         "MAVLinkInspectorPage.qml"
-                }
-            }
-
-            ListModel {
-                id: mobileModel
-                ListElement {
-                    buttonImage:        "/qmlimages/LogDownloadIcon"
-                    buttonText:         qsTr("Log Download")
-                    pageSource:         "LogDownloadPage.qml"
-                }
-                ListElement {
-                    buttonImage:        "/qmlimages/MavlinkConsoleIcon"
-                    buttonText:         qsTr("MAVLink Console")
-                    pageSource:         "MavlinkConsolePage.qml"
-                }
-                ListElement {
-                    buttonImage:        "/qmlimages/MAVLinkInspector"
-                    buttonText:         qsTr("MAVLink Inspector")
-                    pageSource:         "MAVLinkInspectorPage.qml"
-                }
-            }
-
             Repeater {
                 id:                     buttonRepeater
-                model:                  ScreenTools.isMobile ? mobileModel : desktopModel
+                model:                  QGroundControl.corePlugin ? QGroundControl.corePlugin.analyzePages : []
                 Component.onCompleted:  itemAt(0).checked = true
                 SubMenuButton {
                     id:                 subMenu
-                    imageResource:      buttonImage
+                    imageResource:      modelData.icon
                     setupIndicator:     false
                     exclusiveGroup:     setupButtonGroup
-                    text:               buttonText
+                    text:               modelData.title
                     property var window:    analyzeWidgetWindow
                     property var loader:    analyzeWidgetLoader
                     onClicked: {
                         _curIndex = index
-                        panelLoader.source = pageSource
+                        panelLoader.source = modelData.url
                         checked = true
                     }
                     Window {
@@ -156,7 +113,7 @@ Rectangle {
                         width:          ScreenTools.defaultFontPixelWidth  * 100
                         height:         ScreenTools.defaultFontPixelHeight * 40
                         visible:        false
-                        title:          buttonText
+                        title:          modelData.title
                         Rectangle {
                             color:      qgcPal.window
                             anchors.fill:  parent
@@ -169,7 +126,7 @@ Rectangle {
                             analyzeWidgetWindow.visible = false
                             analyzeWidgetLoader.source = ""
                             _curIndex = index
-                            panelLoader.source = pageSource
+                            panelLoader.source = modelData.url
                             subMenu.visible = true
                             subMenu.checked = true
                         }
diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc
index cd7e05d..36d72ff 100644
--- a/src/QGCApplication.cc
+++ b/src/QGCApplication.cc
@@ -497,7 +497,9 @@ void QGCApplication::_initCommon()
     qmlRegisterUncreatableType<CameraCalc>          (kQGroundControl,                       1, 0, "CameraCalc",                 kRefOnly);
     qmlRegisterUncreatableType<LogReplayLink>       (kQGroundControl,                       1, 0, "LogReplayLink",              kRefOnly);
     qmlRegisterType<LogReplayLinkController>        (kQGroundControl,                       1, 0, "LogReplayLinkController");
-    qmlRegisterUncreatableType<MAVLinkChartController>        (kQGroundControl,                       1, 0, "MAVLinkChart",               kRefOnly);
+#if defined(QGC_ENABLE_MAVLINK_INSPECTOR)
+    qmlRegisterUncreatableType<MAVLinkChartController> (kQGroundControl,                    1, 0, "MAVLinkChart",               kRefOnly);
+#endif
 #if defined(QGC_ENABLE_PAIRING)
     qmlRegisterUncreatableType<PairingManager>      (kQGroundControl,                       1, 0, "PairingManager",             kRefOnly);
 #endif
@@ -534,8 +536,9 @@ void QGCApplication::_initCommon()
 #endif
     qmlRegisterType<GeoTagController>               (kQGCControllers,                       1, 0, "GeoTagController");
     qmlRegisterType<MavlinkConsoleController>       (kQGCControllers,                       1, 0, "MavlinkConsoleController");
+#if defined(QGC_ENABLE_MAVLINK_INSPECTOR)
     qmlRegisterType<MAVLinkInspectorController>     (kQGCControllers,                       1, 0, "MAVLinkInspectorController");
-
+#endif
     // Register Qml Singletons
     qmlRegisterSingletonType<QGroundControlQmlGlobal>   ("QGroundControl",                          1, 0, "QGroundControl",         qgroundcontrolQmlGlobalSingletonFactory);
     qmlRegisterSingletonType<ScreenToolsController>     ("QGroundControl.ScreenToolsController",    1, 0, "ScreenToolsController",  screenToolsControllerSingletonFactory);
diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h
index 6ec3dd9..22d0919 100644
--- a/src/QmlControls/QGroundControlQmlGlobal.h
+++ b/src/QmlControls/QGroundControlQmlGlobal.h
@@ -102,6 +102,7 @@ public:
     Q_PROPERTY(bool     isVersionCheckEnabled   READ isVersionCheckEnabled      WRITE setIsVersionCheckEnabled      NOTIFY isVersionCheckEnabledChanged)
     Q_PROPERTY(int      mavlinkSystemID         READ mavlinkSystemID            WRITE setMavlinkSystemID            NOTIFY mavlinkSystemIDChanged)
     Q_PROPERTY(bool     hasAPMSupport           READ hasAPMSupport              CONSTANT)
+    Q_PROPERTY(bool     hasMAVLinkInspector     READ hasMAVLinkInspector        CONSTANT)
 
     Q_PROPERTY(QGeoCoordinate flightMapPosition     READ flightMapPosition      WRITE setFlightMapPosition          NOTIFY flightMapPositionChanged)
     Q_PROPERTY(double         flightMapZoom         READ flightMapZoom          WRITE setFlightMapZoom              NOTIFY flightMapZoomChanged)
@@ -221,6 +222,12 @@ public:
     bool    hasAPMSupport           () { return true; }
 #endif
 
+#if defined(QGC_ENABLE_MAVLINK_INSPECTOR)
+    bool    hasMAVLinkInspector     () { return true; }
+#else
+    bool    hasMAVLinkInspector     () { return false; }
+#endif
+
     int     supportedFirmwareCount  ();
     int     supportedVehicleCount   ();
     bool    px4ProFirmwareSupported ();
diff --git a/src/api/QGCCorePlugin.cc b/src/api/QGCCorePlugin.cc
index 9da47e2..c0def73 100644
--- a/src/api/QGCCorePlugin.cc
+++ b/src/api/QGCCorePlugin.cc
@@ -99,6 +99,7 @@ public:
 
     QGCOptions*         defaultOptions          = nullptr;
     QVariantList        settingsList;
+    QVariantList        analyzeList;
     QVariantList        instrumentPageWidgetList;
 
     QmlObjectListModel _emptyCustomMapItems;
@@ -291,6 +292,21 @@ QVariantList& QGCCorePlugin::instrumentPages()
     return _p->instrumentPageWidgetList;
 }
 
+QVariantList& QGCCorePlugin::analyzePages()
+{
+    if (!_p->analyzeList.count()) {
+        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("Log Download"),     QUrl::fromUserInput("qrc:/qml/LogDownloadPage.qml"),      QUrl::fromUserInput("qrc:/qmlimages/LogDownloadIcon"))));
+#if !defined(__mobile__)
+        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("GeoTag Images"),    QUrl::fromUserInput("qrc:/qml/GeoTagPage.qml"),           QUrl::fromUserInput("qrc:/qmlimages/GeoTagIcon"))));
+#endif
+        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("MAVLink Console"),  QUrl::fromUserInput("qrc:/qml/MavlinkConsolePage.qml"),   QUrl::fromUserInput("qrc:/qmlimages/MavlinkConsoleIcon"))));
+#if defined(QGC_ENABLE_MAVLINK_INSPECTOR)
+        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("MAVLink Inspector"),QUrl::fromUserInput("qrc:/qml/MAVLinkInspectorPage.qml"), QUrl::fromUserInput("qrc:/qmlimages/MAVLinkInspector"))));
+#endif
+    }
+    return _p->analyzeList;
+}
+
 int QGCCorePlugin::defaultSettings()
 {
     return 0;
diff --git a/src/api/QGCCorePlugin.h b/src/api/QGCCorePlugin.h
index 3187789..1ae9fc4 100644
--- a/src/api/QGCCorePlugin.h
+++ b/src/api/QGCCorePlugin.h
@@ -44,6 +44,7 @@ public:
     ~QGCCorePlugin();
 
     Q_PROPERTY(QVariantList         settingsPages           READ settingsPages                                  NOTIFY settingsPagesChanged)
+    Q_PROPERTY(QVariantList         analyzePages            READ analyzePages                                   NOTIFY analyzePagesChanged)
     Q_PROPERTY(QVariantList         instrumentPages         READ instrumentPages                                NOTIFY instrumentPagesChanged)
     Q_PROPERTY(int                  defaultSettings         READ defaultSettings                                CONSTANT)
     Q_PROPERTY(QGCOptions*          options                 READ options                                        CONSTANT)
@@ -60,6 +61,10 @@ public:
     /// @return A list of QGCSettings
     virtual QVariantList& settingsPages();
 
+    /// The list of pages/buttons under the Analyze Menu
+    /// @return A list of QmlPageInfo
+    virtual QVariantList& analyzePages();
+
     /// The list of PageWidget pages shown in the instrument panel
     /// @return A list of QmlPageInfo
     virtual QVariantList& instrumentPages();
@@ -158,6 +163,7 @@ public:
 
 signals:
     void settingsPagesChanged   ();
+    void analyzePagesChanged    ();
     void instrumentPagesChanged ();
     void showTouchAreasChanged  (bool showTouchAreas);
     void showAdvancedUIChanged  (bool showAdvancedUI);