QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
TakeoffItemMapVisual.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtLocation
4import QtPositioning
5
6import QGroundControl
7import QGroundControl.Controls
8import QGroundControl.FlightMap
9
10/// Simple Mission Item visuals
11Item {
12 id: _root
13
14 property var map ///< Map control to place item in
15 property var vehicle ///< Vehicle associated with this item
16 property bool interactive: true
17 property MissionItemIndicatorGroup indicatorGroup
18
19 property var _missionItem: object
20 property var _takeoffIndicatorItem
21 property var _launchIndicatorItem
22
23 signal clicked(int sequenceNumber)
24
25 function addCommonVisuals() {
26 if (_objMgrCommonVisuals.empty) {
27 _takeoffIndicatorItem = _objMgrCommonVisuals.createObject(takeoffIndicatorComponent, map, true /* addToMap */)
28 _launchIndicatorItem = _objMgrCommonVisuals.createObject(launchIndicatorComponent, map, true /* addToMap */)
29 }
30 }
31
32 function addEditingVisuals() {
33 if (_objMgrEditingVisuals.empty) {
34 _objMgrEditingVisuals.createObjects([ takeoffDragComponent, launchDragComponent ], map, false /* addToMap */)
35 }
36 if (!_missionItem.launchCoordinate.isValid) {
37 _objMgrMouseClick.createObject(mouseAreaClickComponent, map, false /* addToMap */)
38 }
39 }
40
41 QGCDynamicObjectManager { id: _objMgrCommonVisuals }
42 QGCDynamicObjectManager { id: _objMgrEditingVisuals }
43 QGCDynamicObjectManager { id: _objMgrMouseClick }
44
45 Component.onCompleted: {
46 addCommonVisuals()
47 if (_missionItem.isCurrentItem && map.planView) {
48 addEditingVisuals()
49 }
50 }
51
52 Connections {
53 target: _missionItem
54
55 function onIsCurrentItemChanged(isCurrentItem) {
56 if (isCurrentItem && map.planView) {
57 addEditingVisuals()
58 } else {
59 _objMgrEditingVisuals.destroyObjects()
60 _objMgrMouseClick.destroyObjects()
61 }
62 }
63 }
64
65 Component {
66 id: takeoffDragComponent
67
68 MissionItemIndicatorDrag {
69 mapControl: _root.map
70 itemIndicator: _takeoffIndicatorItem
71 itemCoordinate: _missionItem.specifiesCoordinate ? _missionItem.coordinate : _missionItem.launchCoordinate
72 visible: _root.interactive
73
74 onItemCoordinateChanged: {
75 if (_missionItem.specifiesCoordinate) {
76 _missionItem.coordinate = itemCoordinate
77 } else {
78 _missionItem.launchCoordinate = itemCoordinate
79 }
80 }
81 }
82 }
83
84 Component {
85 id: launchDragComponent
86
87 MissionItemIndicatorDrag {
88 mapControl: _root.map
89 itemIndicator: _launchIndicatorItem
90 itemCoordinate: _missionItem.launchCoordinate
91 visible: !_missionItem.launchTakeoffAtSameLocation && _root.interactive
92
93 onItemCoordinateChanged: _missionItem.launchCoordinate = itemCoordinate
94 }
95 }
96
97 Component {
98 id: takeoffIndicatorComponent
99
100 MissionItemIndicator {
101 coordinate: _missionItem.specifiesCoordinate ? _missionItem.coordinate : _missionItem.launchCoordinate
102 indicatorGroup: _root.indicatorGroup
103 interactive: _root.interactive
104 missionItem: _missionItem
105 sequenceNumber: _missionItem.sequenceNumber
106 onClicked: _root.clicked(_missionItem.sequenceNumber)
107 opacity: _root.opacity
108 }
109 }
110
111 Component {
112 id: launchIndicatorComponent
113
114 MapQuickItem {
115 coordinate: _missionItem.launchCoordinate
116 anchorPoint.x: sourceItem.anchorPointX
117 anchorPoint.y: sourceItem.anchorPointY
118 visible: !_missionItem.launchTakeoffAtSameLocation && _root.interactive
119
120 sourceItem:
121 MissionItemIndexLabel {
122 checked: _missionItem.isCurrentItem
123 label: qsTr("Home")
124 highlightSelected: true
125 onClicked: _root.clicked(_missionItem.sequenceNumber)
126 visible: _root.interactive
127 }
128 }
129 }
130
131 // Mouse area to capture launch location click
132 Component {
133 id: mouseAreaClickComponent
134
135 MouseArea {
136 anchors.fill: map
137 z: QGroundControl.zOrderMapItems + 1 // Over item indicators
138 visible: !_missionItem.launchCoordinate.isValid && _root.interactive
139
140 readonly property int _decimalPlaces: 8
141
142 onClicked: (mouse) => {
143 var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
144 coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
145 coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
146 coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
147 _missionItem.launchCoordinate = coordinate
148
149 // We drop out of wizard mode after launch position is set if:
150 // - Takeoff location is same as launch position so nothing left to do
151 // - Not a fixed wing. Fixed wing require warning about tweaking climb out position
152 if (_missionItem.launchTakeoffAtSameLocation || !vehicle.fixedWing) {
153 _missionItem.wizardMode = false
154 }
155 _objMgrMouseClick.destroyObjects()
156 }
157 }
158 }
159}