5import QGroundControl.Controls
9 radius: ScreenTools.defaultFontPixelWidth * 0.5
14 property var missionController
16 signal setCurrentSeqNum(int seqNum)
18 property real _margins: ScreenTools.defaultFontPixelWidth / 2
19 property var _visualItems: missionController.visualItems
20 property real _altRange: _maxAMSLAltitude - _minAMSLAltitude
21 property real _indicatorSpacing: 5
22 property real _minAMSLAltitude: isNaN(terrainProfile.minAMSLAlt) ? 0 : terrainProfile.minAMSLAlt
23 property real _maxAMSLAltitude: isNaN(terrainProfile.maxAMSLAlt) ? 100 : terrainProfile.maxAMSLAlt
24 property real _missionTotalDistance: isNaN(missionController.missionTotalDistance) ? 100 : missionController.missionTotalDistance
25 property var _unitsConversion: QGroundControl.unitsConversion
27 QGCPalette { id: qgcPal }
31 anchors.top: parent.bottom
33 font.pointSize: ScreenTools.smallFontPointSize
34 text: qsTr("Height AMSL (%1)").arg(_unitsConversion.appSettingsVerticalDistanceUnitsString)
35 horizontalAlignment: Text.AlignHCenter
37 transformOrigin: Item.TopLeft
41 id: terrainProfileFlickable
42 anchors.top: parent.top
43 anchors.bottom: parent.bottom
44 anchors.leftMargin: titleLabel.contentHeight
45 anchors.left: parent.left
46 anchors.right: parent.right
50 height: terrainProfileFlickable.height
51 width: terrainProfileFlickable.width
56 marginTop: ScreenTools.defaultFontPixelHeight / 2 // Fixes top clipping problem
57 marginRight: ScreenTools.defaultFontPixelWidth * 2 // Prevents clipping last tick mark
58 marginBottom: -ScreenTools.defaultFontPixelHeight / 2 // For some reason you can't get rid of bottom margin by setting to 0
62 colorScheme: qgcPal.globalTheme === QGCPalette.Light ? GraphsTheme.ColorScheme.Light : GraphsTheme.ColorScheme.Dark
63 backgroundColor: "transparent"
64 backgroundVisible: false
65 plotAreaBackgroundColor: qgcPal.window
66 grid.mainColor: applyOpacity(qgcPal.text, 0.5)
67 grid.subColor: applyOpacity(qgcPal.text, 0.3)
69 labelBackgroundVisible: false
70 labelTextColor: qgcPal.text
71 axisXLabelFont.family: ScreenTools.fixedFontFamily
72 axisXLabelFont.pointSize: ScreenTools.smallFontPointSize
73 axisYLabelFont.family: ScreenTools.fixedFontFamily
74 axisYLabelFont.pointSize: ScreenTools.smallFontPointSize
80 max: _unitsConversion.metersToAppSettingsHorizontalDistanceUnits(_missionTotalDistance)
82 tickInterval: max > 0 ? max / 4 : 1
88 min: _unitsConversion.metersToAppSettingsVerticalDistanceUnits(_minAMSLAltitude)
89 max: _unitsConversion.metersToAppSettingsVerticalDistanceUnits(_maxAMSLAltitude)
91 tickInterval: (max - min) > 0 ? (max - min) / 3 : 1
95 // The order of the LineSeries is important to work around nasty bugs in QtGraphs where series just don't display. If you put
96 // terrain and flight first you end up with cases where flight doesn't display no matter what other sorts of workarounds you try.
97 // Putting missing and collision first seems to prevent the problem.
108 width: flightSeries.width * 3
128 height: chart.plotArea.height
129 visibleWidth: chart.plotArea.width
130 missionController: root.missionController
131 horizontalScale: _unitsConversion.metersToAppSettingsHorizontalDistanceUnits(1)
132 verticalScale: _unitsConversion.metersToAppSettingsVerticalDistanceUnits(1)
134 onProfileChanged: terrainProfile.updateSeries(terrainSeries, flightSeries, missingSeries, collisionSeries)
137 model: missionController.visualItems
142 visible: object.specifiesCoordinate && !object.standaloneCoordinate
146 height: terrainProfile.height
149 x: (object.distanceFromStart * terrainProfile.pixelsPerMeter)
150 visible: object.isSimpleItem || object.isSingleItem
152 MissionItemIndexLabel {
153 anchors.horizontalCenter: parent.horizontalCenter
154 anchors.bottom: parent.bottom
156 checked: object.isCurrentItem
157 label: object.abbreviation.charAt(0)
158 index: object.abbreviation.charAt(0) > 'A' && object.abbreviation.charAt(0) < 'z' ? -1 : object.sequenceNumber
159 onClicked: root.setCurrentSeqNum(object.sequenceNumber)
165 height: terrainProfile.height
168 x: (object.distanceFromStart * terrainProfile.pixelsPerMeter)
169 visible: complexItem.visible
171 MissionItemIndexLabel {
172 anchors.horizontalCenter: parent.horizontalCenter
173 anchors.bottom: parent.bottom
175 checked: object.isCurrentItem
176 index: object.sequenceNumber
177 onClicked: root.setCurrentSeqNum(object.sequenceNumber)
183 height: terrainProfile.height
186 x: ((object.distanceFromStart + object.complexDistance) * terrainProfile.pixelsPerMeter)
187 visible: complexItem.visible
189 MissionItemIndexLabel {
190 anchors.horizontalCenter: parent.horizontalCenter
191 anchors.bottom: parent.bottom
193 checked: object.isCurrentItem
194 index: object.lastSequenceNumber
195 onClicked: root.setCurrentSeqNum(object.sequenceNumber)
201 anchors.bottom: parent.bottom
202 x: (object.distanceFromStart * terrainProfile.pixelsPerMeter)
203 width: complexItem.visible ? object.complexDistance * terrainProfile.pixelsPerMeter : 0
204 height: patternNameLabel.height
207 visible: !object.isSimpleItem && !object.isSingleItem
211 onClicked: root.setCurrentSeqNum(object.sequenceNumber)
216 anchors.horizontalCenter: parent.horizontalCenter
217 text: complexItem.visible ? object.patternName : ""
226 function applyOpacity(colorIn, opacity){
227 return Qt.rgba(colorIn.r, colorIn.g, colorIn.b, opacity)