7import QGroundControl.Controls
8import QGroundControl.FactControls
10// Toolbar for Plan View
12 required property var planMasterController
13 property bool showRallyPointsHelp: false
15 signal toolbarButtonClicked()
18 spacing: ScreenTools.defaultFontPixelWidth
20 property var _planMasterController: planMasterController
21 property var _missionController: _planMasterController.missionController
22 property var _geoFenceController: _planMasterController.geoFenceController
23 property var _rallyPointController: _planMasterController.rallyPointController
24 property bool _controllerOffline: _planMasterController.offline
25 property var _saveDirty: _planMasterController.dirtyForSave
26 property var _uploadDirty: _planMasterController.dirtyForUpload
27 property var _syncInProgress: _planMasterController.syncInProgress
28 property var _visualItems: _missionController.visualItems
29 property bool _hasPlanItems: _planMasterController.containsItems
31 readonly property real _margins: ScreenTools.defaultFontPixelWidth
33 function _uploadClicked() {
34 _planMasterController.upload()
37 function _downloadClicked() {
39 QGroundControl.showMessageDialog(root, qsTr("Download"),
40 qsTr("You have unsaved changes. Downloading from the Vehicle will lose these changes. Are you sure?"),
41 Dialog.Yes | Dialog.Cancel,
42 function() { _planMasterController.loadFromVehicle() })
44 _planMasterController.loadFromVehicle()
48 function _openButtonClicked() {
49 // Unsent changes don't matter when offline or when the plan is safely saved to a file
50 let planSafeOnDisk = !_saveDirty && _planMasterController.currentPlanFile !== ""
51 let unsentChanges = _uploadDirty && !_controllerOffline && !planSafeOnDisk
52 if (_saveDirty || unsentChanges) {
54 if (_saveDirty && unsentChanges) {
55 msg = qsTr("You have unsaved/unsent changes. Loading a new Plan will lose these changes. Are you sure?")
56 } else if (_saveDirty) {
57 msg = qsTr("You have unsaved changes. Loading a new Plan will lose these changes. Are you sure?")
59 msg = qsTr("You have unsent changes. Loading a new Plan will lose these changes. Are you sure?")
61 QGroundControl.showMessageDialog(root, qsTr("Open Plan"),
63 Dialog.Yes | Dialog.Cancel,
64 function() { _planMasterController.loadFromSelectedFile() } )
66 _planMasterController.loadFromSelectedFile()
70 function _saveButtonClicked() {
71 if (_planMasterController.currentPlanFile === "") {
72 _planMasterController.saveToSelectedFile()
74 _planMasterController.saveToCurrent()
78 function _saveAsKMLClicked() {
79 // Don't save if we only have Mission Settings item
80 if (_visualItems.count > 1) {
81 _planMasterController.saveKmlToSelectedFile()
85 function _storageClearButtonClicked() {
86 QGroundControl.showMessageDialog(root, qsTr("Clear"),
87 qsTr("Are you sure you want to remove all the items from the plan editor?"),
88 Dialog.Yes | Dialog.Cancel,
89 function() { _planMasterController.removeAll(); })
92 function _vehicleClearButtonClicked() {
93 QGroundControl.showMessageDialog(root, qsTr("Clear"),
94 qsTr("Are you sure you want to remove the plan from the vehicle and the plan editor?"),
95 Dialog.Yes | Dialog.Cancel,
97 _planMasterController.removeAllFromVehicle()
101 function _clearClicked() {
102 if (_planMasterController.offline) {
103 _storageClearButtonClicked();
105 _vehicleClearButtonClicked();
109 QGCPalette { id: qgcPal }
112 objectName: "planToolbar_openButton"
114 iconSource: "/qmlimages/Plan.svg"
115 enabled: !_planMasterController.syncInProgress
116 onClicked: { toolbarButtonClicked(); _openButtonClicked() }
120 objectName: "planToolbar_saveButton"
122 iconSource: "/res/SaveToDisk.svg"
123 enabled: !_syncInProgress && _hasPlanItems
125 onClicked: { toolbarButtonClicked(); _saveButtonClicked() }
130 objectName: "planToolbar_uploadButton"
132 iconSource: "/res/UploadToVehicle.svg"
133 enabled: !_syncInProgress && _hasPlanItems && !_controllerOffline
134 visible: !_syncInProgress
135 primary: _uploadDirty && !_controllerOffline
136 onClicked: { toolbarButtonClicked(); _uploadClicked() }
140 objectName: "planToolbar_clearButton"
142 iconSource: "/res/TrashCan.svg"
143 enabled: !_syncInProgress
144 onClicked: { toolbarButtonClicked(); _clearClicked() }
148 objectName: "planToolbar_hamburgerButton"
149 iconSource: "qrc:/qmlimages/Hamburger.svg"
152 let position = Qt.point(width, height / 2)
153 // For some strange reason using mainWindow in mapToItem doesn't work, so we use globals.parent instead which also gets us mainWindow
154 position = mapToItem(globals.parent, position)
155 var dropPanel = hamburgerDropPanelComponent.createObject(mainWindow, { clickRect: Qt.rect(position.x, position.y, 0, 0) })
161 text: qsTr("Click in map to add rally points")
162 visible: root.showRallyPointsHelp
163 Layout.alignment: Qt.AlignVCenter
167 id: hamburgerDropPanelComponent
172 sourceComponent: Component {
174 spacing: ScreenTools.defaultFontPixelHeight / 2
177 objectName: "planToolbar_saveAsButton"
178 Layout.fillWidth: true
179 text: qsTr("Save as...")
180 enabled: !_syncInProgress && _hasPlanItems
184 _planMasterController.saveToSelectedFile()
189 Layout.fillWidth: true
190 text: qsTr("Save as KML")
191 enabled: !_syncInProgress && _hasPlanItems
200 Layout.fillWidth: true
201 text: qsTr("Download")
202 enabled: !_syncInProgress && !_controllerOffline
203 visible: !_syncInProgress