3 changed files with 137 additions and 0 deletions
@ -0,0 +1,135 @@
@@ -0,0 +1,135 @@
|
||||
/**************************************************************************** |
||||
* |
||||
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> |
||||
* |
||||
* QGroundControl is licensed according to the terms in the file |
||||
* COPYING.md in the root of the source code directory. |
||||
* |
||||
****************************************************************************/ |
||||
|
||||
import QtQuick 2.4 |
||||
import QtQuick.Controls 1.3 |
||||
|
||||
import QGroundControl 1.0 |
||||
import QGroundControl.Controls 1.0 |
||||
import QGroundControl.ScreenTools 1.0 |
||||
|
||||
/// Map scale control |
||||
Item { |
||||
id: scale |
||||
width: rightEnd.x + rightEnd.width |
||||
height: rightEnd.y + rightEnd.height |
||||
|
||||
property var mapControl ///< Map control for which this scale control is being used |
||||
|
||||
property variant _scaleLengths: [5, 10, 25, 50, 100, 150, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000] |
||||
|
||||
property bool _isSatelliteMap: mapControl.activeMapType.name.indexOf(qsTr("Street")) == -1 ///< Scale control being displayed over satellite map |
||||
property var _color: _isSatelliteMap ? "white" : "black" |
||||
|
||||
function formatDistance(meters) |
||||
{ |
||||
var dist = Math.round(meters) |
||||
if (dist > 1000 ){ |
||||
if (dist > 100000){ |
||||
dist = Math.round(dist / 1000) |
||||
} |
||||
else{ |
||||
dist = Math.round(dist / 100) |
||||
dist = dist / 10 |
||||
} |
||||
dist = dist + " km" |
||||
} |
||||
else{ |
||||
dist = dist + " m" |
||||
} |
||||
return dist |
||||
} |
||||
|
||||
function calculateScale() { |
||||
var scaleLineWidth = 100 |
||||
var coord1, coord2, dist, text, f |
||||
f = 0 |
||||
coord1 = mapControl.toCoordinate(Qt.point(0, scale.y)) |
||||
coord2 = mapControl.toCoordinate(Qt.point(scaleLineWidth, scale.y)) |
||||
dist = Math.round(coord1.distanceTo(coord2)) |
||||
if (dist === 0) { |
||||
// not visible |
||||
} else { |
||||
for (var i = 0; i < _scaleLengths.length - 1; i++) { |
||||
if (dist < (_scaleLengths[i] + _scaleLengths[i+1]) / 2 ) { |
||||
f = _scaleLengths[i] / dist |
||||
dist = _scaleLengths[i] |
||||
break; |
||||
} |
||||
} |
||||
if (f === 0) { |
||||
f = dist / _scaleLengths[i] |
||||
dist = _scaleLengths[i] |
||||
} |
||||
} |
||||
text = formatDistance(dist) |
||||
centerLine.width = (scaleLineWidth * f) - (2 * leftEnd.width) |
||||
scaleText.text = text |
||||
} |
||||
|
||||
Connections { |
||||
target: mapControl |
||||
|
||||
onWidthChanged: scaleTimer.restart() |
||||
onHeightChanged: scaleTimer.restart() |
||||
onZoomLevelChanged: scaleTimer.restart() |
||||
} |
||||
|
||||
Timer { |
||||
id: scaleTimer |
||||
interval: 100 |
||||
running: false |
||||
repeat: false |
||||
|
||||
onTriggered: calculateScale() |
||||
} |
||||
|
||||
QGCLabel { |
||||
id: scaleText |
||||
color: _color |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
anchors.left: parent.left |
||||
anchors.right: parent.right |
||||
horizontalAlignment: Text.AlignRight |
||||
text: "0 m" |
||||
} |
||||
|
||||
Rectangle { |
||||
id: leftEnd |
||||
anchors.top: scaleText.bottom |
||||
anchors.left: parent.left |
||||
width: 2 |
||||
height: ScreenTools.defaultFontPixelHeight |
||||
color: _color |
||||
} |
||||
|
||||
Rectangle { |
||||
id: centerLine |
||||
anchors.bottomMargin: 2 |
||||
anchors.bottom: leftEnd.bottom |
||||
anchors.left: leftEnd.right |
||||
height: 2 |
||||
color: _color |
||||
} |
||||
|
||||
Rectangle { |
||||
id: rightEnd |
||||
anchors.top: leftEnd.top |
||||
anchors.left: centerLine.right |
||||
width: 2 |
||||
height: ScreenTools.defaultFontPixelHeight |
||||
color: _color |
||||
} |
||||
|
||||
Component.onCompleted: { |
||||
if (scale.visible) { |
||||
calculateScale(); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue