From 420ea060542d281f04f99f0f88eac730aafca381 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Mon, 27 Mar 2017 16:47:36 -0700 Subject: [PATCH] More work on Plan user model --- src/MissionManager/MissionController.cc | 7 +- src/MissionManager/MissionController.h | 7 +- src/PlanView/MissionSettingsEditor.qml | 11 +- src/PlanView/PlanToolBar.qml | 25 +++- src/PlanView/PlanView.qml | 151 ++++++++++-------------- 5 files changed, 94 insertions(+), 107 deletions(-) diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 489f92973..a9d5479dd 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 b179e6eed..b53c0f0dd 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 d0050bdb4..206ac4591 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 365558aef..75d7d3c88 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 9c764e9dc..41ce30804 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 -- 2.22.0