[core] When a layer is added, reload its source's tiles

This commit is contained in:
John Firebaugh
2017-05-10 17:51:55 -07:00
parent 5290d7ed4c
commit 625c2ea527
2 changed files with 17 additions and 16 deletions

View File

@@ -52,6 +52,21 @@ namespace style {
static Observer nullObserver;
struct QueueSourceReloadVisitor {
UpdateBatch& updateBatch;
// 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) {
updateBatch.sourceIDs.insert(layer.getSourceID());
}
};
Style::Style(Scheduler& scheduler_, FileSource& fileSource_, float pixelRatio)
: scheduler(scheduler_),
fileSource(fileSource_),
@@ -248,6 +263,7 @@ Layer* Style::addLayer(std::unique_ptr<Layer> layer, optional<std::string> befor
}
layer->baseImpl->setObserver(this);
layer->accept(QueueSourceReloadVisitor { updateBatch });
auto added = layers.emplace(before ? findLayer(*before) : layers.end(), std::move(layer))->get();
renderLayers.emplace(before ? findRenderLayer(*before) : renderLayers.end(), added->baseImpl->createRenderLayer());
@@ -726,21 +742,6 @@ void Style::onSpriteError(std::exception_ptr error) {
observer->onResourceError(error);
}
struct QueueSourceReloadVisitor {
UpdateBatch& updateBatch;
// 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) {
updateBatch.sourceIDs.insert(layer.getSourceID());
}
};
void Style::onLayerFilterChanged(Layer& layer) {
layer.accept(QueueSourceReloadVisitor { updateBatch });
observer->onUpdate(Update::Repaint);