diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2016-04-27 19:52:38 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2016-04-27 21:53:21 +0300 |
commit | 30fb7f473845116d6c68ad31c2c7ce016e1121ad (patch) | |
tree | 36fc7f6d2834f314e6fb7dcdeb0f099cdc84bcbb /platform/qt | |
parent | 2656b5c733a7c7a18f81c80518e4bfef75b03582 (diff) | |
download | qtlocation-mapboxgl-30fb7f473845116d6c68ad31c2c7ce016e1121ad.tar.gz |
[Qt] Expose center and zoom properties
Diffstat (limited to 'platform/qt')
-rw-r--r-- | platform/qt/include/qquickmapboxgl.hpp | 49 | ||||
-rw-r--r-- | platform/qt/platform.gyp | 2 | ||||
-rw-r--r-- | platform/qt/qmlapp/qquickmapboxgl.gypi | 2 | ||||
-rw-r--r-- | platform/qt/scripts/configure.sh | 2 | ||||
-rw-r--r-- | platform/qt/src/qquickmapboxgl.cpp | 100 | ||||
-rw-r--r-- | platform/qt/src/qquickmapboxglrenderer.cpp | 13 |
6 files changed, 167 insertions, 1 deletions
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 ¢er); + 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())); + } } |