QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SimpleItemMapVisual.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
11MissionItemMapVisualBase {
12 id: _root
13
14 indicatorComponent: indicatorComponent
15
16 function hideItemVisuals() {
17 if (_itemVisualShowing) {
18 _hideItemVisuals()
19 loiterVisualLoader.active = false
20 }
21 }
22
23 function showItemVisuals() {
24 if (!_itemVisualShowing) {
25 _showItemVisuals()
26 loiterVisualLoader.active = true
27 }
28 }
29
30 Connections {
31 target: _missionItem.isSimpleItem ? _missionItem : null
32
33 function onLoiterRadiusChanged(loiterRadius) {
34 if (loiterVisualLoader.item) {
35 loiterVisualLoader.item.handleLoiterRadiusChange()
36 }
37 }
38
39 function onCoordinateChanged(coordinate) {
40 if (loiterVisualLoader.item) {
41 loiterVisualLoader.item.handleCoordinateChange()
42 }
43 }
44 }
45
46 Loader {
47 id: loiterVisualLoader
48
49 asynchronous: true
50 active: false
51
52 sourceComponent: loiterComponent
53
54 onLoaded: {
55 if (item) {
56 item.parent = map
57 map.addMapItem(item)
58 }
59 }
60 }
61
62 Component {
63 id: indicatorComponent
64
65 MissionItemIndicator {
66 coordinate: _missionItem.coordinate
67 visible: _missionItem.specifiesCoordinate
68 z: QGroundControl.zOrderMapItems
69 missionItem: _missionItem
70 sequenceNumber: _missionItem.sequenceNumber
71 onClicked: if(_root.interactive) _root.clicked(_missionItem.sequenceNumber)
72 opacity: _root.opacity
73 }
74 }
75
76 Component {
77 id: loiterComponent
78
79 MapQuickItem {
80 id: loiterMapQuickItem
81 coordinate: _root._missionItem.coordinate
82 visible: _root.interactive && _missionItem.isSimpleItem && _missionItem.showLoiterRadius
83
84 property alias blockSignals: loiterMapCircleVisuals.blockSignals
85 property alias radius: _mapCircle.radius
86 property alias clockwiseRotation: _mapCircle.clockwiseRotation
87
88 function handleLoiterRadiusChange() {
89 blockSignals = true
90 clockwiseRotation = _missionItem.loiterRadius>= 0
91 blockSignals = false
92 radius.rawValue = Math.abs(_missionItem.loiterRadius)
93 }
94
95 function handleCoordinateChange() {
96 coordinate = _missionItem.coordinate
97 }
98
99 onCoordinateChanged: _mapCircle.center = coordinate
100
101 sourceItem: QGCMapCircleVisuals {
102 id: loiterMapCircleVisuals
103 mapControl: _root.map
104 mapCircle: _mapCircle
105 centerDragHandleVisible: false
106 borderColor: _missionItem.terrainCollision ? "red" : QGroundControl.globalPalette.mapMissionTrajectory
107
108 property bool blockSignals: false
109
110 function updateMissionItem() {
111 _missionItem.loiterRadius = _mapCircle.clockwiseRotation ? _mapCircle.radius.rawValue : -_mapCircle.radius.rawValue
112 }
113
114 QGCMapCircle {
115 id: _mapCircle
116 center: loiterMapQuickItem.coordinate
117 interactive: _root.interactive && _missionItem.isCurrentItem && map.planView
118 showRotation: true
119 onClockwiseRotationChanged: if(!blockSignals) loiterMapCircleVisuals.updateMissionItem()
120 }
121
122 Connections {
123 target: _mapCircle.radius
124 function onRawValueChanged() {
125 if(!blockSignals) loiterMapCircleVisuals.updateMissionItem()
126 }
127 }
128 }
129
130 Component.onCompleted: {
131 handleLoiterRadiusChange()
132 handleCoordinateChange()
133 }
134 }
135 }
136}