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