7import QGroundControl.Controls
8import QGroundControl.FactControls
9import QGroundControl.FlightMap
13 height: childrenRect.y + childrenRect.height + _margin
15 color: qgcPal.windowShadeDark
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
24 readonly property string _internalError: "Internal Error"
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
34 function polygonCaptureStarted() {
35 _missionItem.clearPolygon()
38 function polygonCaptureFinished(coordinates) {
39 for (var i=0; i<coordinates.length; i++) {
40 _missionItem.addPolygonCoordinate(coordinates[i])
44 function polygonAdjustVertex(vertexIndex, vertexCoordinate) {
45 _missionItem.adjustPolygonCoordinate(vertexIndex, vertexCoordinate)
48 function polygonAdjustStarted() { }
49 function polygonAdjustFinished() { }
51 QGCPalette { id: qgcPal; colorGroupEnabled: true }
55 anchors.margins: _margin
56 anchors.top: parent.top
57 anchors.left: parent.left
58 anchors.right: parent.right
61 id: transectAreaDefinitionCompleteLabel
62 Layout.fillWidth: true
63 wrapMode: Text.WordWrap
64 horizontalAlignment: Text.AlignHCenter
65 text: transectAreaDefinitionHelp
66 visible: !transectAreaDefinitionComplete || _missionItem.wizardMode
70 Layout.fillWidth: true
72 visible: transectAreaDefinitionComplete && !_missionItem.wizardMode
74 TransectStyleComplexItemTabBar {
76 Layout.fillWidth: true
81 Layout.fillWidth: true
83 visible: tabBar.currentIndex === 0
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
94 Layout.fillWidth: true
95 cameraCalc: _missionItem.cameraCalc
96 vehicleFlightIsFrontal: true
97 distanceToSurfaceLabel: qsTr("Altitude")
98 frontalDistanceLabel: qsTr("Trigger Dist")
99 sideDistanceLabel: qsTr("Spacing")
103 id: transectValuesHeader
104 Layout.fillWidth: true
105 text: transectValuesHeaderName
109 Layout.fillWidth: true
110 visible: transectValuesHeader.checked
111 sourceComponent: transectValuesComponent
113 property bool forPresets: false
117 Layout.alignment: Qt.AlignHCenter
118 text: qsTr("Rotate Entry Point")
119 onClicked: _missionItem.rotateEntryPoint()
120 visible: transectValuesHeader.checked
125 Layout.fillWidth: true
126 text: qsTr("Statistics")
129 TransectStyleComplexItemStats {
130 Layout.fillWidth: true
131 visible: statsHeader.checked
137 Layout.fillWidth: true
138 visible: tabBar.currentIndex === 1
139 cameraCalc: _missionItem.cameraCalc
143 TransectStyleComplexItemTerrainFollow {
144 Layout.fillWidth: true
146 visible: tabBar.currentIndex === 2
147 missionItem: _missionItem
152 Layout.fillWidth: true
154 visible: tabBar.currentIndex === 3
157 Layout.fillWidth: true
158 text: qsTr("Presets")
159 wrapMode: Text.WordWrap
164 Layout.fillWidth: true
165 model: _missionItem.presetNames
169 Layout.fillWidth: true
172 Layout.fillWidth: true
173 text: qsTr("Apply Preset")
174 enabled: _missionItem.presetNames.length != 0
175 onClicked: _missionItem.loadPreset(presetCombo.textAt(presetCombo.currentIndex))
179 Layout.fillWidth: true
180 text: qsTr("Delete Preset")
181 enabled: _missionItem.presetNames.length != 0
182 onClicked: deletePresetDialogFactory.open({ presetName: presetCombo.textAt(presetCombo.currentIndex) })
184 QGCPopupDialogFactory {
185 id: deletePresetDialogFactory
187 dialogComponent: deletePresetDialog
191 id: deletePresetDialog
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
198 property string presetName
200 onAccepted: { _missionItem.deletePreset(presetName) }
206 Item { height: ScreenTools.defaultFontPixelHeight; width: 1 }
209 Layout.alignment: Qt.AlignCenter
210 Layout.fillWidth: true
211 text: qsTr("Save Settings As New Preset")
212 onClicked: savePresetDialogFactory.open()
216 id: presectsTransectValuesHeader
217 Layout.fillWidth: true
218 text: transectValuesHeaderName
219 visible: !!presetsTransectValuesComponent
223 Layout.fillWidth: true
224 visible: presectsTransectValuesHeader.checked && !!presetsTransectValuesComponent
225 sourceComponent: presetsTransectValuesComponent
227 property bool forPresets: true
231 id: presetsStatsHeader
232 Layout.fillWidth: true
233 text: qsTr("Statistics")
236 TransectStyleComplexItemStats {
237 Layout.fillWidth: true
238 visible: presetsStatsHeader.checked
240 } // Main editing column
241 } // Top level Column
243 QGCPopupDialogFactory {
244 id: savePresetDialogFactory
246 dialogComponent: savePresetDialog
254 title: qsTr("Save Preset")
255 buttons: Dialog.Save | Dialog.Cancel
258 if (presetNameField.text != "") {
259 _missionItem.savePreset(presetNameField.text.trim())
266 width: ScreenTools.defaultFontPixelWidth * 30
267 spacing: ScreenTools.defaultFontPixelHeight
270 Layout.fillWidth: true
271 text: qsTr("Save the current settings as a named preset.")
272 wrapMode: Text.WordWrap
276 text: qsTr("Preset Name")
281 Layout.fillWidth: true
282 placeholderText: qsTr("Enter preset name")
284 Component.onCompleted: validateText(presetNameField.text)
285 onTextChanged: validateText(text)
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
296 popupDialog.acceptButtonEnabled = true
303 Layout.fillWidth: true
304 wrapMode: Text.WordWrap
305 color: QGroundControl.globalPalette.warningText