diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 489f92973a3260abbad961c7aaa8045dfb9840cf..a9d5479ddfc1d48e8d11635f18786a9f59c93ef3 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -1618,12 +1618,15 @@ void MissionController::save(void) saveToFile(missionDir + "/" + missionName); } + _settingsItem->setExistingMission(savedToFile); +} + +void MissionController::saveAndSend(void) +{ // Send to vehicle if we are connected if (!_activeVehicle->isOfflineEditingVehicle()) { sendToVehicle(); } - - _settingsItem->setExistingMission(savedToFile); } void MissionController::clearMission(void) diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index b179e6eed20a37c41618b49fa1e54b63b538c8fa..b53c0f0dd66d6c6acc2bbad4fbaef8aa8942ad0b 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -89,10 +89,13 @@ public: /// Sends the mission items to the specified vehicle static void sendItemsToVehicle(Vehicle* vehicle, QmlObjectListModel* visualMissionItems); - /// Saves the mission to file if any and sends to vehicle + /// Saves the mission to file Q_INVOKABLE void save(void); - /// Removes all items from the mission saving and sending as needed + /// 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 diff --git a/src/PlanView/MissionSettingsEditor.qml b/src/PlanView/MissionSettingsEditor.qml index d0050bdb4bbba947e6e7c551fcfc0a5d23d7dc7f..206ac45919ff723d57fbd992be013cdef33bb91d 100644 --- a/src/PlanView/MissionSettingsEditor.qml +++ b/src/PlanView/MissionSettingsEditor.qml @@ -109,25 +109,18 @@ Rectangle { anchors.right: parent.right QGCButton { - text: qsTr("Clear") + text: qsTr("Remove All") visible: !_noMissionItemsAdded Layout.fillWidth: true onClicked: missionController.clearMission() } QGCButton { - text: qsTr("Close") + text: qsTr("New Mission") visible: !_noMissionItemsAdded Layout.fillWidth: true onClicked: missionController.closeMission() } - - QGCButton { - text: qsTr("Upload") - visible: !_noMissionItemsAdded && !automaticUploadCheckbox.checked - Layout.fillWidth: true - onClicked: missionController.sendToVehicle() - } } Loader { diff --git a/src/PlanView/PlanToolBar.qml b/src/PlanView/PlanToolBar.qml index 365558aef654a0d9abf0908a8cf13f4cfd51eed8..75d7d3c88e8146b18d1226da0d555195474501c7 100644 --- a/src/PlanView/PlanToolBar.qml +++ b/src/PlanView/PlanToolBar.qml @@ -36,6 +36,12 @@ Rectangle { property bool _statusValid: currentMissionItem != undefined property bool _missionValid: missionItems != undefined property bool _controllerValid: missionController != undefined + property bool _manualUpload: QGroundControl.settingsManager.appSettings.automaticMissionUpload.rawValue == 0 + + Connections { + target: QGroundControl.settingsManager.appSettings.automaticMissionUpload + onRawValueChanged: console.log("changed", QGroundControl.settingsManager.appSettings.automaticMissionUpload.rawValue) + } property real _distance: _statusValid ? currentMissionItem.distance : NaN property real _altDifference: _statusValid ? currentMissionItem.altDifference : NaN @@ -66,9 +72,11 @@ Rectangle { onReleased: { mouse.accepted = true; } } - Row { + RowLayout { anchors.top: parent.top anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: uploadButton.visible ? uploadButton.left : uploadButton.right spacing: ScreenTools.defaultFontPixelWidth * 2 QGCToolBarButton { @@ -81,8 +89,9 @@ Rectangle { onClicked: { checked = false - missionController.saveOnSwitch() - showFlyView() + if (missionController.saveOnSwitch()) { + showFlyView() + } } } @@ -163,5 +172,15 @@ Rectangle { QGCLabel { text: "--" } } } + + QGCButton { + id: uploadButton + anchors.rightMargin: _margins + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + text: qsTr("Upload") + visible: _manualUpload && missionController.dirty + onClicked: missionController.uploadFromToolbar() + } } diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index 9c764e9dcafe800663e9d1d1fe047ac5f08b2299..41ce30804d73e968a37debb5a3d70f2bdc6c797f 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -48,15 +48,16 @@ QGCView { property bool _lightWidgetBorders: editorMap.isSatelliteMap property bool _addWaypointOnClick: false 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 /// The controller which should be called for load/save, send to/from vehicle calls property var _syncDropDownController: missionController - readonly property int _layerMission: 1 - readonly property int _layerGeoFence: 2 - readonly property int _layerRallyPoints: 3 - property int _editingLayer: _layerMission + readonly property int _layerMission: 1 + readonly property int _layerGeoFence: 2 + readonly property int _layerRallyPoints: 3 + readonly property string _armedVehicleUploadPrompt: qsTr("Vehicle is currently armed. Do you want to upload the mission to the vehicle?") Component.onCompleted: { toolbar.missionController = Qt.binding(function () { return missionController }) @@ -106,7 +107,28 @@ QGCView { // Users is switching away from Plan View function saveOnSwitch() { - save() + if (missionController.dirty) { + save() + if (_activeVehicle.armed) { + _qgcView.showDialog(confirmSendToActiveVehicleAndSwitchView, qsTr("Mission Upload"), _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) + return false + } else { + sendToVehicle() + } + } + return true + } + + // User clicked upload button in plan toolbar + function uploadFromToolbar() { + if (missionController.dirty) { + save() + if (_activeVehicle.armed) { + _qgcView.showDialog(confirmSendToActiveVehicle, qsTr("Mission Upload"), _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) + } else { + sendToVehicle() + } + } } function loadFromSelectedFile() { @@ -506,7 +528,6 @@ QGCView { color: qgcPal.window title: qsTr("Plan") z: QGroundControl.zOrderWidgets - buttonEnabled: [ true, true, true, true, true ] buttonVisible: [ true, true, true, _showZoom, _showZoom ] maxHeight: mapScale.y - toolStrip.y @@ -777,90 +798,6 @@ QGCView { //- ToolStrip DropPanel Components - Component { - id: syncDropPanel - - Column { - id: columnHolder - spacing: _margin - - property string _overwriteText: (_editingLayer == _layerMission) ? qsTr("Mission overwrite") : ((_editingLayer == _layerGeoFence) ? qsTr("GeoFence overwrite") : qsTr("Rally Points overwrite")) - - QGCLabel { - width: sendSaveGrid.width - wrapMode: Text.WordWrap - text: _syncDropDownController.dirty ? - qsTr("You have unsaved changes. You should send to your vehicle, or save to a file:") : - qsTr("Sync:") - } - - GridLayout { - id: sendSaveGrid - columns: 2 - anchors.margins: _margin - rowSpacing: _margin - columnSpacing: ScreenTools.defaultFontPixelWidth - - QGCButton { - text: qsTr("Save") - Layout.fillWidth: true - enabled: !_syncDropDownController.syncInProgress - onClicked: { - dropPanel.hide() - _syncDropDownController.save() - } - } - - QGCButton { - text: qsTr("Load From Vehicle") - 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() - } - } - } - - QGCButton { - text: qsTr("Save To File...") - 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) - } - } - } - } - } - Component { id: centerMapDropPanel @@ -904,4 +841,36 @@ QGCView { flightMap: editorMap } } + + Component { + id: confirmSendToActiveVehicleAndSwitchView + + QGCViewMessage { + message: _armedVehicleUploadPrompt + + function accept() { + missionController.sendToVehicle() + toolbar.showFlyView() + hideDialog() + } + + function reject() { + toolbar.showFlyView() + hideDialog() + } + } + } + + Component { + id: confirmSendToActiveVehicle + + QGCViewMessage { + message: _armedVehicleUploadPrompt + + function accept() { + missionController.sendToVehicle() + hideDialog() + } + } + } } // QGCVIew