blob: 1e758acecf0e73be3d636b7142b0b6a7c2bba1a8 [file] [log] [blame]
/****************************************************************************
**
** 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.2 as C2
import QtPositioning 5.6
import QtLocation 5.15
import Qt.labs.location 1.0
Window {
id: win
objectName: "win"
visible: true
width: 1440
height: 720
title: qsTr("MapObjects tester")
property real initialZL: 5
property var initialCenter: QtPositioning.coordinate(66.9961, -175.012)
property real rotation : 0
Shortcut {
sequence: "Ctrl+R"
onActivated: {
rotation = 57
}
}
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: 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 = movComponent.createObject(map1MainMOV)
map1MainMOV.addMapObject(o);
}
MapObjectView {
id: map1MainMOV
}
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 on ",s)
}
}
}
Map {
id: map2
rotation: win.rotation
gesture.enabled: true
objectName: "map2"
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.glPolygons = Qt.binding(function() {return switchPolygons2.checked})
o.glPolylines = Qt.binding(function() {return switchPolylines2.currentText})
o.glCircles = Qt.binding(function() {return switchCircles2.checked})
o.glRectangles = Qt.binding(function() {return switchRectangles2.checked})
map2.addMapItemGroup(o);
}
C2.Switch {
text: qsTr("OGL Polygons")
id: switchPolygons2
checked: false
anchors {
top: parent.top
right: parent.right
topMargin: 12
rightMargin: 12
}
}
C2.ComboBox {
model: ['Software','OpenGL','Triangulated']
id: switchPolylines2
anchors {
top: switchPolygons2.bottom
right: parent.right
topMargin: 12
rightMargin: 12
}
onCurrentTextChanged: console.log("CURRENT TEXT CHANGED ",currentText)
}
C2.Switch {
text: qsTr("OGL Circles")
id: switchCircles2
anchors {
top: switchPolylines2.bottom
right: parent.right
topMargin: 12
rightMargin: 12
}
}
C2.Switch {
text: qsTr("OGL Rectangles")
id: switchRectangles2
anchors {
top: switchCircles2.bottom
right: parent.right
topMargin: 12
rightMargin: 12
}
}
}
}
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")
? MapPolyline.OpenGLLineStrip
: ((polyGroup.glPolylines === "Software")
? MapPolyline.Software : MapPolyline.OpenGLExtruded)
}
function polygonBackend()
{
return (polyGroup.glPolygons)
? MapPolygon.OpenGL : MapPolygon.Software
}
function rectangleBackend()
{
return (polyGroup.glRectangles)
? MapRectangle.OpenGL : MapRectangle.Software
}
function circleBackend()
{
return (polyGroup.glCircles)
? MapCircle.OpenGL : MapCircle.Software
}
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 }
]
}
MapPolygon {
id: poly1
color: "red"
objectName: parent.objectName + "red"
backend: polygonBackend()
path: [
{ latitude: 55, longitude: 170 },
{ latitude: 66.9965, longitude: -175.012 },
{ latitude: 55, longitude: -160 },
{ latitude: 40, longitude: -165 },
{ latitude: 45, longitude: 178 }
]
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: selfIntersectingPolygon
color: 'darkmagenta'
objectName: parent.objectName + "darkmagenta"
backend: polygonBackend()
opacity: 1.0
path: [
{ latitude: 19, longitude: 49 },
{ latitude: 18, longitude: 49 },
{ latitude: 18, longitude: 51 },
{ latitude: 20, longitude: 51 },
{ latitude: 20, longitude: 50 },
{ latitude: 18.5, longitude: 50 },
{ latitude: 18.5, longitude: 52 },
{ latitude: 19, longitude: 52 }
]
MouseArea{
anchors.fill: parent
drag.target: parent // This one might glitch as the tessellation done by earcut might be
// inaccurate, so clicking in an area that is covered by earcut but
// does not exist will not trigger the panning
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: 8
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
}
}
}
MapPolygon {
id: poly3
color: "deepskyblue"
objectName: parent.objectName + "deepskyblue"
backend: polygonBackend()
opacity: 0.2
path: [
{ latitude: 65, longitude: -20 },
{ latitude: 75, longitude: 140 },
{ latitude: 65, longitude: 80 },
{ latitude: 55, longitude: -30 }
]
}
MapRectangle {
id: rect
color: 'tomato'
border.color: 'black'
border.width: 6
topLeft: QtPositioning.coordinate(10,-10)
bottomRight: QtPositioning.coordinate(-10,10)
backend: rectangleBackend()
MouseArea {
anchors.fill: parent
Rectangle {
color: "transparent"
border.color: "red"
border.width: 1
anchors.fill: parent
}
}
}
LongPolyline {
id: longPoly
backend: polylineBackend()
Component.onCompleted: longPolyPath = path
}
MapCircle {
center: QtPositioning.coordinate(52, 0)
radius: sliRadius.value
color: 'deepskyblue'
border.width: 6
border.color: 'firebrick'
backend: circleBackend()
MouseArea {
anchors.fill: parent
Rectangle {
color: "transparent"
border.color: "red"
border.width: 1
anchors.fill: parent
}
}
}
MapCircle {
id: circle1
border.color: 'deepskyblue'
border.width: 26
backend: circleBackend()
center: QtPositioning.coordinate(17, 44);
radius: 200*1000
color: "firebrick"
// layer.enabled: (backend == MapCircle.Software)
// layer.samples: 4
}
}
}
Component {
id: movComponent
MapObjectView {
id: polyGroup
MapPolylineObject {
id: tstPolyLine // to verify the polygon stays where it's supposed to
line.color: 'black'
objectName: parent.objectName + "black"
line.width: 1
path: [
{ latitude: 76.9965, longitude: -175.012 },
{ latitude: 26.9965, longitude: -175.012 }
]
}
MapPolylineObject {
id: timeline
line.color: "red"
objectName: parent.objectName + "timeline"
line.width: 4
path: [
{ latitude: 90, longitude: 180 },
{ latitude: -90, longitude: -180 }
]
}
MapPolygonObject {
id: poly1
color: "red"
objectName: parent.objectName + "red"
path: [
{ latitude: 55, longitude: 170 },
{ latitude: 66.9965, longitude: -175.012 },
{ latitude: 55, longitude: -160 },
{ latitude: 40, longitude: -165 },
{ latitude: 45, longitude: 178 }
]
}
MapPolygonObject {
id: selfIntersectingPolygon
color: 'darkmagenta'
objectName: parent.objectName + "darkmagenta"
path: [
{ latitude: 19, longitude: 49 },
{ latitude: 18, longitude: 49 },
{ latitude: 18, longitude: 51 },
{ latitude: 20, longitude: 51 },
{ latitude: 20, longitude: 50 },
{ latitude: 18.5, longitude: 50 },
{ latitude: 18.5, longitude: 52 },
{ latitude: 19, longitude: 52 }
]
}
MapPolygonObject {
id: poly2
color: "green"
border.color: "black"
border.width: 8
objectName: parent.objectName + "green"
path: [
{ latitude: -45, longitude: -170 },
{ latitude: -55, longitude: -155 },
{ latitude: -45, longitude: -130 },
{ latitude: -35, longitude: -155 }
]
}
MapPolygonObject {
id: poly3
color: Qt.rgba(0, 191.0/255.0, 1, 0.3) //"deepskyblue"
objectName: parent.objectName + "deepskyblue"
path: [
{ latitude: 65, longitude: -20 },
{ latitude: 75, longitude: 140 },
{ latitude: 65, longitude: 80 },
{ latitude: 55, longitude: -30 }
]
}
MapCircleObject {
center: QtPositioning.coordinate(52, 0)
radius: sliRadius.value
color: 'deepskyblue'
border.width: 6
border.color: 'firebrick'
}
MapPolylineObject {
id: longPolyline
line.color: "firebrick"
objectName: parent.objectName + "longPolyline"
line.width: 10
path: longPolyPath
}
MapCircleObject {
id: circle1
border.color: 'deepskyblue'
border.width: 26
center: QtPositioning.coordinate(17, 44);
radius: 200*1000
color: "firebrick"
}
}
}
property var longPolyPath
C2.Slider {
id: sliRadius
orientation: Qt.Vertical
anchors {
left: parent.left
top: parent.top
bottom: parent.bottom
topMargin: 10
leftMargin: 10
bottomMargin: 10
}
from: 30 * 1000
to: 600 * 1000
value: 100 * 1000
}
}