From ede85754488d12b0e7524ce2018392b3e8d4013f Mon Sep 17 00:00:00 2001
From: Don Gagne <dongagne@outlook.com>
Date: Thu, 5 Sep 2019 10:28:48 -0700
Subject: [PATCH] Fix initial load for Plan view

---
 src/MissionManager/GeoFenceController.cc   | 12 ++++++++++--
 src/MissionManager/GeoFenceController.h    |  3 ++-
 src/MissionManager/MissionController.cc    | 11 +++++++++--
 src/MissionManager/MissionController.h     |  2 ++
 src/MissionManager/PlanMasterController.cc |  7 +++++++
 src/MissionManager/PlanMasterController.h  |  1 +
 src/MissionManager/RallyPointController.cc | 11 +++++++++--
 src/MissionManager/RallyPointController.h  |  3 ++-
 8 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/src/MissionManager/GeoFenceController.cc b/src/MissionManager/GeoFenceController.cc
index 64e89a5..e9acf66 100644
--- a/src/MissionManager/GeoFenceController.cc
+++ b/src/MissionManager/GeoFenceController.cc
@@ -342,8 +342,10 @@ void GeoFenceController::_setReturnPointFromManager(QGeoCoordinate breachReturnP
 void GeoFenceController::_managerLoadComplete(void)
 {
     // Fly view always reloads on _loadComplete
-    // Plan view only reloads on _loadComplete if specifically requested
-    if (_flyView || _itemsRequested) {
+    // Plan view only reloads if:
+    //  - Load was specifically requested
+    //  - There is no current Plan
+    if (_flyView || _itemsRequested || isEmpty()) {
         _setReturnPointFromManager(_geoFenceManager->breachReturnPoint());
         _setFenceFromManager(_geoFenceManager->polygons(), _geoFenceManager->circles());
         setDirty(false);
@@ -519,3 +521,9 @@ void GeoFenceController::_parametersReady(void)
     connect(_px4ParamCircularFenceFact, &Fact::rawValueChanged, this, &GeoFenceController::paramCircularFenceChanged);
     emit paramCircularFenceChanged();
 }
+
+bool GeoFenceController::isEmpty(void) const
+{
+    return _polygons.count() == 0 && _circles.count() == 0 && !_breachReturnPoint.isValid();
+
+}
diff --git a/src/MissionManager/GeoFenceController.h b/src/MissionManager/GeoFenceController.h
index 65c098d..43d267d 100644
--- a/src/MissionManager/GeoFenceController.h
+++ b/src/MissionManager/GeoFenceController.h
@@ -82,7 +82,8 @@ public:
     QmlObjectListModel* circles                 (void) { return &_circles; }
     QGeoCoordinate      breachReturnPoint       (void) const { return _breachReturnPoint; }
 
-    void setBreachReturnPoint(const QGeoCoordinate& breachReturnPoint);
+    void setBreachReturnPoint   (const QGeoCoordinate& breachReturnPoint);
+    bool isEmpty                (void) const;
 
 signals:
     void breachReturnPointChanged       (QGeoCoordinate breachReturnPoint);
diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc
index 14c138d..69d5779 100644
--- a/src/MissionManager/MissionController.cc
+++ b/src/MissionManager/MissionController.cc
@@ -148,8 +148,10 @@ void MissionController::_newMissionItemsAvailableFromVehicle(bool removeAllReque
     qCDebug(MissionControllerLog) << "_newMissionItemsAvailableFromVehicle flyView:count" << _flyView << _missionManager->missionItems().count();
 
     // Fly view always reloads on _loadComplete
-    // Plan view only reloads on _loadComplete if specifically requested
-    if (_flyView || removeAllRequested || _itemsRequested || _visualItems->count() <= 1) {
+    // Plan view only reloads if:
+    //  - Load was specifically requested
+    //  - There is no current Plan
+    if (_flyView || removeAllRequested || _itemsRequested || isEmpty()) {
         // Fly Mode (accept if):
         //      - Always accepts new items from the vehicle so Fly view is kept up to date
         // Edit Mode (accept if):
@@ -2174,3 +2176,8 @@ void MissionController::_complexBoundingBoxChanged()
 {
     _updateTimer.start(UPDATE_TIMEOUT);
 }
+
+bool MissionController::isEmpty(void) const
+{
+    return _visualItems->count() <= 1;
+}
diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h
index 6fa43f3..16d2c54 100644
--- a/src/MissionManager/MissionController.h
+++ b/src/MissionManager/MissionController.h
@@ -196,6 +196,8 @@ public:
     int  batteryChangePoint         (void) const { return _missionFlightStatus.batteryChangePoint; }    ///< -1 for not supported, 0 for not needed
     int  batteriesRequired          (void) const { return _missionFlightStatus.batteriesRequired; }     ///< -1 for not supported
 
+    bool isEmpty                    (void) const;
+
     // These are the names shown in the UI for the pattern items. They are public so custom builds can remove the ones
     // they don't want through the QGCCorePlugin::
     static const QString patternFWLandingName;
diff --git a/src/MissionManager/PlanMasterController.cc b/src/MissionManager/PlanMasterController.cc
index c872b76..6cc9c25 100644
--- a/src/MissionManager/PlanMasterController.cc
+++ b/src/MissionManager/PlanMasterController.cc
@@ -576,3 +576,10 @@ bool PlanMasterController::syncInProgress(void) const
             _geoFenceController.syncInProgress() ||
             _rallyPointController.syncInProgress();
 }
+
+bool PlanMasterController::isEmpty(void) const
+{
+    return _missionController.isEmpty() &&
+            _geoFenceController.isEmpty() &&
+            _rallyPointController.isEmpty();
+}
diff --git a/src/MissionManager/PlanMasterController.h b/src/MissionManager/PlanMasterController.h
index fed9386..829f550 100644
--- a/src/MissionManager/PlanMasterController.h
+++ b/src/MissionManager/PlanMasterController.h
@@ -84,6 +84,7 @@ public:
     QString     currentPlanFile (void) const { return _currentPlanFile; }
     QStringList loadNameFilters (void) const;
     QStringList saveNameFilters (void) const;
+    bool        isEmpty         (void) const;
 
     QJsonDocument saveToJson    ();
 
diff --git a/src/MissionManager/RallyPointController.cc b/src/MissionManager/RallyPointController.cc
index 732d080..e6f150f 100644
--- a/src/MissionManager/RallyPointController.cc
+++ b/src/MissionManager/RallyPointController.cc
@@ -202,8 +202,10 @@ QString RallyPointController::editorQml(void) const
 void RallyPointController::_managerLoadComplete(void)
 {
     // Fly view always reloads on _loadComplete
-    // Plan view only reloads on _loadComplete if specifically requested
-    if (_flyView || _itemsRequested) {
+    // Plan view only reloads if:
+    //  - Load was specifically requested
+    //  - There is no current Plan
+    if (_flyView || _itemsRequested || isEmpty()) {
         _points.clearAndDeleteContents();
         QObjectList pointList;
         for (int i=0; i<_rallyPointManager->points().count(); i++) {
@@ -318,3 +320,8 @@ bool RallyPointController::showPlanFromManagerVehicle (void)
         }
     }
 }
+
+bool RallyPointController::isEmpty(void) const
+{
+    return _points.count() == 0;
+}
diff --git a/src/MissionManager/RallyPointController.h b/src/MissionManager/RallyPointController.h
index d443b39..0823b9b 100644
--- a/src/MissionManager/RallyPointController.h
+++ b/src/MissionManager/RallyPointController.h
@@ -54,7 +54,8 @@ public:
     QString             editorQml               (void) const;
     QObject*            currentRallyPoint       (void) const { return _currentRallyPoint; }
 
-    void setCurrentRallyPoint(QObject* rallyPoint);
+    void setCurrentRallyPoint   (QObject* rallyPoint);
+    bool isEmpty                (void) const;
 
 signals:
     void currentRallyPointChanged(QObject* rallyPoint);