diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-09-01 08:34:13 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-09-06 14:29:22 -0700 |
commit | d6f667a5e762ce1faec80bee774b805fe7ef5e11 (patch) | |
tree | 527ae75a142d089203d971d1f909d311f3e51d7b | |
parent | 6d770cb40f1231e202b603fcc63d3b00efc3f551 (diff) | |
download | qtlocation-mapboxgl-d6f667a5e762ce1faec80bee774b805fe7ef5e11.tar.gz |
[core] Observe visibility changes
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | src/mbgl/style/layer.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/style/layer_observer.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/style/style.cpp | 13 | ||||
-rw-r--r-- | src/mbgl/style/style.hpp | 1 | ||||
-rw-r--r-- | test/src/mbgl/test/stub_layer_observer.hpp | 5 | ||||
-rw-r--r-- | test/style/style_layer.cpp | 14 |
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); |