summaryrefslogtreecommitdiff
path: root/platform/qt/src/qmapboxgl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/qt/src/qmapboxgl.cpp')
-rw-r--r--platform/qt/src/qmapboxgl.cpp84
1 files changed, 52 insertions, 32 deletions
diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/qmapboxgl.cpp
index 05cb5b7f93..459eacba4b 100644
--- a/platform/qt/src/qmapboxgl.cpp
+++ b/platform/qt/src/qmapboxgl.cpp
@@ -27,6 +27,7 @@
#include <mbgl/style/layers/line_layer.hpp>
#include <mbgl/style/layers/raster_layer.hpp>
#include <mbgl/style/layers/symbol_layer.hpp>
+#include <mbgl/style/rapidjson_conversion.hpp>
#include <mbgl/style/sources/geojson_source.hpp>
#include <mbgl/style/transition_options.hpp>
#include <mbgl/style/image.hpp>
@@ -38,6 +39,7 @@
#include <mbgl/util/geo.hpp>
#include <mbgl/util/geometry.hpp>
#include <mbgl/util/projection.hpp>
+#include <mbgl/util/rapidjson.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/shared_thread_pool.hpp>
#include <mbgl/util/traits.hpp>
@@ -60,7 +62,9 @@
#include <QVariantMap>
#include <QColor>
+#include <functional>
#include <memory>
+#include <sstream>
using namespace QMapbox;
@@ -977,6 +981,10 @@ void QMapboxGL::removeAnnotation(QMapbox::AnnotationID id)
as defined by the \l {https://www.mapbox.com/mapbox-gl-style-spec/} {Mapbox style specification}
for layout properties. Returns true if the operation succeeds, and false otherwise.
+ The implementation attempts to treat \a value as a JSON string, if the
+ QVariant inner type is a string. If not a valid JSON string, then it'll
+ proceed with the mapping described below.
+
This example hides the layer \c route:
\code
@@ -1007,23 +1015,9 @@ void QMapboxGL::removeAnnotation(QMapbox::AnnotationID id)
\li QVariantList
\endtable
*/
-bool QMapboxGL::setLayoutProperty(const QString& layer, const QString& property_, const QVariant& value)
+bool QMapboxGL::setLayoutProperty(const QString& layer, const QString& propertyName, const QVariant& value)
{
- using namespace mbgl::style;
-
- Layer* layer_ = d_ptr->mapObj->getStyle().getLayer(layer.toStdString());
- if (!layer_) {
- qWarning() << "Layer not found:" << layer;
- return false;
- }
-
- auto result = conversion::setLayoutProperty(*layer_, property_.toStdString(), value);
- if (result) {
- qWarning() << "Error setting layout property" << property_ << "on layer" << layer << ":" << QString::fromStdString(result->message);
- return false;
- }
-
- return true;
+ return d_ptr->setProperty(&mbgl::style::conversion::setLayoutProperty, layer, propertyName, value);
}
/*!
@@ -1031,6 +1025,10 @@ bool QMapboxGL::setLayoutProperty(const QString& layer, const QString& property_
as defined by the \l {https://www.mapbox.com/mapbox-gl-style-spec/} {Mapbox style specification}
for paint properties. Returns true if the operation succeeds, and false otherwise.
+ The implementation attempts to treat \a value as a JSON string, if the
+ QVariant inner type is a string. If not a valid JSON string, then it'll
+ proceed with the mapping described below.
+
For paint properties that take a color as \a value, such as \c fill-color, a string such as
\c blue can be passed or a QColor.
@@ -1076,23 +1074,10 @@ bool QMapboxGL::setLayoutProperty(const QString& layer, const QString& property_
map->setPaintProperty("route","line-dasharray", lineDashArray);
\endcode
*/
-bool QMapboxGL::setPaintProperty(const QString& layer, const QString& property_, const QVariant& value)
-{
- using namespace mbgl::style;
-
- Layer* layer_ = d_ptr->mapObj->getStyle().getLayer(layer.toStdString());
- if (!layer_) {
- qWarning() << "Layer not found:" << layer;
- return false;
- }
- auto result = conversion::setPaintProperty(*layer_, property_.toStdString(), value);
- if (result) {
- qWarning() << "Error setting paint property" << property_ << "on layer" << layer << ":" << QString::fromStdString(result->message);
- return false;
- }
-
- return true;
+bool QMapboxGL::setPaintProperty(const QString& layer, const QString& propertyName, const QVariant& value)
+{
+ return d_ptr->setProperty(&mbgl::style::conversion::setPaintProperty, layer, propertyName, value);
}
/*!
@@ -1917,3 +1902,38 @@ void QMapboxGLPrivate::requestRendering()
emit needsRendering();
}
}
+
+bool QMapboxGLPrivate::setProperty(const PropertySetter& setter, const QString& layer, const QString& name, const QVariant& value) {
+ using namespace mbgl::style;
+
+ Layer* layerObject = mapObj->getStyle().getLayer(layer.toStdString());
+ if (!layerObject) {
+ qWarning() << "Layer not found:" << layer;
+ return false;
+ }
+
+ const std::string& propertyString = name.toStdString();
+
+ mbgl::optional<conversion::Error> result;
+
+ if (value.type() == QVariant::String) {
+ mbgl::JSDocument document;
+ document.Parse<0>(value.toString().toStdString());
+ if (!document.HasParseError()) {
+ // Treat value as a valid JSON.
+ const mbgl::JSValue* jsonValue = &document;
+ result = setter(*layerObject, propertyString, jsonValue);
+ } else {
+ result = setter(*layerObject, propertyString, value);
+ }
+ } else {
+ result = setter(*layerObject, propertyString, value);
+ }
+
+ if (result) {
+ qWarning() << "Error setting paint property" << name << "on layer" << layer << ":" << QString::fromStdString(result->message);
+ return false;
+ }
+
+ return true;
+}