Skip to content

Commit e7c8878

Browse files
committed
Correctly handle large numbers of waypoints
1 parent 4aff412 commit e7c8878

9 files changed

+16000
-162
lines changed

src/MissionEditor/MissionEditor.qml

+24-7
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,7 @@ QGCView {
383383
spacing: _margin / 2
384384
orientation: ListView.Vertical
385385
model: controller.missionItems
386-
387-
property real _maxItemHeight: 0
386+
cacheBuffer: height * 2
388387

389388
delegate: MissionItemEditor {
390389
missionItem: object
@@ -399,11 +398,6 @@ QGCView {
399398
controller.removeMissionItem(object.sequenceNumber)
400399
}
401400

402-
onRemoveAll: {
403-
itemDragger.clearItem()
404-
controller.removeAllMissionItems()
405-
}
406-
407401
onInsert: {
408402
controller.insertMissionItem(editorMap.center, i)
409403
setCurrentItem(i)
@@ -601,6 +595,20 @@ QGCView {
601595
}
602596
}
603597

598+
Component {
599+
id: removeAllPromptDialog
600+
601+
QGCViewMessage {
602+
message: "Are you sure you want to delete all mission items?"
603+
604+
function accept() {
605+
itemDragger.clearItem()
606+
controller.removeAllMissionItems()
607+
hideDialog()
608+
}
609+
}
610+
}
611+
604612
Component {
605613
id: syncDropDownComponent
606614

@@ -671,6 +679,15 @@ QGCView {
671679
}
672680
}
673681
}
682+
683+
QGCButton {
684+
text: "Remove all"
685+
onClicked: {
686+
syncButton.hideDropDown()
687+
_root.showDialog(removeAllPromptDialog, "Delete all", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No)
688+
}
689+
}
690+
674691
/*
675692
FIXME: autoSync is temporarily disconnected since it's still buggy
676693

src/MissionManager/MissionController.cc

+34-30
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void MissionController::start(bool editMode)
7272

7373
// We start with an empty mission
7474
_missionItems = new QmlObjectListModel(this);
75-
_addPlannedHomePosition(false /* addToCenter */);
75+
_addPlannedHomePosition(_missionItems, false /* addToCenter */);
7676
_initAllMissionItems();
7777
}
7878

@@ -94,7 +94,7 @@ void MissionController::_newMissionItemsAvailableFromVehicle(void)
9494
qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count();
9595

9696
if (!_activeVehicle->firmwarePlugin()->sendHomePositionToVehicle() || _missionItems->count() == 0) {
97-
_addPlannedHomePosition(true /* addToCenter */);
97+
_addPlannedHomePosition(_missionItems,true /* addToCenter */);
9898
}
9999

100100
_missionItemsRequested = false;
@@ -176,14 +176,16 @@ void MissionController::removeMissionItem(int index)
176176
void MissionController::removeAllMissionItems(void)
177177
{
178178
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();
182184
}
183185
}
184186

185187
#ifndef __mobile__
186-
bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& errorString)
188+
bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString)
187189
{
188190
QJsonParseError jsonParseError;
189191
QJsonDocument jsonDoc(QJsonDocument::fromJson(bytes, &jsonParseError));
@@ -219,7 +221,7 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& e
219221

220222
MissionItem* item = new MissionItem(_activeVehicle, this);
221223
if (item->load(itemValue.toObject(), errorString)) {
222-
_missionItems->append(item);
224+
missionItems->append(item);
223225
} else {
224226
return false;
225227
}
@@ -230,20 +232,20 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& e
230232
MissionItem* item = new MissionItem(_activeVehicle, this);
231233

232234
if (item->load(json[_jsonPlannedHomePositionKey].toObject(), errorString)) {
233-
_missionItems->insert(0, item);
235+
missionItems->insert(0, item);
234236
} else {
235237
return false;
236238
}
237239
} else {
238-
_addPlannedHomePosition(true /* addToCenter */);
240+
_addPlannedHomePosition(missionItems, true /* addToCenter */);
239241
}
240242

241243
return true;
242244
}
243245
#endif
244246

245247
#ifndef __mobile__
246-
bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& errorString)
248+
bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString)
247249
{
248250
bool addPlannedHomePosition = false;
249251

@@ -267,7 +269,7 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& error
267269
MissionItem* item = new MissionItem(_activeVehicle, this);
268270

269271
if (item->load(stream)) {
270-
_missionItems->append(item);
272+
missionItems->append(item);
271273
} else {
272274
errorString = QStringLiteral("The mission file is corrupted.");
273275
return false;
@@ -278,12 +280,12 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& error
278280
return false;
279281
}
280282

281-
if (addPlannedHomePosition || _missionItems->count() == 0) {
282-
_addPlannedHomePosition(true /* addToCenter */);
283+
if (addPlannedHomePosition || missionItems->count() == 0) {
284+
_addPlannedHomePosition(missionItems, true /* addToCenter */);
283285

284286
// 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));
287289
if (item->command() == MavlinkQmlSingleton::MAV_CMD_DO_JUMP) {
288290
// Home is in position 0
289291
item->setParam1((int)item->param1() + 1);
@@ -305,11 +307,7 @@ void MissionController::loadMissionFromFile(void)
305307
return;
306308
}
307309

308-
if (_missionItems) {
309-
_deinitAllMissionItems();
310-
_missionItems->deleteLater();
311-
}
312-
_missionItems = new QmlObjectListModel(this);
310+
QmlObjectListModel* newMissionItems = new QmlObjectListModel(this);
313311

314312
QFile file(filename);
315313

@@ -322,19 +320,25 @@ void MissionController::loadMissionFromFile(void)
322320
QString firstLine = stream.readLine();
323321
if (firstLine.contains(QRegExp("QGC.*WPL"))) {
324322
stream.seek(0);
325-
_loadTextMissionFile(stream, errorString);
323+
_loadTextMissionFile(stream, newMissionItems, errorString);
326324
} else {
327-
_loadJsonMissionFile(bytes, errorString);
325+
_loadJsonMissionFile(bytes, newMissionItems, errorString);
328326
}
329327
}
330328

331329
if (!errorString.isEmpty()) {
332-
_missionItems->clear();
330+
delete newMissionItems;
333331
qgcApp()->showMessage(errorString);
332+
return;
334333
}
335334

335+
if (_missionItems) {
336+
_deinitAllMissionItems();
337+
_missionItems->deleteLater();
338+
}
339+
_missionItems = newMissionItems;
336340
if (_missionItems->count() == 0) {
337-
_addPlannedHomePosition(true /* addToCenter */);
341+
_addPlannedHomePosition(_missionItems, true /* addToCenter */);
338342
}
339343

340344
_initAllMissionItems();
@@ -786,21 +790,21 @@ double MissionController::_normalizeLon(double lon)
786790
}
787791

788792
/// 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)
790794
{
791795
MissionItem* homeItem = new MissionItem(_activeVehicle, this);
792-
_missionItems->insert(0, homeItem);
796+
missionItems->insert(0, homeItem);
793797

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));
796800

797801
double north = _normalizeLat(item->coordinate().latitude());
798802
double south = north;
799803
double east = _normalizeLon(item->coordinate().longitude());
800804
double west = east;
801805

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));
804808

805809
double lat = _normalizeLat(item->coordinate().latitude());
806810
double lon = _normalizeLon(item->coordinate().longitude());

src/MissionManager/MissionController.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@ private slots:
9494
void _calcPrevWaypointValues(double homeAlt, MissionItem* currentItem, MissionItem* prevItem, double* azimuth, double* distance, double* altDifference);
9595
bool _findLastAltitude(double* lastAltitude);
9696
bool _findLastAcceptanceRadius(double* lastAcceptanceRadius);
97-
void _addPlannedHomePosition(bool addToCenter);
97+
void _addPlannedHomePosition(QmlObjectListModel* missionItems, bool addToCenter);
9898
double _normalizeLat(double lat);
9999
double _normalizeLon(double lon);
100100
#ifndef __mobile__
101-
bool _loadJsonMissionFile(const QByteArray& bytes, QString& errorString);
102-
bool _loadTextMissionFile(QTextStream& stream, QString& errorString);
101+
bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString);
102+
bool _loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString);
103103
#endif
104104

105105
private:

0 commit comments

Comments
 (0)