QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SimpleItemEditor.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Layouts
4
5import QGroundControl
6import QGroundControl.Controls
7import QGroundControl.FactControls
8
9// Editor for Simple mission items
10Rectangle {
11 required property var missionItem
12 required property real availableWidth
13
14 id: root
15 width: availableWidth
16 height: editorColumn.height + (_margin * 2)
17 color: qgcPal.windowShadeDark
18 radius: _radius
19
20
21 property bool _specifiesAltitude: missionItem.specifiesAltitude
22 property real _margin: ScreenTools.defaultFontPixelHeight / 2
23 property real _altRectMargin: ScreenTools.defaultFontPixelWidth / 2
24 property var _controllerVehicle: missionItem.masterController.controllerVehicle
25 property int _globalAltFrame: missionItem.masterController.missionController.globalAltitudeFrame
26 property bool _globalAltFrameIsMixed: _globalAltFrame == QGroundControl.AltitudeFrameMixed
27 property real _radius: ScreenTools.defaultFontPixelWidth / 2
28 property real _fieldSpacing: ScreenTools.defaultFontPixelHeight / 2
29
30 QGCPalette { id: qgcPal; colorGroupEnabled: root.enabled }
31
32 Column {
33 id: editorColumn
34 anchors.margins: _margin
35 anchors.left: parent.left
36 anchors.right: parent.right
37 anchors.top: parent.top
38 spacing: _margin
39
40 // Takeoff item
41 ColumnLayout {
42 anchors.margins: _margin
43 anchors.left: parent.left
44 anchors.right: parent.right
45 spacing: _margin
46 visible: missionItem.isTakeoffItem && missionItem.wizardMode // Hack special case for takeoff item
47
48 QGCLabel {
49 text: qsTr("Move '%1' %2 to the %3 location. %4")
50 .arg(_controllerVehicle.vtol ? qsTr("T") : qsTr("T"))
51 .arg(_controllerVehicle.vtol ? qsTr("Transition Direction") : qsTr("Takeoff"))
52 .arg(_controllerVehicle.vtol ? qsTr("desired") : qsTr("climbout"))
53 .arg(_controllerVehicle.vtol ? (qsTr("Ensure distance from launch to transition direction is far enough to complete transition.")) : "")
54 Layout.fillWidth: true
55 wrapMode: Text.WordWrap
56 visible: !initialClickLabel.visible
57 }
58
59 QGCLabel {
60 text: qsTr("Ensure clear of obstacles and into the wind.")
61 Layout.fillWidth: true
62 wrapMode: Text.WordWrap
63 visible: !initialClickLabel.visible
64 }
65
66 QGCButton {
67 text: qsTr("Done")
68 Layout.fillWidth: true
69 visible: !initialClickLabel.visible
70 onClicked: {
71 missionItem.wizardMode = false
72 }
73 }
74
75 QGCLabel {
76 id: initialClickLabel
77 text: missionItem.launchTakeoffAtSameLocation ?
78 qsTr("Click in map to set planned Takeoff location.") :
79 qsTr("Click in map to set planned Launch location.")
80 Layout.fillWidth: true
81 wrapMode: Text.WordWrap
82 visible: missionItem.isTakeoffItem && !missionItem.launchCoordinate.isValid
83 }
84 }
85
86 ColumnLayout {
87 width: parent.width
88 spacing: _fieldSpacing
89 visible: !missionItem.wizardMode
90
91 QGCTabBar {
92 id: tabBar
93 Layout.fillWidth: true
94 visible: _multipleTabsVisible()
95
96 property bool showBasicItems: tabBar.visible ? tabBar.currentIndex === 0 : _basicItemsAvailable
97 property bool showCameraItems: tabBar.visible ? tabBar.currentIndex === 1 : _cameraAvailable
98 property bool showAdvancedItems: tabBar.visible ? tabBar.currentIndex === 2 : _advancedItemsAvailable
99
100 property bool _basicItemsAvailable: _specifiesAltitude || missionItem.speedSection.available || missionItem.comboboxFacts.count > 0 || missionItem.textFieldFacts.count > 0 || missionItem.nanFacts.count > 0
101 property bool _advancedItemsAvailable: missionItem.comboboxFactsAdvanced.count > 0 || missionItem.textFieldFactsAdvanced.count > 0 || missionItem.nanFactsAdvanced.count > 0
102 property bool _cameraAvailable: missionItem.cameraSection.available
103
104 function _multipleTabsVisible() {
105 let visibleCount = 0
106 if (_basicItemsAvailable) visibleCount++
107 if (_cameraAvailable) visibleCount++
108 if (_advancedItemsAvailable) visibleCount++
109 return visibleCount > 1
110 }
111
112 Component.onCompleted: {
113 if (_basicItemsAvailable) {
114 tabBar.currentIndex = 0
115 } else if (_cameraAvailable) {
116 tabBar.currentIndex = 1
117 } else if (_advancedItemsAvailable) {
118 tabBar.currentIndex = 2
119 } else {
120 tabBar.currentIndex = -1
121 }
122 }
123
124 QGCTabButton {
125 id: basicItemsTab
126 icon.source: "/res/PlanSimpleItemBasic.svg"
127 visible: tabBar._basicItemsAvailable
128 }
129
130 QGCTabButton {
131 id: cameraTab
132 icon.source: "/res/PlanSimpleItemCamera.svg"
133 visible: tabBar._cameraAvailable
134 }
135
136 QGCTabButton {
137 id: advancedItemsTab
138 icon.source: "/res/PlanSimpleItemAdvanced.svg"
139 visible: tabBar._advancedItemsAvailable
140 }
141 }
142
143 ColumnLayout {
144 Layout.fillWidth: true
145 spacing: _fieldSpacing
146 visible: tabBar.showBasicItems
147
148 ColumnLayout {
149 Layout.fillWidth: true
150 spacing: _fieldSpacing
151 visible: _specifiesAltitude
152
153 RowLayout {
154 Layout.fillWidth: true
155 visible: _globalAltFrameIsMixed
156
157 QGCLabel {
158 Layout.fillWidth: true
159 text: qsTr("Alt Frame")
160 }
161
162 AltFrameCombo {
163 altitudeFrame: missionItem.altitudeFrame
164 vehicle: _controllerVehicle
165 onAltitudeFrameChanged: missionItem.altitudeFrame = altitudeFrame
166 }
167 }
168
169 FactTextFieldSlider {
170 id: altField
171 Layout.fillWidth: true
172 label: qsTr("Altitude%1").arg(_extraLabelText())
173 fact: missionItem.altitude
174
175 function _extraLabelText() {
176 return qsTr(" (%1)").arg(QGroundControl.altitudeFrameExtraUnits(missionItem.altitudeFrame))
177 }
178 }
179
180 QGCLabel {
181 font.pointSize: ScreenTools.smallFontPointSize
182 text: qsTr("Actual AMSL alt sent: %1 %2").arg(missionItem.amslAltAboveTerrain.valueString).arg(missionItem.amslAltAboveTerrain.units)
183 visible: missionItem.altitudeFrame === QGroundControl.AltitudeFrameCalcAboveTerrain
184 }
185 }
186
187 ColumnLayout {
188 Layout.fillWidth: true
189 spacing: _fieldSpacing
190
191 Repeater {
192 model: missionItem.comboboxFacts
193
194 ColumnLayout {
195 Layout.fillWidth: true
196 spacing: 0
197
198 QGCLabel {
199 font.pointSize: ScreenTools.smallFontPointSize
200 text: object.name
201 visible: object.name !== ""
202 }
203
204 FactComboBox {
205 Layout.fillWidth: true
206 indexModel: false
207 model: object.enumStrings
208 fact: object
209 }
210 }
211 }
212 }
213
214 Repeater {
215 model: missionItem.textFieldFacts
216
217 FactTextFieldSlider {
218 Layout.fillWidth: true
219 label: object.name
220 fact: object
221 enabled: !object.readOnly
222 warnOnUserMinMaxInvalid: false
223 }
224 }
225
226 Repeater {
227 model: missionItem.nanFacts
228
229 FactTextFieldSlider {
230 Layout.fillWidth: true
231 label: object.name
232 fact: object
233 showEnableCheckbox: true
234 enableCheckBoxChecked: !isNaN(object.rawValue)
235 warnOnUserMinMaxInvalid: false
236
237 onEnableCheckboxClicked: object.rawValue = enableCheckBoxChecked ? 0 : NaN
238 }
239 }
240
241 FactTextFieldSlider {
242 Layout.fillWidth: true
243 label: qsTr("Flight Speed")
244 fact: missionItem.speedSection.flightSpeed
245 showEnableCheckbox: true
246 enableCheckBoxChecked: missionItem.speedSection.specifyFlightSpeed
247 visible: missionItem.speedSection.available
248
249 onEnableCheckboxClicked: missionItem.speedSection.specifyFlightSpeed = enableCheckBoxChecked
250 }
251 }
252
253 CameraSection {
254 Layout.fillWidth: true
255 showSectionHeader: false
256 missionItem: root.missionItem
257 visible: tabBar.showCameraItems
258
259 Component.onCompleted: checked = missionItem.cameraSection.settingsSpecified
260 }
261
262 ColumnLayout {
263 Layout.fillWidth: true
264 spacing: _fieldSpacing
265 visible: tabBar.showAdvancedItems
266
267 ColumnLayout {
268 Layout.fillWidth: true
269 spacing: _fieldSpacing
270
271 Repeater {
272 model: missionItem.comboboxFactsAdvanced
273
274 ColumnLayout {
275 Layout.fillWidth: true
276 spacing: 0
277
278 QGCLabel {
279 font.pointSize: ScreenTools.smallFontPointSize
280 text: object.name
281 visible: object.name !== ""
282 }
283
284 FactComboBox {
285 Layout.fillWidth: true
286 indexModel: false
287 model: object.enumStrings
288 fact: object
289 }
290 }
291 }
292 }
293
294 Repeater {
295 model: missionItem.textFieldFactsAdvanced
296
297 FactTextFieldSlider {
298 Layout.fillWidth: true
299 label: object.name
300 fact: object
301 enabled: !object.readOnly
302 warnOnUserMinMaxInvalid: false
303 }
304 }
305
306 Repeater {
307 model: missionItem.nanFactsAdvanced
308
309 FactTextFieldSlider {
310 Layout.fillWidth: true
311 label: object.name
312 fact: object
313 showEnableCheckbox: true
314 enableCheckBoxChecked: !isNaN(object.rawValue)
315 warnOnUserMinMaxInvalid: false
316
317 onEnableCheckboxClicked: object.rawValue = enableCheckBoxChecked ? 0 : NaN
318 }
319 }
320 }
321 }
322 }
323}