Unverified Commit 26cc44d2 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #7918 from DonLakeFlyer/PlanOverlay

Plan: Create Plan overlay and friends
parents 7dd98eac 636175dc
...@@ -35,16 +35,18 @@ SettingsFact::SettingsFact(QString settingsGroup, FactMetaData* metaData, QObjec ...@@ -35,16 +35,18 @@ SettingsFact::SettingsFact(QString settingsGroup, FactMetaData* metaData, QObjec
_visible = qgcApp()->toolbox()->corePlugin()->adjustSettingMetaData(settingsGroup, *metaData); _visible = qgcApp()->toolbox()->corePlugin()->adjustSettingMetaData(settingsGroup, *metaData);
setMetaData(metaData); setMetaData(metaData);
QVariant rawDefaultValue = metaData->rawDefaultValue(); if (metaData->defaultValueAvailable()) {
if (_visible) { QVariant rawDefaultValue = metaData->rawDefaultValue();
QVariant typedValue; if (_visible) {
QString errorString; QVariant typedValue;
metaData->convertAndValidateRaw(settings.value(_name, rawDefaultValue), true /* conertOnly */, typedValue, errorString); QString errorString;
_rawValue = typedValue; metaData->convertAndValidateRaw(settings.value(_name, rawDefaultValue), true /* conertOnly */, typedValue, errorString);
} else { _rawValue = typedValue;
// Setting is not visible, force to default value always } else {
settings.setValue(_name, rawDefaultValue); // Setting is not visible, force to default value always
_rawValue = rawDefaultValue; settings.setValue(_name, rawDefaultValue);
_rawValue = rawDefaultValue;
}
} }
connect(this, &Fact::rawValueChanged, this, &SettingsFact::_rawValueChanged); connect(this, &Fact::rawValueChanged, this, &SettingsFact::_rawValueChanged);
......
...@@ -1004,16 +1004,16 @@ bool MissionController::loadTextFile(QFile& file, QString& errorString) ...@@ -1004,16 +1004,16 @@ bool MissionController::loadTextFile(QFile& file, QString& errorString)
return true; return true;
} }
bool MissionController::readyForSaveSend(void) const int MissionController::readyForSaveState(void) const
{ {
for (int i=0; i<_visualItems->count(); i++) { for (int i=0; i<_visualItems->count(); i++) {
VisualMissionItem* visualItem = qobject_cast<VisualMissionItem*>(_visualItems->get(i)); VisualMissionItem* visualItem = qobject_cast<VisualMissionItem*>(_visualItems->get(i));
if (visualItem->readyForSaveState() != VisualMissionItem::ReadyForSave) { if (visualItem->readyForSaveState() != VisualMissionItem::ReadyForSave) {
return false; return visualItem->readyForSaveState();
} }
} }
return true; return VisualMissionItem::ReadyForSave;
} }
void MissionController::save(QJsonObject& json) void MissionController::save(QJsonObject& json)
......
...@@ -145,9 +145,10 @@ public: ...@@ -145,9 +145,10 @@ public:
/// Returns the index of this item in the visual item list /// Returns the index of this item in the visual item list
Q_INVOKABLE int visualItemIndexFromSequenceNumber(int sequenceNumber) const; Q_INVOKABLE int visualItemIndexFromSequenceNumber(int sequenceNumber) const;
/// Determines if the mission has all data needed to be saved or sent to the vehicle. Currently the only case where this /// Determines if the mission has all data needed to be saved or sent to the vehicle.
/// would return false is when it is still waiting on terrain data to determine correct altitudes. /// IMPORTANT NOTE: The return value is a VisualMissionItem::ReadForSaveState value. It is an int here to work around
bool readyForSaveSend(void) const; /// a nightmare of circular header dependency problems.
int readyForSaveState(void) const;
/// 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);
......
...@@ -29,7 +29,7 @@ class PlanMasterController : public QObject ...@@ -29,7 +29,7 @@ class PlanMasterController : public QObject
public: public:
PlanMasterController(QObject* parent = nullptr); PlanMasterController(QObject* parent = nullptr);
~PlanMasterController(); ~PlanMasterController();
Q_PROPERTY(MissionController* missionController READ missionController CONSTANT) Q_PROPERTY(MissionController* missionController READ missionController CONSTANT)
Q_PROPERTY(GeoFenceController* geoFenceController READ geoFenceController CONSTANT) Q_PROPERTY(GeoFenceController* geoFenceController READ geoFenceController CONSTANT)
Q_PROPERTY(RallyPointController* rallyPointController READ rallyPointController CONSTANT) Q_PROPERTY(RallyPointController* rallyPointController READ rallyPointController CONSTANT)
...@@ -52,9 +52,10 @@ public: ...@@ -52,9 +52,10 @@ public:
/// @param deleteWhenSendCmplete The PlanMasterController object should be deleted after the first send is completed. /// @param deleteWhenSendCmplete The PlanMasterController object should be deleted after the first send is completed.
Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted = false); Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted = false);
/// Determines if the plan has all data needed to be saved or sent to the vehicle. Currently the only case where this /// Determines if the plan has all information needed to be saved or sent to the vehicle.
/// would return false is when it is still waiting on terrain data to determine correct altitudes. /// IMPORTANT NOTE: The return value is a VisualMissionItem::ReadForSaveState value. It is an int here to work around
Q_INVOKABLE bool readyForSaveSend(void) const { return _missionController.readyForSaveSend(); } /// a nightmare of circular header dependency problems.
Q_INVOKABLE int readyForSaveState(void) const { return _missionController.readyForSaveState(); }
/// Sends a plan to the specified file /// Sends a plan to the specified file
/// @param[in] vehicle Vehicle we are sending a plan to /// @param[in] vehicle Vehicle we are sending a plan to
......
...@@ -181,13 +181,29 @@ Item { ...@@ -181,13 +181,29 @@ Item {
mainWindow.planMasterControllerPlan = _planMasterController mainWindow.planMasterControllerPlan = _planMasterController
} }
function waitingOnDataMessage() { function waitingOnIncompleteDataMessage(save) {
mainWindow.showMessageDialog(qsTr("Unable to Save/Upload"), qsTr("Plan is waiting on terrain data from server for correct altitude values.")) var saveOrUpload = save ? qsTr("Save") : qsTr("Upload")
mainWindow.showMessageDialog(qsTr("Unable to %1").arg(saveOrUpload), qsTr("Plan has incomplete items. Complete all items and %1 again.").arg(saveOrUpload))
}
function waitingOnTerrainDataMessage(save) {
var saveOrUpload = save ? qsTr("Save") : qsTr("Upload")
mainWindow.showMessageDialog(qsTr("Unable to %1").arg(saveOrUpload), qsTr("Plan is waiting on terrain data from server for correct altitude values."))
}
function checkReadyForSaveUpload(save) {
if (readyForSaveState() == VisualMissionItem.NotReadyForSaveData) {
waitingOnIncompleteDataMessage(save)
return false
} else if (readyForSaveState() == VisualMissionItem.NotReadyForSaveTerrain) {
waitingOnTerrainDataMessage(save)
return false
}
return true
} }
function upload() { function upload() {
if (!readyForSaveSend()) { if (!checkReadyForSaveUpload(false /* save */)) {
waitingOnDataMessage()
return return
} }
if (activeVehicle && activeVehicle.armed && activeVehicle.flightMode === activeVehicle.missionFlightMode) { if (activeVehicle && activeVehicle.armed && activeVehicle.flightMode === activeVehicle.missionFlightMode) {
...@@ -208,8 +224,7 @@ Item { ...@@ -208,8 +224,7 @@ Item {
} }
function saveToSelectedFile() { function saveToSelectedFile() {
if (!readyForSaveSend()) { if (!checkReadyForSaveUpload(true /* save */)) {
waitingOnDataMessage()
return return
} }
fileDialog.title = qsTr("Save Plan") fileDialog.title = qsTr("Save Plan")
...@@ -236,8 +251,7 @@ Item { ...@@ -236,8 +251,7 @@ Item {
} }
function saveKmlToSelectedFile() { function saveKmlToSelectedFile() {
if (!readyForSaveSend()) { if (!checkReadyForSaveUpload(true /* save */)) {
waitingOnDataMessage()
return return
} }
fileDialog.title = qsTr("Save KML") fileDialog.title = qsTr("Save KML")
...@@ -1040,10 +1054,13 @@ Item { ...@@ -1040,10 +1054,13 @@ Item {
QGCButton { QGCButton {
text: qsTr("New...") text: qsTr("New...")
Layout.fillWidth: true Layout.fillWidth: true
enabled: _planMasterController.containsItems
onClicked: { onClicked: {
dropPanel.hide() dropPanel.hide()
mainWindow.showComponentDialog(removeAllPromptDialog, qsTr("New Plan"), mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) if (_planMasterController.containsItems) {
mainWindow.showComponentDialog(removeAllPromptDialog, qsTr("New Plan"), mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No)
} else {
startOverlay.visible = true
}
} }
} }
......
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