Commit 12980b18 authored by Don Gagne's avatar Don Gagne

Add support for load/save mission on tablet

parent 5a90520b
...@@ -92,8 +92,20 @@ QGCView { ...@@ -92,8 +92,20 @@ QGCView {
} }
function loadFromFile() { function loadFromFile() {
controller.loadMissionFromFile() if (ScreenTools.isMobile) {
fitViewportToMissionItems() _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) { function normalizeLat(lat) {
...@@ -175,6 +187,56 @@ QGCView { ...@@ -175,6 +187,56 @@ QGCView {
property int _moveDialogMissionItemIndex 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 { Component {
id: moveDialog id: moveDialog
...@@ -655,14 +717,13 @@ QGCView { ...@@ -655,14 +717,13 @@ QGCView {
Row { Row {
spacing: ScreenTools.defaultFontPixelWidth spacing: ScreenTools.defaultFontPixelWidth
visible: !ScreenTools.isMobile
QGCButton { QGCButton {
text: "Save to file..." text: "Save to file..."
onClicked: { onClicked: {
syncButton.hideDropDown() syncButton.hideDropDown()
controller.saveMissionToFile() saveToFile()
} }
} }
......
...@@ -184,7 +184,6 @@ void MissionController::removeAllMissionItems(void) ...@@ -184,7 +184,6 @@ void MissionController::removeAllMissionItems(void)
} }
} }
#ifndef __mobile__
bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString) bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString)
{ {
QJsonParseError jsonParseError; QJsonParseError jsonParseError;
...@@ -242,9 +241,7 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectL ...@@ -242,9 +241,7 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectL
return true; return true;
} }
#endif
#ifndef __mobile__
bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString) bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString)
{ {
bool addPlannedHomePosition = false; bool addPlannedHomePosition = false;
...@@ -295,13 +292,10 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListM ...@@ -295,13 +292,10 @@ bool MissionController::_loadTextMissionFile(QTextStream& stream, QmlObjectListM
return true; return true;
} }
#endif
void MissionController::loadMissionFromFile(void) void MissionController::_loadMissionFromFile(const QString& filename)
{ {
#ifndef __mobile__
QString errorString; QString errorString;
QString filename = QGCFileDialog::getOpenFileName(NULL, "Select Mission File to load", QString(), "Mission file (*.mission);;All Files (*.*)");
if (filename.isEmpty()) { if (filename.isEmpty()) {
return; return;
...@@ -342,23 +336,34 @@ void MissionController::loadMissionFromFile(void) ...@@ -342,23 +336,34 @@ void MissionController::loadMissionFromFile(void)
} }
_initAllMissionItems(); _initAllMissionItems();
#endif
} }
void MissionController::saveMissionToFile(void) void MissionController::loadMissionFromFile(void)
{ {
#ifndef __mobile__ #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()) { if (filename.isEmpty()) {
return; return;
} }
QString missionFilename = filename;
if (!QFileInfo(filename).fileName().contains(".")) { if (!QFileInfo(filename).fileName().contains(".")) {
filename += ".mission"; missionFilename += ".mission";
} }
QFile file(filename); QFile file(missionFilename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qgcApp()->showMessage(file.errorString()); qgcApp()->showMessage(file.errorString());
...@@ -397,9 +402,41 @@ void MissionController::saveMissionToFile(void) ...@@ -397,9 +402,41 @@ void MissionController::saveMissionToFile(void)
} }
_missionItems->setDirty(false); _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 #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) void MissionController::_calcPrevWaypointValues(double homeAlt, MissionItem* currentItem, MissionItem* prevItem, double* azimuth, double* distance, double* altDifference)
{ {
QGeoCoordinate currentCoord = currentItem->coordinate(); QGeoCoordinate currentCoord = currentItem->coordinate();
...@@ -834,3 +871,23 @@ void MissionController::_currentMissionItemChanged(int sequenceNumber) ...@@ -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;
}
...@@ -49,8 +49,11 @@ public: ...@@ -49,8 +49,11 @@ public:
Q_INVOKABLE void sendMissionItems(void); Q_INVOKABLE void sendMissionItems(void);
Q_INVOKABLE void loadMissionFromFile(void); Q_INVOKABLE void loadMissionFromFile(void);
Q_INVOKABLE void saveMissionToFile(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 removeMissionItem(int index);
Q_INVOKABLE void removeAllMissionItems(void); Q_INVOKABLE void removeAllMissionItems(void);
Q_INVOKABLE QStringList getMobileMissionFiles(void);
/// @param i: index to insert at /// @param i: index to insert at
Q_INVOKABLE int insertMissionItem(QGeoCoordinate coordinate, int i); Q_INVOKABLE int insertMissionItem(QGeoCoordinate coordinate, int i);
...@@ -97,10 +100,10 @@ private: ...@@ -97,10 +100,10 @@ private:
void _addPlannedHomePosition(QmlObjectListModel* missionItems, bool addToCenter); void _addPlannedHomePosition(QmlObjectListModel* missionItems, bool addToCenter);
double _normalizeLat(double lat); double _normalizeLat(double lat);
double _normalizeLon(double lon); double _normalizeLon(double lon);
#ifndef __mobile__
bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString); bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString);
bool _loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString); bool _loadTextMissionFile(QTextStream& stream, QmlObjectListModel* missionItems, QString& errorString);
#endif void _loadMissionFromFile(const QString& file);
void _saveMissionToFile(const QString& file);
private: private:
bool _editMode; bool _editMode;
......
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