QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
PlanToolBarIndicators.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Layouts
4import QtQuick.Dialogs
5
6import QGroundControl
7import QGroundControl.Controls
8import QGroundControl.FactControls
9
10// Toolbar for Plan View
11RowLayout {
12 required property var planMasterController
13 property bool showRallyPointsHelp: false
14
15 signal toolbarButtonClicked()
16
17 id: root
18 spacing: ScreenTools.defaultFontPixelWidth
19
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
30
31 readonly property real _margins: ScreenTools.defaultFontPixelWidth
32
33 function _uploadClicked() {
34 _planMasterController.upload()
35 }
36
37 function _downloadClicked() {
38 if (_saveDirty) {
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() })
43 } else {
44 _planMasterController.loadFromVehicle()
45 }
46 }
47
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) {
53 let msg
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?")
58 } else {
59 msg = qsTr("You have unsent changes. Loading a new Plan will lose these changes. Are you sure?")
60 }
61 QGroundControl.showMessageDialog(root, qsTr("Open Plan"),
62 msg,
63 Dialog.Yes | Dialog.Cancel,
64 function() { _planMasterController.loadFromSelectedFile() } )
65 } else {
66 _planMasterController.loadFromSelectedFile()
67 }
68 }
69
70 function _saveButtonClicked() {
71 if (_planMasterController.currentPlanFile === "") {
72 _planMasterController.saveToSelectedFile()
73 } else {
74 _planMasterController.saveToCurrent()
75 }
76 }
77
78 function _saveAsKMLClicked() {
79 // Don't save if we only have Mission Settings item
80 if (_visualItems.count > 1) {
81 _planMasterController.saveKmlToSelectedFile()
82 }
83 }
84
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(); })
90 }
91
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,
96 function() {
97 _planMasterController.removeAllFromVehicle()
98 })
99 }
100
101 function _clearClicked() {
102 if (_planMasterController.offline) {
103 _storageClearButtonClicked();
104 } else {
105 _vehicleClearButtonClicked();
106 }
107 }
108
109 QGCPalette { id: qgcPal }
110
111 QGCButton {
112 objectName: "planToolbar_openButton"
113 text: qsTr("Open")
114 iconSource: "/qmlimages/Plan.svg"
115 enabled: !_planMasterController.syncInProgress
116 onClicked: { toolbarButtonClicked(); _openButtonClicked() }
117 }
118
119 QGCButton {
120 objectName: "planToolbar_saveButton"
121 text: qsTr("Save")
122 iconSource: "/res/SaveToDisk.svg"
123 enabled: !_syncInProgress && _hasPlanItems
124 primary: _saveDirty
125 onClicked: { toolbarButtonClicked(); _saveButtonClicked() }
126 }
127
128 QGCButton {
129 id: uploadButton
130 objectName: "planToolbar_uploadButton"
131 text: qsTr("Upload")
132 iconSource: "/res/UploadToVehicle.svg"
133 enabled: !_syncInProgress && _hasPlanItems && !_controllerOffline
134 visible: !_syncInProgress
135 primary: _uploadDirty && !_controllerOffline
136 onClicked: { toolbarButtonClicked(); _uploadClicked() }
137 }
138
139 QGCButton {
140 objectName: "planToolbar_clearButton"
141 text: qsTr("Clear")
142 iconSource: "/res/TrashCan.svg"
143 enabled: !_syncInProgress
144 onClicked: { toolbarButtonClicked(); _clearClicked() }
145 }
146
147 QGCButton {
148 objectName: "planToolbar_hamburgerButton"
149 iconSource: "qrc:/qmlimages/Hamburger.svg"
150
151 onClicked: {
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) })
156 dropPanel.open()
157 }
158 }
159
160 QGCLabel {
161 text: qsTr("Click in map to add rally points")
162 visible: root.showRallyPointsHelp
163 Layout.alignment: Qt.AlignVCenter
164 }
165
166 Component {
167 id: hamburgerDropPanelComponent
168
169 DropPanel {
170 id: dropPanel
171
172 sourceComponent: Component {
173 ColumnLayout {
174 spacing: ScreenTools.defaultFontPixelHeight / 2
175
176 QGCButton {
177 objectName: "planToolbar_saveAsButton"
178 Layout.fillWidth: true
179 text: qsTr("Save as...")
180 enabled: !_syncInProgress && _hasPlanItems
181
182 onClicked: {
183 dropPanel.close()
184 _planMasterController.saveToSelectedFile()
185 }
186 }
187
188 QGCButton {
189 Layout.fillWidth: true
190 text: qsTr("Save as KML")
191 enabled: !_syncInProgress && _hasPlanItems
192
193 onClicked: {
194 dropPanel.close()
195 _saveAsKMLClicked()
196 }
197 }
198
199 QGCButton {
200 Layout.fillWidth: true
201 text: qsTr("Download")
202 enabled: !_syncInProgress && !_controllerOffline
203 visible: !_syncInProgress
204
205 onClicked: {
206 dropPanel.close()
207 _downloadClicked()
208 }
209 }
210 }
211 }
212 }
213 }
214}