diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/manual/mapobjects_tester/main.cpp | 48 | ||||
-rw-r--r-- | tests/manual/mapobjects_tester/main.qml | 515 | ||||
-rw-r--r-- | tests/manual/mapobjects_tester/mapobjects_tester.pro | 29 | ||||
-rw-r--r-- | tests/manual/mapobjects_tester/qml.qrc | 5 |
4 files changed, 597 insertions, 0 deletions
diff --git a/tests/manual/mapobjects_tester/main.cpp b/tests/manual/mapobjects_tester/main.cpp new file mode 100644 index 00000000..c04944d0 --- /dev/null +++ b/tests/manual/mapobjects_tester/main.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + const QUrl url(QStringLiteral("qrc:/main.qml")); + QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, + &app, [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, Qt::QueuedConnection); + engine.load(url); + + return app.exec(); +} diff --git a/tests/manual/mapobjects_tester/main.qml b/tests/manual/mapobjects_tester/main.qml new file mode 100644 index 00000000..4695df3a --- /dev/null +++ b/tests/manual/mapobjects_tester/main.qml @@ -0,0 +1,515 @@ +/**************************************************************************** +** +** 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("MapItems backends") + + + 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 + } + } + } + + 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' + } + +// MapCircleObject { +// id: circle1 +// border.color: 'deepskyblue' +// border.width: 26 +// center: QtPositioning.coordinate(17, 44); +// radius: 200*1000 +// color: "firebrick" +// } + } + } + + 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 + } +} diff --git a/tests/manual/mapobjects_tester/mapobjects_tester.pro b/tests/manual/mapobjects_tester/mapobjects_tester.pro new file mode 100644 index 00000000..a517b750 --- /dev/null +++ b/tests/manual/mapobjects_tester/mapobjects_tester.pro @@ -0,0 +1,29 @@ +QT += quick +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Refer to the documentation for the +# deprecated API to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/tests/manual/mapobjects_tester/qml.qrc b/tests/manual/mapobjects_tester/qml.qrc new file mode 100644 index 00000000..5f6483ac --- /dev/null +++ b/tests/manual/mapobjects_tester/qml.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> |