8import QGroundControl.Controls
9import QGroundControl.FlightMap
14 property var map ///< Map control to place item in
16 signal clicked(int sequenceNumber)
18 readonly property real _landingWidthMeters: 15
19 readonly property real _landingLengthMeters: 100
21 property var _missionItem: object
22 property var _mouseArea
23 property var _dragAreas: [ ]
24 property var _flightPath
25 property var _loiterPointObject
26 property var _landingPointObject
27 property bool _useLoiterToAlt: _missionItem.useLoiterToAlt.rawValue
28 property real _landingAreaBearing: _missionItem.landingCoordinate.azimuthTo(_missionItem.slopeStartCoordinate)
30 function hideItemVisuals() {
31 objMgr.destroyObjects()
34 function showItemVisuals() {
35 if (objMgr.rgDynamicObjects.length === 0) {
36 _loiterPointObject = objMgr.createObject(finalApproachPointComponent, map, true /* parentObjectIsMap */)
37 _landingPointObject = objMgr.createObject(landingPointComponent, map, true /* parentObjectIsMap */)
39 var rgComponents = [ flightPathComponent, loiterRadiusComponent ]
40 objMgr.createObjects(rgComponents, map, true /* parentObjectIsMap */)
44 function hideMouseArea() {
47 _mouseArea = undefined
51 function showMouseArea() {
53 _mouseArea = mouseAreaComponent.createObject(map)
57 function hideDragAreas() {
58 for (var i=0; i<_dragAreas.length; i++) {
59 _dragAreas[i].destroy()
64 function showDragAreas() {
65 if (_dragAreas.length === 0) {
66 _dragAreas.push(loiterDragAreaComponent.createObject(map))
67 _dragAreas.push(landDragAreaComponent.createObject(map))
71 function _setFlightPath() {
72 if (_useLoiterToAlt) {
73 _flightPath = [ _missionItem.slopeStartCoordinate, _missionItem.landingCoordinate ]
75 _flightPath = [ _missionItem.finalApproachCoordinate, _missionItem.landingCoordinate ]
79 QGCDynamicObjectManager {
83 Component.onCompleted: {
84 if (_missionItem.landingCoordSet) {
86 if (!_missionItem.flyView && _missionItem.isCurrentItem) {
90 } else if (!_missionItem.flyView && _missionItem.isCurrentItem) {
95 Component.onDestruction: {
101 on_UseLoiterToAltChanged: _setFlightPath()
106 onIsCurrentItemChanged: {
107 if (_missionItem.flyView) {
110 if (_missionItem.isCurrentItem) {
111 if (_missionItem.landingCoordSet) {
122 onLandingCoordSetChanged: {
123 if (_missionItem.flyView) {
126 if (_missionItem.landingCoordSet) {
131 } else if (_missionItem.isCurrentItem) {
137 onLandingCoordinateChanged: _setFlightPath()
138 onSlopeStartCoordinateChanged: _setFlightPath()
139 onFinalApproachCoordinateChanged: _setFlightPath()
142 // Mouse area to capture landing point coordindate
144 id: mouseAreaComponent
148 z: QGroundControl.zOrderMapItems + 1 // Over item indicators
150 readonly property int _decimalPlaces: 8
152 onClicked: (mouse) => {
153 var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
154 coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
155 coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
156 coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
157 _missionItem.landingCoordinate = coordinate
158 _missionItem.setLandingHeadingToTakeoffHeading()
163 // Control which is used to drag the final approach point
165 id: loiterDragAreaComponent
167 MissionItemIndicatorDrag {
168 mapControl: _root.map
169 itemIndicator: _loiterPointObject
170 itemCoordinate: _missionItem.finalApproachCoordinate
172 property bool _preventReentrancy: false
174 onItemCoordinateChanged: {
175 if (!_preventReentrancy) {
177 _preventReentrancy = true
178 var angle = _missionItem.landingCoordinate.azimuthTo(itemCoordinate)
179 var distance = _missionItem.landingCoordinate.distanceTo(_missionItem.finalApproachCoordinate)
180 _missionItem.finalApproachCoordinate = _missionItem.landingCoordinate.atDistanceAndAzimuth(distance, angle)
181 _preventReentrancy = false
188 // Control which is used to drag the landing point
190 id: landDragAreaComponent
192 MissionItemIndicatorDrag {
193 mapControl: _root.map
194 itemIndicator: _landingPointObject
195 itemCoordinate: _missionItem.landingCoordinate
197 onItemCoordinateChanged: _missionItem.landingCoordinate = itemCoordinate
203 id: flightPathComponent
206 z: QGroundControl.zOrderMapItems - 1 // Under item indicators
207 line.color: "#be781c"
213 // Final approach point
215 id: finalApproachPointComponent
218 anchorPoint.x: sourceItem.anchorPointX
219 anchorPoint.y: sourceItem.anchorPointY
220 z: QGroundControl.zOrderMapItems
221 coordinate: _missionItem.finalApproachCoordinate
224 MissionItemIndexLabel {
225 index: _missionItem.sequenceNumber
226 label: _useLoiterToAlt ? qsTr("Loiter") : qsTr("Approach")
227 checked: _missionItem.isCurrentItem
229 onClicked: _root.clicked(_missionItem.sequenceNumber)
236 id: landingPointComponent
239 anchorPoint.x: sourceItem.anchorPointX
240 anchorPoint.y: sourceItem.anchorPointY
241 z: QGroundControl.zOrderMapItems
242 coordinate: _missionItem.landingCoordinate
245 MissionItemIndexLabel {
246 index: _missionItem.lastSequenceNumber
248 checked: _missionItem.isCurrentItem
250 onClicked: _root.clicked(_missionItem.sequenceNumber)
256 id: loiterRadiusComponent
259 z: QGroundControl.zOrderMapItems
260 center: _missionItem.finalApproachCoordinate
261 radius: _missionItem.loiterRadius.rawValue
263 border.color: "green"
265 visible: _useLoiterToAlt