mirror of https://github.com/qt/qtdoc.git
103 lines
2.9 KiB
QML
103 lines
2.9 KiB
QML
// Copyright (C) 2023 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
import QtQuick
|
|
import QtLocation
|
|
import QtPositioning
|
|
|
|
Item {
|
|
id: mapView
|
|
property alias lightningLayerVisible: lightningLayer.visible
|
|
property alias distanceLayerVisible: distanceLayer.visible
|
|
property alias locationAllowed: positionSource.active
|
|
property alias zoomLevel: map.zoomLevel
|
|
property int mapType: MapType.map
|
|
|
|
function recenter(coordinate) {
|
|
map.center = coordinate ?? positionSource.position.coordinate;
|
|
}
|
|
|
|
PositionSource {
|
|
id: positionSource
|
|
updateInterval: 3000
|
|
active: false
|
|
preferredPositioningMethods: PositionSource.AllPositioningMethods
|
|
onPositionChanged: LightningController.setUserLocation(position.coordinate)
|
|
}
|
|
|
|
Map {
|
|
id: map
|
|
anchors.fill: parent
|
|
plugin: Plugin {
|
|
name: "osm"
|
|
PluginParameter {
|
|
name: "osm.mapping.providersrepository.disabled"
|
|
value: "true"
|
|
}
|
|
}
|
|
|
|
MapQuickItem {
|
|
coordinate: positionSource.position.coordinate
|
|
sourceItem: Image {
|
|
id: userLocationImage
|
|
source: "icons/user-location.svg"
|
|
width: 24
|
|
height: width
|
|
anchors.centerIn: parent
|
|
}
|
|
}
|
|
|
|
LightningMapLayer { id: lightningLayer }
|
|
|
|
DistanceTimeLayer {
|
|
id: distanceLayer
|
|
anchors.top: map.top
|
|
anchors.horizontalCenter: map.horizontalCenter
|
|
anchors.margins: 30
|
|
width: 180
|
|
height: 90
|
|
}
|
|
}
|
|
|
|
PinchHandler {
|
|
target: null
|
|
grabPermissions: PointerHandler.TakeOverForbidden
|
|
property geoCoordinate startCenteroid
|
|
onActiveChanged: {
|
|
if (active)
|
|
startCenteroid = map.toCoordinate(centroid.position, false)
|
|
}
|
|
onScaleChanged: (delta) => {
|
|
map.zoomLevel += Math.log(delta)
|
|
map.alignCoordinateToPoint(startCenteroid, centroid.position)
|
|
}
|
|
}
|
|
|
|
WheelHandler {
|
|
onWheel: function(event) {
|
|
const loc = map.toCoordinate(point.position)
|
|
map.zoomLevel += event.angleDelta.y / 120;
|
|
map.alignCoordinateToPoint(loc, point.position)
|
|
}
|
|
}
|
|
|
|
DragHandler {
|
|
target: null
|
|
grabPermissions: PointerHandler.TakeOverForbidden
|
|
onTranslationChanged: (delta) => { map.pan(-delta.x, -delta.y); }
|
|
}
|
|
|
|
onMapTypeChanged: {
|
|
let index = 0;
|
|
for (; index < map.supportedMapTypes.length; ++index) {
|
|
const supportedMapType = map.supportedMapTypes[index];
|
|
if (supportedMapType.style === mapType)
|
|
break;
|
|
}
|
|
if (index >= map.supportedMapTypes.length) {
|
|
return;
|
|
}
|
|
map.activeMapType = map.supportedMapTypes[index];
|
|
}
|
|
}
|