7import QGroundControl.Controls
8import QGroundControl.FactControls
9import QGroundControl.FlightMap
13 height: childrenRect.y + childrenRect.height + _margin
15 color: qgcPal.windowShadeDark
18 required property var missionItem
19 required property real availableWidth
21 property bool transectAreaDefinitionComplete: true
22 property string transectAreaDefinitionHelp: _internalError
23 property string transectValuesHeaderName: _internalError
24 property var transectValuesComponent: undefined
25 property var presetsTransectValuesComponent: undefined
27 readonly property string _internalError: "Internal Error"
29 property var _missionItem: missionItem
30 property real _margin: ScreenTools.defaultFontPixelWidth / 2
31 property real _fieldWidth: ScreenTools.defaultFontPixelWidth * 10.5
32 property var _vehicle: QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle : QGroundControl.multiVehicleManager.offlineEditingVehicle
33 property real _cameraMinTriggerInterval: _missionItem.cameraCalc.minTriggerInterval.rawValue
34 property string _doneAdjusting: qsTr("Done")
35 property bool _presetsAvailable: _missionItem.presetNames.length !== 0
37 function polygonCaptureStarted() {
38 _missionItem.clearPolygon()
41 function polygonCaptureFinished(coordinates) {
42 for (var i=0; i<coordinates.length; i++) {
43 _missionItem.addPolygonCoordinate(coordinates[i])
47 function polygonAdjustVertex(vertexIndex, vertexCoordinate) {
48 _missionItem.adjustPolygonCoordinate(vertexIndex, vertexCoordinate)
51 function polygonAdjustStarted() { }
52 function polygonAdjustFinished() { }
54 QGCPalette { id: qgcPal; colorGroupEnabled: true }
58 anchors.margins: _margin
59 anchors.top: parent.top
60 anchors.left: parent.left
61 anchors.right: parent.right
64 id: transectAreaDefinitionCompleteLabel
65 Layout.fillWidth: true
66 wrapMode: Text.WordWrap
67 horizontalAlignment: Text.AlignHCenter
68 text: transectAreaDefinitionHelp
69 visible: !transectAreaDefinitionComplete || _missionItem.wizardMode
73 Layout.fillWidth: true
75 visible: transectAreaDefinitionComplete && !_missionItem.wizardMode
77 TransectStyleComplexItemTabBar {
79 Layout.fillWidth: true
84 Layout.fillWidth: true
86 visible: tabBar.currentIndex === 0
89 Layout.fillWidth: true
90 text: qsTr("WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.").arg(_cameraMinTriggerInterval.toFixed(1))
91 wrapMode: Text.WordWrap
92 color: qgcPal.warningText
93 visible: _missionItem.cameraShots > 0 && _cameraMinTriggerInterval !== 0 && _cameraMinTriggerInterval > _missionItem.timeBetweenShots
97 Layout.fillWidth: true
98 cameraCalc: _missionItem.cameraCalc
99 vehicleFlightIsFrontal: true
100 distanceToSurfaceLabel: qsTr("Altitude")
101 frontalDistanceLabel: qsTr("Trigger Dist")
102 sideDistanceLabel: qsTr("Spacing")
106 id: transectValuesHeader
107 Layout.fillWidth: true
108 text: transectValuesHeaderName
112 Layout.fillWidth: true
113 visible: transectValuesHeader.checked
114 sourceComponent: transectValuesComponent
116 property bool forPresets: false
120 Layout.alignment: Qt.AlignHCenter
121 text: qsTr("Rotate Entry Point")
122 onClicked: _missionItem.rotateEntryPoint()
123 visible: transectValuesHeader.checked
128 Layout.fillWidth: true
129 text: qsTr("Statistics")
132 TransectStyleComplexItemStats {
133 Layout.fillWidth: true
134 visible: statsHeader.checked
140 Layout.fillWidth: true
141 visible: tabBar.currentIndex === 1
142 cameraCalc: _missionItem.cameraCalc
146 TransectStyleComplexItemTerrainFollow {
147 Layout.fillWidth: true
149 visible: tabBar.currentIndex === 2
150 missionItem: _missionItem
155 Layout.fillWidth: true
157 visible: tabBar.currentIndex === 3
160 Layout.fillWidth: true
161 text: qsTr("Presets")
162 wrapMode: Text.WordWrap
167 Layout.fillWidth: true
168 model: _missionItem.presetNames
172 Layout.fillWidth: true
175 Layout.fillWidth: true
176 text: qsTr("Apply Preset")
177 enabled: _missionItem.presetNames.length != 0
178 onClicked: _missionItem.loadPreset(presetCombo.textAt(presetCombo.currentIndex))
182 Layout.fillWidth: true
183 text: qsTr("Delete Preset")
184 enabled: _missionItem.presetNames.length != 0
185 onClicked: deletePresetDialogFactory.open({ presetName: presetCombo.textAt(presetCombo.currentIndex) })
187 QGCPopupDialogFactory {
188 id: deletePresetDialogFactory
190 dialogComponent: deletePresetDialog
194 id: deletePresetDialog
196 QGCSimpleMessageDialog {
197 title: qsTr("Delete Preset")
198 text: qsTr("Are you sure you want to delete '%1' preset?").arg(presetName)
199 buttons: Dialog.Yes | Dialog.No
201 property string presetName
203 onAccepted: { _missionItem.deletePreset(presetName) }
209 Item { height: ScreenTools.defaultFontPixelHeight; width: 1 }
212 Layout.alignment: Qt.AlignCenter
213 Layout.fillWidth: true
214 text: qsTr("Save Settings As New Preset")
215 onClicked: savePresetDialogFactory.open()
219 id: presectsTransectValuesHeader
220 Layout.fillWidth: true
221 text: transectValuesHeaderName
222 visible: !!presetsTransectValuesComponent
226 Layout.fillWidth: true
227 visible: presectsTransectValuesHeader.checked && !!presetsTransectValuesComponent
228 sourceComponent: presetsTransectValuesComponent
230 property bool forPresets: true
234 id: presetsStatsHeader
235 Layout.fillWidth: true
236 text: qsTr("Statistics")
239 TransectStyleComplexItemStats {
240 Layout.fillWidth: true
241 visible: presetsStatsHeader.checked
243 } // Main editing column
244 } // Top level Column
246 QGCPopupDialogFactory {
247 id: savePresetDialogFactory
249 dialogComponent: savePresetDialog
257 title: qsTr("Save Preset")
258 buttons: Dialog.Save | Dialog.Cancel
261 if (presetNameField.text != "") {
262 _missionItem.savePreset(presetNameField.text.trim())
269 width: ScreenTools.defaultFontPixelWidth * 30
270 spacing: ScreenTools.defaultFontPixelHeight
273 Layout.fillWidth: true
274 text: qsTr("Save the current settings as a named preset.")
275 wrapMode: Text.WordWrap
279 text: qsTr("Preset Name")
284 Layout.fillWidth: true
285 placeholderText: qsTr("Enter preset name")
287 Component.onCompleted: validateText(presetNameField.text)
288 onTextChanged: validateText(text)
290 function validateText(text) {
291 if (text.trim() === "") {
292 nameError.text = qsTr("Preset name cannot be blank.")
293 popupDialog.acceptButtonEnabled = false
294 } else if (text.includes("/")) {
295 nameError.text = qsTr("Preset name cannot include the \"/\" character.")
296 popupDialog.acceptButtonEnabled = false
299 popupDialog.acceptButtonEnabled = true
306 Layout.fillWidth: true
307 wrapMode: Text.WordWrap
308 color: QGroundControl.globalPalette.warningText