diff --git a/QGCApplication.pro b/QGCApplication.pro
index baad461..c6235a3 100644
--- a/QGCApplication.pro
+++ b/QGCApplication.pro
@@ -228,6 +228,7 @@ HEADERS += \
src/MG.h \
src/MissionEditor/MissionEditorController.h \
src/MissionManager/MissionManager.h \
+ src/MissionManager/MissionController.h \
src/QGC.h \
src/QGCApplication.h \
src/QGCComboBox.h \
@@ -346,6 +347,7 @@ SOURCES += \
src/main.cc \
src/MissionEditor/MissionEditorController.cc \
src/MissionManager/MissionManager.cc \
+ src/MissionManager/MissionController.cc \
src/QGC.cc \
src/QGCApplication.cc \
src/QGCComboBox.cc \
diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index b85d0a5..8b6ddc2 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -163,8 +163,6 @@
src/FlightMap/qmldir
src/FlightMap/FlightMap.qml
src/FlightMap/QGCVideoBackground.qml
-
-
src/FlightMap/Widgets/QGCAltitudeWidget.qml
src/FlightMap/Widgets/QGCArtificialHorizon.qml
src/FlightMap/Widgets/QGCAttitudeWidget.qml
@@ -176,10 +174,9 @@
src/FlightMap/Widgets/QGCPitchIndicator.qml
src/FlightMap/Widgets/QGCSlider.qml
src/FlightMap/Widgets/QGCSpeedWidget.qml
-
-
src/FlightMap/MapItems/MissionItemIndicator.qml
src/FlightMap/MapItems/VehicleMapItem.qml
+ src/FlightMap/MapItems/MissionItemView.qml
diff --git a/src/FlightDisplay/FlightDisplayView.qml b/src/FlightDisplay/FlightDisplayView.qml
index 1f361be..012c749 100644
--- a/src/FlightDisplay/FlightDisplayView.qml
+++ b/src/FlightDisplay/FlightDisplayView.qml
@@ -84,6 +84,7 @@ Item {
property bool _showMap: getBool(QGroundControl.flightMapSettings.loadMapSetting(flightMap.mapName, _showMapBackgroundKey, "1"))
FlightDisplayViewController { id: _controller }
+ MissionController { id: _missionController }
ExclusiveGroup {
id: _dropButtonsExclusiveGroup
@@ -178,16 +179,9 @@ Item {
}
// Add the mission items to the map
- MapItemView {
- model: multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.missionItems : 0
-
- delegate:
- MissionItemIndicator {
- label: object.sequenceNumber
- isCurrentItem: object.isCurrentItem
- coordinate: object.coordinate
- z: flightMap.zOrderMapItems
- }
+ MissionItemView {
+ model: _missionController.missionItems
+ zOrderMapItems: flightMap.zOrderMapItems
}
Loader {
diff --git a/src/FlightMap/MapItems/MissionItemView.qml b/src/FlightMap/MapItems/MissionItemView.qml
new file mode 100644
index 0000000..13d143b
--- /dev/null
+++ b/src/FlightMap/MapItems/MissionItemView.qml
@@ -0,0 +1,95 @@
+/*=====================================================================
+
+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 .
+
+======================================================================*/
+
+import QtQuick 2.4
+import QtQuick.Controls 1.3
+import QtQuick.Dialogs 1.2
+import QtLocation 5.3
+import QtPositioning 5.3
+
+import QGroundControl 1.0
+import QGroundControl.FlightMap 1.0
+import QGroundControl.ScreenTools 1.0
+import QGroundControl.Controls 1.0
+import QGroundControl.Palette 1.0
+
+/// The MissionItemView control is used to add Mission Item Indicators to a FlightMap.
+MapItemView {
+ id: _root
+
+ property real zOrderMapItems ///< Z order for indicator
+ property var itemDragger ///< Set to item drag control if you want to support drag
+
+ delegate: MissionItemIndicator {
+ id: itemIndicator
+ label: object.sequenceNumber == 0 ? "H" : object.sequenceNumber
+ isCurrentItem: object.isCurrentItem
+ coordinate: object.coordinate
+ z: zOrderMapItems
+ visible: object.specifiesCoordinate
+
+ onClicked: setCurrentItem(object.sequenceNumber)
+
+ Connections {
+ target: object
+
+ onIsCurrentItemChanged: {
+ if (isCurrentItem) {
+ if (_root.itemDragger) {
+ // Setup our drag item
+ if (object.sequenceNumber != 0) {
+ _root.itemDragger.visible = true
+ _root.itemDragger.missionItem = Qt.binding(function() { return object })
+ _root.itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator })
+ } else {
+ _root.itemDragger.clearItem()
+ }
+ }
+
+ // Zoom the map and move to the new position
+ _root.parent.zoomLevel = _root.parent.maxZoomLevel
+ _root.parent.latitude = object.coordinate.latitude
+ _root.parent.longitude = object.coordinate.longitude
+ }
+ }
+ }
+
+ // These are the non-coordinate child mission items attached to this item
+ Row {
+ anchors.top: parent.top
+ anchors.left: parent.right
+
+ Repeater {
+ model: object.childItems
+
+ delegate: MissionItemIndexLabel {
+ label: object.sequenceNumber
+ isCurrentItem: object.isCurrentItem
+ z: 2
+
+ onClicked: setCurrentItem(object.sequenceNumber)
+ }
+ }
+ }
+ }
+}
diff --git a/src/FlightMap/qmldir b/src/FlightMap/qmldir
index 18f0c21..44207c0 100644
--- a/src/FlightMap/qmldir
+++ b/src/FlightMap/qmldir
@@ -17,6 +17,7 @@ QGCPitchIndicator 1.0 QGCPitchIndicator.qml
QGCSlider 1.0 QGCSlider.qml
QGCSpeedWidget 1.0 QGCSpeedWidget.qml
-# MapQuickItems
+# Map items
VehicleMapItem 1.0 VehicleMapItem.qml
MissionItemIndicator 1.0 MissionItemIndicator.qml
+MissionItemView 1.0 MissionItemView.qml
diff --git a/src/MissionEditor/MissionEditor.qml b/src/MissionEditor/MissionEditor.qml
index c7bb64b..912255d 100644
--- a/src/MissionEditor/MissionEditor.qml
+++ b/src/MissionEditor/MissionEditor.qml
@@ -215,65 +215,10 @@ QGCView {
}
// Add the mission items to the map
- MapItemView {
- model: controller.missionItems
-
- delegate:
- MissionItemIndicator {
- id: itemIndicator
- label: object.sequenceNumber == 0 ? (liveHomePositionAvailable ? "H" : "F") : object.sequenceNumber
- isCurrentItem: !homePositionManagerButton.checked && object.isCurrentItem
- coordinate: object.coordinate
- z: editorMap.zOrderMapItems
- visible: object.specifiesCoordinate
-
- onClicked: setCurrentItem(object.sequenceNumber)
-
- Connections {
- target: object
-
- onIsCurrentItemChanged: {
- if (isCurrentItem) {
- // Setup our drag item
- if (object.sequenceNumber != 0) {
- itemEditor.visible = true
- itemEditor.missionItem = Qt.binding(function() { return object })
- itemEditor.missionItemIndicator = Qt.binding(function() { return itemIndicator })
- } else {
- itemEditor.clearItem()
- }
-
- // Zoom the map and move to the new position
- editorMap.zoomLevel = editorMap.maxZoomLevel
- editorMap.latitude = object.coordinate.latitude
- editorMap.longitude = object.coordinate.longitude
- }
- }
- }
-
- // These are the non-coordinate child mission items attached to this item
- Row {
- anchors.top: parent.top
- anchors.left: parent.right
-
- Repeater {
- model: object.childItems
-
- delegate:
- MissionItemIndexLabel {
- label: object.sequenceNumber
- isCurrentItem: !homePositionManagerButton.checked && object.isCurrentItem
- z: 2
-
- onClicked: {
- setCurrentItem(object.sequenceNumber)
- missionItemEditorButton.checked
- }
-
- }
- }
- }
- }
+ MissionItemView {
+ model: controller.missionItems
+ zOrderMapItems: editorMap.zOrderMapItems
+ itemDragger: itemEditor
}
// Add lines between waypoints
diff --git a/src/MissionEditor/MissionEditorController.cc b/src/MissionEditor/MissionEditorController.cc
index 53da03d..c623b8e 100644
--- a/src/MissionEditor/MissionEditorController.cc
+++ b/src/MissionEditor/MissionEditorController.cc
@@ -35,7 +35,7 @@ This file is part of the QGROUNDCONTROL project
const char* MissionEditorController::_settingsGroup = "MissionEditorController";
-MissionEditorController::MissionEditorController(QWidget *parent)
+MissionEditorController::MissionEditorController(QObject *parent)
: QObject(parent)
, _missionItems(NULL)
, _canEdit(true)
@@ -43,7 +43,7 @@ MissionEditorController::MissionEditorController(QWidget *parent)
, _liveHomePositionAvailable(false)
, _autoSync(false)
, _firstMissionItemSync(false)
- , _expectingNewMissionItems(false)
+ , _missionItemsRequested(false)
{
MultiVehicleManager* multiVehicleMgr = MultiVehicleManager::instance();
@@ -53,8 +53,8 @@ MissionEditorController::MissionEditorController(QWidget *parent)
if (activeVehicle) {
_activeVehicleChanged(activeVehicle);
} else {
- _missionItems = new QmlObjectListModel(this);
- _initAllMissionItems();
+ _missionItemsRequested = true;
+ _newMissionItemsAvailable();
}
}
@@ -64,9 +64,9 @@ MissionEditorController::~MissionEditorController()
void MissionEditorController::_newMissionItemsAvailable(void)
{
- if (_firstMissionItemSync || !_expectingNewMissionItems) {
+ if (_firstMissionItemSync) {
// This is the first time the vehicle is seeing items. We have to be careful of transitioning from offline
- // to online. Other case is an unexpected set of new items from the vehicle.
+ // to online.
_firstMissionItemSync = false;
if (_missionItems && _missionItems->count() > 1) {
@@ -79,24 +79,32 @@ void MissionEditorController::_newMissionItemsAvailable(void)
return;
}
}
- } else if (_autoSync) {
- // When we are running autoSync we assume the MissionManager is notifying us about the
- // items we just sent to it. We keep our own edit list, instead of resetting.
+ } else if (!_missionItemsRequested) {
+ // We didn't specifically ask for new mission items. Disregard the new set since it is
+ // the most likely the set we just sent to the vehicle.
return;
}
- _expectingNewMissionItems = false;
+ _missionItemsRequested = false;
if (_missionItems) {
_deinitAllMissionItems();
_missionItems->deleteLater();
}
- MissionManager* missionManager = MultiVehicleManager::instance()->activeVehicle()->missionManager();
-
- _canEdit = missionManager->canEdit();
- _missionItems = missionManager->copyMissionItems();
-
+ MissionManager* missionManager = NULL;
+ if (_activeVehicle) {
+ missionManager = _activeVehicle->missionManager();
+ }
+
+ if (!missionManager || missionManager->inProgress()) {
+ _canEdit = true;
+ _missionItems = new QmlObjectListModel(this);
+ } else {
+ _canEdit = missionManager->canEdit();
+ _missionItems = missionManager->copyMissionItems();
+ }
+
_initAllMissionItems();
}
@@ -105,7 +113,7 @@ void MissionEditorController::getMissionItems(void)
Vehicle* activeVehicle = MultiVehicleManager::instance()->activeVehicle();
if (activeVehicle) {
- _expectingNewMissionItems = true;
+ _missionItemsRequested = true;
MissionManager* missionManager = activeVehicle->missionManager();
connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionEditorController::_newMissionItemsAvailable);
activeVehicle->missionManager()->requestMissionItems();
@@ -390,6 +398,7 @@ void MissionEditorController::_activeVehicleChanged(Vehicle* activeVehicle)
disconnect(_activeVehicle, &Vehicle::homePositionAvailableChanged, this, &MissionEditorController::_activeVehicleHomePositionAvailableChanged);
disconnect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionEditorController::_activeVehicleHomePositionChanged);
_activeVehicle = NULL;
+ _newMissionItemsAvailable();
_activeVehicleHomePositionAvailableChanged(false);
}
@@ -402,8 +411,6 @@ void MissionEditorController::_activeVehicleChanged(Vehicle* activeVehicle)
connect(missionManager, &MissionManager::inProgressChanged, this, &MissionEditorController::_inProgressChanged);
connect(_activeVehicle, &Vehicle::homePositionAvailableChanged, this, &MissionEditorController::_activeVehicleHomePositionAvailableChanged);
connect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionEditorController::_activeVehicleHomePositionChanged);
- _activeVehicleHomePositionChanged(_activeVehicle->homePosition());
- _activeVehicleHomePositionAvailableChanged(_activeVehicle->homePositionAvailable());
if (missionManager->inProgress()) {
// Vehicle is still in process of requesting mission items
@@ -411,8 +418,13 @@ void MissionEditorController::_activeVehicleChanged(Vehicle* activeVehicle)
} else {
// Vehicle already has mission items
_firstMissionItemSync = false;
- _newMissionItemsAvailable();
}
+
+ _missionItemsRequested = true;
+ _newMissionItemsAvailable();
+
+ _activeVehicleHomePositionChanged(_activeVehicle->homePosition());
+ _activeVehicleHomePositionAvailableChanged(_activeVehicle->homePositionAvailable());
}
}
@@ -468,8 +480,10 @@ void MissionEditorController::_autoSyncSend(void)
{
qDebug() << "Auto-syncing with vehicle";
_queuedSend = false;
- sendMissionItems();
- _missionItems->setDirty(false);
+ if (_missionItems) {
+ sendMissionItems();
+ _missionItems->setDirty(false);
+ }
}
void MissionEditorController::_inProgressChanged(bool inProgress)
@@ -478,3 +492,8 @@ void MissionEditorController::_inProgressChanged(bool inProgress)
_autoSyncSend();
}
}
+
+QmlObjectListModel* MissionEditorController::missionItems(void)
+{
+ return _missionItems;
+}
diff --git a/src/MissionEditor/MissionEditorController.h b/src/MissionEditor/MissionEditorController.h
index bbfb5e2..e74e6da 100644
--- a/src/MissionEditor/MissionEditorController.h
+++ b/src/MissionEditor/MissionEditorController.h
@@ -34,7 +34,7 @@ class MissionEditorController : public QObject
Q_OBJECT
public:
- MissionEditorController(QWidget* parent = NULL);
+ MissionEditorController(QObject* parent = NULL);
~MissionEditorController();
Q_PROPERTY(QmlObjectListModel* missionItems READ missionItems NOTIFY missionItemsChanged)
@@ -54,7 +54,7 @@ public:
// Property accessors
- QmlObjectListModel* missionItems(void) { return _missionItems; }
+ QmlObjectListModel* missionItems(void);
QmlObjectListModel* waypointLines(void) { return &_waypointLines; }
bool canEdit(void) { return _canEdit; }
bool liveHomePositionAvailable(void) { return _liveHomePositionAvailable; }
@@ -100,7 +100,7 @@ private:
QGeoCoordinate _liveHomePosition;
bool _autoSync;
bool _firstMissionItemSync;
- bool _expectingNewMissionItems;
+ bool _missionItemsRequested;
bool _queuedSend;
static const char* _settingsGroup;
diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc
new file mode 100644
index 0000000..2214c9a
--- /dev/null
+++ b/src/MissionManager/MissionController.cc
@@ -0,0 +1,158 @@
+/*=====================================================================
+
+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 "MissionController.h"
+#include "ScreenToolsController.h"
+#include "MultiVehicleManager.h"
+#include "MissionManager.h"
+#include "CoordinateVector.h"
+
+MissionController::MissionController(QObject *parent)
+ : QObject(parent)
+ , _missionItems(NULL)
+ , _activeVehicle(NULL)
+{
+ MultiVehicleManager* multiVehicleMgr = MultiVehicleManager::instance();
+
+ connect(multiVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &MissionController::_activeVehicleChanged);
+
+ Vehicle* activeVehicle = multiVehicleMgr->activeVehicle();
+ if (activeVehicle) {
+ _activeVehicleChanged(activeVehicle);
+ } else {
+ _newMissionItemsAvailable();
+ }
+}
+
+MissionController::~MissionController()
+{
+}
+
+void MissionController::_newMissionItemsAvailable(void)
+{
+ if (_missionItems) {
+ _missionItems->deleteLater();
+ }
+
+ MissionManager* missionManager = NULL;
+ Vehicle* activeVehicle = MultiVehicleManager::instance()->activeVehicle();
+ if (activeVehicle) {
+ missionManager = activeVehicle->missionManager();
+ }
+
+ if (!missionManager || missionManager->inProgress()) {
+ _missionItems = new QmlObjectListModel(this);
+ } else {
+ _missionItems = missionManager->copyMissionItems();
+ }
+
+ _initAllMissionItems();
+}
+
+void MissionController::_recalcWaypointLines(void)
+{
+ bool firstCoordinateItem = true;
+ MissionItem* lastCoordinateItem = qobject_cast(_missionItems->get(0));
+
+ _waypointLines.clear();
+
+ for (int i=1; i<_missionItems->count(); i++) {
+ MissionItem* item = qobject_cast(_missionItems->get(i));
+
+ if (item->specifiesCoordinate()) {
+ if (firstCoordinateItem) {
+ if (item->command() == MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF) {
+ // The first coordinate we hit is a takeoff command so link back to home position
+ _waypointLines.append(new CoordinateVector(qobject_cast(_missionItems->get(0))->coordinate(), item->coordinate()));
+ } else {
+ // First coordiante is not a takeoff command, it does not link backwards to anything
+ }
+ firstCoordinateItem = false;
+ } else {
+ // Subsequent coordinate items link to last coordinate item
+ _waypointLines.append(new CoordinateVector(lastCoordinateItem->coordinate(), item->coordinate()));
+ }
+ lastCoordinateItem = item;
+ }
+ }
+
+ emit waypointLinesChanged();
+}
+
+// This will update the child item hierarchy
+void MissionController::_recalcChildItems(void)
+{
+ MissionItem* currentParentItem = qobject_cast(_missionItems->get(0));
+
+ currentParentItem->childItems()->clear();
+
+ for (int i=1; i<_missionItems->count(); i++) {
+ MissionItem* item = qobject_cast(_missionItems->get(i));
+
+ // Set up non-coordinate item child hierarchy
+ if (item->specifiesCoordinate()) {
+ item->childItems()->clear();
+ currentParentItem = item;
+ } else {
+ currentParentItem->childItems()->append(item);
+ }
+ }
+}
+
+void MissionController::_recalcAll(void)
+{
+ _recalcChildItems();
+ _recalcWaypointLines();
+}
+
+/// Initializes a new set of mission items which may have come from the vehicle or have been loaded from a file
+void MissionController::_initAllMissionItems(void)
+{
+ // Add the home position item to the front
+ MissionItem* homeItem = new MissionItem(this);
+ homeItem->setHomePositionSpecialCase(true);
+ homeItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT);
+ _missionItems->insert(0, homeItem);
+
+ _recalcChildItems();
+ _recalcWaypointLines();
+
+ emit missionItemsChanged();
+}
+
+void MissionController::_activeVehicleChanged(Vehicle* activeVehicle)
+{
+ if (_activeVehicle) {
+ MissionManager* missionManager = _activeVehicle->missionManager();
+ disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailable);
+ _activeVehicle = NULL;
+ }
+
+ _activeVehicle = activeVehicle;
+
+ if (_activeVehicle) {
+ MissionManager* missionManager = activeVehicle->missionManager();
+ connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailable);
+ _newMissionItemsAvailable();
+ }
+}
diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h
new file mode 100644
index 0000000..776dbbf
--- /dev/null
+++ b/src/MissionManager/MissionController.h
@@ -0,0 +1,69 @@
+/*=====================================================================
+
+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 MissionController_H
+#define MissionController_H
+
+#include
+
+#include "QmlObjectListModel.h"
+#include "Vehicle.h"
+
+/// MissionController is a read only controller for Mission Items
+class MissionController : public QObject
+{
+ Q_OBJECT
+
+public:
+ MissionController(QObject* parent = NULL);
+ ~MissionController();
+
+ Q_PROPERTY(QmlObjectListModel* missionItems READ missionItems NOTIFY missionItemsChanged)
+ Q_PROPERTY(QmlObjectListModel* waypointLines READ waypointLines NOTIFY waypointLinesChanged)
+
+ // Property accessors
+
+ QmlObjectListModel* missionItems(void) { return _missionItems; }
+ QmlObjectListModel* waypointLines(void) { return &_waypointLines; }
+
+signals:
+ void missionItemsChanged(void);
+ void waypointLinesChanged(void);
+
+private slots:
+ void _newMissionItemsAvailable();
+ void _activeVehicleChanged(Vehicle* activeVehicle);
+
+private:
+ void _recalcWaypointLines(void);
+ void _recalcChildItems(void);
+ void _recalcAll(void);
+ void _initAllMissionItems(void);
+
+private:
+ QmlObjectListModel* _missionItems;
+ QmlObjectListModel _waypointLines;
+ Vehicle* _activeVehicle;
+};
+
+#endif
diff --git a/src/MissionManager/MissionManager.cc b/src/MissionManager/MissionManager.cc
index 4bb407b..1655de1 100644
--- a/src/MissionManager/MissionManager.cc
+++ b/src/MissionManager/MissionManager.cc
@@ -61,6 +61,7 @@ void MissionManager::writeMissionItems(const QmlObjectListModel& missionItems, b
for (int i=skipFirstItem ? 1: 0; i(missionItems[i])));
}
+ emit newMissionItemsAvailable();
if (skipFirstItem) {
for (int i=0; i<_missionItems.count(); i++) {
@@ -576,4 +577,4 @@ QString MissionManager::_missionResultToString(MAV_MISSION_RESULT result)
qWarning(MissionManagerLog) << "Fell off end of switch statement";
return QString("QGC Internal Error");
}
-}
\ No newline at end of file
+}
diff --git a/src/MissionManager/MissionManagerTest.cc b/src/MissionManager/MissionManagerTest.cc
index 6be9a97..fe6f494 100644
--- a/src/MissionManager/MissionManagerTest.cc
+++ b/src/MissionManager/MissionManagerTest.cc
@@ -160,9 +160,11 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f
// Send the items to the vehicle
_missionManager->writeMissionItems(*list, false /* skipFirstItem */);
- // writeMissionItems should emit inProgressChanged signal before returning so no need to wait for it
+ // writeMissionItems should emit these signals before returning:
+ // inProgressChanged
+ // newMissionItemsAvailable
QVERIFY(_missionManager->inProgress());
- QCOMPARE(_multiSpy->checkOnlySignalByMask(inProgressChangedSignalMask), true);
+ QCOMPARE(_multiSpy->checkSignalByMask(inProgressChangedSignalMask | newMissionItemsAvailableSignalMask), true);
_checkInProgressValues(true);
_multiSpy->clearAllSignals();
diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc
index 3c2a91a..cbe4e53 100644
--- a/src/QGCApplication.cc
+++ b/src/QGCApplication.cc
@@ -88,6 +88,7 @@
#include "QGCQGeoCoordinate.h"
#include "CoordinateVector.h"
#include "MainToolBarController.h"
+#include "MissionController.h"
#include "MissionEditorController.h"
#include "FlightDisplayViewController.h"
#include "VideoSurface.h"
@@ -353,6 +354,7 @@ void QGCApplication::_initCommon(void)
qmlRegisterType ("QGroundControl.Controllers", 1, 0, "RadioComponentController");
qmlRegisterType ("QGroundControl.Controllers", 1, 0, "ScreenToolsController");
qmlRegisterType ("QGroundControl.Controllers", 1, 0, "MainToolBarController");
+ qmlRegisterType ("QGroundControl.Controllers", 1, 0, "MissionController");
qmlRegisterType ("QGroundControl.Controllers", 1, 0, "MissionEditorController");
qmlRegisterType ("QGroundControl.Controllers", 1, 0, "FlightDisplayViewController");
diff --git a/src/ui/toolbar/MainToolBar.qml b/src/ui/toolbar/MainToolBar.qml
index e1d3cb7..b31e6d8 100644
--- a/src/ui/toolbar/MainToolBar.qml
+++ b/src/ui/toolbar/MainToolBar.qml
@@ -224,7 +224,7 @@ Item {
//-- Indicators
Row {
id: row12
- x: desktopToolsLoader.item.width + horizontalMargins
+ x: horizontalMargins + (ScreenTools.isMobile ? 0: desktopToolsLoader.item.width)
height: cellHeight
spacing: cellSpacerSize
anchors.top: desktopToolsLoader.top