summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-09-01 08:34:13 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-09-06 14:29:22 -0700
commitd6f667a5e762ce1faec80bee774b805fe7ef5e11 (patch)
tree527ae75a142d089203d971d1f909d311f3e51d7b
parent6d770cb40f1231e202b603fcc63d3b00efc3f551 (diff)
downloadqtlocation-mapboxgl-d6f667a5e762ce1faec80bee774b805fe7ef5e11.tar.gz
[core] Observe visibility changes
-rw-r--r--package.json2
-rw-r--r--src/mbgl/style/layer.cpp3
-rw-r--r--src/mbgl/style/layer_observer.hpp1
-rw-r--r--src/mbgl/style/style.cpp13
-rw-r--r--src/mbgl/style/style.hpp1
-rw-r--r--test/src/mbgl/test/stub_layer_observer.hpp5
-rw-r--r--test/style/style_layer.cpp14
7 files changed, 35 insertions, 4 deletions
diff --git a/package.json b/package.json
index 41a2696870..1dd72807d7 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
"express": "^4.11.1",
"mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#de2ab007455aa2587c552694c68583f94c9f2747",
"mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae",
- "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#ac0e1907ff628e662dafeb44cdab6e594b59a59b",
+ "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#5b2e5749e85ad4241b5b4e4e54d2fa98e8920f34",
"mkdirp": "^0.5.1",
"node-cmake": "^1.2.1",
"request": "^2.72.0",
diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp
index 4d4e793ec0..a78f8c29bc 100644
--- a/src/mbgl/style/layer.cpp
+++ b/src/mbgl/style/layer.cpp
@@ -19,7 +19,10 @@ VisibilityType Layer::getVisibility() const {
}
void Layer::setVisibility(VisibilityType value) {
+ if (value == getVisibility())
+ return;
baseImpl->visibility = value;
+ baseImpl->observer->onLayerVisibilityChanged(*this);
}
float Layer::getMinZoom() const {
diff --git a/src/mbgl/style/layer_observer.hpp b/src/mbgl/style/layer_observer.hpp
index 1d3d1aef46..4182a1b812 100644
--- a/src/mbgl/style/layer_observer.hpp
+++ b/src/mbgl/style/layer_observer.hpp
@@ -10,6 +10,7 @@ public:
virtual ~LayerObserver() = default;
virtual void onLayerFilterChanged(Layer&) {}
+ virtual void onLayerVisibilityChanged(Layer&) {}
virtual void onLayerPaintPropertyChanged(Layer&) {}
virtual void onLayerLayoutPropertyChanged(Layer&) {}
};
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index 7317100bec..42636194e3 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -506,9 +506,11 @@ void Style::onSpriteError(std::exception_ptr error) {
struct QueueSourceReloadVisitor {
UpdateBatch& updateBatch;
- void operator()(CustomLayer&) { assert(false); }
- void operator()(RasterLayer&) { assert(false); }
- void operator()(BackgroundLayer&) { assert(false); }
+ // No need to reload sources for these types; their visibility can change but
+ // they don't participate in layout.
+ void operator()(CustomLayer&) {}
+ void operator()(RasterLayer&) {}
+ void operator()(BackgroundLayer&) {}
template <class VectorLayer>
void operator()(VectorLayer& layer) {
@@ -521,6 +523,11 @@ void Style::onLayerFilterChanged(Layer& layer) {
observer->onUpdate(Update::Layout);
}
+void Style::onLayerVisibilityChanged(Layer& layer) {
+ layer.accept(QueueSourceReloadVisitor { updateBatch });
+ observer->onUpdate(Update::Layout);
+}
+
void Style::onLayerPaintPropertyChanged(Layer&) {
observer->onUpdate(Update::RecalculateStyle | Update::Classes);
}
diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp
index b3f70e1eb2..ef1b427538 100644
--- a/src/mbgl/style/style.hpp
+++ b/src/mbgl/style/style.hpp
@@ -136,6 +136,7 @@ private:
// LayerObserver implementation.
void onLayerFilterChanged(Layer&) override;
+ void onLayerVisibilityChanged(Layer&) override;
void onLayerPaintPropertyChanged(Layer&) override;
void onLayerLayoutPropertyChanged(Layer&) override;
diff --git a/test/src/mbgl/test/stub_layer_observer.hpp b/test/src/mbgl/test/stub_layer_observer.hpp
index 500103055d..f346080b10 100644
--- a/test/src/mbgl/test/stub_layer_observer.hpp
+++ b/test/src/mbgl/test/stub_layer_observer.hpp
@@ -14,6 +14,10 @@ public:
if (layerFilterChanged) layerFilterChanged(layer);
}
+ void onLayerVisibilityChanged(Layer& layer) override {
+ if (layerVisibilityChanged) layerVisibilityChanged(layer);
+ }
+
void onLayerPaintPropertyChanged(Layer& layer) override {
if (layerPaintPropertyChanged) layerPaintPropertyChanged(layer);
}
@@ -23,6 +27,7 @@ public:
}
std::function<void (Layer&)> layerFilterChanged;
+ std::function<void (Layer&)> layerVisibilityChanged;
std::function<void (Layer&)> layerPaintPropertyChanged;
std::function<void (Layer&)> layerLayoutPropertyChanged;
};
diff --git a/test/style/style_layer.cpp b/test/style/style_layer.cpp
index 0d2ed88edd..08952e3799 100644
--- a/test/style/style_layer.cpp
+++ b/test/style/style_layer.cpp
@@ -226,6 +226,15 @@ TEST(Layer, Observer) {
layer->setFilter(NullFilter());
EXPECT_TRUE(filterChanged);
+ // Notifies observer on visibility change.
+ bool visibilityChanged = false;
+ observer.layerVisibilityChanged = [&] (Layer& layer_) {
+ EXPECT_EQ(layer.get(), &layer_);
+ visibilityChanged = true;
+ };
+ layer->setVisibility(VisibilityType::None);
+ EXPECT_TRUE(visibilityChanged);
+
// Notifies observer on paint property change.
bool paintPropertyChanged = false;
observer.layerPaintPropertyChanged = [&] (Layer& layer_) {
@@ -244,6 +253,11 @@ TEST(Layer, Observer) {
layer->setLineCap(lineCap);
EXPECT_TRUE(layoutPropertyChanged);
+ // Does not notify observer on no-op visibility change.
+ visibilityChanged = false;
+ layer->setVisibility(VisibilityType::None);
+ EXPECT_FALSE(visibilityChanged);
+
// Does not notify observer on no-op paint property change.
paintPropertyChanged = false;
layer->setLineColor(color);