summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/location/mapviewer/main.cpp24
-rw-r--r--examples/location/mapviewer/map/MapComponent.qml23
-rw-r--r--examples/location/mapviewer/map/MapSliders.qml327
-rw-r--r--examples/location/mapviewer/mapviewer.pro1
-rw-r--r--examples/location/mapviewer/mapviewer.qml5
-rw-r--r--examples/location/mapviewer/mapviewer.qrc1
-rw-r--r--examples/location/places/main.cpp18
-rw-r--r--examples/location/planespotter/main.cpp4
8 files changed, 383 insertions, 20 deletions
diff --git a/examples/location/mapviewer/main.cpp b/examples/location/mapviewer/main.cpp
index 1b526435..3eedd8dd 100644
--- a/examples/location/mapviewer/main.cpp
+++ b/examples/location/mapviewer/main.cpp
@@ -84,11 +84,35 @@ static bool parseArgs(QStringList& args, QVariantMap& parameters)
int main(int argc, char *argv[])
{
+ const QByteArray additionalLibraryPaths = qgetenv("QTLOCATION_EXTRA_LIBRARY_PATH");
+ for (const QByteArray &p : additionalLibraryPaths.split(':'))
+ QCoreApplication::addLibraryPath(QString(p));
+
QGuiApplication application(argc, argv);
QVariantMap parameters;
QStringList args(QCoreApplication::arguments());
+ // Fetch tokens from the environment, if present
+ const QByteArray mapboxMapID = qgetenv("MAPBOX_MAP_ID");
+ const QByteArray mapboxAccessToken = qgetenv("MAPBOX_ACCESS_TOKEN");
+ const QByteArray hereAppID = qgetenv("HERE_APP_ID");
+ const QByteArray hereToken = qgetenv("HERE_TOKEN");
+ const QByteArray esriToken = qgetenv("ESRI_TOKEN");
+
+ if (!mapboxMapID.isEmpty())
+ parameters["mapbox.map_id"] = QString::fromLocal8Bit(mapboxMapID);
+ if (!mapboxAccessToken.isEmpty()) {
+ parameters["mapbox.access_token"] = QString::fromLocal8Bit(mapboxAccessToken);
+ parameters["mapboxgl.access_token"] = QString::fromLocal8Bit(mapboxAccessToken);
+ }
+ if (!hereAppID.isEmpty())
+ parameters["here.app_id"] = QString::fromLocal8Bit(hereAppID);
+ if (!hereToken.isEmpty())
+ parameters["here.token"] = QString::fromLocal8Bit(hereToken);
+ if (!esriToken.isEmpty())
+ parameters["esri.token"] = QString::fromLocal8Bit(esriToken);
+
if (parseArgs(args, parameters))
return 0;
if (!args.contains(QStringLiteral("osm.useragent")))
diff --git a/examples/location/mapviewer/map/MapComponent.qml b/examples/location/mapviewer/map/MapComponent.qml
index 008a4a00..c3d5dfd2 100644
--- a/examples/location/mapviewer/map/MapComponent.qml
+++ b/examples/location/mapviewer/map/MapComponent.qml
@@ -39,7 +39,7 @@
****************************************************************************/
import QtQuick 2.5
import QtQuick.Controls 1.4
-import QtLocation 5.6
+import QtLocation 5.9
import QtPositioning 5.5
import "../helper.js" as Helper
@@ -269,7 +269,7 @@ Map {
//! [mapnavigation]
// Enable pan, flick, and pinch gestures to zoom in and out
- gesture.acceptedGestures: MapGestureArea.PanGesture | MapGestureArea.FlickGesture | MapGestureArea.PinchGesture
+ gesture.acceptedGestures: MapGestureArea.PanGesture | MapGestureArea.FlickGesture | MapGestureArea.PinchGesture | MapGestureArea.RotationGesture | MapGestureArea.TiltGesture
gesture.flickDeceleration: 3000
gesture.enabled: true
//! [mapnavigation]
@@ -364,22 +364,11 @@ Map {
anchorPoint: Qt.point(-poiTheQtComapny.sourceItem.width * 0.5,poiTheQtComapny.sourceItem.height * 1.5)
}
-
- Slider {
- id: zoomSlider;
+ MapSliders {
+ id: sliders
z: map.z + 3
- minimumValue: map.minimumZoomLevel;
- maximumValue: map.maximumZoomLevel;
- anchors.margins: 10
- anchors.bottom: scale.top
- anchors.top: parent.top
- anchors.right: parent.right
- orientation : Qt.Vertical
- value: map.zoomLevel
- onValueChanged: {
- if (value >= 0)
- map.zoomLevel = value
- }
+ mapSource: map
+ edge: Qt.LeftEdge
}
Item {
diff --git a/examples/location/mapviewer/map/MapSliders.qml b/examples/location/mapviewer/map/MapSliders.qml
new file mode 100644
index 00000000..75e4f474
--- /dev/null
+++ b/examples/location/mapviewer/map/MapSliders.qml
@@ -0,0 +1,327 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+
+Row {
+ id: containerRow
+
+ property var mapSource
+ property real fontSize : 14
+ property color labelBackground : "transparent"
+ property int edge: Qt.RightEdge
+
+ function rightEdge() {
+ return (containerRow.edge === Qt.RightEdge);
+ }
+
+ layoutDirection: rightEdge() ? Qt.LeftToRight : Qt.RightToLeft
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.right: rightEdge() ? parent.right : undefined
+ anchors.left: rightEdge() ? undefined : parent.left
+
+ Button {
+ id: sliderToggler
+ width: 32
+ height: 96
+ checkable: true
+ checked: false
+ anchors.verticalCenter: parent.verticalCenter
+
+ transform: Scale {
+ origin.x: rightEdge() ? 0 : sliderToggler.width / 2
+ xScale: rightEdge() ? 1 : -1
+ }
+
+ style: ButtonStyle {
+ background: Rectangle {
+ color: "transparent"
+ }
+ }
+
+ property real shear: 0.333
+ property real buttonOpacity: 0.5
+ property real mirror : rightEdge() ? 1.0 : -1.0
+
+ Rectangle {
+ width: 16
+ height: 48
+ color: "seagreen"
+ antialiasing: true
+ opacity: sliderToggler.buttonOpacity
+ anchors.top: parent.top
+ anchors.left: sliderToggler.checked ? parent.left : parent.horizontalCenter
+ transform: Matrix4x4 {
+ property real d : sliderToggler.checked ? 1.0 : -1.0
+ matrix: Qt.matrix4x4(1.0, d * sliderToggler.shear, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0)
+ }
+ }
+
+ Rectangle {
+ width: 16
+ height: 48
+ color: "seagreen"
+ antialiasing: true
+ opacity: sliderToggler.buttonOpacity
+ anchors.top: parent.verticalCenter
+ anchors.right: sliderToggler.checked ? parent.right : parent.horizontalCenter
+ transform: Matrix4x4 {
+ property real d : sliderToggler.checked ? -1.0 : 1.0
+ matrix: Qt.matrix4x4(1.0, d * sliderToggler.shear, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0)
+ }
+ }
+ }
+
+ Rectangle {
+ id: sliderContainer
+ height: parent.height
+ width: sliderRow.width + 10
+ visible: sliderToggler.checked
+ color: Qt.rgba( 0, 191 / 255.0, 255 / 255.0, 0.07)
+
+ property var labelBorderColor: "transparent"
+ property var slidersHeight : sliderContainer.height
+ - rowSliderValues.height
+ - rowSliderLabels.height
+ - sliderColumn.spacing * 2
+ - sliderColumn.topPadding
+ - sliderColumn.bottomPadding
+
+ Column {
+ id: sliderColumn
+ spacing: 10
+ topPadding: 16
+ bottomPadding: 48
+ anchors.centerIn: parent
+
+ // the sliders value labels
+ Row {
+ id: rowSliderValues
+ spacing: sliderRow.spacing
+ width: sliderRow.width
+ height: 32
+ property real entryWidth: zoomSlider.width
+
+ Rectangle{
+ color: labelBackground
+ height: parent.height
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelZoomValue
+ text: zoomSlider.value.toFixed(3)
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+ Rectangle{
+ color: labelBackground
+ height: parent.height
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelBearingValue
+ text: bearingSlider.value.toFixed(2)
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+ Rectangle{
+ color: labelBackground
+ height: parent.height
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelTiltValue
+ text: tiltSlider.value.toFixed(2)
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+ Rectangle{
+ color: labelBackground
+ height: parent.height
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelFovValue
+ text: fovSlider.value.toFixed(2)
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+ } // rowSliderValues
+
+ // The sliders row
+ Row {
+ spacing: 10
+ id: sliderRow
+ height: sliderContainer.slidersHeight
+
+ Slider {
+ id: zoomSlider
+ height: parent.height
+ orientation : Qt.Vertical
+ onValueChanged: {
+ containerRow.mapSource.zoomLevel = value
+ }
+ Component.onCompleted: {
+ minimumValue = Qt.binding(function() { return containerRow.mapSource.minimumZoomLevel; })
+ maximumValue = Qt.binding(function() { return containerRow.mapSource.maximumZoomLevel; })
+ value = Qt.binding(function() { return containerRow.mapSource.zoomLevel; })
+ }
+ }
+ Slider {
+ id: bearingSlider
+ height: parent.height
+ minimumValue: 0
+ maximumValue: 360
+ orientation : Qt.Vertical
+ value: containerRow.mapSource.bearing
+ onValueChanged: {
+ containerRow.mapSource.bearing = value;
+ }
+ }
+ Slider {
+ id: tiltSlider
+ height: parent.height
+ orientation : Qt.Vertical
+ onValueChanged: {
+ containerRow.mapSource.tilt = value;
+ }
+ Component.onCompleted: {
+ minimumValue = Qt.binding(function() { return containerRow.mapSource.minimumTilt; })
+ maximumValue = Qt.binding(function() { return containerRow.mapSource.maximumTilt; })
+ value = Qt.binding(function() { return containerRow.mapSource.tilt; })
+ }
+ }
+ Slider {
+ id: fovSlider
+ height: parent.height
+ orientation : Qt.Vertical
+ onValueChanged: {
+ containerRow.mapSource.fieldOfView = value;
+ }
+ Component.onCompleted: {
+ minimumValue = Qt.binding(function() { return containerRow.mapSource.minimumFieldOfView; })
+ maximumValue = Qt.binding(function() { return containerRow.mapSource.maximumFieldOfView; })
+ value = Qt.binding(function() { return containerRow.mapSource.fieldOfView; })
+ }
+ }
+ } // Row sliders
+
+ // The labels row
+ Row {
+ id: rowSliderLabels
+ spacing: sliderRow.spacing
+ width: sliderRow.width
+ property real entryWidth: zoomSlider.width
+ property real entryHeight: 64
+
+ Rectangle{
+ color: labelBackground
+ height: parent.entryHeight
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelZoom
+ text: "Zoom"
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+
+ Rectangle{
+ color: labelBackground
+ height: parent.entryHeight
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelBearing
+ text: "Bearing"
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+ Rectangle{
+ color: labelBackground
+ height: parent.entryHeight
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelTilt
+ text: "Tilt"
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+ Rectangle{
+ color: labelBackground
+ height: parent.entryHeight
+ width: parent.entryWidth
+ border.color: sliderContainer.labelBorderColor
+ Label {
+ id: labelFov
+ text: "FoV"
+ font.pixelSize: fontSize
+ rotation: -90
+ anchors.centerIn: parent
+ }
+ }
+ } // rowSliderLabels
+ } // Column
+ } // sliderContainer
+} // containerRow
diff --git a/examples/location/mapviewer/mapviewer.pro b/examples/location/mapviewer/mapviewer.pro
index 65ac2d16..0dc4a705 100644
--- a/examples/location/mapviewer/mapviewer.pro
+++ b/examples/location/mapviewer/mapviewer.pro
@@ -10,6 +10,7 @@ RESOURCES += \
OTHER_FILES +=mapviewer.qml \
helper.js \
map/MapComponent.qml \
+ map/MapSliders.qml \
map/Marker.qml \
map/CircleItem.qml \
map/RectangleItem.qml \
diff --git a/examples/location/mapviewer/mapviewer.qml b/examples/location/mapviewer/mapviewer.qml
index 08ef2663..21348919 100644
--- a/examples/location/mapviewer/mapviewer.qml
+++ b/examples/location/mapviewer/mapviewer.qml
@@ -87,7 +87,10 @@ ApplicationWindow {
map.zoomLevel = zoomLevel
map.center = center
} else {
- map.zoomLevel = (map.maximumZoomLevel - map.minimumZoomLevel)/2
+ // Use an integer ZL to enable nearest interpolation, if possible.
+ map.zoomLevel = Math.floor((map.maximumZoomLevel - map.minimumZoomLevel)/2)
+ // defaulting to 45 degrees, if possible.
+ map.fieldOfView = Math.min(Math.max(45.0, map.minimumFieldOfView), map.maximumFieldOfView)
}
map.forceActiveFocus()
diff --git a/examples/location/mapviewer/mapviewer.qrc b/examples/location/mapviewer/mapviewer.qrc
index a84c67da..7a7d1f4c 100644
--- a/examples/location/mapviewer/mapviewer.qrc
+++ b/examples/location/mapviewer/mapviewer.qrc
@@ -2,6 +2,7 @@
<qresource prefix="/">
<file>mapviewer.qml</file>
<file>map/MapComponent.qml</file>
+ <file>map/MapSliders.qml</file>
<file>map/Marker.qml</file>
<file>map/PolylineItem.qml</file>
<file>map/RectangleItem.qml</file>
diff --git a/examples/location/places/main.cpp b/examples/location/places/main.cpp
index 8c3b64ed..a30fb857 100644
--- a/examples/location/places/main.cpp
+++ b/examples/location/places/main.cpp
@@ -90,6 +90,24 @@ int main(int argc, char *argv[])
QVariantMap parameters;
QStringList args(QCoreApplication::arguments());
+ // Fetch tokens from the environment, if present
+ const QByteArray mapboxMapID = qgetenv("MAPBOX_MAP_ID");
+ const QByteArray mapboxAccessToken = qgetenv("MAPBOX_ACCESS_TOKEN");
+ const QByteArray hereAppID = qgetenv("HERE_APP_ID");
+ const QByteArray hereToken = qgetenv("HERE_TOKEN");
+ const QByteArray esriToken = qgetenv("ESRI_TOKEN");
+
+ if (!mapboxMapID.isEmpty())
+ parameters["mapbox.map_id"] = QString::fromLocal8Bit(mapboxMapID);
+ if (!mapboxAccessToken.isEmpty())
+ parameters["mapbox.access_token"] = QString::fromLocal8Bit(mapboxAccessToken);
+ if (!hereAppID.isEmpty())
+ parameters["here.app_id"] = QString::fromLocal8Bit(hereAppID);
+ if (!hereToken.isEmpty())
+ parameters["here.token"] = QString::fromLocal8Bit(hereToken);
+ if (!esriToken.isEmpty())
+ parameters["esri.token"] = QString::fromLocal8Bit(esriToken);
+
if (parseArgs(args, parameters))
return 0;
diff --git a/examples/location/planespotter/main.cpp b/examples/location/planespotter/main.cpp
index c71a6999..76b706c9 100644
--- a/examples/location/planespotter/main.cpp
+++ b/examples/location/planespotter/main.cpp
@@ -47,7 +47,7 @@
#include <QDebug>
#include <QEasingCurve>
#include <QGeoCoordinate>
-#include <QtPositioning/private/qgeoprojection_p.h>
+#include <QtPositioning/private/qwebmercator_p.h>
#define ANIMATION_DURATION 4000
@@ -162,7 +162,7 @@ private:
progress = ((qreal)startTime.msecsTo(current) / ANIMATION_DURATION);
}
- setPosition(QGeoProjection::coordinateInterpolation(
+ setPosition(QWebMercator::coordinateInterpolation(
fromCoordinate, toCoordinate, easingCurve.valueForProgress(progress)));
if (!timer.isActive())