Commit e7c88789 authored by Don Gagne's avatar Don Gagne

Correctly handle large numbers of waypoints

parent 4aff4121
......@@ -383,8 +383,7 @@ QGCView {
spacing: _margin / 2
orientation: ListView.Vertical
model: controller.missionItems
property real _maxItemHeight: 0
cacheBuffer: height * 2
delegate: MissionItemEditor {
missionItem: object
......@@ -399,11 +398,6 @@ QGCView {
controller.removeMissionItem(object.sequenceNumber)
}
onRemoveAll: {
itemDragger.clearItem()
controller.removeAllMissionItems()
}
onInsert: {
controller.insertMissionItem(editorMap.center, i)
setCurrentItem(i)
......@@ -601,6 +595,20 @@ QGCView {
}
}
Component {
id: removeAllPromptDialog
QGCViewMessage {
message: "Are you sure you want to delete all mission items?"
function accept() {
itemDragger.clearItem()
controller.removeAllMissionItems()
hideDialog()
}
}
}
Component {
id: syncDropDownComponent
......@@ -671,6 +679,15 @@ QGCView {
}
}
}
QGCButton {
text: "Remove all"
onClicked: {
syncButton.hideDropDown()
_root.showDialog(removeAllPromptDialog, "Delete all", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No)
}
}
/*
FIXME: autoSync is temporarily disconnected since it's still buggy
......
......@@ -72,7 +72,7 @@ void MissionController::start(bool editMode)
// We start with an empty mission
_missionItems = new QmlObjectListModel(this);
_addPlannedHomePosition(false /* addToCenter */);
_addPlannedHomePosition(_missionItems, false /* addToCenter */);
_initAllMissionItems();
}
......@@ -94,7 +94,7 @@ void MissionController::_newMissionItemsAvailableFromVehicle(void)
qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count();
if (!_activeVehicle->firmwarePlugin()->sendHomePositionToVehicle() || _missionItems->count() == 0) {
_addPlannedHomePosition(true /* addToCenter */);
_addPlannedHomePosition(_missionItems,true /* addToCenter */);
}
_missionItemsRequested = false;
......@@ -176,14 +176,16 @@ void MissionController::removeMissionItem(int index)
void MissionController::removeAllMissionItems(void)
{
if (_missionItems) {
while (_missionItems->count() != 1) {
removeMissionItem(_missionItems->count() - 1);
}
QmlObjectListModel* oldItems = _missionItems;
_missionItems = new QmlObjectListModel(this);
_addPlannedHomePosition(_missionItems, false /* addToCenter */);
_initAllMissionItems();
oldItems->deleteLater();
}
}
#ifndef __mobile__
bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& errorString)
bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString)
{
QJsonParseError jsonParseError;
QJsonDocument jsonDoc(QJsonDocument::fromJson(bytes, &jsonParseError));
......@@ -219,7 +221,7 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& e
MissionItem* item = new MissionItem(_activeVehicle, this);
if (item->load(itemValue.toObject(), errorString)) {
_missionItems->append(item);
missionItems->append(item);
} else {
return false;
}
......@@ -230,12 +232,12 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& e
MissionItem* item = new MissionItem(_activeVehicle, this);
if (item->load(json[_jsonPlannedHomePositionKey].toObject(), errorString)) {
_missionItems->insert(0, item);
missionItems->insert(0, item);
} else {
return false;
}
} else {
_addPlannedHomePosition(true /* addToCenter */);
_addPlannedHomePosition(missionItems, true /* addToCenter */);
}
return true;
......@@ -243,7 +245,7 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QString& e
#endif
#ifndef __mobile__
bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& errorString)
bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString)
{
bool addPlannedHomePosition = false;
......@@ -267,7 +269,7 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& error
MissionItem* item = new MissionItem(_activeVehicle, this);
if (item->load(stream)) {
_missionItems->append(item);
missionItems->append(item);
} else {
errorString = QStringLiteral("The mission file is corrupted.");
return false;
......@@ -278,12 +280,12 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QString& error
return false;
}
if (addPlannedHomePosition || _missionItems->count() == 0) {
_addPlannedHomePosition(true /* addToCenter */);
if (addPlannedHomePosition || missionItems->count() == 0) {
_addPlannedHomePosition(missionItems, true /* addToCenter */);
// Update sequence numbers in DO_JUMP commands to take into account added home position
for (int i=1; i<_missionItems->count(); i++) {
MissionItem* item = qobject_cast<MissionItem*>(_missionItems->get(i));
for (int i=1; i<missionItems->count(); i++) {
MissionItem* item = qobject_cast<MissionItem*>(missionItems->get(i));
if (item->command() == MavlinkQmlSingleton::MAV_CMD_DO_JUMP) {
// Home is in position 0
item->setParam1((int)item->param1() + 1);
......@@ -305,11 +307,7 @@ void MissionController::loadMissionFromFile(void)
return;
}
if (_missionItems) {
_deinitAllMissionItems();
_missionItems->deleteLater();
}
_missionItems = new QmlObjectListModel(this);
QmlObjectListModel* newMissionItems = new QmlObjectListModel(this);
QFile file(filename);
......@@ -322,19 +320,25 @@ void MissionController::loadMissionFromFile(void)
QString firstLine = stream.readLine();
if (firstLine.contains(QRegExp("QGC.*WPL"))) {
stream.seek(0);
_loadTextMissionFile(stream, errorString);
_loadTextMissionFile(stream, newMissionItems, errorString);
} else {
_loadJsonMissionFile(bytes, errorString);
_loadJsonMissionFile(bytes, newMissionItems, errorString);
}
}
if (!errorString.isEmpty()) {
_missionItems->clear();
delete newMissionItems;
qgcApp()->showMessage(errorString);
return;
}
if (_missionItems) {
_deinitAllMissionItems();
_missionItems->deleteLater();
}
_missionItems = newMissionItems;
if (_missionItems->count() == 0) {
_addPlannedHomePosition(true /* addToCenter */);
_addPlannedHomePosition(_missionItems, true /* addToCenter */);
}
_initAllMissionItems();
......@@ -786,21 +790,21 @@ double MissionController::_normalizeLon(double lon)
}
/// Add the home position item to the front of the list
void MissionController::_addPlannedHomePosition(bool addToCenter)
void MissionController::_addPlannedHomePosition(QmlObjectListModel* missionItems, bool addToCenter)
{
MissionItem* homeItem = new MissionItem(_activeVehicle, this);
_missionItems->insert(0, homeItem);
missionItems->insert(0, homeItem);
if (_missionItems->count() > 1 && addToCenter) {
MissionItem* item = qobject_cast<MissionItem*>(_missionItems->get(1));
if (missionItems->count() > 1 && addToCenter) {
MissionItem* item = qobject_cast<MissionItem*>(missionItems->get(1));
double north = _normalizeLat(item->coordinate().latitude());
double south = north;
double east = _normalizeLon(item->coordinate().longitude());
double west = east;
for (int i=2; i<_missionItems->count(); i++) {
item = qobject_cast<MissionItem*>(_missionItems->get(i));
for (int i=2; i<missionItems->count(); i++) {
item = qobject_cast<MissionItem*>(missionItems->get(i));
double lat = _normalizeLat(item->coordinate().latitude());
double lon = _normalizeLon(item->coordinate().longitude());
......
......@@ -94,12 +94,12 @@ private:
void _calcPrevWaypointValues(double homeAlt, MissionItem* currentItem, MissionItem* prevItem, double* azimuth, double* distance, double* altDifference);
bool _findLastAltitude(double* lastAltitude);
bool _findLastAcceptanceRadius(double* lastAcceptanceRadius);
void _addPlannedHomePosition(bool addToCenter);
void _addPlannedHomePosition(QmlObjectListModel* missionItems, bool addToCenter);
double _normalizeLat(double lat);
double _normalizeLon(double lon);
#ifndef __mobile__
bool _loadJsonMissionFile(const QByteArray& bytes, QString& errorString);
bool _loadTextMissionFile(QTextStream& stream, QString& errorString);
bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString);
bool _loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString);
#endif
private:
......
This diff is collapsed.
This diff is collapsed.
QGC WPL 110
0 1 0 16 0 0 0 0 34.577822 -112.469101 584.380005 1
1 0 3 22 20.000000 0.000000 0.000000 0.000000 0.000000 0.000000 30.000000 1
2 0 3 16 0.000000 0.000000 0.000000 0.000000 34.469587 -112.534801 90.000000 1
3 0 3 206 21.059999 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1
4 0 3 16 0.000000 0.000000 0.000000 0.000000 34.462736 -112.535401 90.000000 1
5 0 3 16 0.000000 0.000000 0.000000 0.000000 34.462833 -112.535104 90.000000 1
6 0 3 16 0.000000 0.000000 0.000000 0.000000 34.484993 -112.533163 90.000000 1
7 0 3 16 0.000000 0.000000 0.000000 0.000000 34.500399 -112.531524 90.000000 1
8 0 3 16 0.000000 0.000000 0.000000 0.000000 34.462930 -112.534807 90.000000 1
9 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463027 -112.534510 90.000000 1
10 0 3 16 0.000000 0.000000 0.000000 0.000000 34.515805 -112.529884 90.000000 1
11 0 3 16 0.000000 0.000000 0.000000 0.000000 34.531211 -112.528244 90.000000 1
12 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463124 -112.534213 90.000000 1
13 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463221 -112.533916 90.000000 1
14 0 3 16 0.000000 0.000000 0.000000 0.000000 34.546616 -112.526604 90.000000 1
15 0 3 16 0.000000 0.000000 0.000000 0.000000 34.562022 -112.524963 90.000000 1
16 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463317 -112.533619 90.000000 1
17 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463414 -112.533322 90.000000 1
18 0 3 16 0.000000 0.000000 0.000000 0.000000 34.577428 -112.523322 90.000000 1
19 0 3 16 0.000000 0.000000 0.000000 0.000000 34.592834 -112.521680 90.000000 1
20 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463511 -112.533025 90.000000 1
21 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463608 -112.532728 90.000000 1
22 0 3 16 0.000000 0.000000 0.000000 0.000000 34.608239 -112.520037 90.000000 1
23 0 3 16 0.000000 0.000000 0.000000 0.000000 34.623645 -112.518395 90.000000 1
24 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463705 -112.532431 90.000000 1
25 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463802 -112.532134 90.000000 1
26 0 3 16 0.000000 0.000000 0.000000 0.000000 34.639051 -112.516751 90.000000 1
27 0 3 16 0.000000 0.000000 0.000000 0.000000 34.639722 -112.516403 90.000000 1
28 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463899 -112.531837 90.000000 1
29 0 3 16 0.000000 0.000000 0.000000 0.000000 34.463996 -112.531540 90.000000 1
30 0 3 16 0.000000 0.000000 0.000000 0.000000 34.639439 -112.516139 90.000000 1
31 0 3 16 0.000000 0.000000 0.000000 0.000000 34.639157 -112.515874 90.000000 1
32 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464092 -112.531243 90.000000 1
33 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464189 -112.530946 90.000000 1
34 0 3 16 0.000000 0.000000 0.000000 0.000000 34.638874 -112.515610 90.000000 1
35 0 3 16 0.000000 0.000000 0.000000 0.000000 34.638592 -112.515346 90.000000 1
36 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464286 -112.530649 90.000000 1
37 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464383 -112.530352 90.000000 1
38 0 3 16 0.000000 0.000000 0.000000 0.000000 34.638309 -112.515081 90.000000 1
39 0 3 16 0.000000 0.000000 0.000000 0.000000 34.638027 -112.514817 90.000000 1
40 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464480 -112.530054 90.000000 1
41 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464577 -112.529757 90.000000 1
42 0 3 16 0.000000 0.000000 0.000000 0.000000 34.637744 -112.514553 90.000000 1
43 0 3 16 0.000000 0.000000 0.000000 0.000000 34.637462 -112.514289 90.000000 1
44 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464674 -112.529460 90.000000 1
45 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464771 -112.529163 90.000000 1
46 0 3 16 0.000000 0.000000 0.000000 0.000000 34.637179 -112.514024 90.000000 1
47 0 3 16 0.000000 0.000000 0.000000 0.000000 34.636896 -112.513760 90.000000 1
48 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464868 -112.528866 90.000000 1
49 0 3 16 0.000000 0.000000 0.000000 0.000000 34.464964 -112.528569 90.000000 1
50 0 3 16 0.000000 0.000000 0.000000 0.000000 34.636614 -112.513496 90.000000 1
51 0 3 16 0.000000 0.000000 0.000000 0.000000 34.636331 -112.513231 90.000000 1
52 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465061 -112.528272 90.000000 1
53 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465158 -112.527975 90.000000 1
54 0 3 16 0.000000 0.000000 0.000000 0.000000 34.636049 -112.512967 90.000000 1
55 0 3 16 0.000000 0.000000 0.000000 0.000000 34.635766 -112.512703 90.000000 1
56 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465255 -112.527678 90.000000 1
57 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465352 -112.527381 90.000000 1
58 0 3 16 0.000000 0.000000 0.000000 0.000000 34.635484 -112.512439 90.000000 1
59 0 3 16 0.000000 0.000000 0.000000 0.000000 34.635201 -112.512174 90.000000 1
60 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465449 -112.527084 90.000000 1
61 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465546 -112.526787 90.000000 1
62 0 3 16 0.000000 0.000000 0.000000 0.000000 34.634918 -112.511910 90.000000 1
63 0 3 16 0.000000 0.000000 0.000000 0.000000 34.634636 -112.511646 90.000000 1
64 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465643 -112.526490 90.000000 1
65 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465739 -112.526193 90.000000 1
66 0 3 16 0.000000 0.000000 0.000000 0.000000 34.634353 -112.511381 90.000000 1
67 0 3 16 0.000000 0.000000 0.000000 0.000000 34.634071 -112.511117 90.000000 1
68 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465836 -112.525896 90.000000 1
69 0 3 16 0.000000 0.000000 0.000000 0.000000 34.465933 -112.525599 90.000000 1
70 0 3 16 0.000000 0.000000 0.000000 0.000000 34.633788 -112.510853 90.000000 1
71 0 3 16 0.000000 0.000000 0.000000 0.000000 34.633506 -112.510589 90.000000 1
72 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466030 -112.525302 90.000000 1
73 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466127 -112.525005 90.000000 1
74 0 3 16 0.000000 0.000000 0.000000 0.000000 34.633223 -112.510324 90.000000 1
75 0 3 16 0.000000 0.000000 0.000000 0.000000 34.632940 -112.510060 90.000000 1
76 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466224 -112.524708 90.000000 1
77 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466321 -112.524411 90.000000 1
78 0 3 16 0.000000 0.000000 0.000000 0.000000 34.632658 -112.509796 90.000000 1
79 0 3 16 0.000000 0.000000 0.000000 0.000000 34.632375 -112.509532 90.000000 1
80 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466417 -112.524114 90.000000 1
81 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466514 -112.523817 90.000000 1
82 0 3 16 0.000000 0.000000 0.000000 0.000000 34.632093 -112.509267 90.000000 1
83 0 3 16 0.000000 0.000000 0.000000 0.000000 34.631810 -112.509003 90.000000 1
84 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466611 -112.523519 90.000000 1
85 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466708 -112.523222 90.000000 1
86 0 3 16 0.000000 0.000000 0.000000 0.000000 34.631527 -112.508739 90.000000 1
87 0 3 16 0.000000 0.000000 0.000000 0.000000 34.631245 -112.508474 90.000000 1
88 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466805 -112.522925 90.000000 1
89 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466902 -112.522628 90.000000 1
90 0 3 16 0.000000 0.000000 0.000000 0.000000 34.630962 -112.508210 90.000000 1
91 0 3 16 0.000000 0.000000 0.000000 0.000000 34.630680 -112.507946 90.000000 1
92 0 3 16 0.000000 0.000000 0.000000 0.000000 34.466999 -112.522331 90.000000 1
93 0 3 16 0.000000 0.000000 0.000000 0.000000 34.467096 -112.522034 90.000000 1
94 0 3 16 0.000000 0.000000 0.000000 0.000000 34.630397 -112.507682 90.000000 1
95 0 3 16 0.000000 0.000000 0.000000 0.000000 34.630115 -112.507417 90.000000 1
96 0 3 16 0.000000 0.000000 0.000000 0.000000 34.467192 -112.521737 90.000000 1
97 0 3 16 0.000000 0.000000 0.000000 0.000000 34.467289 -112.521440 90.000000 1
98 0 3 16 0.000000 0.000000 0.000000 0.000000 34.629832 -112.507153 90.000000 1
99 0 3 16 0.000000 0.000000 0.000000 0.000000 34.629549 -112.506889 90.000000 1
This diff is collapsed.
This diff is collapsed.
QGC WPL 110
0 1 0 16 0 0 0 0 40.122269 -105.170967 1543.079956 1
1 0 3 22 10.000000 0.000000 0.000000 0.000000 0.000000 0.000000 30.000000 1
2 0 3 16 0.000000 0.000000 0.000000 0.000000 40.122993 -105.167717 100.000000 1
3 0 3 16 0.000000 0.000000 0.000000 0.000000 40.120598 -105.167030 100.000000 1
4 0 3 16 0.000000 0.000000 0.000000 0.000000 40.118942 -105.173714 100.000000 1
5 0 3 16 0.000000 0.000000 0.000000 0.000000 40.120270 -105.175835 100.000000 1
6 0 3 16 0.000000 0.000000 0.000000 0.000000 40.121994 -105.174843 100.000000 1
7 0 3 177 2.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1
8 0 3 18 2.000000 0.000000 150.000000 0.000000 40.120483 -105.170555 100.000000 1
9 0 3 16 0.000000 0.000000 0.000000 0.000000 40.120796 -105.169289 100.000000 1
10 0 3 178 0.000000 15.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1
11 0 3 189 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1
12 0 3 16 0.000000 0.000000 0.000000 0.000000 40.119156 -105.175896 50.000000 1
13 0 3 16 0.000000 0.000000 0.000000 0.000000 40.121551 -105.176829 25.000000 1
14 0 3 21 0.000000 0.000000 0.000000 0.000000 40.122527 -105.170274 0.000000 1
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