| /**************************************************************************** |
| ** |
| ** Copyright (C) 2020 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the test suite of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| import QtQuick 2.7 |
| import QtQuick.Window 2.2 |
| import QtQuick.Controls 2.13 as C2 |
| import QtPositioning 5.6 |
| import QtLocation 5.15 |
| |
| Window { |
| id: win |
| visible: true |
| width: 1600 |
| height: 800 |
| title: qsTr("MapPolyline tester") |
| |
| property real initialZL: 4 |
| property var initialCenter: QtPositioning.coordinate(55, -160) |
| property real rotation : 0 |
| |
| Shortcut { |
| sequence: "Ctrl+R" |
| onActivated: { |
| rotation = rotation + 36 |
| } |
| } |
| |
| function syncMaps(mFrom, mTo, propName) |
| { |
| if (mTo[propName] !== mFrom[propName]) { |
| mTo[propName] = mFrom[propName] |
| } |
| } |
| |
| Plugin { |
| id: osm // use only one plugin, to avoid messing up the cache |
| name: "osm" |
| } |
| Rectangle { |
| id: mapContainer |
| rotation: win.rotation |
| anchors.fill: parent |
| color: "lightsteelblue" |
| |
| Map { |
| id: map |
| rotation: win.rotation |
| gesture.enabled: true |
| objectName: "map1" |
| anchors { |
| bottom: parent.bottom |
| top: parent.top |
| left: parent.left |
| right: (leftSwitch.checked) ? parent.right : parent.horizontalCenter |
| } |
| |
| onCenterChanged: syncMaps(map, map2, "center") |
| onTiltChanged: syncMaps(map, map2, "tilt") |
| onBearingChanged: syncMaps(map, map2, "bearing") |
| onZoomLevelChanged: syncMaps(map, map2, "zoomLevel") |
| onFieldOfViewChanged: syncMaps(map, map2, "fieldOfView") |
| |
| opacity: 1.0 |
| color: 'transparent' |
| plugin: osm |
| center: initialCenter |
| activeMapType: map.supportedMapTypes[2] |
| zoomLevel: initialZL |
| z : parent.z + 1 |
| copyrightsVisible: false |
| |
| Component.onCompleted: { |
| var o = migComponent.createObject(map) |
| o.glPolylines = Qt.binding(function() {return switchPolylines1.currentText}) |
| map.addMapItemGroup(o); |
| } |
| MouseArea { |
| anchors.fill: parent |
| onClicked: { |
| mouse.accepted = false |
| var crd = map.toCoordinate(Qt.point(mouse.x, mouse.y)) |
| var s = crd.toString(0) |
| console.log("Clicked the map (not an Item) on ",s) |
| } |
| } |
| |
| C2.ComboBox { |
| model: ['Software','OpenGL LineStrip','OpenGL Triangles'] |
| id: switchPolylines1 |
| anchors { |
| top: parent.top |
| right: parent.right |
| topMargin: 12 |
| rightMargin: 12 |
| } |
| } |
| } |
| Map { |
| id: map2 |
| rotation: win.rotation |
| gesture.enabled: true |
| objectName: "map2" |
| visible: !leftSwitch.checked |
| anchors { |
| bottom: parent.bottom |
| top: parent.top |
| left: parent.horizontalCenter |
| right: parent.right |
| } |
| |
| onCenterChanged: syncMaps(map2, map, "center") |
| onTiltChanged: syncMaps(map2, map, "tilt") |
| onBearingChanged: syncMaps(map2, map, "bearing") |
| onZoomLevelChanged: syncMaps(map2, map, "zoomLevel") |
| onFieldOfViewChanged: syncMaps(map2, map, "fieldOfView") |
| |
| color: 'transparent' |
| plugin: osm |
| activeMapType: map.supportedMapTypes[2] |
| center: initialCenter |
| zoomLevel: initialZL |
| copyrightsVisible: false |
| |
| Component.onCompleted: { |
| var o = migComponent.createObject(map2) |
| o.glPolylines = Qt.binding(function() {return switchPolylines2.currentText}) |
| map2.addMapItemGroup(o); |
| } |
| |
| C2.ComboBox { |
| model: ['Software','OpenGL LineStrip','OpenGL Triangles'] |
| id: switchPolylines2 |
| anchors { |
| top: parent.top |
| right: parent.right |
| topMargin: 12 |
| rightMargin: 12 |
| } |
| onCurrentTextChanged: console.log("CURRENT TEXT CHANGED ",currentText) |
| } |
| } |
| } |
| |
| Component { |
| id: migComponent |
| MapItemGroup { |
| id: polyGroup |
| property bool glPolygons : true |
| property string glPolylines : "Software" |
| property bool glCircles : true |
| property bool glRectangles : true |
| objectName: parent.objectName + "_MIG_" |
| |
| function polylineBackend() |
| { |
| return (polyGroup.glPolylines === "OpenGL LineStrip") |
| ? MapPolyline.OpenGLLineStrip |
| : ((polyGroup.glPolylines === "Software") |
| ? MapPolyline.Software : MapPolyline.OpenGLExtruded) |
| } |
| |
| function polygonBackend() |
| { |
| return (polyGroup.glPolylines === "Software") |
| ? MapPolygon.Software : MapPolygon.OpenGL |
| } |
| |
| function miterValue() |
| { |
| return (miterSwitch.checked) ? Qt.RoundCap : Qt.FlatCap |
| } |
| |
| MapPolyline { |
| id: tstPolyLine // to verify the polygon stays where it's supposed to |
| line.color: 'black' |
| objectName: parent.objectName + "black" |
| line.width: 1 |
| opacity: 1.0 |
| backend: polylineBackend() |
| path: [ |
| { latitude: 76.9965, longitude: -175.012 }, |
| { latitude: 26.9965, longitude: -175.012 } |
| ] |
| } |
| |
| MapPolyline { |
| id: timeline |
| line.color: "red" |
| objectName: parent.objectName + "timeline" |
| line.width: 4 |
| backend: polylineBackend() |
| path: [ |
| { latitude: 90, longitude: 180 }, |
| { latitude: -90, longitude: -180 } |
| ] |
| } |
| |
| MapPolyline { |
| id: poly1 |
| line.color: "pink" |
| line.width: sliWidth.value |
| objectName: parent.objectName + "red" |
| backend: polylineBackend() |
| |
| path: [ |
| { latitude: 55, longitude: 170 }, |
| { latitude: 66.9965, longitude: 170 }, |
| { latitude: 66.9965, longitude: -175.012 }, |
| { latitude: 55, longitude: -160 }, |
| { latitude: 40, longitude: -165 }, |
| { latitude: 45, longitude: 174 }, |
| { latitude: 43, longitude: -168 } |
| ] |
| DynamicParameter { |
| type: "lineStyle" |
| property var lineCap: miterValue() |
| } |
| |
| MouseArea { |
| anchors.fill: parent |
| onClicked: console.log("poly1 in "+parent.parent.objectName + "clicked") |
| |
| Rectangle { // this is technically unsupported, but practically works. |
| color: "transparent" |
| border.color: "red" |
| anchors.fill: parent |
| } |
| } |
| } |
| |
| MapPolygon { |
| id: poly2 |
| color: "green" |
| border.color: "black" |
| border.width: 12 |
| objectName: parent.objectName + "green" |
| backend: polygonBackend() |
| path: [ |
| { latitude: -45, longitude: -170 }, |
| { latitude: -55, longitude: -155 }, |
| { latitude: -45, longitude: -130 }, |
| { latitude: -35, longitude: -155 } |
| ] |
| MouseArea{ |
| anchors.fill: parent |
| drag.target: parent |
| Rectangle { // this is technically unsupported, but practically works. |
| color: "transparent" |
| border.color: "red" |
| anchors.fill: parent |
| } |
| } |
| } |
| |
| // LongPolyline { |
| // id: longPolyline |
| // line.width: 10 |
| // line.color: 'firebrick' |
| // backend: polylineBackend() |
| // } |
| } |
| } |
| |
| |
| C2.Switch { |
| text: qsTr("Left") |
| id: leftSwitch |
| anchors { |
| top: parent.top |
| left: parent.left |
| leftMargin: 12 |
| rightMargin: 12 |
| } |
| checked: false |
| } |
| C2.Switch { |
| text: qsTr("Miter") |
| id: miterSwitch |
| anchors { |
| top: leftSwitch.bottom |
| left: parent.left |
| leftMargin: 12 |
| rightMargin: 12 |
| } |
| checked: false |
| } |
| C2.Slider { |
| id: sliWidth |
| orientation: Qt.Vertical |
| anchors { |
| left: parent.left |
| top: miterSwitch.bottom |
| bottom: parent.bottom |
| topMargin: 10 |
| leftMargin: 10 |
| bottomMargin: 10 |
| } |
| from: 1 |
| to: 50 |
| value: 50 |
| } |
| } |