From da653ec537efc37d619f3984ddeead0bee018e89 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Thu, 28 Apr 2016 19:43:24 +0300 Subject: [PATCH] [Qt] Allow setting the style via QML --- platform/qt/include/qquickmapboxgl.hpp | 12 ++++++++++++ platform/qt/qmlapp/main.qml | 2 ++ platform/qt/src/qquickmapboxgl.cpp | 20 ++++++++++++++++++++ platform/qt/src/qquickmapboxglrenderer.cpp | 5 ++++- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/platform/qt/include/qquickmapboxgl.hpp b/platform/qt/include/qquickmapboxgl.hpp index 906087f7b..0475bb4b3 100644 --- a/platform/qt/include/qquickmapboxgl.hpp +++ b/platform/qt/include/qquickmapboxgl.hpp @@ -13,6 +13,7 @@ class Q_DECL_EXPORT QQuickMapboxGL : public QQuickFramebufferObject { Q_OBJECT + // Map QML Type interface implementation. Q_ENUMS(QGeoServiceProvider::Error) Q_PROPERTY(QDeclarativeGeoServiceProvider *plugin READ plugin WRITE setPlugin NOTIFY pluginChanged) Q_PROPERTY(qreal minimumZoomLevel READ minimumZoomLevel WRITE setMinimumZoomLevel NOTIFY minimumZoomLevelChanged) @@ -25,6 +26,9 @@ class Q_DECL_EXPORT QQuickMapboxGL : public QQuickFramebufferObject Q_PROPERTY(bool copyrightsVisible READ copyrightsVisible WRITE setCopyrightsVisible NOTIFY copyrightsVisibleChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) + // MapboxGL QML Type interface. + Q_PROPERTY(QString style READ style WRITE setStyle NOTIFY styleChanged) + public: QQuickMapboxGL(QQuickItem *parent = 0); virtual ~QQuickMapboxGL(); @@ -59,10 +63,14 @@ public: void setColor(const QColor &color); QColor color() const; + void setStyle(const QString &style); + QString style() const; + enum SyncState { NothingNeedsSync = 0x00, ZoomNeedsSync = 0x01, CenterNeedsSync = 0x02, + StyleNeedsSync = 0x04, }; int swapSyncState(); @@ -80,6 +88,8 @@ signals: void copyrightsVisibleChanged(bool visible); void colorChanged(const QColor &color); + void styleChanged(); + private: qreal m_minimumZoomLevel = 0; qreal m_maximumZoomLevel = 20; @@ -88,6 +98,8 @@ private: QGeoCoordinate m_center; QGeoShape m_visibleRegion; + QString m_style; + int m_syncState = NothingNeedsSync; }; diff --git a/platform/qt/qmlapp/main.qml b/platform/qt/qmlapp/main.qml index 6a09d6051..6baefba4d 100644 --- a/platform/qt/qmlapp/main.qml +++ b/platform/qt/qmlapp/main.qml @@ -21,6 +21,8 @@ ApplicationWindow { id: map anchors.fill: parent + style: "mapbox://styles/mapbox/streets-v8" + center: QtPositioning.coordinate(60.170448, 24.942046) zoomLevel: 14 minimumZoomLevel: 8 diff --git a/platform/qt/src/qquickmapboxgl.cpp b/platform/qt/src/qquickmapboxgl.cpp index b31055b58..2e6542ac1 100644 --- a/platform/qt/src/qquickmapboxgl.cpp +++ b/platform/qt/src/qquickmapboxgl.cpp @@ -3,6 +3,7 @@ #include #include +#include #include QQuickMapboxGL::QQuickMapboxGL(QQuickItem *parent_) @@ -156,6 +157,25 @@ QColor QQuickMapboxGL::color() const return QColor(); } +void QQuickMapboxGL::setStyle(const QString &styleUrl) +{ + if (m_style == styleUrl) { + return; + } + + m_style = styleUrl; + + m_syncState |= StyleNeedsSync; + update(); + + emit styleChanged(); +} + +QString QQuickMapboxGL::style() const +{ + return m_style; +} + int QQuickMapboxGL::swapSyncState() { int oldState = m_syncState; diff --git a/platform/qt/src/qquickmapboxglrenderer.cpp b/platform/qt/src/qquickmapboxglrenderer.cpp index fc98cf35e..20b5bf6d4 100644 --- a/platform/qt/src/qquickmapboxglrenderer.cpp +++ b/platform/qt/src/qquickmapboxglrenderer.cpp @@ -42,7 +42,6 @@ void QQuickMapboxGLRenderer::render() void QQuickMapboxGLRenderer::synchronize(QQuickFramebufferObject *item) { if (!m_initialized) { - m_map->setStyleURL(QMapbox::defaultStyles()[0].first); QObject::connect(m_map.data(), SIGNAL(needsRendering()), item, SLOT(update())); m_initialized = true; } @@ -58,4 +57,8 @@ void QQuickMapboxGLRenderer::synchronize(QQuickFramebufferObject *item) const auto& center = quickMap->center(); m_map->setCoordinate(QMapbox::Coordinate(center.latitude(), center.longitude())); } + + if (syncStatus & QQuickMapboxGL::StyleNeedsSync) { + m_map->setStyleURL(quickMap->style()); + } }