diff --git a/src/FlightMap/MapItems/MissionItemIndicator.qml b/src/FlightMap/MapItems/MissionItemIndicator.qml index 530f0d0394df1e62bda3c5ee1ae51eb36b8aa15a..efba9e15a536c7762b6151d0a79751150f2ebb82 100644 --- a/src/FlightMap/MapItems/MissionItemIndicator.qml +++ b/src/FlightMap/MapItems/MissionItemIndicator.qml @@ -33,6 +33,7 @@ MapQuickItem { id: _item property var missionItem + property int sequenceNumber signal clicked @@ -43,10 +44,9 @@ MapQuickItem { MissionItemIndexLabel { id: _label isCurrentItem: _isCurrentItem - label: _sequenceNumber == 0 ? "H" : missionItem.sequenceNumber + label: sequenceNumber == 0 ? "H" : sequenceNumber onClicked: _item.clicked() property bool _isCurrentItem: missionItem ? missionItem.isCurrentItem : false - property bool _sequenceNumber: missionItem ? missionItem.sequenceNumber : 0 } } diff --git a/src/FlightMap/MapItems/MissionItemView.qml b/src/FlightMap/MapItems/MissionItemView.qml index d23ff871ffbe3501e66b89d2b357a633421b4e93..9304953984022c3e1367d08bbc2f3e3107209ccc 100644 --- a/src/FlightMap/MapItems/MissionItemView.qml +++ b/src/FlightMap/MapItems/MissionItemView.qml @@ -41,6 +41,7 @@ MapItemView { visible: object.specifiesCoordinate && (index != 0 || object.showHomePosition) z: QGroundControl.zOrderMapItems missionItem: object + sequenceNumber: object.sequenceNumber // These are the non-coordinate child mission items attached to this item Row { diff --git a/src/FlightMap/Widgets/VibrationWidget.qml b/src/FlightMap/Widgets/VibrationWidget.qml index 8c16c8a9054755214e16570b60e3d22268aff19a..83f838d7ee1fcb612c136b808bb64781c462f48b 100644 --- a/src/FlightMap/Widgets/VibrationWidget.qml +++ b/src/FlightMap/Widgets/VibrationWidget.qml @@ -134,8 +134,6 @@ QGCFlickable { width: barRow.width height: 1 color: "red" - - Component.onCompleted: console.log(anchors.topMargin, xBar.height, _barBadValue, _barMaximum, _barMinimum) } QGCLabel { diff --git a/src/MissionEditor/MissionEditor.qml b/src/MissionEditor/MissionEditor.qml index 7b8255cc8e85c86af09288ca39969a29c3fe7229..e15e66411141a5604ba88e6ba4dd3a93ced94802 100644 --- a/src/MissionEditor/MissionEditor.qml +++ b/src/MissionEditor/MissionEditor.qml @@ -366,8 +366,42 @@ QGCView { // Add the simple mission items to the map MapItemView { - model: controller.visualItems - delegate: missionItemComponent + model: controller.visualItems + delegate: missionItemComponent + } + + // Add the complex mission items to the map + MapItemView { + model: controller.complexVisualItems + delegate: polygonItemComponent + } + + Component { + id: polygonItemComponent + + MapPolygon { + color: 'green' + path: object.polygonPath + opacity: 0.5 + } + } + + // Add the complex mission item exit coordinates + MapItemView { + model: controller.complexVisualItems + delegate: exitCoordinateComponent + } + + Component { + id: exitCoordinateComponent + + MissionItemIndicator { + coordinate: object.exitCoordinate + z: QGroundControl.zOrderMapItems + missionItem: object + sequenceNumber: object.lastSequenceNumber + visible: object.specifiesCoordinate + } } Component { @@ -379,18 +413,18 @@ QGCView { visible: object.specifiesCoordinate z: QGroundControl.zOrderMapItems missionItem: object + sequenceNumber: object.sequenceNumber onClicked: setCurrentItem(object.sequenceNumber) function updateItemIndicator() { - if (object.isCurrentItem && itemIndicator.visible) { - if (object.specifiesCoordinate) { - // Setup our drag item - itemDragger.visible = true - itemDragger.missionItem = Qt.binding(function() { return object }) - itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator }) - } + if (object.isCurrentItem && itemIndicator.visible && + object.specifiesCoordinate && object.isSimpleItem) { + // Setup our drag item + itemDragger.visible = true + itemDragger.missionItem = Qt.binding(function() { return object }) + itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator }) } } @@ -421,22 +455,6 @@ QGCView { } } - // Add the complex mission items to the map - MapItemView { - model: controller.complexVisualItems - delegate: polygonItemComponent - } - - Component { - id: polygonItemComponent - - MapPolygon { - color: 'green' - path: object.polygonPath - opacity: 0.5 - } - } - // Add lines between waypoints MissionLineView { model: controller.waypointLines diff --git a/src/MissionManager/ComplexMissionItem.cc b/src/MissionManager/ComplexMissionItem.cc index d148c9f1ddb0686c755839378f1f35424535f9a0..16c0c4dfa18fd01037b6f6aeeff9dec979acd73f 100644 --- a/src/MissionManager/ComplexMissionItem.cc +++ b/src/MissionManager/ComplexMissionItem.cc @@ -33,6 +33,7 @@ const char* ComplexMissionItem::_complexType = "survey"; ComplexMissionItem::ComplexMissionItem(Vehicle* vehicle, QObject* parent) : VisualMissionItem(vehicle, parent) + , _sequenceNumber(0) , _dirty(false) { MissionItem missionItem; @@ -44,6 +45,7 @@ ComplexMissionItem::ComplexMissionItem(Vehicle* vehicle, QObject* parent) ComplexMissionItem::ComplexMissionItem(const ComplexMissionItem& other, QObject* parent) : VisualMissionItem(other, parent) + , _sequenceNumber(other.sequenceNumber()) , _dirty(false) { @@ -51,8 +53,18 @@ ComplexMissionItem::ComplexMissionItem(const ComplexMissionItem& other, QObject* void ComplexMissionItem::clearPolygon(void) { - _polygonPath.clear(); + // Bug workaround, see below + while (_polygonPath.count() > 1) { + _polygonPath.takeLast(); + } emit polygonPathChanged(); + + // Although this code should remove the polygon from the map it doesn't. There appears + // to be a bug in MapPolygon which causes it to not be redrawn if the list is empty. So + // we work around it by using the code above to remove all bu the last point which in turn + // will cause the polygon to go away. + _polygonPath.clear(); + emit specifiesCoordinateChanged(); } void ComplexMissionItem::addPolygonCoordinate(const QGeoCoordinate coordinate) @@ -60,15 +72,18 @@ void ComplexMissionItem::addPolygonCoordinate(const QGeoCoordinate coordinate) _polygonPath << QVariant::fromValue(coordinate); emit polygonPathChanged(); - // FIXME: Hack, first polygon point sets entry coordinate - if (_polygonPath.count() == 1) { + int pointCount = _polygonPath.count(); + if (pointCount == 1) { setCoordinate(coordinate); + } else if (pointCount == 3) { + emit specifiesCoordinateChanged(); } + _setExitCoordinate(coordinate); } -int ComplexMissionItem::nextSequenceNumber(void) const +int ComplexMissionItem::lastSequenceNumber(void) const { - return _sequenceNumber + _missionItems.count(); + return _sequenceNumber + _missionItems.count() - 1; } void ComplexMissionItem::setCoordinate(const QGeoCoordinate& coordinate) @@ -126,11 +141,15 @@ void ComplexMissionItem::save(QJsonObject& saveObject) const void ComplexMissionItem::setSequenceNumber(int sequenceNumber) { - VisualMissionItem::setSequenceNumber(sequenceNumber); + if (_sequenceNumber != sequenceNumber) { + _sequenceNumber = sequenceNumber; - // Update internal mission items to new numbering - for (int i=0; i<_missionItems.count(); i++) { - _missionItems[i]->setSequenceNumber(sequenceNumber++); + // Update internal mission items to new numbering + for (int i=0; i<_missionItems.count(); i++) { + _missionItems[i]->setSequenceNumber(sequenceNumber++); + } + + emit sequenceNumberChanged(sequenceNumber); } } @@ -217,10 +236,12 @@ bool ComplexMissionItem::load(const QJsonObject& complexObject, QString& errorSt int itemCount = _missionItems.count(); if (itemCount > 0) { - setCoordinate(_missionItems[0]->coordinate()); - _setExitCoordinate(_missionItems[itemCount - 1]->coordinate()); + _coordinate = _missionItems[0]->coordinate(); + _exitCoordinate = _missionItems[itemCount - 1]->coordinate(); } + qDebug() << coordinate() << exitCoordinate() << _missionItems[0]->coordinate() << _missionItems[1]->coordinate(); + return true; } @@ -236,3 +257,8 @@ void ComplexMissionItem::_setExitCoordinate(const QGeoCoordinate& coordinate) } } } + +bool ComplexMissionItem::specifiesCoordinate(void) const +{ + return _polygonPath.count() > 2; +} diff --git a/src/MissionManager/ComplexMissionItem.h b/src/MissionManager/ComplexMissionItem.h index 741800d187ad012ecb09680227741cf02e77235b..c8bb4b403b6d16a06596127f77101b88191da329 100644 --- a/src/MissionManager/ComplexMissionItem.h +++ b/src/MissionManager/ComplexMissionItem.h @@ -35,7 +35,8 @@ public: ComplexMissionItem(Vehicle* vehicle, QObject* parent = NULL); ComplexMissionItem(const ComplexMissionItem& other, QObject* parent = NULL); - Q_PROPERTY(QVariantList polygonPath READ polygonPath NOTIFY polygonPathChanged) + Q_PROPERTY(QVariantList polygonPath READ polygonPath NOTIFY polygonPathChanged) + Q_PROPERTY(int lastSequenceNumber READ lastSequenceNumber NOTIFY lastSequenceNumberChanged) Q_INVOKABLE void clearPolygon(void); Q_INVOKABLE void addPolygonCoordinate(const QGeoCoordinate coordinate); @@ -44,8 +45,8 @@ public: QList& missionItems(void) { return _missionItems; } - /// @return The next sequence number to use after this item. Takes into account child items of the complex item - int nextSequenceNumber(void) const; + /// @return The last sequence number used by this item. Takes into account child items of the complex item + int lastSequenceNumber(void) const; /// Load the complex mission item from Json /// @param complexObject Complex mission item json object @@ -58,11 +59,12 @@ public: bool dirty (void) const final { return _dirty; } bool isSimpleItem (void) const final { return false; } bool isStandaloneCoordinate (void) const final { return false; } - bool specifiesCoordinate (void) const final { return true; } + bool specifiesCoordinate (void) const final; QString commandDescription (void) const final { return "Survey"; } QString commandName (void) const final { return "Survey"; } QGeoCoordinate coordinate (void) const final { return _coordinate; } QGeoCoordinate exitCoordinate (void) const final { return _exitCoordinate; } + int sequenceNumber (void) const final { return _sequenceNumber; } bool coordinateHasRelativeAltitude (void) const final { return true; } bool exitCoordinateHasRelativeAltitude (void) const final { return true; } @@ -75,11 +77,13 @@ public: signals: void polygonPathChanged(void); + void lastSequenceNumberChanged(int lastSequenceNumber); private: void _clear(void); void _setExitCoordinate(const QGeoCoordinate& coordinate); + int _sequenceNumber; bool _dirty; QVariantList _polygonPath; QList _missionItems; diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index debac5505610c2e4e09b1516d8470cbeb148f77b..02f79a56c9751098496a6df7438ccf4b748b156b 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -157,10 +157,26 @@ void MissionController::sendMissionItems(void) } } +int MissionController::_nextSequenceNumber(void) +{ + if (_visualItems->count() == 0) { + qWarning() << "Internal error: Empty visual item list"; + return 0; + } else { + VisualMissionItem* lastItem = qobject_cast(_visualItems->get(_visualItems->count() - 1)); + + if (lastItem->isSimpleItem()) { + return lastItem->sequenceNumber() + 1; + } else { + return qobject_cast(lastItem)->lastSequenceNumber() + 1; + } + } +} + int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i) { SimpleMissionItem * newItem = new SimpleMissionItem(_activeVehicle, this); - newItem->setSequenceNumber(_visualItems->count()); + newItem->setSequenceNumber(_nextSequenceNumber()); newItem->setCoordinate(coordinate); newItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT); _initVisualItem(newItem); @@ -188,7 +204,7 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i) int MissionController::insertComplexMissionItem(QGeoCoordinate coordinate, int i) { ComplexMissionItem* newItem = new ComplexMissionItem(_activeVehicle, this); - newItem->setSequenceNumber(_visualItems->count()); + newItem->setSequenceNumber(_nextSequenceNumber()); newItem->setCoordinate(coordinate); _initVisualItem(newItem); @@ -240,7 +256,7 @@ void MissionController::removeAllMissionItems(void) } } -bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString) +bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* visualItems, QmlObjectListModel* complexItems, QString& errorString) { QJsonParseError jsonParseError; QJsonDocument jsonDoc(QJsonDocument::fromJson(bytes, &jsonParseError)); @@ -274,52 +290,81 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectL return false; } - // Simple items - if (json.contains(jsonSimpleItemsKey)) { - QJsonArray itemArray(json[jsonSimpleItemsKey].toArray()); - foreach (const QJsonValue& itemValue, itemArray) { - if (!itemValue.isObject()) { - errorString = QStringLiteral("Mission item is not an object"); - return false; - } + // Read complex items + QJsonArray complexArray(json[_jsonComplexItemsKey].toArray()); + qCDebug(MissionControllerLog) << "Json load: complex item count" << complexArray.count(); + for (int i=0; iload(itemValue.toObject(), errorString)) { - missionItems->append(item); - } else { - return false; - } + if (!itemValue.isObject()) { + errorString = QStringLiteral("Mission item is not an object"); + return false; + } + + ComplexMissionItem* item = new ComplexMissionItem(_activeVehicle, this); + if (item->load(itemValue.toObject(), errorString)) { + qCDebug(MissionControllerLog) << "Json load: complex item start:stop" << item->sequenceNumber() << item->lastSequenceNumber(); + complexItems->append(item); + } else { + return false; } } - // Complex items - if (json.contains(_jsonComplexItemsKey)) { - QJsonArray itemArray(json[_jsonComplexItemsKey].toArray()); - foreach (const QJsonValue& itemValue, itemArray) { + // Read simple items, interspersing complex items into the full list + + int nextSimpleItemIndex= 0; + int nextComplexItemIndex= 0; + int nextSequenceNumber = 1; // Start with 1 since home is in 0 + QJsonArray itemArray(json[jsonSimpleItemsKey].toArray()); + + qCDebug(MissionControllerLog) << "Json load: simple item loop start simpleItemCount:ComplexItemCount" << itemArray.count() << complexItems->count(); + do { + qCDebug(MissionControllerLog) << "Json load: simple item loop nextSimpleItemIndex:nextComplexItemIndex:nextSequenceNumber" << nextSimpleItemIndex << nextComplexItemIndex << nextSequenceNumber; + + // If there is a complex item that should be next in sequence add it in + if (nextComplexItemIndex < complexItems->count()) { + ComplexMissionItem* complexItem = qobject_cast(complexItems->get(nextComplexItemIndex)); + + if (complexItem->sequenceNumber() == nextSequenceNumber) { + qCDebug(MissionControllerLog) << "Json load: injecting complex item expectedSequence:actualSequence:" << nextSequenceNumber << complexItem->sequenceNumber(); + visualItems->append(complexItem); + nextSequenceNumber = complexItem->lastSequenceNumber() + 1; + nextComplexItemIndex++; + continue; + } + } + + // Add the next available simple item + if (nextSimpleItemIndex < itemArray.count()) { + const QJsonValue& itemValue = itemArray[nextSimpleItemIndex++]; + if (!itemValue.isObject()) { errorString = QStringLiteral("Mission item is not an object"); return false; } - ComplexMissionItem* item = new ComplexMissionItem(_activeVehicle, this); + SimpleMissionItem* item = new SimpleMissionItem(_activeVehicle, this); if (item->load(itemValue.toObject(), errorString)) { - missionItems->append(item); + qCDebug(MissionControllerLog) << "Json load: adding simple item expectedSequence:actualSequence" << nextSequenceNumber << item->sequenceNumber(); + visualItems->append(item); } else { return false; } + + nextSequenceNumber++; } - } + } while (nextSimpleItemIndex < itemArray.count() | nextComplexItemIndex < complexItems->count()); if (json.contains(_jsonPlannedHomePositionKey)) { SimpleMissionItem* item = new SimpleMissionItem(_activeVehicle, this); if (item->load(json[_jsonPlannedHomePositionKey].toObject(), errorString)) { - missionItems->insert(0, item); + visualItems->insert(0, item); } else { return false; } } else { - _addPlannedHomePosition(missionItems, true /* addToCenter */); + _addPlannedHomePosition(visualItems, true /* addToCenter */); } return true; @@ -383,7 +428,8 @@ void MissionController::_loadMissionFromFile(const QString& filename) return; } - QmlObjectListModel* newMissionItems = new QmlObjectListModel(this); + QmlObjectListModel* newVisualItems = new QmlObjectListModel(this); + QmlObjectListModel* newComplexItems = new QmlObjectListModel(this); QFile file(filename); @@ -396,14 +442,22 @@ void MissionController::_loadMissionFromFile(const QString& filename) QString firstLine = stream.readLine(); if (firstLine.contains(QRegExp("QGC.*WPL"))) { stream.seek(0); - _loadTextMissionFile(stream, newMissionItems, errorString); + _loadTextMissionFile(stream, newVisualItems, errorString); } else { - _loadJsonMissionFile(bytes, newMissionItems, errorString); + _loadJsonMissionFile(bytes, newVisualItems, newComplexItems, errorString); } } if (!errorString.isEmpty()) { - delete newMissionItems; + for (int i=0; icount(); i++) { + newVisualItems->get(i)->deleteLater(); + } + for (int i=0; icount(); i++) { + newComplexItems->get(i)->deleteLater(); + } + delete newVisualItems; + delete newComplexItems; + qgcApp()->showMessage(errorString); return; } @@ -412,7 +466,13 @@ void MissionController::_loadMissionFromFile(const QString& filename) _deinitAllVisualItems(); _visualItems->deleteListAndContents(); } - _visualItems = newMissionItems; + if (_complexItems) { + _complexItems->deleteLater(); + } + + _visualItems = newVisualItems; + _complexItems = newComplexItems; + if (_visualItems->count() == 0) { _addPlannedHomePosition(_visualItems, true /* addToCenter */); } @@ -647,7 +707,7 @@ void MissionController::_recalcWaypointLines(void) item->setAltDifference(altDifference); item->setAzimuth(azimuth); item->setDistance(distance); - _waypointLines.append(new CoordinateVector(lastCoordinateItem->coordinate(), item->coordinate())); + _waypointLines.append(new CoordinateVector(lastCoordinateItem->isSimpleItem() ? lastCoordinateItem->coordinate() : lastCoordinateItem->exitCoordinate(), item->coordinate())); } lastCoordinateItem = item; } @@ -689,7 +749,7 @@ void MissionController::_recalcSequence(void) ComplexMissionItem* complexItem = qobject_cast(item); if (complexItem) { - sequenceNumber = complexItem->nextSequenceNumber(); + sequenceNumber = complexItem->lastSequenceNumber() + 1; } else { qWarning() << "isSimpleItem == false, yet not ComplexMissionItem"; } @@ -748,8 +808,6 @@ void MissionController::_initAllVisualItems(void) homeItem->setShowHomePosition(true); } - qDebug() << "home item" << homeItem->coordinate(); - QmlObjectListModel* newComplexItems = new QmlObjectListModel(this); for (int i=0; i<_visualItems->count(); i++) { VisualMissionItem* item = qobject_cast(_visualItems->get(i)); @@ -796,6 +854,7 @@ void MissionController::_initVisualItem(VisualMissionItem* visualItem) _visualItems->setDirty(false); connect(visualItem, &VisualMissionItem::coordinateChanged, this, &MissionController::_itemCoordinateChanged); + connect(visualItem, &VisualMissionItem::specifiesCoordinateChanged, this, &MissionController::_recalcWaypointLines); connect(visualItem, &VisualMissionItem::coordinateHasRelativeAltitudeChanged, this, &MissionController::_recalcWaypointLines); connect(visualItem, &VisualMissionItem::exitCoordinateHasRelativeAltitudeChanged, this, &MissionController::_recalcWaypointLines); @@ -921,7 +980,6 @@ void MissionController::_dirtyChanged(bool dirty) void MissionController::_autoSyncSend(void) { - qDebug() << "Auto-syncing with vehicle"; _queuedSend = false; if (_visualItems) { sendMissionItems(); diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 5e5b33c7bf034779f29d95140a32bd908d846ebc..05dd1a3e881b331d5a9522a811afd6fb5beb90bf 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -113,10 +113,11 @@ private: void _addPlannedHomePosition(QmlObjectListModel* visualItems, bool addToCenter); double _normalizeLat(double lat); double _normalizeLon(double lon); - bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* visualItems, QString& errorString); + bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* visualItems, QmlObjectListModel* complexItems, QString& errorString); bool _loadTextMissionFile(QTextStream& stream, QmlObjectListModel* visualItems, QString& errorString); void _loadMissionFromFile(const QString& file); void _saveMissionToFile(const QString& file); + int _nextSequenceNumber(void); private: bool _editMode; diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index 72d8a270b2244bd081726bbea423fdc0cd5792ee..1141011d23a17be5e68931cd617b9081fea57d5d 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -190,6 +190,9 @@ void SimpleMissionItem::_connectSignals(void) // These fact signals must alway signal out through SimpleMissionItem signals connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCommandChanged); connect(&_missionItem._frameFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendFrameChanged); + + // Sequence number is kept in mission iteem, so we need to propogate signal up as well + connect(&_missionItem, &MissionItem::sequenceNumberChanged, this, &SimpleMissionItem::sequenceNumberChanged); } void SimpleMissionItem::_setupMetaData(void) @@ -574,7 +577,6 @@ void SimpleMissionItem::setCommand(MavlinkQmlSingleton::Qml_MAV_CMD command) void SimpleMissionItem::setCoordinate(const QGeoCoordinate& coordinate) { if (_missionItem.coordinate() != coordinate) { - qDebug() << _missionItem.coordinate() << coordinate; _missionItem.setCoordinate(coordinate); } } @@ -582,5 +584,4 @@ void SimpleMissionItem::setCoordinate(const QGeoCoordinate& coordinate) void SimpleMissionItem::setSequenceNumber(int sequenceNumber) { _missionItem.setSequenceNumber(sequenceNumber); - VisualMissionItem::setSequenceNumber(sequenceNumber); } diff --git a/src/MissionManager/SimpleMissionItem.h b/src/MissionManager/SimpleMissionItem.h index 984e1c13247228b5ddb23c42dc8360713bbfc602..0e6ed0bc8f84c7178a6e6bb99b15b7071c7813d9 100644 --- a/src/MissionManager/SimpleMissionItem.h +++ b/src/MissionManager/SimpleMissionItem.h @@ -101,6 +101,7 @@ public: QString commandName (void) const final; QGeoCoordinate coordinate (void) const final { return _missionItem.coordinate(); } QGeoCoordinate exitCoordinate (void) const final { return coordinate(); } + int sequenceNumber (void) const final { return _missionItem.sequenceNumber(); } bool coordinateHasRelativeAltitude (void) const final { return _missionItem.relativeAltitude(); } bool exitCoordinateHasRelativeAltitude (void) const final { return coordinateHasRelativeAltitude(); } diff --git a/src/MissionManager/VisualMissionItem.cc b/src/MissionManager/VisualMissionItem.cc index 8dc0befd0dd666c2858e236fce77ea47624da8ce..9362e028748c75de73d2bf62b58948bf258dcea7 100644 --- a/src/MissionManager/VisualMissionItem.cc +++ b/src/MissionManager/VisualMissionItem.cc @@ -31,7 +31,6 @@ This file is part of the QGROUNDCONTROL project VisualMissionItem::VisualMissionItem(Vehicle* vehicle, QObject* parent) : QObject(parent) , _vehicle(vehicle) - , _sequenceNumber(0) , _isCurrentItem(false) , _dirty(false) , _altDifference(0.0) @@ -45,7 +44,6 @@ VisualMissionItem::VisualMissionItem(Vehicle* vehicle, QObject* parent) VisualMissionItem::VisualMissionItem(const VisualMissionItem& other, QObject* parent) : QObject(parent) , _vehicle(NULL) - , _sequenceNumber(0) , _isCurrentItem(false) , _dirty(false) , _altDifference(0.0) @@ -60,7 +58,6 @@ const VisualMissionItem& VisualMissionItem::operator=(const VisualMissionItem& o { _vehicle = other._vehicle; - setSequenceNumber(other._sequenceNumber); setIsCurrentItem(other._isCurrentItem); setDirty(other._dirty); setAltDifference(other._altDifference); @@ -106,11 +103,3 @@ void VisualMissionItem::setAzimuth(double azimuth) _azimuth = azimuth; emit azimuthChanged(_azimuth); } - -void VisualMissionItem::setSequenceNumber (int sequenceNumber) -{ - if (_sequenceNumber != sequenceNumber) { - _sequenceNumber = sequenceNumber; - emit sequenceNumberChanged(_sequenceNumber); - } -} diff --git a/src/MissionManager/VisualMissionItem.h b/src/MissionManager/VisualMissionItem.h index 5e553ee69de7c23ecff21a0ac89d7474277d7f19..61beb7844ec224ecfea3efe3485a1eaa5ac27f89 100644 --- a/src/MissionManager/VisualMissionItem.h +++ b/src/MissionManager/VisualMissionItem.h @@ -99,7 +99,6 @@ public: double azimuth (void) const { return _azimuth; } double distance (void) const { return _distance; } bool isCurrentItem (void) const { return _isCurrentItem; } - int sequenceNumber (void) const { return _sequenceNumber; } QmlObjectListModel* childItems(void) { return &_childItems; } @@ -111,10 +110,6 @@ public: Vehicle* vehicle(void) { return _vehicle; } - // Virtuals which may be overriden by derived classes - - virtual void setSequenceNumber(int sequenceNumber); - // Pure virtuals which must be provides by derived classes virtual bool dirty (void) const = 0; @@ -125,6 +120,7 @@ public: virtual QString commandName (void) const = 0; virtual QGeoCoordinate coordinate (void) const = 0; virtual QGeoCoordinate exitCoordinate (void) const = 0; + virtual int sequenceNumber (void) const = 0; virtual bool coordinateHasRelativeAltitude (void) const = 0; virtual bool exitCoordinateHasRelativeAltitude (void) const = 0; @@ -132,6 +128,7 @@ public: virtual void setDirty (bool dirty) = 0; virtual void setCoordinate (const QGeoCoordinate& coordinate) = 0; + virtual void setSequenceNumber (int sequenceNumber) = 0; /// Save the item(s) in Json format /// @param saveObject Save the item to this json object @@ -159,7 +156,6 @@ signals: protected: Vehicle* _vehicle; - int _sequenceNumber; bool _isCurrentItem; bool _dirty; double _altDifference; ///< Difference in altitude from previous waypoint