From 12980b186b42e984b113eb32c7783767d01d37af Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 12 Feb 2016 14:33:10 -0800 Subject: [PATCH] Add support for load/save mission on tablet --- src/MissionEditor/MissionEditor.qml | 69 +++++++++++++++++++-- src/MissionManager/MissionController.cc | 81 +++++++++++++++++++++---- src/MissionManager/MissionController.h | 7 ++- 3 files changed, 139 insertions(+), 18 deletions(-) diff --git a/src/MissionEditor/MissionEditor.qml b/src/MissionEditor/MissionEditor.qml index fb4e3b53f..0d1047a9b 100644 --- a/src/MissionEditor/MissionEditor.qml +++ b/src/MissionEditor/MissionEditor.qml @@ -92,8 +92,20 @@ QGCView { } function loadFromFile() { - controller.loadMissionFromFile() - fitViewportToMissionItems() + if (ScreenTools.isMobile) { + _root.showDialog(mobileFilePicker, "Select Mission File", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel) + } else { + controller.loadMissionFromFile() + fitViewportToMissionItems() + } + } + + function saveToFile() { + if (ScreenTools.isMobile) { + _root.showDialog(mobileFileSaver, "Save Mission File", _root.showDialogDefaultWidth, StandardButton.Save | StandardButton.Cancel) + } else { + controller.saveToFile() + } } function normalizeLat(lat) { @@ -175,6 +187,56 @@ QGCView { property int _moveDialogMissionItemIndex + Component { + id: mobileFilePicker + + QGCViewDialog { + ListView { + anchors.margins: _margin + anchors.fill: parent + spacing: _margin / 2 + orientation: ListView.Vertical + model: controller.getMobileMissionFiles() + + delegate: QGCButton { + text: modelData + + onClicked: { + hideDialog() + controller.loadMobileMissionFromFile(modelData) + fitViewportToMissionItems() + } + } + } + } + } + + Component { + id: mobileFileSaver + + QGCViewDialog { + function accept() { + hideDialog() + console.log(filenameTextField.text) + controller.saveMobileMissionToFile(filenameTextField.text) + } + + Column { + anchors.left: parent.left + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight + + QGCLabel { + text: "File name:" + } + + QGCTextField { + id: filenameTextField + } + } + } + } + Component { id: moveDialog @@ -655,14 +717,13 @@ QGCView { Row { spacing: ScreenTools.defaultFontPixelWidth - visible: !ScreenTools.isMobile QGCButton { text: "Save to file..." onClicked: { syncButton.hideDropDown() - controller.saveMissionToFile() + saveToFile() } } diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 30837641e..039bd9d99 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -184,7 +184,6 @@ void MissionController::removeAllMissionItems(void) } } -#ifndef __mobile__ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString) { QJsonParseError jsonParseError; @@ -242,9 +241,7 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectL return true; } -#endif -#ifndef __mobile__ bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString) { bool addPlannedHomePosition = false; @@ -295,13 +292,10 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListM return true; } -#endif -void MissionController::loadMissionFromFile(void) +void MissionController::_loadMissionFromFile(const QString& filename) { -#ifndef __mobile__ QString errorString; - QString filename = QGCFileDialog::getOpenFileName(NULL, "Select Mission File to load", QString(), "Mission file (*.mission);;All Files (*.*)"); if (filename.isEmpty()) { return; @@ -342,23 +336,34 @@ void MissionController::loadMissionFromFile(void) } _initAllMissionItems(); -#endif } -void MissionController::saveMissionToFile(void) +void MissionController::loadMissionFromFile(void) { #ifndef __mobile__ - QString filename = QGCFileDialog::getSaveFileName(NULL, "Select file to save mission to", QString(), "Mission file (*.mission);;All Files (*.*)"); + QString filename = QGCFileDialog::getOpenFileName(NULL, "Select Mission File to load", QString(), "Mission file (*.mission);;All Files (*.*)"); + + if (filename.isEmpty()) { + return; + } + _loadMissionFromFile(filename); +#endif +} + +void MissionController::_saveMissionToFile(const QString& filename) +{ + qDebug() << filename; if (filename.isEmpty()) { return; } + QString missionFilename = filename; if (!QFileInfo(filename).fileName().contains(".")) { - filename += ".mission"; + missionFilename += ".mission"; } - QFile file(filename); + QFile file(missionFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qgcApp()->showMessage(file.errorString()); @@ -397,9 +402,41 @@ void MissionController::saveMissionToFile(void) } _missionItems->setDirty(false); +} + +void MissionController::saveMissionToFile(void) +{ +#ifndef __mobile__ + QString filename = QGCFileDialog::getSaveFileName(NULL, "Select file to save mission to", QString(), "Mission file (*.mission);;All Files (*.*)"); + + if (filename.isEmpty()) { + return; + } + saveMissionToFile(filename); #endif } +void MissionController::saveMobileMissionToFile(const QString& filename) +{ + QStringList docDirs = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation); + if (docDirs.count() <= 0) { + qWarning() << "No Documents location"; + return; + } + + _saveMissionToFile(docDirs.at(0) + QDir::separator() + missionFilename); +} + +void MissionController::loadMobileMissionFromFile(const QString& filename) +{ + QStringList docDirs = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation); + if (docDirs.count() <= 0) { + qWarning() << "No Documents location"; + return; + } + _loadMissionFromFile(docDirs.at(0) + QDir::separator() + filename); +} + void MissionController::_calcPrevWaypointValues(double homeAlt, MissionItem* currentItem, MissionItem* prevItem, double* azimuth, double* distance, double* altDifference) { QGeoCoordinate currentCoord = currentItem->coordinate(); @@ -834,3 +871,23 @@ void MissionController::_currentMissionItemChanged(int sequenceNumber) } } } + +QStringList MissionController::getMobileMissionFiles(void) +{ + QStringList missionFiles; + + QStringList docDirs = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation); + if (docDirs.count() <= 0) { + qWarning() << "No Documents location"; + return QStringList(); + } + QDir missionDir = docDirs.at(0); + + QFileInfoList missionFileInfoList = missionDir.entryInfoList(QStringList(QStringLiteral("*.mission")), QDir::Files, QDir::Name); + + foreach (const QFileInfo& missionFileInfo, missionFileInfoList) { + missionFiles << missionFileInfo.baseName() + ".mission"; + } + + return missionFiles; +} diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 11374a83f..5d73c480e 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -49,8 +49,11 @@ public: Q_INVOKABLE void sendMissionItems(void); Q_INVOKABLE void loadMissionFromFile(void); Q_INVOKABLE void saveMissionToFile(void); + Q_INVOKABLE void loadMobileMissionFromFile(const QString& file); + Q_INVOKABLE void saveMobileMissionToFile(const QString& file); Q_INVOKABLE void removeMissionItem(int index); Q_INVOKABLE void removeAllMissionItems(void); + Q_INVOKABLE QStringList getMobileMissionFiles(void); /// @param i: index to insert at Q_INVOKABLE int insertMissionItem(QGeoCoordinate coordinate, int i); @@ -97,10 +100,10 @@ private: void _addPlannedHomePosition(QmlObjectListModel* missionItems, bool addToCenter); double _normalizeLat(double lat); double _normalizeLon(double lon); -#ifndef __mobile__ bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString); bool _loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString); -#endif + void _loadMissionFromFile(const QString& file); + void _saveMissionToFile(const QString& file); private: bool _editMode; -- 2.22.0