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 if (_saveDirty || _uploadDirty) {
50 QGroundControl.showMessageDialog(root, qsTr("Open Plan"),
51 qsTr("You have unsaved/unsent changes. Loading a new Plan will lose these changes. Are you sure?"),
52 Dialog.Yes | Dialog.Cancel,
53 function() { _planMasterController.loadFromSelectedFile() } )
54 } else {
55 _planMasterController.loadFromSelectedFile()
56 }
57 }
58
59 function _saveButtonClicked() {
60 if (_planMasterController.currentPlanFileName === "") {
61 if (_planMasterController.currentPlanFile === "") {
62 // No file and no name typed — open the file dialog
63 _planMasterController.saveToSelectedFile()
64 } else {
65 // Have a file but name was cleared — save to the existing file
66 _planMasterController.saveToCurrent()
67 }
68 return
69 }
70
71 if (_planMasterController.currentPlanFile === "" || _planMasterController.planFileRenamed) {
72 // First save with a typed name, or name was changed since last save
73 let fullName = _planMasterController.currentPlanFileName + "." + _planMasterController.fileExtension
74 let msg = _planMasterController.resolvedPlanFileExists()
75 ? qsTr("'%1' already exists. Overwrite?").arg(fullName)
76 : qsTr("Save as '%1'?").arg(fullName)
77 QGroundControl.showMessageDialog(root, qsTr("Save"), msg,
78 Dialog.Yes | Dialog.No,
79 function() { _planMasterController.saveWithCurrentName() })
80 } else {
81 _planMasterController.saveToCurrent()
82 }
83 }
84
85 function _saveAsKMLClicked() {
86 // Don't save if we only have Mission Settings item
87 if (_visualItems.count > 1) {
88 _planMasterController.saveKmlToSelectedFile()
89 }
90 }
91
92 function _storageClearButtonClicked() {
93 QGroundControl.showMessageDialog(root, qsTr("Clear"),
94 qsTr("Are you sure you want to remove all the items from the plan editor?"),
95 Dialog.Yes | Dialog.Cancel,
96 function() { _planMasterController.removeAll(); })
97 }
98
99 function _vehicleClearButtonClicked() {
100 QGroundControl.showMessageDialog(root, qsTr("Clear"),
101 qsTr("Are you sure you want to remove the plan from the vehicle and the plan editor?"),
102 Dialog.Yes | Dialog.Cancel,
103 function() {
104 _planMasterController.removeAllFromVehicle()
105 })
106 }
107
108 function _clearClicked() {
109 if (_planMasterController.offline) {
110 _storageClearButtonClicked();
111 } else {
112 _vehicleClearButtonClicked();
113 }
114 }
115
116 QGCPalette { id: qgcPal }
117
118 QGCButton {
119 objectName: "planToolbar_openButton"
120 text: qsTr("Open")
121 iconSource: "/qmlimages/Plan.svg"
122 enabled: !_planMasterController.syncInProgress
123 onClicked: { toolbarButtonClicked(); _openButtonClicked() }
124 }
125
126 QGCButton {
127 objectName: "planToolbar_saveButton"
128 text: qsTr("Save")
129 iconSource: "/res/SaveToDisk.svg"
130 enabled: !_syncInProgress && _hasPlanItems
131 primary: _saveDirty
132 onClicked: { toolbarButtonClicked(); _saveButtonClicked() }
133 }
134
135 QGCButton {
136 id: uploadButton
137 objectName: "planToolbar_uploadButton"
138 text: qsTr("Upload")
139 iconSource: "/res/UploadToVehicle.svg"
140 enabled: !_syncInProgress && _hasPlanItems && !_controllerOffline
141 visible: !_syncInProgress
142 primary: _uploadDirty && !_controllerOffline
143 onClicked: { toolbarButtonClicked(); _uploadClicked() }
144 }
145
146 QGCButton {
147 objectName: "planToolbar_clearButton"
148 text: qsTr("Clear")
149 iconSource: "/res/TrashCan.svg"
150 enabled: !_syncInProgress
151 onClicked: { toolbarButtonClicked(); _clearClicked() }
152 }
153
154 QGCButton {
155 iconSource: "qrc:/qmlimages/Hamburger.svg"
156
157 onClicked: {
158 let position = Qt.point(width, height / 2)
159 // For some strange reason using mainWindow in mapToItem doesn't work, so we use globals.parent instead which also gets us mainWindow
160 position = mapToItem(globals.parent, position)
161 var dropPanel = hamburgerDropPanelComponent.createObject(mainWindow, { clickRect: Qt.rect(position.x, position.y, 0, 0) })
162 dropPanel.open()
163 }
164 }
165
166 QGCLabel {
167 text: qsTr("Click in map to add rally points")
168 visible: root.showRallyPointsHelp
169 Layout.alignment: Qt.AlignVCenter
170 }
171
172 Component {
173 id: hamburgerDropPanelComponent
174
175 DropPanel {
176 id: dropPanel
177
178 sourceComponent: Component {
179 ColumnLayout {
180 spacing: ScreenTools.defaultFontPixelHeight / 2
181
182 QGCButton {
183 Layout.fillWidth: true
184 text: qsTr("Save as KML")
185 enabled: !_syncInProgress && _hasPlanItems
186
187 onClicked: {
188 dropPanel.close()
189 _saveAsKMLClicked()
190 }
191 }
192
193 QGCButton {
194 Layout.fillWidth: true
195 text: qsTr("Download")
196 enabled: !_syncInProgress && !_controllerOffline
197 visible: !_syncInProgress
198
199 onClicked: {
200 dropPanel.close()
201 _downloadClicked()
202 }
203 }
204 }
205 }
206 }
207 }
208}