Newer
Older
/****************************************************************************
*
* (c) 2009-2020 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.3
import QtQuick.Controls 1.2
import QtLocation 5.3
import QtPositioning 5.3
import QGroundControl.FlightMap 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.Vehicle 1.0
import QGroundControl.QGCPositionManager 1.0
//-- Qt 5.9 has rotation gesture enabled by default. Here we limit the possible gestures.
gesture.acceptedGestures: MapGestureArea.PinchGesture | MapGestureArea.PanGesture | MapGestureArea.FlickGesture
gesture.flickDeceleration: 3000
plugin: Plugin { name: "QGroundControl" }
Gus Grubba
committed
// https://bugreports.qt.io/browse/QTBUG-82185
opacity: 0.99
property string mapName: 'defaultMap'
property bool isSatelliteMap: activeMapType.name.indexOf("Satellite") > -1 || activeMapType.name.indexOf("Hybrid") > -1
property bool userPanned: false ///< true: the user has manually panned the map
property bool allowGCSLocationCenter: false ///< true: map will center/zoom to gcs location one time
property bool allowVehicleLocationCenter: false ///< true: map will center/zoom to vehicle location one time
property bool firstGCSPositionReceived: false ///< true: first gcs position update was responded to
property bool firstVehiclePositionReceived: false ///< true: first vehicle position update was responded to
property bool planView: false ///< true: map being using for Plan view, items should be draggable
property var activeVehicleCoordinate: activeVehicle ? activeVehicle.coordinate : QtPositioning.coordinate()
// TODO: Is this still necessary with Qt 5.11?
// This works around a bug on Qt where if you set a visibleRegion and then the user moves or zooms the map
// and then you set the same visibleRegion the map will not move/scale appropriately since it thinks there
// is nothing to do.
_map.visibleRegion = QtPositioning.rectangle(QtPositioning.coordinate(0, 0), QtPositioning.coordinate(0, 0))
_map.visibleRegion = region
}
function _possiblyCenterToVehiclePosition() {
if (!firstVehiclePositionReceived && allowVehicleLocationCenter && activeVehicleCoordinate.isValid) {
firstVehiclePositionReceived = true
center = activeVehicleCoordinate
zoomLevel = QGroundControl.flightMapInitialZoom
}
}
function centerToSpecifiedLocation() {
mainWindow.showComponentDialog(specifyMapPositionDialog, qsTr("Specify Position"), mainWindow.showDialogDefaultWidth, StandardButton.Close)
}
Component {
id: specifyMapPositionDialog
EditPositionDialog {
coordinate: center
onCoordinateChanged: center = coordinate
}
}
// Center map to gcs location
onGcsPositionChanged: {
if (gcsPosition.isValid && allowGCSLocationCenter && !firstGCSPositionReceived && !firstVehiclePositionReceived) {
firstGCSPositionReceived = true
Gus Grubba
committed
//-- Only center on gsc if we have no vehicle (and we are supposed to do so)
var activeVehicleCoordinate = activeVehicle ? activeVehicle.coordinate : QtPositioning.coordinate()
if(QGroundControl.settingsManager.flyViewSettings.keepMapCenteredOnVehicle.rawValue || !activeVehicleCoordinate.isValid)
center = gcsPosition
// We track whether the user has panned or not to correctly handle automatic map positioning
Connections {
target: gesture
onPanFinished: userPanned = true
onFlickFinished: userPanned = true
}
var settings = QGroundControl.settingsManager.flightMapSettings
var fullMapName = settings.mapProvider.value + " " + settings.mapType.value
for (var i = 0; i < _map.supportedMapTypes.length; i++) {
if (fullMapName === _map.supportedMapTypes[i].name) {
onActiveVehicleCoordinateChanged: _possiblyCenterToVehiclePosition()
Component.onCompleted: {
updateActiveMapType()
_possiblyCenterToVehiclePosition()
}
target: QGroundControl.settingsManager.flightMapSettings.mapType
onRawValueChanged: updateActiveMapType()
}
Connections {
target: QGroundControl.settingsManager.flightMapSettings.mapProvider
onRawValueChanged: updateActiveMapType()
anchorPoint.x: sourceItem.width / 2
anchorPoint.y: sourceItem.height / 2
visible: gcsPosition.isValid
coordinate: gcsPosition
id: mapItemImage
source: isNaN(gcsHeading) ? "/res/QGCLogoFull" : "/res/QGCLogoArrow"
mipmap: true
antialiasing: true
fillMode: Image.PreserveAspectFit
height: ScreenTools.defaultFontPixelHeight * (isNaN(gcsHeading) ? 1.75 : 2.5 )
transform: Rotation {
origin.x: mapItemImage.width / 2
origin.y: mapItemImage.height / 2
angle: isNaN(gcsHeading) ? 0 : gcsHeading
}