/**************************************************************************** * * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ import QtQuick 2.3 import QtQuick.Controls 1.2 import QtLocation 5.3 import QtPositioning 5.3 import QtQuick.Layouts 1.11 import QGroundControl 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Palette 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FlightMap 1.0 Item { id: _root property var map ///< Map control to place item in signal clicked(int sequenceNumber) readonly property real _landingWidthMeters: 15 readonly property real _landingLengthMeters: 100 property var _missionItem: object property var _mouseArea property var _dragAreas: [ ] property var _flightPath property real _landingAreaBearing: _missionItem.landingCoordinate.azimuthTo(_missionItem.loiterTangentCoordinate) property var _loiterPointObject property var _landingPointObject function hideItemVisuals() { objMgr.destroyObjects() } function showItemVisuals() { if (objMgr.rgDynamicObjects.length === 0) { _loiterPointObject = objMgr.createObject(loiterPointComponent, map, true /* parentObjectIsMap */) _landingPointObject = objMgr.createObject(landingPointComponent, map, true /* parentObjectIsMap */) var rgComponents = [ flightPathComponent, loiterRadiusComponent ] objMgr.createObjects(rgComponents, map, true /* parentObjectIsMap */) } } function hideMouseArea() { if (_mouseArea) { _mouseArea.destroy() _mouseArea = undefined } } function showMouseArea() { if (!_mouseArea) { _mouseArea = mouseAreaComponent.createObject(map) map.addMapItem(_mouseArea) } } function hideDragAreas() { for (var i=0; i<_dragAreas.length; i++) { _dragAreas[i].destroy() } _dragAreas = [ ] } function showDragAreas() { if (_dragAreas.length === 0) { _dragAreas.push(loiterDragAreaComponent.createObject(map)) _dragAreas.push(landDragAreaComponent.createObject(map)) } } function _setFlightPath() { _flightPath = [ _missionItem.loiterTangentCoordinate, _missionItem.landingCoordinate ] } QGCDynamicObjectManager { id: objMgr } Component.onCompleted: { if (_missionItem.landingCoordSet) { showItemVisuals() if (!_missionItem.flyView && _missionItem.isCurrentItem) { showDragAreas() } _setFlightPath() } else if (!_missionItem.flyView && _missionItem.isCurrentItem) { showMouseArea() } } Component.onDestruction: { hideDragAreas() hideMouseArea() hideItemVisuals() } Connections { target: _missionItem onIsCurrentItemChanged: { if (_missionItem.flyView) { return } if (_missionItem.isCurrentItem) { if (_missionItem.landingCoordSet) { showDragAreas() } else { showMouseArea() } } else { hideMouseArea() hideDragAreas() } } onLandingCoordSetChanged: { if (_missionItem.flyView) { return } if (_missionItem.landingCoordSet) { hideMouseArea() showItemVisuals() showDragAreas() _setFlightPath() } else if (_missionItem.isCurrentItem) { hideDragAreas() showMouseArea() } } onLandingCoordinateChanged: _setFlightPath() onLoiterTangentCoordinateChanged: _setFlightPath() } // Mouse area to capture landing point coordindate Component { id: mouseAreaComponent MouseArea { anchors.fill: map z: QGroundControl.zOrderMapItems + 1 // Over item indicators readonly property int _decimalPlaces: 8 onClicked: { var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */) coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces) coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces) coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces) _missionItem.landingCoordinate = coordinate _missionItem.setLandingHeadingToTakeoffHeading() } } } // Control which is used to drag the loiter point Component { id: loiterDragAreaComponent MissionItemIndicatorDrag { mapControl: _root.map itemIndicator: _loiterPointObject itemCoordinate: _missionItem.loiterCoordinate onItemCoordinateChanged: _missionItem.loiterCoordinate = itemCoordinate } } // Control which is used to drag the landing point Component { id: landDragAreaComponent MissionItemIndicatorDrag { mapControl: _root.map itemIndicator: _landingPointObject itemCoordinate: _missionItem.landingCoordinate onItemCoordinateChanged: _missionItem.landingCoordinate = itemCoordinate } } // Flight path Component { id: flightPathComponent MapPolyline { z: QGroundControl.zOrderMapItems - 1 // Under item indicators line.color: "#be781c" line.width: 2 path: _flightPath } } // Loiter point Component { id: loiterPointComponent MapQuickItem { anchorPoint.x: sourceItem.anchorPointX anchorPoint.y: sourceItem.anchorPointY z: QGroundControl.zOrderMapItems coordinate: _missionItem.loiterCoordinate sourceItem: MissionItemIndexLabel { index: _missionItem.sequenceNumber label: qsTr("Loiter") checked: _missionItem.isCurrentItem onClicked: _root.clicked(_missionItem.sequenceNumber) } } } // Landing point Component { id: landingPointComponent MapQuickItem { anchorPoint.x: sourceItem.anchorPointX anchorPoint.y: sourceItem.anchorPointY z: QGroundControl.zOrderMapItems coordinate: _missionItem.landingCoordinate sourceItem: MissionItemIndexLabel { index: _missionItem.lastSequenceNumber label: qsTr("Land") checked: _missionItem.isCurrentItem onClicked: _root.clicked(_missionItem.sequenceNumber) } } } Component { id: loiterRadiusComponent MapCircle { z: QGroundControl.zOrderMapItems center: _missionItem.loiterCoordinate radius: _missionItem.loiterRadius.rawValue border.width: 2 border.color: "green" color: "transparent" } } }