@@ -72,7 +72,7 @@ void MissionController::start(bool editMode)
72
72
73
73
// We start with an empty mission
74
74
_missionItems = new QmlObjectListModel (this );
75
- _addPlannedHomePosition (false /* addToCenter */ );
75
+ _addPlannedHomePosition (_missionItems, false /* addToCenter */ );
76
76
_initAllMissionItems ();
77
77
}
78
78
@@ -94,7 +94,7 @@ void MissionController::_newMissionItemsAvailableFromVehicle(void)
94
94
qCDebug (MissionControllerLog) << " loading from vehicle count" << _missionItems->count ();
95
95
96
96
if (!_activeVehicle->firmwarePlugin ()->sendHomePositionToVehicle () || _missionItems->count () == 0 ) {
97
- _addPlannedHomePosition (true /* addToCenter */ );
97
+ _addPlannedHomePosition (_missionItems, true /* addToCenter */ );
98
98
}
99
99
100
100
_missionItemsRequested = false ;
@@ -176,14 +176,16 @@ void MissionController::removeMissionItem(int index)
176
176
void MissionController::removeAllMissionItems (void )
177
177
{
178
178
if (_missionItems) {
179
- while (_missionItems->count () != 1 ) {
180
- removeMissionItem (_missionItems->count () - 1 );
181
- }
179
+ QmlObjectListModel* oldItems = _missionItems;
180
+ _missionItems = new QmlObjectListModel (this );
181
+ _addPlannedHomePosition (_missionItems, false /* addToCenter */ );
182
+ _initAllMissionItems ();
183
+ oldItems->deleteLater ();
182
184
}
183
185
}
184
186
185
187
#ifndef __mobile__
186
- bool MissionController::_loadJsonMissionFile (const QByteArray& bytes, QString& errorString)
188
+ bool MissionController::_loadJsonMissionFile (const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString)
187
189
{
188
190
QJsonParseError jsonParseError;
189
191
QJsonDocument jsonDoc (QJsonDocument::fromJson (bytes, &jsonParseError));
@@ -219,7 +221,7 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& e
219
221
220
222
MissionItem* item = new MissionItem (_activeVehicle, this );
221
223
if (item->load (itemValue.toObject (), errorString)) {
222
- _missionItems ->append (item);
224
+ missionItems ->append (item);
223
225
} else {
224
226
return false ;
225
227
}
@@ -230,20 +232,20 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& e
230
232
MissionItem* item = new MissionItem (_activeVehicle, this );
231
233
232
234
if (item->load (json[_jsonPlannedHomePositionKey].toObject (), errorString)) {
233
- _missionItems ->insert (0 , item);
235
+ missionItems ->insert (0 , item);
234
236
} else {
235
237
return false ;
236
238
}
237
239
} else {
238
- _addPlannedHomePosition (true /* addToCenter */ );
240
+ _addPlannedHomePosition (missionItems, true /* addToCenter */ );
239
241
}
240
242
241
243
return true ;
242
244
}
243
245
#endif
244
246
245
247
#ifndef __mobile__
246
- bool MissionController::_loadTextMissionFile (QTextStream& stream, QString& errorString)
248
+ bool MissionController::_loadTextMissionFile (QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString)
247
249
{
248
250
bool addPlannedHomePosition = false ;
249
251
@@ -267,7 +269,7 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& error
267
269
MissionItem* item = new MissionItem (_activeVehicle, this );
268
270
269
271
if (item->load (stream)) {
270
- _missionItems ->append (item);
272
+ missionItems ->append (item);
271
273
} else {
272
274
errorString = QStringLiteral (" The mission file is corrupted." );
273
275
return false ;
@@ -278,12 +280,12 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& error
278
280
return false ;
279
281
}
280
282
281
- if (addPlannedHomePosition || _missionItems ->count () == 0 ) {
282
- _addPlannedHomePosition (true /* addToCenter */ );
283
+ if (addPlannedHomePosition || missionItems ->count () == 0 ) {
284
+ _addPlannedHomePosition (missionItems, true /* addToCenter */ );
283
285
284
286
// Update sequence numbers in DO_JUMP commands to take into account added home position
285
- for (int i=1 ; i<_missionItems ->count (); i++) {
286
- MissionItem* item = qobject_cast<MissionItem*>(_missionItems ->get (i));
287
+ for (int i=1 ; i<missionItems ->count (); i++) {
288
+ MissionItem* item = qobject_cast<MissionItem*>(missionItems ->get (i));
287
289
if (item->command () == MavlinkQmlSingleton::MAV_CMD_DO_JUMP) {
288
290
// Home is in position 0
289
291
item->setParam1 ((int )item->param1 () + 1 );
@@ -305,11 +307,7 @@ void MissionController::loadMissionFromFile(void)
305
307
return ;
306
308
}
307
309
308
- if (_missionItems) {
309
- _deinitAllMissionItems ();
310
- _missionItems->deleteLater ();
311
- }
312
- _missionItems = new QmlObjectListModel (this );
310
+ QmlObjectListModel* newMissionItems = new QmlObjectListModel (this );
313
311
314
312
QFile file (filename);
315
313
@@ -322,19 +320,25 @@ void MissionController::loadMissionFromFile(void)
322
320
QString firstLine = stream.readLine ();
323
321
if (firstLine.contains (QRegExp (" QGC.*WPL" ))) {
324
322
stream.seek (0 );
325
- _loadTextMissionFile (stream, errorString);
323
+ _loadTextMissionFile (stream, newMissionItems, errorString);
326
324
} else {
327
- _loadJsonMissionFile (bytes, errorString);
325
+ _loadJsonMissionFile (bytes, newMissionItems, errorString);
328
326
}
329
327
}
330
328
331
329
if (!errorString.isEmpty ()) {
332
- _missionItems-> clear () ;
330
+ delete newMissionItems ;
333
331
qgcApp ()->showMessage (errorString);
332
+ return ;
334
333
}
335
334
335
+ if (_missionItems) {
336
+ _deinitAllMissionItems ();
337
+ _missionItems->deleteLater ();
338
+ }
339
+ _missionItems = newMissionItems;
336
340
if (_missionItems->count () == 0 ) {
337
- _addPlannedHomePosition (true /* addToCenter */ );
341
+ _addPlannedHomePosition (_missionItems, true /* addToCenter */ );
338
342
}
339
343
340
344
_initAllMissionItems ();
@@ -786,21 +790,21 @@ double MissionController::_normalizeLon(double lon)
786
790
}
787
791
788
792
// / Add the home position item to the front of the list
789
- void MissionController::_addPlannedHomePosition (bool addToCenter)
793
+ void MissionController::_addPlannedHomePosition (QmlObjectListModel* missionItems, bool addToCenter)
790
794
{
791
795
MissionItem* homeItem = new MissionItem (_activeVehicle, this );
792
- _missionItems ->insert (0 , homeItem);
796
+ missionItems ->insert (0 , homeItem);
793
797
794
- if (_missionItems ->count () > 1 && addToCenter) {
795
- MissionItem* item = qobject_cast<MissionItem*>(_missionItems ->get (1 ));
798
+ if (missionItems ->count () > 1 && addToCenter) {
799
+ MissionItem* item = qobject_cast<MissionItem*>(missionItems ->get (1 ));
796
800
797
801
double north = _normalizeLat (item->coordinate ().latitude ());
798
802
double south = north;
799
803
double east = _normalizeLon (item->coordinate ().longitude ());
800
804
double west = east;
801
805
802
- for (int i=2 ; i<_missionItems ->count (); i++) {
803
- item = qobject_cast<MissionItem*>(_missionItems ->get (i));
806
+ for (int i=2 ; i<missionItems ->count (); i++) {
807
+ item = qobject_cast<MissionItem*>(missionItems ->get (i));
804
808
805
809
double lat = _normalizeLat (item->coordinate ().latitude ());
806
810
double lon = _normalizeLon (item->coordinate ().longitude ());
0 commit comments