From 0b201f75a75b26516e3c12d38ab72b75de2ef830 Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Tue, 26 Jun 2018 15:51:49 -0700 Subject: init --- platform/qt/include/qmapboxgl.hpp | 2 +- platform/qt/src/qmapboxgl.cpp | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) 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 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 #include #include +#include +#include +#include +#include #include @@ -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 &vector) { + QVariantList list; + list.reserve(vector.size()); + for (auto &value : vector) { + list.append(QVariantFromValue(value)); + } + return list; + }, [&](const std::unordered_map &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()) { + filter_ = layer_->as()->getFilter(); + } else if (layer_->is()) { + filter_ = layer_->as()->getFilter(); + } else if (layer_->is()) { + filter_ = layer_->as()->getFilter(); + } else if (layer_->is()) { + filter_ = layer_->as()->getFilter(); + } else if (layer_->is()) { + filter_ = layer_->as()->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(). -- cgit v1.2.1