Unverified Commit bf9dbefb authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #7782 from DonLakeFlyer/MissionControllerRecalc

Mission controller recalc
parents c850bd92 06823adf
...@@ -1110,9 +1110,14 @@ void MissionController::_recalcWaypointLines(void) ...@@ -1110,9 +1110,14 @@ void MissionController::_recalcWaypointLines(void)
qCDebug(MissionControllerLog) << "_recalcWaypointLines homePositionValid" << homePositionValid; qCDebug(MissionControllerLog) << "_recalcWaypointLines homePositionValid" << homePositionValid;
CoordVectHashTable old_table = _linesTable; CoordVectHashTable old_table = _linesTable;
_linesTable.clear(); _linesTable.clear();
_waypointLines.clear();
_waypointPath.clear(); _waypointPath.clear();
_waypointLines.beginReset();
_directionArrows.beginReset();
_waypointLines.clear();
_directionArrows.clear(); _directionArrows.clear();
bool linkEndToHome; bool linkEndToHome;
...@@ -1150,7 +1155,10 @@ void MissionController::_recalcWaypointLines(void) ...@@ -1150,7 +1155,10 @@ void MissionController::_recalcWaypointLines(void)
lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItem, item); lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItem, item);
if (!_flyView || addDirectionArrow) { if (!_flyView || addDirectionArrow) {
_directionArrows.append(_addWaypointLineSegment(old_table, lastSegmentVisualItemPair)); CoordinateVector* coordVector = _addWaypointLineSegment(old_table, lastSegmentVisualItemPair);
if (addDirectionArrow) {
_directionArrows.append(coordVector);
}
} }
} }
firstCoordinateItem = false; firstCoordinateItem = false;
...@@ -1205,6 +1213,9 @@ void MissionController::_recalcWaypointLines(void) ...@@ -1205,6 +1213,9 @@ void MissionController::_recalcWaypointLines(void)
_waypointLines.swapObjectList(objs); _waypointLines.swapObjectList(objs);
} }
_waypointLines.endReset();
_directionArrows.endReset();
// Anything left in the old table is an obsolete line object that can go // Anything left in the old table is an obsolete line object that can go
qDeleteAll(old_table); qDeleteAll(old_table);
...@@ -1218,7 +1229,6 @@ void MissionController::_recalcWaypointLines(void) ...@@ -1218,7 +1229,6 @@ void MissionController::_recalcWaypointLines(void)
_waypointPath.append(QVariant::fromValue(QGeoCoordinate(0, 0))); _waypointPath.append(QVariant::fromValue(QGeoCoordinate(0, 0)));
} }
emit waypointLinesChanged();
emit waypointPathChanged(); emit waypointPathChanged();
} }
......
...@@ -68,7 +68,7 @@ public: ...@@ -68,7 +68,7 @@ public:
} MissionFlightStatus_t; } MissionFlightStatus_t;
Q_PROPERTY(QmlObjectListModel* visualItems READ visualItems NOTIFY visualItemsChanged) Q_PROPERTY(QmlObjectListModel* visualItems READ visualItems NOTIFY visualItemsChanged)
Q_PROPERTY(QmlObjectListModel* waypointLines READ waypointLines NOTIFY waypointLinesChanged) ///< Used by Plan view only for interactive editing Q_PROPERTY(QmlObjectListModel* waypointLines READ waypointLines CONSTANT) ///< Used by Plan view only for interactive editing
Q_PROPERTY(QVariantList waypointPath READ waypointPath NOTIFY waypointPathChanged) ///< Used by Fly view only for static display Q_PROPERTY(QVariantList waypointPath READ waypointPath NOTIFY waypointPathChanged) ///< Used by Fly view only for static display
Q_PROPERTY(QmlObjectListModel* directionArrows READ directionArrows CONSTANT) Q_PROPERTY(QmlObjectListModel* directionArrows READ directionArrows CONSTANT)
Q_PROPERTY(QStringList complexMissionItemNames READ complexMissionItemNames NOTIFY complexMissionItemNamesChanged) Q_PROPERTY(QStringList complexMissionItemNames READ complexMissionItemNames NOTIFY complexMissionItemNamesChanged)
...@@ -206,7 +206,6 @@ public: ...@@ -206,7 +206,6 @@ public:
signals: signals:
void visualItemsChanged (void); void visualItemsChanged (void);
void waypointLinesChanged (void);
void waypointPathChanged (void); void waypointPathChanged (void);
void newItemsFromVehicle (void); void newItemsFromVehicle (void);
void missionDistanceChanged (double missionDistance); void missionDistanceChanged (double missionDistance);
......
...@@ -48,7 +48,6 @@ void MissionControllerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareType) ...@@ -48,7 +48,6 @@ void MissionControllerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareType)
// MissionController signals // MissionController signals
_rgMissionControllerSignals[visualItemsChangedSignalIndex] = SIGNAL(visualItemsChanged()); _rgMissionControllerSignals[visualItemsChangedSignalIndex] = SIGNAL(visualItemsChanged());
_rgMissionControllerSignals[waypointLinesChangedSignalIndex] = SIGNAL(waypointLinesChanged());
// Master controller pulls offline vehicle info from settings // Master controller pulls offline vehicle info from settings
qgcApp()->toolbox()->settingsManager()->appSettings()->offlineEditingFirmwareType()->setRawValue(firmwareType); qgcApp()->toolbox()->settingsManager()->appSettings()->offlineEditingFirmwareType()->setRawValue(firmwareType);
...@@ -62,7 +61,7 @@ void MissionControllerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareType) ...@@ -62,7 +61,7 @@ void MissionControllerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareType)
_masterController->start(false /* flyView */); _masterController->start(false /* flyView */);
// All signals should some through on start // All signals should some through on start
QCOMPARE(_multiSpyMissionController->checkOnlySignalsByMask(visualItemsChangedSignalMask | waypointLinesChangedSignalMask), true); QCOMPARE(_multiSpyMissionController->checkOnlySignalsByMask(visualItemsChangedSignalMask), true);
_multiSpyMissionController->clearAllSignals(); _multiSpyMissionController->clearAllSignals();
QmlObjectListModel* visualItems = _missionController->visualItems(); QmlObjectListModel* visualItems = _missionController->visualItems();
...@@ -120,8 +119,6 @@ void MissionControllerTest::_testAddWaypointWorker(MAV_AUTOPILOT firmwareType) ...@@ -120,8 +119,6 @@ void MissionControllerTest::_testAddWaypointWorker(MAV_AUTOPILOT firmwareType)
_missionController->insertSimpleMissionItem(coordinate, _missionController->visualItems()->count()); _missionController->insertSimpleMissionItem(coordinate, _missionController->visualItems()->count());
QCOMPARE(_multiSpyMissionController->checkOnlySignalsByMask(waypointLinesChangedSignalMask), true);
QmlObjectListModel* visualItems = _missionController->visualItems(); QmlObjectListModel* visualItems = _missionController->visualItems();
QVERIFY(visualItems); QVERIFY(visualItems);
......
...@@ -70,13 +70,11 @@ private: ...@@ -70,13 +70,11 @@ private:
enum { enum {
visualItemsChangedSignalIndex = 0, visualItemsChangedSignalIndex = 0,
waypointLinesChangedSignalIndex,
missionControllerMaxSignalIndex missionControllerMaxSignalIndex
}; };
enum { enum {
visualItemsChangedSignalMask = 1 << visualItemsChangedSignalIndex, visualItemsChangedSignalMask = 1 << visualItemsChangedSignalIndex,
waypointLinesChangedSignalMask = 1 << waypointLinesChangedSignalIndex,
}; };
MultiSignalSpy* _multiSpyMissionController; MultiSignalSpy* _multiSpyMissionController;
......
...@@ -20,9 +20,10 @@ const int QmlObjectListModel::ObjectRole = Qt::UserRole; ...@@ -20,9 +20,10 @@ const int QmlObjectListModel::ObjectRole = Qt::UserRole;
const int QmlObjectListModel::TextRole = Qt::UserRole + 1; const int QmlObjectListModel::TextRole = Qt::UserRole + 1;
QmlObjectListModel::QmlObjectListModel(QObject* parent) QmlObjectListModel::QmlObjectListModel(QObject* parent)
: QAbstractListModel(parent) : QAbstractListModel (parent)
, _dirty(false) , _dirty (false)
, _skipDirtyFirstItem(false) , _skipDirtyFirstItem (false)
, _externalBeginResetModel (false)
{ {
} }
...@@ -142,8 +143,13 @@ const QObject* QmlObjectListModel::operator[](int index) const ...@@ -142,8 +143,13 @@ const QObject* QmlObjectListModel::operator[](int index) const
void QmlObjectListModel::clear() void QmlObjectListModel::clear()
{ {
while (rowCount()) { if (!_externalBeginResetModel) {
removeAt(0); beginResetModel();
}
_objectList.clear();
if (!_externalBeginResetModel) {
endResetModel();
emit countChanged(count());
} }
} }
...@@ -221,10 +227,14 @@ void QmlObjectListModel::append(QList<QObject*> objects) ...@@ -221,10 +227,14 @@ void QmlObjectListModel::append(QList<QObject*> objects)
QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist) QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist)
{ {
QObjectList oldlist(_objectList); QObjectList oldlist(_objectList);
beginResetModel(); if (!_externalBeginResetModel) {
beginResetModel();
}
_objectList = newlist; _objectList = newlist;
endResetModel(); if (!_externalBeginResetModel) {
emit countChanged(count()); endResetModel();
emit countChanged(count());
}
return oldlist; return oldlist;
} }
...@@ -274,3 +284,21 @@ void QmlObjectListModel::clearAndDeleteContents() ...@@ -274,3 +284,21 @@ void QmlObjectListModel::clearAndDeleteContents()
clear(); clear();
endResetModel(); endResetModel();
} }
void QmlObjectListModel::beginReset(void)
{
if (_externalBeginResetModel) {
qWarning() << "QmlObjectListModel::beginReset already set";
}
_externalBeginResetModel = true;
beginResetModel();
}
void QmlObjectListModel::endReset(void)
{
if (!_externalBeginResetModel) {
qWarning() << "QmlObjectListModel::endReset begin not set";
}
_externalBeginResetModel = false;
endResetModel();
}
...@@ -33,6 +33,7 @@ public: ...@@ -33,6 +33,7 @@ public:
int count () const; int count () const;
bool dirty () const { return _dirty; } bool dirty () const { return _dirty; }
void setDirty (bool dirty); void setDirty (bool dirty);
void append (QObject* object); void append (QObject* object);
void append (QList<QObject*> objects); void append (QList<QObject*> objects);
...@@ -56,8 +57,8 @@ public: ...@@ -56,8 +57,8 @@ public:
/// Clears the list and calls deleteLater on each entry /// Clears the list and calls deleteLater on each entry
void clearAndDeleteContents (); void clearAndDeleteContents ();
void beginReset () { beginResetModel(); } void beginReset ();
void endReset () { endResetModel(); } void endReset ();
signals: signals:
void countChanged (int count); void countChanged (int count);
...@@ -80,6 +81,7 @@ private: ...@@ -80,6 +81,7 @@ private:
bool _dirty; bool _dirty;
bool _skipDirtyFirstItem; bool _skipDirtyFirstItem;
bool _externalBeginResetModel;
static const int ObjectRole; static const int ObjectRole;
static const int TextRole; static const int TextRole;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment