Commit d95ec754 authored by DonLakeFlyer's avatar DonLakeFlyer

Change Plan sync model yet again

parent d5e12680
...@@ -647,30 +647,6 @@ void MissionController::loadFromFile(const QString& filename) ...@@ -647,30 +647,6 @@ void MissionController::loadFromFile(const QString& filename)
MissionController::_scanForAdditionalSettings(_visualItems, _activeVehicle); MissionController::_scanForAdditionalSettings(_visualItems, _activeVehicle);
_initAllVisualItems(); _initAllVisualItems();
// Split the filename into directory and filename
QString filenameOnly = filename;
int lastSepIndex = filename.lastIndexOf(QStringLiteral("/"));
if (lastSepIndex != -1) {
filenameOnly = filename.right(filename.length() - lastSepIndex - 1);
}
QString directoryOnly = filename.left(filename.length() - filenameOnly.length() - 1);
QString extension = AppSettings::missionFileExtension;
if (filenameOnly.endsWith("." + extension)) {
filenameOnly = filenameOnly.left(filenameOnly.length() - extension.length() - 1);
}
_settingsItem->missionName()->setRawValue(filenameOnly);
if (directoryOnly == qgcApp()->toolbox()->settingsManager()->appSettings()->missionSavePath()) {
QString emptyString;
_settingsItem->setLoadedMissionDirectory(emptyString);
} else {
_settingsItem->setLoadedMissionDirectory(directoryOnly);
}
_settingsItem->setExistingMission(true);
sendToVehicle(); sendToVehicle();
} }
...@@ -1235,7 +1211,7 @@ void MissionController::_initAllVisualItems(void) ...@@ -1235,7 +1211,7 @@ void MissionController::_initAllVisualItems(void)
_recalcAll(); _recalcAll();
connect(_visualItems, &QmlObjectListModel::dirtyChanged, this, &MissionController::dirtyChanged); connect(_visualItems, &QmlObjectListModel::dirtyChanged, this, &MissionController::_visualItemsDirtyChanged);
connect(_visualItems, &QmlObjectListModel::countChanged, this, &MissionController::_updateContainsItems); connect(_visualItems, &QmlObjectListModel::countChanged, this, &MissionController::_updateContainsItems);
emit visualItemsChanged(); emit visualItemsChanged();
...@@ -1250,7 +1226,7 @@ void MissionController::_deinitAllVisualItems(void) ...@@ -1250,7 +1226,7 @@ void MissionController::_deinitAllVisualItems(void)
_deinitVisualItem(qobject_cast<VisualMissionItem*>(_visualItems->get(i))); _deinitVisualItem(qobject_cast<VisualMissionItem*>(_visualItems->get(i)));
} }
disconnect(_visualItems, &QmlObjectListModel::dirtyChanged, this, &MissionController::dirtyChanged); disconnect(_visualItems, &QmlObjectListModel::dirtyChanged, this, &MissionController::_visualItemsDirtyChanged);
disconnect(_visualItems, &QmlObjectListModel::countChanged, this, &MissionController::_updateContainsItems); disconnect(_visualItems, &QmlObjectListModel::countChanged, this, &MissionController::_updateContainsItems);
} }
...@@ -1605,46 +1581,16 @@ bool MissionController::missionInProgress(void) const ...@@ -1605,46 +1581,16 @@ bool MissionController::missionInProgress(void) const
return _visualItems && _visualItems->count() > 1 && (!_visualItems->value<VisualMissionItem*>(0)->isCurrentItem() && !_visualItems->value<VisualMissionItem*>(1)->isCurrentItem()); return _visualItems && _visualItems->count() > 1 && (!_visualItems->value<VisualMissionItem*>(0)->isCurrentItem() && !_visualItems->value<VisualMissionItem*>(1)->isCurrentItem());
} }
void MissionController::save(void) void MissionController::_visualItemsDirtyChanged(bool dirty)
{
// Save to file if the mission is named
QString missionDir = _settingsItem->loadedMissionDirectory();
if (missionDir.isEmpty()) {
missionDir = _appSettings->missionSavePath();
}
bool savedToFile = false;
QString missionName = _settingsItem->missionName()->rawValue().toString();
if (!missionDir.isEmpty() && !missionName.isEmpty()) {
savedToFile = true;
saveToFile(missionDir + "/" + missionName);
}
_settingsItem->setExistingMission(savedToFile);
}
void MissionController::saveAndSend(void)
{ {
// Send to vehicle if we are connected if (dirty) {
if (!_activeVehicle->isOfflineEditingVehicle()) { if (_visualItems->count() > 1) {
sendToVehicle(); emit dirtyChanged(true);
} else {
// This was a change to mission settings with no other mission items added
_visualItems->setDirty(false);
}
} else {
emit dirtyChanged(false);
} }
} }
void MissionController::clearMission(void)
{
// We need to save the mission information around removeAll all since it delete/recreates settings item
QString missionName = _settingsItem->missionName()->rawValue().toString();
QString loadedMissionDirectory = _settingsItem->loadedMissionDirectory();
bool existingMission = _settingsItem->existingMission();
removeAll();
_settingsItem->missionName()->setRawValue(missionName);
_settingsItem->setLoadedMissionDirectory(loadedMissionDirectory);
_settingsItem->setExistingMission(existingMission);
}
void MissionController::closeMission(void)
{
removeAll();
}
...@@ -89,18 +89,6 @@ public: ...@@ -89,18 +89,6 @@ public:
/// Sends the mission items to the specified vehicle /// Sends the mission items to the specified vehicle
static void sendItemsToVehicle(Vehicle* vehicle, QmlObjectListModel* visualMissionItems); static void sendItemsToVehicle(Vehicle* vehicle, QmlObjectListModel* visualMissionItems);
/// Saves the mission to file
Q_INVOKABLE void save(void);
/// Save and to file and send to vehicle if possible
Q_INVOKABLE void saveAndSend(void);
/// Removes all items from the mission
Q_INVOKABLE void clearMission(void);
/// Closes the mission, saving and sending as needed before closing
Q_INVOKABLE void closeMission(void);
// Overrides from PlanElementController // Overrides from PlanElementController
void start (bool editMode) final; void start (bool editMode) final;
void startStaticActiveVehicle (Vehicle* vehicle) final; void startStaticActiveVehicle (Vehicle* vehicle) final;
...@@ -155,6 +143,7 @@ private slots: ...@@ -155,6 +143,7 @@ private slots:
void _recalcWaypointLines(void); void _recalcWaypointLines(void);
void _recalcMissionFlightStatus(void); void _recalcMissionFlightStatus(void);
void _updateContainsItems(void); void _updateContainsItems(void);
void _visualItemsDirtyChanged(bool dirty);
private: private:
void _init(void); void _init(void);
......
...@@ -22,11 +22,5 @@ ...@@ -22,11 +22,5 @@
"enumStrings": "No action on mission end,Loiter after mission end,RTL after mission end", "enumStrings": "No action on mission end,Loiter after mission end,RTL after mission end",
"enumValues": "0,1,2", "enumValues": "0,1,2",
"defaultValue": 0 "defaultValue": 0
},
{
"name": "MissionName",
"shortDescription": "Name for the mission.",
"type": "string",
"defaultValue": ""
} }
] ]
...@@ -23,7 +23,6 @@ QGC_LOGGING_CATEGORY(MissionSettingsComplexItemLog, "MissionSettingsComplexItemL ...@@ -23,7 +23,6 @@ QGC_LOGGING_CATEGORY(MissionSettingsComplexItemLog, "MissionSettingsComplexItemL
const char* MissionSettingsItem::jsonComplexItemTypeValue = "MissionSettings"; const char* MissionSettingsItem::jsonComplexItemTypeValue = "MissionSettings";
const char* MissionSettingsItem::_missionNameName = "MissionName";
const char* MissionSettingsItem::_plannedHomePositionAltitudeName = "PlannedHomePositionAltitude"; const char* MissionSettingsItem::_plannedHomePositionAltitudeName = "PlannedHomePositionAltitude";
const char* MissionSettingsItem::_missionFlightSpeedName = "FlightSpeed"; const char* MissionSettingsItem::_missionFlightSpeedName = "FlightSpeed";
const char* MissionSettingsItem::_missionEndActionName = "MissionEndAction"; const char* MissionSettingsItem::_missionEndActionName = "MissionEndAction";
...@@ -32,9 +31,7 @@ QMap<QString, FactMetaData*> MissionSettingsItem::_metaDataMap; ...@@ -32,9 +31,7 @@ QMap<QString, FactMetaData*> MissionSettingsItem::_metaDataMap;
MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, QObject* parent) MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, QObject* parent)
: ComplexMissionItem(vehicle, parent) : ComplexMissionItem(vehicle, parent)
, _existingMission(false)
, _specifyMissionFlightSpeed(false) , _specifyMissionFlightSpeed(false)
, _missionNameFact (0, _missionNameName, FactMetaData::valueTypeString)
, _plannedHomePositionAltitudeFact (0, _plannedHomePositionAltitudeName, FactMetaData::valueTypeDouble) , _plannedHomePositionAltitudeFact (0, _plannedHomePositionAltitudeName, FactMetaData::valueTypeDouble)
, _missionFlightSpeedFact (0, _missionFlightSpeedName, FactMetaData::valueTypeDouble) , _missionFlightSpeedFact (0, _missionFlightSpeedName, FactMetaData::valueTypeDouble)
, _missionEndActionFact (0, _missionEndActionName, FactMetaData::valueTypeUint32) , _missionEndActionFact (0, _missionEndActionName, FactMetaData::valueTypeUint32)
...@@ -47,12 +44,10 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, QObject* parent) ...@@ -47,12 +44,10 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, QObject* parent)
_metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/MissionSettings.FactMetaData.json"), NULL /* metaDataParent */); _metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/MissionSettings.FactMetaData.json"), NULL /* metaDataParent */);
} }
_missionNameFact.setMetaData (_metaDataMap[_missionNameName]);
_plannedHomePositionAltitudeFact.setMetaData (_metaDataMap[_plannedHomePositionAltitudeName]); _plannedHomePositionAltitudeFact.setMetaData (_metaDataMap[_plannedHomePositionAltitudeName]);
_missionFlightSpeedFact.setMetaData (_metaDataMap[_missionFlightSpeedName]); _missionFlightSpeedFact.setMetaData (_metaDataMap[_missionFlightSpeedName]);
_missionEndActionFact.setMetaData (_metaDataMap[_missionEndActionName]); _missionEndActionFact.setMetaData (_metaDataMap[_missionEndActionName]);
_missionNameFact.setRawValue (_missionNameFact.rawDefaultValue());
_plannedHomePositionAltitudeFact.setRawValue (_plannedHomePositionAltitudeFact.rawDefaultValue()); _plannedHomePositionAltitudeFact.setRawValue (_plannedHomePositionAltitudeFact.rawDefaultValue());
_missionEndActionFact.setRawValue (_missionEndActionFact.rawDefaultValue()); _missionEndActionFact.setRawValue (_missionEndActionFact.rawDefaultValue());
...@@ -63,8 +58,8 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, QObject* parent) ...@@ -63,8 +58,8 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, QObject* parent)
setHomePositionSpecialCase(true); setHomePositionSpecialCase(true);
connect(this, &MissionSettingsItem::specifyMissionFlightSpeedChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber); connect(this, &MissionSettingsItem::specifyMissionFlightSpeedChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(&_cameraSection, &CameraSection::missionItemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber); connect(&_cameraSection, &CameraSection::missionItemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(&_plannedHomePositionAltitudeFact, &Fact::valueChanged, this, &MissionSettingsItem::_setDirty); connect(&_plannedHomePositionAltitudeFact, &Fact::valueChanged, this, &MissionSettingsItem::_setDirty);
connect(&_plannedHomePositionAltitudeFact, &Fact::valueChanged, this, &MissionSettingsItem::_updateAltitudeInCoordinate); connect(&_plannedHomePositionAltitudeFact, &Fact::valueChanged, this, &MissionSettingsItem::_updateAltitudeInCoordinate);
...@@ -411,19 +406,3 @@ void MissionSettingsItem::_updateAltitudeInCoordinate(QVariant value) ...@@ -411,19 +406,3 @@ void MissionSettingsItem::_updateAltitudeInCoordinate(QVariant value)
emit exitCoordinateChanged(_plannedHomePositionCoordinate); emit exitCoordinateChanged(_plannedHomePositionCoordinate);
} }
} }
void MissionSettingsItem::setExistingMission(bool existingMission)
{
if (existingMission != _existingMission) {
_existingMission = existingMission;
emit existingMissionChanged(existingMission );
}
}
void MissionSettingsItem::setLoadedMissionDirectory(QString& loadedMissionDirectory)
{
if (_loadedMissionDirectory != loadedMissionDirectory) {
_loadedMissionDirectory = loadedMissionDirectory;
emit loadedMissionDirectoryChanged(loadedMissionDirectory);
}
}
...@@ -32,24 +32,18 @@ public: ...@@ -32,24 +32,18 @@ public:
}; };
Q_ENUMS(MissionEndAction) Q_ENUMS(MissionEndAction)
Q_PROPERTY(Fact* missionName READ missionName CONSTANT)
Q_PROPERTY(QString loadedMissionDirectory READ loadedMissionDirectory WRITE setLoadedMissionDirectory NOTIFY loadedMissionDirectoryChanged)
Q_PROPERTY(bool existingMission READ existingMission WRITE setExistingMission NOTIFY existingMissionChanged)
Q_PROPERTY(bool specifyMissionFlightSpeed READ specifyMissionFlightSpeed WRITE setSpecifyMissionFlightSpeed NOTIFY specifyMissionFlightSpeedChanged) Q_PROPERTY(bool specifyMissionFlightSpeed READ specifyMissionFlightSpeed WRITE setSpecifyMissionFlightSpeed NOTIFY specifyMissionFlightSpeedChanged)
Q_PROPERTY(Fact* missionFlightSpeed READ missionFlightSpeed CONSTANT) Q_PROPERTY(Fact* missionFlightSpeed READ missionFlightSpeed CONSTANT)
Q_PROPERTY(Fact* missionEndAction READ missionEndAction CONSTANT) Q_PROPERTY(Fact* missionEndAction READ missionEndAction CONSTANT)
Q_PROPERTY(Fact* plannedHomePositionAltitude READ plannedHomePositionAltitude CONSTANT) Q_PROPERTY(Fact* plannedHomePositionAltitude READ plannedHomePositionAltitude CONSTANT)
Q_PROPERTY(QObject* cameraSection READ cameraSection CONSTANT) Q_PROPERTY(QObject* cameraSection READ cameraSection CONSTANT)
Fact* missionName (void) { return &_missionNameFact; }
Fact* plannedHomePositionAltitude (void) { return &_plannedHomePositionAltitudeFact; } Fact* plannedHomePositionAltitude (void) { return &_plannedHomePositionAltitudeFact; }
Fact* missionFlightSpeed (void) { return &_missionFlightSpeedFact; } Fact* missionFlightSpeed (void) { return &_missionFlightSpeedFact; }
Fact* missionEndAction (void) { return &_missionEndActionFact; } Fact* missionEndAction (void) { return &_missionEndActionFact; }
bool specifyMissionFlightSpeed (void) const { return _specifyMissionFlightSpeed; } bool specifyMissionFlightSpeed (void) const { return _specifyMissionFlightSpeed; }
bool existingMission (void) const { return _existingMission; }
void setSpecifyMissionFlightSpeed(bool specifyMissionFlightSpeed); void setSpecifyMissionFlightSpeed(bool specifyMissionFlightSpeed);
void setExistingMission(bool existingMission);
QObject* cameraSection(void) { return &_cameraSection; } QObject* cameraSection(void) { return &_cameraSection; }
/// Scans the loaded items for settings items /// Scans the loaded items for settings items
...@@ -62,10 +56,6 @@ public: ...@@ -62,10 +56,6 @@ public:
/// @return true: Mission end action was added /// @return true: Mission end action was added
bool addMissionEndAction(QList<MissionItem*>& items, int seqNum, QObject* missionItemParent); bool addMissionEndAction(QList<MissionItem*>& items, int seqNum, QObject* missionItemParent);
// Returns the directory the misiosn was loaded from. Empty string is laoded from normal savePath.
QString loadedMissionDirectory(void) const { return _loadedMissionDirectory; }
void setLoadedMissionDirectory(QString& loadedMissionDirectory);
// Overrides from ComplexMissionItem // Overrides from ComplexMissionItem
double complexDistance (void) const final; double complexDistance (void) const final;
...@@ -104,8 +94,6 @@ public: ...@@ -104,8 +94,6 @@ public:
signals: signals:
void specifyMissionFlightSpeedChanged(bool specifyMissionFlightSpeed); void specifyMissionFlightSpeedChanged(bool specifyMissionFlightSpeed);
void existingMissionChanged(bool existingMission);
void loadedMissionDirectoryChanged(QString& loadedMissionDirectory);
private slots: private slots:
void _setDirtyAndUpdateLastSequenceNumber (void); void _setDirtyAndUpdateLastSequenceNumber (void);
...@@ -114,14 +102,11 @@ private slots: ...@@ -114,14 +102,11 @@ private slots:
void _updateAltitudeInCoordinate (QVariant value); void _updateAltitudeInCoordinate (QVariant value);
private: private:
bool _existingMission;
bool _specifyMissionFlightSpeed; bool _specifyMissionFlightSpeed;
QGeoCoordinate _plannedHomePositionCoordinate; // Does not include altitde QGeoCoordinate _plannedHomePositionCoordinate; // Does not include altitde
Fact _missionNameFact;
Fact _plannedHomePositionAltitudeFact; Fact _plannedHomePositionAltitudeFact;
Fact _missionFlightSpeedFact; Fact _missionFlightSpeedFact;
Fact _missionEndActionFact; Fact _missionEndActionFact;
QString _loadedMissionDirectory;
CameraSection _cameraSection; CameraSection _cameraSection;
int _sequenceNumber; int _sequenceNumber;
...@@ -129,7 +114,6 @@ private: ...@@ -129,7 +114,6 @@ private:
static QMap<QString, FactMetaData*> _metaDataMap; static QMap<QString, FactMetaData*> _metaDataMap;
static const char* _missionNameName;
static const char* _plannedHomePositionAltitudeName; static const char* _plannedHomePositionAltitudeName;
static const char* _missionFlightSpeedName; static const char* _missionFlightSpeedName;
static const char* _missionEndActionName; static const char* _missionEndActionName;
......
...@@ -51,6 +51,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent) ...@@ -51,6 +51,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent)
: VisualMissionItem(vehicle, parent) : VisualMissionItem(vehicle, parent)
, _rawEdit(false) , _rawEdit(false)
, _dirty(false) , _dirty(false)
, _ignoreDirtyChangeSignals(false)
, _cameraSection(NULL) , _cameraSection(NULL)
, _commandTree(qgcApp()->toolbox()->missionCommandTree()) , _commandTree(qgcApp()->toolbox()->missionCommandTree())
, _altitudeRelativeToHomeFact (0, "Altitude is relative to home", FactMetaData::valueTypeUint32) , _altitudeRelativeToHomeFact (0, "Altitude is relative to home", FactMetaData::valueTypeUint32)
...@@ -87,6 +88,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missio ...@@ -87,6 +88,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missio
, _missionItem(missionItem) , _missionItem(missionItem)
, _rawEdit(false) , _rawEdit(false)
, _dirty(false) , _dirty(false)
, _ignoreDirtyChangeSignals(false)
, _cameraSection(NULL) , _cameraSection(NULL)
, _commandTree(qgcApp()->toolbox()->missionCommandTree()) , _commandTree(qgcApp()->toolbox()->missionCommandTree())
, _altitudeRelativeToHomeFact (0, "Altitude is relative to home", FactMetaData::valueTypeUint32) , _altitudeRelativeToHomeFact (0, "Altitude is relative to home", FactMetaData::valueTypeUint32)
...@@ -117,6 +119,7 @@ SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* pa ...@@ -117,6 +119,7 @@ SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* pa
, _missionItem(other._vehicle) , _missionItem(other._vehicle)
, _rawEdit(false) , _rawEdit(false)
, _dirty(false) , _dirty(false)
, _ignoreDirtyChangeSignals(false)
, _cameraSection(NULL) , _cameraSection(NULL)
, _commandTree(qgcApp()->toolbox()->missionCommandTree()) , _commandTree(qgcApp()->toolbox()->missionCommandTree())
, _altitudeRelativeToHomeFact (0, "Altitude is relative to home", FactMetaData::valueTypeUint32) , _altitudeRelativeToHomeFact (0, "Altitude is relative to home", FactMetaData::valueTypeUint32)
...@@ -390,6 +393,8 @@ QmlObjectListModel* SimpleMissionItem::textFieldFacts(void) ...@@ -390,6 +393,8 @@ QmlObjectListModel* SimpleMissionItem::textFieldFacts(void)
_missionItem._param7Fact.setMetaData(_defaultParamMetaData); _missionItem._param7Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param7Fact); model->append(&_missionItem._param7Fact);
} else { } else {
_ignoreDirtyChangeSignals = true;
_clearParamMetaData(); _clearParamMetaData();
MAV_CMD command; MAV_CMD command;
...@@ -425,6 +430,8 @@ QmlObjectListModel* SimpleMissionItem::textFieldFacts(void) ...@@ -425,6 +430,8 @@ QmlObjectListModel* SimpleMissionItem::textFieldFacts(void)
_missionItem._param7Fact.setMetaData(_altitudeMetaData); _missionItem._param7Fact.setMetaData(_altitudeMetaData);
model->append(&_missionItem._param7Fact); model->append(&_missionItem._param7Fact);
} }
_ignoreDirtyChangeSignals = false;
} }
return model; return model;
...@@ -524,7 +531,9 @@ void SimpleMissionItem::setDirty(bool dirty) ...@@ -524,7 +531,9 @@ void SimpleMissionItem::setDirty(bool dirty)
void SimpleMissionItem::_setDirtyFromSignal(void) void SimpleMissionItem::_setDirtyFromSignal(void)
{ {
setDirty(true); if (!_ignoreDirtyChangeSignals) {
setDirty(true);
}
} }
void SimpleMissionItem::_sendCoordinateChanged(void) void SimpleMissionItem::_sendCoordinateChanged(void)
......
...@@ -143,6 +143,7 @@ private: ...@@ -143,6 +143,7 @@ private:
MissionItem _missionItem; MissionItem _missionItem;
bool _rawEdit; bool _rawEdit;
bool _dirty; bool _dirty;
bool _ignoreDirtyChangeSignals;
CameraSection* _cameraSection; CameraSection* _cameraSection;
......
...@@ -31,10 +31,6 @@ Rectangle { ...@@ -31,10 +31,6 @@ Rectangle {
property bool _mobile: ScreenTools.isMobile property bool _mobile: ScreenTools.isMobile
property var _savePath: QGroundControl.settingsManager.appSettings.missionSavePath property var _savePath: QGroundControl.settingsManager.appSettings.missionSavePath
property var _fileExtension: QGroundControl.settingsManager.appSettings.missionFileExtension property var _fileExtension: QGroundControl.settingsManager.appSettings.missionFileExtension
property bool _newMissionAlreadyExists: false
property bool _noMissionName: missionItem.missionName.valueString === ""
property bool _showMissionList: _noMissionItemsAdded && (_noMissionName || _newMissionAlreadyExists)
property bool _existingMissionLoaded: missionItem.existingMission
property var _appSettings: QGroundControl.settingsManager.appSettings property var _appSettings: QGroundControl.settingsManager.appSettings
readonly property string _firmwareLabel: qsTr("Firmware") readonly property string _firmwareLabel: qsTr("Firmware")
...@@ -43,16 +39,6 @@ Rectangle { ...@@ -43,16 +39,6 @@ Rectangle {
QGCPalette { id: qgcPal } QGCPalette { id: qgcPal }
QFileDialogController { id: fileController } QFileDialogController { id: fileController }
Connections {
target: missionItem.missionName
onRawValueChanged: {
if (!_existingMissionLoaded) {
_newMissionAlreadyExists = !_noMissionName && fileController.fileExists(_savePath + "/" + missionItem.missionName.valueString + "." + _fileExtension)
}
}
}
Loader { Loader {
id: deferedload id: deferedload
active: valuesRect.visible active: valuesRect.visible
...@@ -74,140 +60,16 @@ Rectangle { ...@@ -74,140 +60,16 @@ Rectangle {
anchors.top: parent.top anchors.top: parent.top
spacing: _margin spacing: _margin
QGCLabel {
text: qsTr("Mission name")
font.pointSize: ScreenTools.smallFontPointSize
}
FactTextField {
anchors.left: parent.left
anchors.right: parent.right
fact: missionItem.missionName
visible: !_existingMissionLoaded
}
QGCLabel {
text: missionItem.missionName.valueString
visible: _existingMissionLoaded
}
QGCLabel {
text: qsTr("Mission already exists")
font.pointSize: ScreenTools.smallFontPointSize
color: qgcPal.warningText
visible: !_existingMissionLoaded && _newMissionAlreadyExists
}
FactCheckBox {
id: automaticUploadCheckbox
text: qsTr("Automatically upload on exit")
fact: _appSettings.automaticMissionUpload
}
RowLayout {
anchors.left: parent.left
anchors.right: parent.right
QGCButton {
text: qsTr("Remove All")
visible: !_noMissionItemsAdded
Layout.fillWidth: true
onClicked: missionController.clearMission()
}
QGCButton {
text: qsTr("New Mission")
visible: !_noMissionItemsAdded
Layout.fillWidth: true
onClicked: missionController.closeMission()
}
}
Loader { Loader {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
sourceComponent: _showMissionList ? missionList : missionSettings sourceComponent: missionSettings
} }
} // Column } // Column
} // Item } // Item
} // Component } // Component
} // Loader } // Loader
Component {
id: missionList
QGCFlickable {
anchors.left: parent.left
anchors.right: parent.right
height: missionColumn.height
Column {
id: missionColumn
anchors.left: parent.left
anchors.right: parent.right
spacing: _margin
SectionHeader {
text: qsTr("Load Mission")
showSpacer: false
}
RowLayout {
anchors.left: parent.left
anchors.right: parent.right
QGCButton {
text: qsTr("From Vehicle")
visible: !_offlineEditing
Layout.fillWidth: true
onClicked: missionController.loadFromVehicle()
}
QGCButton {
text: qsTr("Browse")
Layout.fillWidth: true
onClicked: fileDialog.openForLoad()
QGCFileDialog {
id: fileDialog
qgcView: rootQgcView
title: qsTr("Select mission file")
selectExisting: true
folder: _appSettings.missionSavePath
fileExtension: _appSettings.missionFileExtension
nameFilters: [ qsTr("Mission Files (*.%1)").arg(fileExtension) , qsTr("All Files (*.*)") ]
onAcceptedForLoad: {
missionController.loadFromFile(file)
fileDialog.close()
}
}
}
}
QGCLabel {
text: qsTr("No mission files")
visible: missionRepeater.model.length === 0
}
Repeater {
id: missionRepeater
model: fileController.getFiles(_savePath, _fileExtension);
QGCButton {
anchors.left: parent.left
anchors.right: parent.right
text: modelData
onClicked: {
missionController.loadFromFile(fileController.fullyQualifiedFilename(_savePath, modelData, _fileExtension))
}
}
}
}
}
}
Component { Component {
id: missionSettings id: missionSettings
......
...@@ -89,7 +89,7 @@ Rectangle { ...@@ -89,7 +89,7 @@ Rectangle {
onClicked: { onClicked: {
checked = false checked = false
if (missionController.saveOnSwitch()) { if (missionController.uploadOnSwitch()) {
showFlyView() showFlyView()
} }
} }
...@@ -178,9 +178,10 @@ Rectangle { ...@@ -178,9 +178,10 @@ Rectangle {
anchors.rightMargin: _margins anchors.rightMargin: _margins
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
text: qsTr("Upload") text: missionController.dirty ? qsTr("Upload Required") : qsTr("Upload")
visible: _manualUpload && missionController.dirty enabled: _activeVehicle
onClicked: missionController.uploadFromToolbar() visible: _manualUpload
onClicked: missionController.upload()
} }
} }
...@@ -19,6 +19,7 @@ import QGroundControl 1.0 ...@@ -19,6 +19,7 @@ import QGroundControl 1.0
import QGroundControl.FlightMap 1.0 import QGroundControl.FlightMap 1.0
import QGroundControl.ScreenTools 1.0 import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0 import QGroundControl.Controls 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0 import QGroundControl.Palette 1.0
import QGroundControl.Mavlink 1.0 import QGroundControl.Mavlink 1.0
import QGroundControl.Controllers 1.0 import QGroundControl.Controllers 1.0
...@@ -28,9 +29,7 @@ import QGroundControl.Controllers 1.0 ...@@ -28,9 +29,7 @@ import QGroundControl.Controllers 1.0
QGCView { QGCView {
id: _qgcView id: _qgcView
viewPanel: panel viewPanel: panel
z: QGroundControl.zOrderTopMost
// zOrder comes from the Loader in MainWindow.qml
z: QGroundControl.zOrderTopMost
readonly property int _decimalPlaces: 8 readonly property int _decimalPlaces: 8
readonly property real _horizontalMargin: ScreenTools.defaultFontPixelWidth / 2 readonly property real _horizontalMargin: ScreenTools.defaultFontPixelWidth / 2
...@@ -50,6 +49,7 @@ QGCView { ...@@ -50,6 +49,7 @@ QGCView {
property bool _singleComplexItem: missionController.complexMissionItemNames.length === 1 property bool _singleComplexItem: missionController.complexMissionItemNames.length === 1
property real _toolbarHeight: _qgcView.height - ScreenTools.availableHeight property real _toolbarHeight: _qgcView.height - ScreenTools.availableHeight
property int _editingLayer: _layerMission property int _editingLayer: _layerMission
property bool _autoSync: QGroundControl.settingsManager.appSettings.automaticMissionUpload.rawValue != 0
/// The controller which should be called for load/save, send to/from vehicle calls /// The controller which should be called for load/save, send to/from vehicle calls
property var _syncDropDownController: missionController property var _syncDropDownController: missionController
...@@ -105,30 +105,29 @@ QGCView { ...@@ -105,30 +105,29 @@ QGCView {
setCurrentItem(0) setCurrentItem(0)
} }
function _denyUpload() {
if (_activeVehicle && _activeVehicle.armed && _activeVehicle.flightMode === _activeVehicle.missionFlightMode) {
_qgcView.showMessage(qsTr("Mission Upload"), qsTr("Your vehicle is currently flying a mission. Upload is not allowed."), StandardButton.Ok)
return true
} else {
return false
}
}
// Users is switching away from Plan View // Users is switching away from Plan View
function saveOnSwitch() { function uploadOnSwitch() {
if (missionController.dirty) { if (missionController.dirty && _autoSync) {
save() if (!_denyUpload()) {
if (_activeVehicle.armed) {
_qgcView.showDialog(confirmSendToActiveVehicleAndSwitchView, qsTr("Mission Upload"), _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No)
return false
} else {
sendToVehicle() sendToVehicle()
} }
} }
return true return true
} }
// User clicked upload button in plan toolbar function upload() {
function uploadFromToolbar() { if (!_denyUpload()) {
if (missionController.dirty) {
save()
if (_activeVehicle.armed) {
_qgcView.showDialog(confirmSendToActiveVehicle, qsTr("Mission Upload"), _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No)
} else {
sendToVehicle() sendToVehicle()
} }
}
} }
function loadFromSelectedFile() { function loadFromSelectedFile() {
...@@ -339,17 +338,11 @@ QGCView { ...@@ -339,17 +338,11 @@ QGCView {
QGCViewPanel { QGCViewPanel {
id: panel id: panel
height: ScreenTools.availableHeight anchors.fill: parent
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
FlightMap { FlightMap {
id: editorMap id: editorMap
height: _qgcView.height anchors.fill: parent
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right//rightPanel.left
mapName: "MissionEditor" mapName: "MissionEditor"
// This is the center rectangle of the map which is not obscured by tools // This is the center rectangle of the map which is not obscured by tools
...@@ -528,13 +521,15 @@ QGCView { ...@@ -528,13 +521,15 @@ QGCView {
color: qgcPal.window color: qgcPal.window
title: qsTr("Plan") title: qsTr("Plan")
z: QGroundControl.zOrderWidgets z: QGroundControl.zOrderWidgets
buttonVisible: [ true, true, true, _showZoom, _showZoom ] showAlternateIcon: [ false, false, !_autoSync && _syncDropDownController.dirty, false, false, false ]
rotateImage: [ false, false, _syncDropDownController.syncInProgress, false, false, false ]
animateImage: [ false, false, !_autoSync && _syncDropDownController.dirty, false, false, false ]
buttonEnabled: [ true, true, !_syncDropDownController.syncInProgress, true, true, true ]
buttonVisible: [ true, true, true, true, _showZoom, _showZoom ]
maxHeight: mapScale.y - toolStrip.y maxHeight: mapScale.y - toolStrip.y
property bool _showZoom: !ScreenTools.isMobile property bool _showZoom: !ScreenTools.isMobile
property bool mySingleComplexItem: _singleComplexItem
model: [ model: [
{ {
name: "Waypoint", name: "Waypoint",
...@@ -546,6 +541,12 @@ QGCView { ...@@ -546,6 +541,12 @@ QGCView {
iconSource: "/qmlimages/MapDrawShape.svg", iconSource: "/qmlimages/MapDrawShape.svg",
dropPanelComponent: _singleComplexItem ? undefined : patternDropPanel dropPanelComponent: _singleComplexItem ? undefined : patternDropPanel
}, },
{
name: "Sync",
iconSource: "/qmlimages/MapSync.svg",
alternateIconSource: "/qmlimages/MapSyncChanged.svg",
dropPanelComponent: syncDropPanel
},
{ {
name: "Center", name: "Center",
iconSource: "/qmlimages/MapCenter.svg", iconSource: "/qmlimages/MapCenter.svg",
...@@ -571,10 +572,10 @@ QGCView { ...@@ -571,10 +572,10 @@ QGCView {
addComplexItem(missionController.complexMissionItemNames[0]) addComplexItem(missionController.complexMissionItemNames[0])
} }
break break
case 3: case 5:
editorMap.zoomLevel += 0.5 editorMap.zoomLevel += 0.5
break break
case 4: case 6:
editorMap.zoomLevel -= 0.5 editorMap.zoomLevel -= 0.5
break break
} }
...@@ -609,9 +610,9 @@ QGCView { ...@@ -609,9 +610,9 @@ QGCView {
// Right pane for mission editing controls // Right pane for mission editing controls
Rectangle { Rectangle {
id: rightPanel id: rightPanel
anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
height: ScreenTools.availableHeight
width: _rightPanelWidth width: _rightPanelWidth
color: qgcPal.window color: qgcPal.window
opacity: 0.95 opacity: 0.95
...@@ -796,6 +797,19 @@ QGCView { ...@@ -796,6 +797,19 @@ QGCView {
} }
} }
Component {
id: geoFenceEditorComponent
GeoFenceEditor {
availableWidth: _rightPanelWidth
availableHeight: ScreenTools.availableHeight
myGeoFenceController: geoFenceController
flightMap: editorMap
}
}
//- ToolStrip DropPanel Components //- ToolStrip DropPanel Components
Component { Component {
...@@ -832,44 +846,90 @@ QGCView { ...@@ -832,44 +846,90 @@ QGCView {
} }
Component { Component {
id: geoFenceEditorComponent id: syncDropPanel
GeoFenceEditor {
availableWidth: _rightPanelWidth
availableHeight: ScreenTools.availableHeight
myGeoFenceController: geoFenceController
flightMap: editorMap
}
}
Component { Column {
id: confirmSendToActiveVehicleAndSwitchView id: columnHolder
spacing: _margin
QGCViewMessage { property string _overwriteText: (_editingLayer == _layerMission) ? qsTr("Mission overwrite") : ((_editingLayer == _layerGeoFence) ? qsTr("GeoFence overwrite") : qsTr("Rally Points overwrite"))
message: _armedVehicleUploadPrompt
function accept() { QGCLabel {
missionController.sendToVehicle() width: sendSaveGrid.width
toolbar.showFlyView() wrapMode: Text.WordWrap
hideDialog() text: _syncDropDownController.dirty ?
qsTr("You have unsaved changes. You should upload to your vehicle, or save to a file:") :
qsTr("Sync:")
} }
function reject() { GridLayout {
toolbar.showFlyView() id: sendSaveGrid
hideDialog() columns: 2
} anchors.margins: _margin
} rowSpacing: _margin
} columnSpacing: ScreenTools.defaultFontPixelWidth
Component { QGCButton {
id: confirmSendToActiveVehicle text: qsTr("Upload")
Layout.fillWidth: true
enabled: _activeVehicle && !_syncDropDownController.syncInProgress
onClicked: {
dropPanel.hide()
_syncDropDownController.upload()
}
}
QGCViewMessage { QGCButton {
message: _armedVehicleUploadPrompt text: qsTr("Download")
Layout.fillWidth: true
enabled: _activeVehicle && !_syncDropDownController.syncInProgress
onClicked: {
dropPanel.hide()
if (_syncDropDownController.dirty) {
_qgcView.showDialog(syncLoadFromVehicleOverwrite, columnHolder._overwriteText, _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel)
} else {
_syncDropDownController.loadFromVehicle()
}
}
}
function accept() { QGCButton {
missionController.sendToVehicle() text: qsTr("Save To File...")
hideDialog() Layout.fillWidth: true
enabled: !_syncDropDownController.syncInProgress
onClicked: {
dropPanel.hide()
_syncDropDownController.saveToSelectedFile()
}
}
QGCButton {
text: qsTr("Load From File...")
Layout.fillWidth: true
enabled: !_syncDropDownController.syncInProgress
onClicked: {
dropPanel.hide()
if (_syncDropDownController.dirty) {
_qgcView.showDialog(syncLoadFromFileOverwrite, columnHolder._overwriteText, _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel)
} else {
_syncDropDownController.loadFromSelectedFile()
}
}
}
QGCButton {
text: qsTr("Remove All")
Layout.fillWidth: true
onClicked: {
dropPanel.hide()
_qgcView.showDialog(removeAllPromptDialog, qsTr("Remove all"), _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No)
}
}
}
FactCheckBox {
text: qsTr("Automatic upload to vehicle")
fact: QGroundControl.settingsManager.appSettings.automaticMissionUpload
} }
} }
} }
......
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