summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsheem Mamoowala <asheem.mamoowala@mapbox.com>2018-06-26 15:51:49 -0700
committerAsheem Mamoowala <asheem.mamoowala@mapbox.com>2018-06-26 15:51:49 -0700
commit0b201f75a75b26516e3c12d38ab72b75de2ef830 (patch)
tree446f8f8588fb540eb7b9f9c15e8032576eca2a0c
parent95fd7ee74257fded4a23cf8c06144f276804a04c (diff)
downloadqtlocation-mapboxgl-upstream/qt-get-filter.tar.gz
-rw-r--r--platform/qt/include/qmapboxgl.hpp2
-rw-r--r--platform/qt/src/qmapboxgl.cpp75
2 files changed, 76 insertions, 1 deletions
diff --git a/platform/qt/include/qmapboxgl.hpp b/platform/qt/include/qmapboxgl.hpp
index ac143066e3..a699b77cec 100644
--- a/platform/qt/include/qmapboxgl.hpp
+++ b/platform/qt/include/qmapboxgl.hpp
@@ -239,7 +239,7 @@ public:
QList<QString> layerIds() const;
void setFilter(const QString &layer, const QVariant &filter);
-
+ QVariant getFilter(const QString &layer) const;
// When rendering on a different thread,
// should be called on the render thread.
void createRenderer();
diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/qmapboxgl.cpp
index 581a1c4111..c15d8654b5 100644
--- a/platform/qt/src/qmapboxgl.cpp
+++ b/platform/qt/src/qmapboxgl.cpp
@@ -55,6 +55,10 @@
#include <QString>
#include <QStringList>
#include <QThreadStorage>
+#include <QVariant>
+#include <QVariantList>
+#include <QVariantMap>
+#include <QColor>
#include <memory>
@@ -1572,6 +1576,77 @@ void QMapboxGL::setFilter(const QString& layer, const QVariant& filter)
qWarning() << "Layer doesn't support filters";
}
+QVariant QVariantFromValue(const mbgl::Value &value) {
+ return value.match(
+ [](const mbgl::NullValue) {
+ return QVariant();
+ }, [](const bool value) {
+ return QVariant(value);
+ }, [](const float value) {
+ return QVariant(value);
+ }, [](const int64_t value) {
+ return QVariant(value);
+ }, [](const double value) {
+ return QVariant(value);
+ }, [](const std::string &value) {
+ return QVariant(value.c_str());
+ }, [](const mbgl::Color &value) {
+ return QColor(value.r, value.g, value.b, value.a);
+ }, [&](const std::vector<mbgl::Value> &vector) {
+ QVariantList list;
+ list.reserve(vector.size());
+ for (auto &value : vector) {
+ list.append(QVariantFromValue(value));
+ }
+ return list;
+ }, [&](const std::unordered_map<std::string, mbgl::Value> &map) {
+ QVariantMap varMap;
+ for (auto &item : map) {
+ varMap.insert(item.first.c_str(), QVariantFromValue(item.second));
+ }
+ return varMap;
+ }, [](const auto &) {
+ return QVariant();
+ });
+}
+
+QVariant QMapboxGL::getFilter(const QString &layer) const {
+ using namespace mbgl::style;
+ using namespace mbgl::style::conversion;
+
+ Layer* layer_ = d_ptr->mapObj->getStyle().getLayer(layer.toStdString());
+ if (!layer_) {
+ qWarning() << "Layer not found:" << layer;
+ return QVariant();
+ }
+
+ Filter filter_;
+
+ if (layer_->is<FillLayer>()) {
+ filter_ = layer_->as<FillLayer>()->getFilter();
+ } else if (layer_->is<LineLayer>()) {
+ filter_ = layer_->as<LineLayer>()->getFilter();
+ } else if (layer_->is<SymbolLayer>()) {
+ filter_ = layer_->as<SymbolLayer>()->getFilter();
+ } else if (layer_->is<CircleLayer>()) {
+ filter_ = layer_->as<CircleLayer>()->getFilter();
+ } else if (layer_->is<FillExtrusionLayer>()) {
+ filter_ = layer_->as<FillExtrusionLayer>()->getFilter();
+ } else {
+ qWarning() << "Layer doesn't support filters";
+ return QVariant();
+ }
+
+ if (!filter_.expression) {
+ qWarning() << "getFilter only supports expression-based filters";
+ return QVariant();
+ }
+
+ auto serialized = (**filter_.expression).serialize();
+ return QVariantFromValue(serialized);
+
+
+}
/*!
Creates the infrastructure needed for rendering the map. It
should be called before any call to render().