4import QGroundControl.Controls
5import QGroundControl.Viewer3D
7/// Ground-scale indicator for the 3D viewer, patterned after MapScale.qml.
8/// Shows the ground distance covered on screen at the ground plane through the
9/// screen center (scale varies elsewhere in a perspective view).
12 width: rightEnd.x + rightEnd.width
13 height: rightEnd.y + rightEnd.height
15 property Viewer3DCameraController controller
16 property bool autoHide: false ///< true: disappears after a timeout on scale change
18 // Scene units are meters x 10
19 readonly property real _sceneToMeters: 0.1
20 property var _scaleLengthsMeters: [5, 10, 25, 50, 100, 150, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000]
21 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]
23 function formatDistanceMeters(meters) {
24 var dist = Math.round(meters)
27 dist = Math.round(dist / 1000)
29 dist = Math.round(dist / 100)
32 dist = dist + qsTr(" km")
34 dist = dist + qsTr(" m")
39 function formatDistanceFeet(feet) {
40 var dist = Math.round(feet)
42 dist = Math.round(dist / 5280)
46 dist += qsTr(" miles")
49 dist = dist + qsTr(" ft")
54 function _applyNiceLength(scaleLineLength, scaleLinePixelLength, scaleLengths) {
55 var scaleLineRatio = 0
58 if (scaleLineLength === 0) {
62 for (i = 0; i < scaleLengths.length - 1; i++) {
63 if (scaleLineLength < ((scaleLengths[i] + scaleLengths[i + 1]) / 2)) {
64 scaleLineRatio = scaleLengths[i] / scaleLineLength
65 scaleLineLength = scaleLengths[i]
69 if (scaleLineRatio === 0) {
70 scaleLineRatio = scaleLengths[i] / scaleLineLength
71 scaleLineLength = scaleLengths[i]
74 centerLine.width = (scaleLinePixelLength * scaleLineRatio) - (2 * leftEnd.width)
75 return scaleLineLength
78 function calculateScale() {
83 var scaleLinePixelLength = 100
84 var scaleLineMeters = controller.sceneUnitsPerPixel() * scaleLinePixelLength * _sceneToMeters
85 if (scaleLineMeters <= 0) {
89 if (QGroundControl.settingsManager.unitsSettings.horizontalDistanceUnits.value === UnitsSettings.HorizontalDistanceUnitsFeet) {
90 var niceFeet = _applyNiceLength(scaleLineMeters * 3.2808399, scaleLinePixelLength, _scaleLengthsFeet)
91 scaleText.text = formatDistanceFeet(niceFeet)
93 var niceMeters = _applyNiceLength(scaleLineMeters, scaleLinePixelLength, _scaleLengthsMeters)
94 scaleText.text = formatDistanceMeters(niceMeters)
98 function triggerRecalc() {
100 if (control.autoHide) {
101 autoHideTimer.restart()
102 autoHideAnimation.stop()
107 Component.onCompleted: triggerRecalc()
108 onControllerChanged: triggerRecalc()
111 target: control.controller
113 function onDistanceChanged() { control.triggerRecalc() }
114 function onViewportSizeChanged() { control.triggerRecalc() }
115 function onFieldOfViewChanged() { control.triggerRecalc() }
119 id: autoHideAnimation
130 onTriggered: autoHideAnimation.start()
133 QGCPalette { id: qgcPal }
137 anchors.left: parent.left
138 anchors.right: rightEnd.right
140 horizontalAlignment: Text.AlignRight
146 anchors.top: scaleText.bottom
147 anchors.left: parent.left
149 height: ScreenTools.defaultFontPixelHeight
155 anchors.bottomMargin: 2
156 anchors.bottom: leftEnd.bottom
157 anchors.left: leftEnd.right
164 anchors.top: leftEnd.top
165 anchors.left: centerLine.right
167 height: ScreenTools.defaultFontPixelHeight