summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <thiago@mapbox.com>2016-04-27 19:52:38 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2016-04-27 21:53:21 +0300
commit30fb7f473845116d6c68ad31c2c7ce016e1121ad (patch)
tree36fc7f6d2834f314e6fb7dcdeb0f099cdc84bcbb
parent2656b5c733a7c7a18f81c80518e4bfef75b03582 (diff)
downloadqtlocation-mapboxgl-30fb7f473845116d6c68ad31c2c7ce016e1121ad.tar.gz
[Qt] Expose center and zoom properties
-rw-r--r--.travis.yml2
-rw-r--r--platform/qt/include/qquickmapboxgl.hpp49
-rw-r--r--platform/qt/platform.gyp2
-rw-r--r--platform/qt/qmlapp/qquickmapboxgl.gypi2
-rw-r--r--platform/qt/scripts/configure.sh2
-rw-r--r--platform/qt/src/qquickmapboxgl.cpp100
-rw-r--r--platform/qt/src/qquickmapboxglrenderer.cpp13
7 files changed, 169 insertions, 1 deletions
diff --git a/.travis.yml b/.travis.yml
index c0d2a03358..b2e959f8e7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -115,6 +115,8 @@ matrix:
compiler: ": linux-gcc49-release"
env: FLAVOR=qt5 BUILDTYPE=Release _CXX=g++-4.9 _CC=gcc-4.9
addons: *qt5
+ before_install:
+ - sudo apt-get install -y qtpositioning5-dev
script:
- make qt-app qt-qml-app
diff --git a/platform/qt/include/qquickmapboxgl.hpp b/platform/qt/include/qquickmapboxgl.hpp
index 8dfec6b369..6d24ca6732 100644
--- a/platform/qt/include/qquickmapboxgl.hpp
+++ b/platform/qt/include/qquickmapboxgl.hpp
@@ -1,6 +1,8 @@
#ifndef QQUICKMAPBOXGL_H
#define QQUICKMAPBOXGL_H
+#include <QGeoCoordinate>
+#include <QGeoShape>
#include <QQuickFramebufferObject>
class QQuickItem;
@@ -9,12 +11,57 @@ class Q_DECL_EXPORT QQuickMapboxGL : public QQuickFramebufferObject
{
Q_OBJECT
+ Q_PROPERTY(qreal minimumZoomLevel READ minimumZoomLevel WRITE setMinimumZoomLevel NOTIFY minimumZoomLevelChanged)
+ Q_PROPERTY(qreal maximumZoomLevel READ maximumZoomLevel WRITE setMaximumZoomLevel NOTIFY maximumZoomLevelChanged)
+ Q_PROPERTY(qreal zoomLevel READ zoomLevel WRITE setZoomLevel NOTIFY zoomLevelChanged)
+ Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged)
+ Q_PROPERTY(QGeoShape visibleRegion READ visibleRegion WRITE setVisibleRegion)
+
public:
QQuickMapboxGL(QQuickItem *parent = 0);
virtual ~QQuickMapboxGL();
- // Called from render thread.
+ // QQuickFramebufferObject implementation.
virtual Renderer *createRenderer() const Q_DECL_FINAL;
+
+ void setMinimumZoomLevel(qreal minimumZoomLevel);
+ qreal minimumZoomLevel() const;
+
+ void setMaximumZoomLevel(qreal maximumZoomLevel);
+ qreal maximumZoomLevel() const;
+
+ void setZoomLevel(qreal zoomLevel);
+ qreal zoomLevel() const;
+
+ void setCenter(const QGeoCoordinate &center);
+ QGeoCoordinate center() const;
+
+ void setVisibleRegion(const QGeoShape &shape);
+ QGeoShape visibleRegion() const;
+
+ enum SyncState {
+ NothingNeedsSync = 0x00,
+ ZoomNeedsSync = 0x01,
+ CenterNeedsSync = 0x02,
+ };
+
+ int swapSyncState();
+
+signals:
+ void minimumZoomLevelChanged();
+ void maximumZoomLevelChanged();
+ void zoomLevelChanged(qreal zoomLevel);
+ void centerChanged(const QGeoCoordinate &coordinate);
+
+private:
+ qreal m_minimumZoomLevel = 0;
+ qreal m_maximumZoomLevel = 20;
+ qreal m_zoomLevel = 20;
+
+ QGeoCoordinate m_center;
+ QGeoShape m_visibleRegion;
+
+ int m_syncState = NothingNeedsSync;
};
#endif // QQUICKMAPBOXGL_H
diff --git a/platform/qt/platform.gyp b/platform/qt/platform.gyp
index 29901544c9..78b86df88a 100644
--- a/platform/qt/platform.gyp
+++ b/platform/qt/platform.gyp
@@ -118,9 +118,11 @@
['<(qt_version_major) == 5', {
'variables': {
'cflags': [
+ '<@(qt_positioning_cflags)',
'<@(qt_quick_cflags)',
],
'ldflags': [
+ '<@(qt_positioning_ldflags)',
'<@(qt_quick_ldflags)',
],
},
diff --git a/platform/qt/qmlapp/qquickmapboxgl.gypi b/platform/qt/qmlapp/qquickmapboxgl.gypi
index c5f0aebb08..63d6afeece 100644
--- a/platform/qt/qmlapp/qquickmapboxgl.gypi
+++ b/platform/qt/qmlapp/qquickmapboxgl.gypi
@@ -27,6 +27,7 @@
'<@(opengl_cflags)',
'<@(qt_core_cflags)',
'<@(qt_gui_cflags)',
+ '<@(qt_positioning_cflags)',
'<@(qt_qml_cflags)',
'<@(qt_quick_cflags)',
'-fPIC',
@@ -35,6 +36,7 @@
'<@(opengl_ldflags)',
'<@(qt_core_ldflags)',
'<@(qt_gui_ldflags)',
+ '<@(qt_positioning_ldflags)',
'<@(qt_qml_ldflags)',
'<@(qt_quick_ldflags)',
],
diff --git a/platform/qt/scripts/configure.sh b/platform/qt/scripts/configure.sh
index 8656a044cb..890ce85dde 100644
--- a/platform/qt/scripts/configure.sh
+++ b/platform/qt/scripts/configure.sh
@@ -47,9 +47,11 @@ function print_qt_flags {
if [ ${QT_VERSION_MAJOR} -gt 4 ]; then
CONFIG+=" 'qt_qml_cflags%': $(quote_flags $(mason cflags Qt system "QtQml")), "$LN
CONFIG+=" 'qt_quick_cflags%': $(quote_flags $(mason cflags Qt system "QtQuick")), "$LN
+ CONFIG+=" 'qt_positioning_cflags%': $(quote_flags $(mason cflags Qt system "QtPositioning")),"$LN
CONFIG+=" 'qt_qml_ldflags%': $(quote_flags $(mason ldflags Qt system "QtQml")), "$LN
CONFIG+=" 'qt_quick_ldflags%': $(quote_flags $(mason ldflags Qt system "QtQuick")), "$LN
+ CONFIG+=" 'qt_positioning_ldflags%': $(quote_flags $(mason ldflags Qt system "QtPositioning")),"$LN
fi
if hash moc 2>/dev/null && hash rcc 2>/dev/null; then
diff --git a/platform/qt/src/qquickmapboxgl.cpp b/platform/qt/src/qquickmapboxgl.cpp
index 99f79126f6..96af258214 100644
--- a/platform/qt/src/qquickmapboxgl.cpp
+++ b/platform/qt/src/qquickmapboxgl.cpp
@@ -3,6 +3,7 @@
#include <QQuickMapboxGL>
#include <QQuickItem>
+#include <QtGlobal>
QQuickMapboxGL::QQuickMapboxGL(QQuickItem *parent_)
: QQuickFramebufferObject(parent_)
@@ -21,3 +22,102 @@ QQuickFramebufferObject::Renderer *QQuickMapboxGL::createRenderer() const
{
return new QQuickMapboxGLRenderer();
}
+
+void QQuickMapboxGL::setMinimumZoomLevel(qreal zoom)
+{
+ zoom = qMax(0., zoom);
+ zoom = qMin(m_maximumZoomLevel, zoom);
+
+ if (m_minimumZoomLevel == zoom) {
+ return;
+ }
+
+ m_minimumZoomLevel = zoom;
+
+ emit minimumZoomLevelChanged();
+}
+
+qreal QQuickMapboxGL::minimumZoomLevel() const
+{
+ return m_minimumZoomLevel;
+}
+
+void QQuickMapboxGL::setMaximumZoomLevel(qreal zoom)
+{
+ zoom = qMin(20., zoom);
+ zoom = qMax(m_minimumZoomLevel, zoom);
+
+ if (m_maximumZoomLevel == zoom) {
+ return;
+ }
+
+ m_maximumZoomLevel = zoom;
+
+ emit maximumZoomLevelChanged();
+}
+
+qreal QQuickMapboxGL::maximumZoomLevel() const
+{
+ return m_maximumZoomLevel;
+}
+
+void QQuickMapboxGL::setZoomLevel(qreal zoom)
+{
+ zoom = qMin(m_maximumZoomLevel, zoom);
+ zoom = qMax(m_minimumZoomLevel, zoom);
+
+ if (m_zoomLevel == zoom) {
+ return;
+ }
+
+ m_zoomLevel = zoom;
+
+ m_syncState |= ZoomNeedsSync;
+ update();
+
+ emit zoomLevelChanged(m_zoomLevel);
+}
+
+qreal QQuickMapboxGL::zoomLevel() const
+{
+ return m_zoomLevel;
+}
+
+void QQuickMapboxGL::setCenter(const QGeoCoordinate &coordinate)
+{
+ if (m_center == coordinate) {
+ return;
+ }
+
+ m_center = coordinate;
+
+ m_syncState |= CenterNeedsSync;
+ update();
+
+ emit centerChanged(m_center);
+}
+
+QGeoCoordinate QQuickMapboxGL::center() const
+{
+ return m_center;
+}
+
+
+void QQuickMapboxGL::setVisibleRegion(const QGeoShape &shape)
+{
+ m_visibleRegion = shape;
+}
+
+QGeoShape QQuickMapboxGL::visibleRegion() const
+{
+ return m_visibleRegion;
+}
+
+int QQuickMapboxGL::swapSyncState()
+{
+ int oldState = m_syncState;
+
+ m_syncState = NothingNeedsSync;
+
+ return oldState;
+}
diff --git a/platform/qt/src/qquickmapboxglrenderer.cpp b/platform/qt/src/qquickmapboxglrenderer.cpp
index 5871e05536..8a5c2e32a4 100644
--- a/platform/qt/src/qquickmapboxglrenderer.cpp
+++ b/platform/qt/src/qquickmapboxglrenderer.cpp
@@ -1,6 +1,7 @@
#include "qquickmapboxglrenderer.hpp"
#include <QMapboxGL>
+#include <QQuickMapboxGL>
#include <QSize>
#include <QOpenGLFramebufferObject>
@@ -43,4 +44,16 @@ void QQuickMapboxGLRenderer::synchronize(QQuickFramebufferObject *item)
QObject::connect(m_map.data(), SIGNAL(needsRendering()), item, SLOT(update()));
m_initialized = true;
}
+
+ auto quickMap = static_cast<QQuickMapboxGL*>(item);
+ auto syncStatus = quickMap->swapSyncState();
+
+ if (syncStatus & QQuickMapboxGL::ZoomNeedsSync) {
+ m_map->setZoom(quickMap->zoomLevel());
+ }
+
+ if (syncStatus & QQuickMapboxGL::CenterNeedsSync) {
+ const auto& center = quickMap->center();
+ m_map->setCoordinate(QMapbox::Coordinate(center.latitude(), center.longitude()));
+ }
}