QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
TransectStyleComplexItemEditor.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Dialogs
4import QtQuick.Layouts
5
6import QGroundControl
7import QGroundControl.Controls
8import QGroundControl.FactControls
9import QGroundControl.FlightMap
10
11Rectangle {
12 id: _root
13 height: childrenRect.y + childrenRect.height + _margin
14 width: availableWidth
15 color: qgcPal.windowShadeDark
16 radius: _radius
17
18 property bool transectAreaDefinitionComplete: true
19 property string transectAreaDefinitionHelp: _internalError
20 property string transectValuesHeaderName: _internalError
21 property var transectValuesComponent: undefined
22 property var presetsTransectValuesComponent: undefined
23
24 readonly property string _internalError: "Internal Error"
25
26 property var _missionItem: missionItem
27 property real _margin: ScreenTools.defaultFontPixelWidth / 2
28 property real _fieldWidth: ScreenTools.defaultFontPixelWidth * 10.5
29 property var _vehicle: QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle : QGroundControl.multiVehicleManager.offlineEditingVehicle
30 property real _cameraMinTriggerInterval: _missionItem.cameraCalc.minTriggerInterval.rawValue
31 property string _doneAdjusting: qsTr("Done")
32 property bool _presetsAvailable: _missionItem.presetNames.length !== 0
33
34 function polygonCaptureStarted() {
35 _missionItem.clearPolygon()
36 }
37
38 function polygonCaptureFinished(coordinates) {
39 for (var i=0; i<coordinates.length; i++) {
40 _missionItem.addPolygonCoordinate(coordinates[i])
41 }
42 }
43
44 function polygonAdjustVertex(vertexIndex, vertexCoordinate) {
45 _missionItem.adjustPolygonCoordinate(vertexIndex, vertexCoordinate)
46 }
47
48 function polygonAdjustStarted() { }
49 function polygonAdjustFinished() { }
50
51 QGCPalette { id: qgcPal; colorGroupEnabled: true }
52
53 ColumnLayout {
54 id: editorColumn
55 anchors.margins: _margin
56 anchors.top: parent.top
57 anchors.left: parent.left
58 anchors.right: parent.right
59
60 QGCLabel {
61 id: transectAreaDefinitionCompleteLabel
62 Layout.fillWidth: true
63 wrapMode: Text.WordWrap
64 horizontalAlignment: Text.AlignHCenter
65 text: transectAreaDefinitionHelp
66 visible: !transectAreaDefinitionComplete || _missionItem.wizardMode
67 }
68
69 ColumnLayout {
70 Layout.fillWidth: true
71 spacing: _margin
72 visible: transectAreaDefinitionComplete && !_missionItem.wizardMode
73
74 TransectStyleComplexItemTabBar {
75 id: tabBar
76 Layout.fillWidth: true
77 }
78
79 // Grid tab
80 ColumnLayout {
81 Layout.fillWidth: true
82 spacing: _margin
83 visible: tabBar.currentIndex === 0
84
85 QGCLabel {
86 Layout.fillWidth: true
87 text: qsTr("WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.").arg(_cameraMinTriggerInterval.toFixed(1))
88 wrapMode: Text.WordWrap
89 color: qgcPal.warningText
90 visible: _missionItem.cameraShots > 0 && _cameraMinTriggerInterval !== 0 && _cameraMinTriggerInterval > _missionItem.timeBetweenShots
91 }
92
93 CameraCalcGrid {
94 Layout.fillWidth: true
95 cameraCalc: _missionItem.cameraCalc
96 vehicleFlightIsFrontal: true
97 distanceToSurfaceLabel: qsTr("Altitude")
98 frontalDistanceLabel: qsTr("Trigger Dist")
99 sideDistanceLabel: qsTr("Spacing")
100 }
101
102 SectionHeader {
103 id: transectValuesHeader
104 Layout.fillWidth: true
105 text: transectValuesHeaderName
106 }
107
108 Loader {
109 Layout.fillWidth: true
110 visible: transectValuesHeader.checked
111 sourceComponent: transectValuesComponent
112
113 property bool forPresets: false
114 }
115
116 QGCButton {
117 Layout.alignment: Qt.AlignHCenter
118 text: qsTr("Rotate Entry Point")
119 onClicked: _missionItem.rotateEntryPoint()
120 visible: transectValuesHeader.checked
121 }
122
123 SectionHeader {
124 id: statsHeader
125 Layout.fillWidth: true
126 text: qsTr("Statistics")
127 }
128
129 TransectStyleComplexItemStats {
130 Layout.fillWidth: true
131 visible: statsHeader.checked
132 }
133 } // Grid Column
134
135 // Camera Tab
136 CameraCalcCamera {
137 Layout.fillWidth: true
138 visible: tabBar.currentIndex === 1
139 cameraCalc: _missionItem.cameraCalc
140 }
141
142 // Terrain Tab
143 TransectStyleComplexItemTerrainFollow {
144 Layout.fillWidth: true
145 spacing: _margin
146 visible: tabBar.currentIndex === 2
147 missionItem: _missionItem
148 }
149
150 // Presets Tab
151 ColumnLayout {
152 Layout.fillWidth: true
153 spacing: _margin
154 visible: tabBar.currentIndex === 3
155
156 QGCLabel {
157 Layout.fillWidth: true
158 text: qsTr("Presets")
159 wrapMode: Text.WordWrap
160 }
161
162 QGCComboBox {
163 id: presetCombo
164 Layout.fillWidth: true
165 model: _missionItem.presetNames
166 }
167
168 RowLayout {
169 Layout.fillWidth: true
170
171 QGCButton {
172 Layout.fillWidth: true
173 text: qsTr("Apply Preset")
174 enabled: _missionItem.presetNames.length != 0
175 onClicked: _missionItem.loadPreset(presetCombo.textAt(presetCombo.currentIndex))
176 }
177
178 QGCButton {
179 Layout.fillWidth: true
180 text: qsTr("Delete Preset")
181 enabled: _missionItem.presetNames.length != 0
182 onClicked: deletePresetDialogFactory.open({ presetName: presetCombo.textAt(presetCombo.currentIndex) })
183
184 QGCPopupDialogFactory {
185 id: deletePresetDialogFactory
186
187 dialogComponent: deletePresetDialog
188 }
189
190 Component {
191 id: deletePresetDialog
192
193 QGCSimpleMessageDialog {
194 title: qsTr("Delete Preset")
195 text: qsTr("Are you sure you want to delete '%1' preset?").arg(presetName)
196 buttons: Dialog.Yes | Dialog.No
197
198 property string presetName
199
200 onAccepted: { _missionItem.deletePreset(presetName) }
201 }
202 }
203 }
204 }
205
206 Item { height: ScreenTools.defaultFontPixelHeight; width: 1 }
207
208 QGCButton {
209 Layout.alignment: Qt.AlignCenter
210 Layout.fillWidth: true
211 text: qsTr("Save Settings As New Preset")
212 onClicked: savePresetDialogFactory.open()
213 }
214
215 SectionHeader {
216 id: presectsTransectValuesHeader
217 Layout.fillWidth: true
218 text: transectValuesHeaderName
219 visible: !!presetsTransectValuesComponent
220 }
221
222 Loader {
223 Layout.fillWidth: true
224 visible: presectsTransectValuesHeader.checked && !!presetsTransectValuesComponent
225 sourceComponent: presetsTransectValuesComponent
226
227 property bool forPresets: true
228 }
229
230 SectionHeader {
231 id: presetsStatsHeader
232 Layout.fillWidth: true
233 text: qsTr("Statistics")
234 }
235
236 TransectStyleComplexItemStats {
237 Layout.fillWidth: true
238 visible: presetsStatsHeader.checked
239 }
240 } // Main editing column
241 } // Top level Column
242
243 QGCPopupDialogFactory {
244 id: savePresetDialogFactory
245
246 dialogComponent: savePresetDialog
247 }
248
249 Component {
250 id: savePresetDialog
251
252 QGCPopupDialog {
253 id: popupDialog
254 title: qsTr("Save Preset")
255 buttons: Dialog.Save | Dialog.Cancel
256
257 onAccepted: {
258 if (presetNameField.text != "") {
259 _missionItem.savePreset(presetNameField.text.trim())
260 } else {
261 preventClose = true
262 }
263 }
264
265 ColumnLayout {
266 width: ScreenTools.defaultFontPixelWidth * 30
267 spacing: ScreenTools.defaultFontPixelHeight
268
269 QGCLabel {
270 Layout.fillWidth: true
271 text: qsTr("Save the current settings as a named preset.")
272 wrapMode: Text.WordWrap
273 }
274
275 QGCLabel {
276 text: qsTr("Preset Name")
277 }
278
279 QGCTextField {
280 id: presetNameField
281 Layout.fillWidth: true
282 placeholderText: qsTr("Enter preset name")
283
284 Component.onCompleted: validateText(presetNameField.text)
285 onTextChanged: validateText(text)
286
287 function validateText(text) {
288 if (text.trim() === "") {
289 nameError.text = qsTr("Preset name cannot be blank.")
290 popupDialog.acceptButtonEnabled = false
291 } else if (text.includes("/")) {
292 nameError.text = qsTr("Preset name cannot include the \"/\" character.")
293 popupDialog.acceptButtonEnabled = false
294 } else {
295 nameError.text = ""
296 popupDialog.acceptButtonEnabled = true
297 }
298 }
299 }
300
301 QGCLabel {
302 id: nameError
303 Layout.fillWidth: true
304 wrapMode: Text.WordWrap
305 color: QGroundControl.globalPalette.warningText
306 visible: text !== ""
307 }
308 }
309 }
310 }
311 }
312}