5import QGroundControl.Controls
10 width: rightEnd.x + rightEnd.width
11 height: rightEnd.y + rightEnd.height
13 property var mapControl ///< Map control for which this scale control is being used
14 property bool autoHide: false ///< true: disappears after a timeout on scale change
16 property var _scaleLengthsMeters: [5, 10, 25, 50, 100, 150, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000]
17 property var _scaleLengthsFeet: [10, 25, 50, 100, 250, 500, 1000, 2000, 3000, 4000, 5280, 5280*2, 5280*5, 5280*10, 5280*25, 5280*50, 5280*100, 5280*250, 5280*500, 5280*1000]
18 property var _color: mapControl.isSatelliteMap ? "white" : "black"
20 function formatDistanceMeters(meters) {
21 var dist = Math.round(meters)
24 dist = Math.round(dist / 1000)
26 dist = Math.round(dist / 100)
29 dist = dist + qsTr(" km")
31 dist = dist + qsTr(" m")
36 function formatDistanceFeet(feet) {
37 var dist = Math.round(feet)
39 dist = Math.round(dist / 5280)
44 dist += qsTr(" miles")
47 dist = dist + qsTr(" ft")
52 function calculateMetersRatio(scaleLineMeters, scaleLinePixelLength) {
53 var scaleLineRatio = 0
55 if (scaleLineMeters === 0) {
58 for (var i = 0; i < _scaleLengthsMeters.length - 1; i++) {
59 if (scaleLineMeters < (_scaleLengthsMeters[i] + _scaleLengthsMeters[i+1]) / 2 ) {
60 scaleLineRatio = _scaleLengthsMeters[i] / scaleLineMeters
61 scaleLineMeters = _scaleLengthsMeters[i]
65 if (scaleLineRatio === 0) {
66 scaleLineRatio = scaleLineMeters / _scaleLengthsMeters[i]
67 scaleLineMeters = _scaleLengthsMeters[i]
71 var text = formatDistanceMeters(scaleLineMeters)
72 centerLine.width = (scaleLinePixelLength * scaleLineRatio) - (2 * leftEnd.width)
76 function calculateFeetRatio(scaleLineMeters, scaleLinePixelLength) {
77 var scaleLineRatio = 0
78 var scaleLineFeet = scaleLineMeters * 3.2808399
80 if (scaleLineFeet === 0) {
83 for (var i = 0; i < _scaleLengthsFeet.length - 1; i++) {
84 if (scaleLineFeet < (_scaleLengthsFeet[i] + _scaleLengthsFeet[i+1]) / 2 ) {
85 scaleLineRatio = _scaleLengthsFeet[i] / scaleLineFeet
86 scaleLineFeet = _scaleLengthsFeet[i]
90 if (scaleLineRatio === 0) {
91 scaleLineRatio = scaleLineFeet / _scaleLengthsFeet[i]
92 scaleLineFeet = _scaleLengthsFeet[i]
96 var text = formatDistanceFeet(scaleLineFeet)
97 centerLine.width = (scaleLinePixelLength * scaleLineRatio) - (2 * leftEnd.width)
101 function calculateScale() {
103 var scaleLinePixelLength = 100
104 var leftCoord = mapControl.toCoordinate(Qt.point(0, control.y), false /* clipToViewPort */)
105 var rightCoord = mapControl.toCoordinate(Qt.point(scaleLinePixelLength, control.y), false /* clipToViewPort */)
106 var scaleLineMeters = Math.round(leftCoord.distanceTo(rightCoord))
107 if (QGroundControl.settingsManager.unitsSettings.horizontalDistanceUnits.value === UnitsSettings.HorizontalDistanceUnitsFeet) {
108 calculateFeetRatio(scaleLineMeters, scaleLinePixelLength)
110 calculateMetersRatio(scaleLineMeters, scaleLinePixelLength)
115 function triggerRecalc() {
117 if (control.autoHide) {
118 autoHideTimer.restart()
119 autoHideAnimation.stop()
124 Component.onCompleted: calculateScale()
128 function onWidthChanged() { triggerRecalc() }
129 function onHeightChanged() { triggerRecalc() }
130 function onZoomLevelChanged() { triggerRecalc() }
134 id: autoHideAnimation
145 onTriggered: autoHideAnimation.start()
152 anchors.left: parent.left
153 anchors.right: rightEnd.right
154 horizontalAlignment:Text.AlignRight
160 anchors.top: scaleText.bottom
161 anchors.left: parent.left
163 height: ScreenTools.defaultFontPixelHeight
169 anchors.bottomMargin: 2
170 anchors.bottom: leftEnd.bottom
171 anchors.left: leftEnd.right
178 anchors.top: leftEnd.top
179 anchors.left: centerLine.right
181 height: ScreenTools.defaultFontPixelHeight