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 indicatorGroup: _root.indicatorGroup
68 indicatorVisible: _missionItem.specifiesCoordinate
69 interactive: _root.interactive
70 missionItem: _missionItem
71 sequenceNumber: _missionItem.sequenceNumber
72 onClicked: _root.clicked(_missionItem.sequenceNumber)
73 opacity: _root.opacity
74 }
75 }
76
77 Component {
78 id: loiterComponent
79
80 MapQuickItem {
81 id: loiterMapQuickItem
82 coordinate: _root._missionItem.coordinate
83 visible: _root.interactive && _missionItem.isSimpleItem && _missionItem.showLoiterRadius
84
85 property alias blockSignals: loiterMapCircleVisuals.blockSignals
86 property alias radius: _mapCircle.radius
87 property alias clockwiseRotation: _mapCircle.clockwiseRotation
88
89 function handleLoiterRadiusChange() {
90 blockSignals = true
91 clockwiseRotation = _missionItem.loiterRadius>= 0
92 blockSignals = false
93 radius.rawValue = Math.abs(_missionItem.loiterRadius)
94 }
95
96 function handleCoordinateChange() {
97 coordinate = _missionItem.coordinate
98 }
99
100 onCoordinateChanged: _mapCircle.center = coordinate
101
102 sourceItem: QGCMapCircleVisuals {
103 id: loiterMapCircleVisuals
104 mapControl: _root.map
105 mapCircle: _mapCircle
106 centerDragHandleVisible: false
107 borderColor: _missionItem.terrainCollision ? "red" : QGroundControl.globalPalette.mapMissionTrajectory
108
109 property bool blockSignals: false
110
111 function updateMissionItem() {
112 _missionItem.loiterRadius = _mapCircle.clockwiseRotation ? _mapCircle.radius.rawValue : -_mapCircle.radius.rawValue
113 }
114
115 QGCMapCircle {
116 id: _mapCircle
117 center: loiterMapQuickItem.coordinate
118 interactive: _root.interactive && _missionItem.isCurrentItem && map.planView
119 showRotation: true
120 onClockwiseRotationChanged: if(!blockSignals) loiterMapCircleVisuals.updateMissionItem()
121 }
122
123 Connections {
124 target: _mapCircle.radius
125 function onRawValueChanged() {
126 if(!blockSignals) loiterMapCircleVisuals.updateMissionItem()
127 }
128 }
129 }
130
131 Component.onCompleted: {
132 handleLoiterRadiusChange()
133 handleCoordinateChange()
134 }
135 }
136 }
137}