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 id: root
16 spacing: ScreenTools.defaultFontPixelWidth
17
18 property var _planMasterController: planMasterController
19 property var _missionController: _planMasterController.missionController
20 property var _geoFenceController: _planMasterController.geoFenceController
21 property var _rallyPointController: _planMasterController.rallyPointController
22 property bool _controllerOffline: _planMasterController.offline
23 property var _saveDirty: _planMasterController.dirtyForSave
24 property var _uploadDirty: _planMasterController.dirtyForUpload
25 property var _syncInProgress: _planMasterController.syncInProgress
26 property var _visualItems: _missionController.visualItems
27 property bool _hasPlanItems: _planMasterController.containsItems
28
29 readonly property real _margins: ScreenTools.defaultFontPixelWidth
30
31 function _uploadClicked() {
32 _planMasterController.upload()
33 }
34
35 function _downloadClicked() {
36 if (_saveDirty) {
37 QGroundControl.showMessageDialog(root, qsTr("Download"),
38 qsTr("You have unsaved changes. Downloading from the Vehicle will lose these changes. Are you sure?"),
39 Dialog.Yes | Dialog.Cancel,
40 function() { _planMasterController.loadFromVehicle() })
41 } else {
42 _planMasterController.loadFromVehicle()
43 }
44 }
45
46 function _openButtonClicked() {
47 if (_saveDirty || _uploadDirty) {
48 QGroundControl.showMessageDialog(root, qsTr("Open Plan"),
49 qsTr("You have unsaved/unsent changes. Loading a new Plan will lose these changes. Are you sure?"),
50 Dialog.Yes | Dialog.Cancel,
51 function() { _planMasterController.loadFromSelectedFile() } )
52 } else {
53 _planMasterController.loadFromSelectedFile()
54 }
55 }
56
57 function _saveButtonClicked() {
58 if (_planMasterController.currentPlanFileName === "") {
59 if (_planMasterController.currentPlanFile === "") {
60 // No file and no name typed — open the file dialog
61 _planMasterController.saveToSelectedFile()
62 } else {
63 // Have a file but name was cleared — save to the existing file
64 _planMasterController.saveToCurrent()
65 }
66 return
67 }
68
69 if (_planMasterController.currentPlanFile === "" || _planMasterController.planFileRenamed) {
70 // First save with a typed name, or name was changed since last save
71 let fullName = _planMasterController.currentPlanFileName + "." + _planMasterController.fileExtension
72 let msg = _planMasterController.resolvedPlanFileExists()
73 ? qsTr("'%1' already exists. Overwrite?").arg(fullName)
74 : qsTr("Save as '%1'?").arg(fullName)
75 QGroundControl.showMessageDialog(root, qsTr("Save"), msg,
76 Dialog.Yes | Dialog.No,
77 function() { _planMasterController.saveWithCurrentName() })
78 } else {
79 _planMasterController.saveToCurrent()
80 }
81 }
82
83 function _saveAsKMLClicked() {
84 // Don't save if we only have Mission Settings item
85 if (_visualItems.count > 1) {
86 _planMasterController.saveKmlToSelectedFile()
87 }
88 }
89
90 function _storageClearButtonClicked() {
91 QGroundControl.showMessageDialog(root, qsTr("Clear"),
92 qsTr("Are you sure you want to remove all the items from the plan editor?"),
93 Dialog.Yes | Dialog.Cancel,
94 function() { _planMasterController.removeAll(); })
95 }
96
97 function _vehicleClearButtonClicked() {
98 QGroundControl.showMessageDialog(root, qsTr("Clear"),
99 qsTr("Are you sure you want to remove the plan from the vehicle and the plan editor?"),
100 Dialog.Yes | Dialog.Cancel,
101 function() {
102 _planMasterController.removeAllFromVehicle()
103 })
104 }
105
106 function _clearClicked() {
107 if (_planMasterController.offline) {
108 _storageClearButtonClicked();
109 } else {
110 _vehicleClearButtonClicked();
111 }
112 }
113
114 QGCPalette { id: qgcPal }
115
116 QGCButton {
117 text: qsTr("Open")
118 iconSource: "/qmlimages/Plan.svg"
119 enabled: !_planMasterController.syncInProgress
120 onClicked: _openButtonClicked()
121 }
122
123 QGCButton {
124 text: qsTr("Save")
125 iconSource: "/res/SaveToDisk.svg"
126 enabled: !_syncInProgress && _hasPlanItems
127 primary: _saveDirty
128 onClicked: _saveButtonClicked()
129 }
130
131 QGCButton {
132 id: uploadButton
133 text: qsTr("Upload")
134 iconSource: "/res/UploadToVehicle.svg"
135 enabled: !_syncInProgress && _hasPlanItems
136 visible: !_syncInProgress
137 primary: _uploadDirty
138 onClicked: _uploadClicked()
139 }
140
141 QGCButton {
142 text: qsTr("Clear")
143 iconSource: "/res/TrashCan.svg"
144 enabled: !_syncInProgress
145 onClicked: _clearClicked()
146 }
147
148 QGCButton {
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 Layout.fillWidth: true
178 text: qsTr("Save as KML")
179 enabled: !_syncInProgress && _hasPlanItems
180
181 onClicked: {
182 dropPanel.close()
183 _saveAsKMLClicked()
184 }
185 }
186
187 QGCButton {
188 Layout.fillWidth: true
189 text: qsTr("Download")
190 enabled: !_syncInProgress && !_controllerOffline
191 visible: !_syncInProgress
192
193 onClicked: {
194 dropPanel.close()
195 _downloadClicked()
196 }
197 }
198 }
199 }
200 }
201 }
202}