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