Warning, /libraries/kosmindoormap/src/map-quick/IndoorMap.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import org.kde.kosmindoormap
0010 import QtQuick.Controls as QQC2
0011 
0012 /** QML item for displaying a train station or airport map. */
0013 Item {
0014     id: mapRoot
0015 
0016     /** Access to map loading status and progress. */
0017     property alias mapLoader: map.loader
0018     /** Path to a MapCSS style sheet used for rendering the map. */
0019     property alias styleSheet: map.styleSheet
0020     /** Floor level model. */
0021     property alias floorLevels: map.floorLevels
0022     /** Access to the view transformation and floor level selection. */
0023     property alias view: map.view
0024     /** There is something preventing displaying a map. */
0025     property alias hasError: map.hasError
0026     /** Access to the map data, for feeding into content-specific models. */
0027     property alias mapData: map.mapData
0028     /** Access to overlay sources. */
0029     property alias overlaySources: map.overlaySources
0030     /** ISO 3166-1/2 country or region code for opening hours interpretation. */
0031     property alias region: map.region
0032     /** IANA timezone id for opening hours interpretation. */
0033     property alias timeZone: map.timeZone
0034     /** Currently hovered element. */
0035     property alias hoveredElement: map.hoveredElement
0036 
0037     /** Emitted when a map element has been picked by clicking/tapping on it. */
0038     signal elementPicked(var element);
0039     /** Emitted when a map element has been long-pressed. */
0040     signal elementLongPressed(var element);
0041 
0042     /** Map an event handler EventPoint to map screen coordinates. */
0043     function mapEventPointToScreen(eventPoint) {
0044         let root = mapRoot.parent;
0045         while (root.parent) { root = root.parent; }
0046         return map.mapFromItem(root, eventPoint.scenePosition.x, eventPoint.scenePosition.y);
0047     }
0048 
0049     /** Returns the OSM element at the given screen position, if any. */
0050     function elementAt(screenPosition) {
0051         return map.elementAt(screenPosition.x, screenPosition.y);
0052     }
0053 
0054     MapItemImpl {
0055         id: map
0056         anchors.fill: mapRoot
0057     }
0058 
0059     Flickable {
0060         id: flickable
0061         boundsBehavior: Flickable.StopAtBounds
0062         clip: true
0063         interactive: !pinchHandler.active
0064         contentX: map.view.panX
0065         contentY: map.view.panY
0066         contentWidth: map.view.panWidth
0067         contentHeight: map.view.panHeight
0068         anchors.fill: parent
0069 
0070         onContentXChanged: {
0071             if (moving) {
0072                 map.view.panTopLeft(flickable.contentX, flickable.contentY);
0073                 map.update();
0074             }
0075         }
0076         onContentYChanged: {
0077             if (moving) {
0078                 map.view.panTopLeft(flickable.contentX, flickable.contentY);
0079                 map.update();
0080             }
0081         }
0082 
0083         QQC2.ScrollBar.vertical: QQC2.ScrollBar {}
0084         QQC2.ScrollBar.horizontal: QQC2.ScrollBar {}
0085 
0086         TapHandler {
0087             id: tapHandler
0088             acceptedButtons: Qt.LeftButton
0089             onTapped: function(eventPoint) {
0090                 const element = mapRoot.elementAt(mapRoot.mapEventPointToScreen(eventPoint));
0091                 if (!element.isNull) {
0092                     elementPicked(element);
0093                 }
0094             }
0095             onLongPressed: function() {
0096                 const element = mapRoot.elementAt(mapRoot.mapEventPointToScreen(tapHandler.point));
0097                 if (!element.isNull) {
0098                     elementLongPressed(element);
0099                 }
0100             }
0101         }
0102         PinchHandler {
0103             id: pinchHandler
0104             target: null
0105             property double initialZoom
0106             onActiveChanged: {
0107                 initialZoom = map.view.zoomLevel
0108             }
0109             onActiveScaleChanged: {
0110                 map.view.setZoomLevel(pinchHandler.initialZoom + Math.log2(pinchHandler.activeScale),
0111                                       Qt.point(pinchHandler.centroid.position.x - flickable.contentX, pinchHandler.centroid.position.y - flickable.contentY));
0112             }
0113             xAxis.enabled: false
0114             yAxis.enabled: false
0115             minimumRotation: 0.0
0116             maximumRotation: 0.0
0117         }
0118         WheelHandler {
0119             id: wheelHandler
0120             target: null
0121             orientation: Qt.Vertical
0122             acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
0123             property double initialZoom: 0.0
0124             onActiveChanged: {
0125                 wheelHandler.initialZoom = map.view.zoomLevel
0126                 wheelHandler.rotation = 0;
0127             }
0128             onRotationChanged: {
0129                 // same scale as in qquickmapgestrurearea.cpp
0130                 map.view.setZoomLevel(wheelHandler.initialZoom + 0.05 * wheelHandler.rotation,
0131                                       Qt.point(wheelHandler.point.position.x - flickable.contentX, wheelHandler.point.position.y - flickable.contentY));
0132             }
0133         }
0134     }
0135 
0136     Connections {
0137         target: map.view
0138         function onTransformationChanged() {
0139             flickable.contentX = map.view.panX;
0140             flickable.contentY = map.view.panY;
0141         }
0142     }
0143 
0144     QQC2.BusyIndicator {
0145         anchors.centerIn: parent
0146         running: map.loader.isLoading
0147     }
0148 
0149     QQC2.Label {
0150         anchors.fill: parent
0151         text: map.errorMessage
0152         visible: map.hasError
0153         wrapMode: Text.WordWrap
0154         horizontalAlignment: Qt.AlignHCenter
0155         verticalAlignment: Qt.AlignVCenter
0156     }
0157 }