diff options
author | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-11-29 20:18:40 -0800 |
---|---|---|
committer | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-12-06 19:44:12 -0800 |
commit | 31a216459c564ff7771b0e30837978dbd298de51 (patch) | |
tree | bc33ec1fdd304e8b773efc83438bbb7e4449d5f9 /src/mbgl/tile | |
parent | d783611d1a8a8ef1cce47cb8913fc573fc2e6cf7 (diff) | |
download | qtlocation-mapboxgl-31a216459c564ff7771b0e30837978dbd298de51.tar.gz |
[core] Mark custom geometry tiles stale without clearing data
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r-- | src/mbgl/tile/custom_geometry_tile.cpp | 15 | ||||
-rw-r--r-- | src/mbgl/tile/custom_geometry_tile.hpp | 14 |
2 files changed, 24 insertions, 5 deletions
diff --git a/src/mbgl/tile/custom_geometry_tile.cpp b/src/mbgl/tile/custom_geometry_tile.cpp index b608d90d83..7c8a85c4a4 100644 --- a/src/mbgl/tile/custom_geometry_tile.cpp +++ b/src/mbgl/tile/custom_geometry_tile.cpp @@ -5,6 +5,8 @@ #include <mbgl/actor/scheduler.hpp> #include <mbgl/style/filter_evaluator.hpp> #include <mbgl/util/string.hpp> +#include <mbgl/tile/tile_observer.hpp> +#include <mbgl/style/custom_tile_loader.hpp> #include <mapbox/geojsonvt.hpp> @@ -19,7 +21,8 @@ CustomGeometryTile::CustomGeometryTile(const OverscaledTileID& overscaledTileID, necessity(TileNecessity::Optional), options(options_), loader(loader_), - actor(*Scheduler::GetCurrent(), std::bind(&CustomGeometryTile::setTileData, this, std::placeholders::_1)) { + mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())), + actorRef(*this, mailbox) { } CustomGeometryTile::~CustomGeometryTile() { @@ -43,14 +46,20 @@ void CustomGeometryTile::setTileData(const GeoJSON& geoJSON) { setData(std::make_unique<GeoJSONTileData>(std::move(featureData))); } +void CustomGeometryTile::invalidateTileData() { + stale = true; + observer->onTileChanged(*this); +} + //Fetching tile data for custom sources is assumed to be an expensive operation. // Only required tiles make fetchTile requests. Attempt to cancel a tile // that is no longer required. void CustomGeometryTile::setNecessity(TileNecessity newNecessity) { - if (newNecessity != necessity) { + if (newNecessity != necessity || stale ) { necessity = newNecessity; if (necessity == TileNecessity::Required) { - loader.invoke(&style::CustomTileLoader::fetchTile, id, actor.self()); + loader.invoke(&style::CustomTileLoader::fetchTile, id, actorRef); + stale = false; } else if (!isRenderable()) { loader.invoke(&style::CustomTileLoader::cancelTile, id); } diff --git a/src/mbgl/tile/custom_geometry_tile.hpp b/src/mbgl/tile/custom_geometry_tile.hpp index 66cc412e8c..1df44e6b2a 100644 --- a/src/mbgl/tile/custom_geometry_tile.hpp +++ b/src/mbgl/tile/custom_geometry_tile.hpp @@ -1,13 +1,19 @@ #pragma once #include <mbgl/tile/geometry_tile.hpp> +#include <mbgl/style/sources/custom_geometry_source.hpp> #include <mbgl/util/feature.hpp> -#include <mbgl/style/custom_tile_loader.hpp> +#include <mbgl/util/geojson.hpp> +#include <mbgl/actor/mailbox.hpp> namespace mbgl { class TileParameters; +namespace style { +class CustomTileLoader; +} // namespace style + class CustomGeometryTile: public GeometryTile { public: CustomGeometryTile(const OverscaledTileID&, @@ -16,7 +22,9 @@ public: const style::CustomGeometrySource::TileOptions, ActorRef<style::CustomTileLoader> loader); ~CustomGeometryTile() override; + void setTileData(const GeoJSON& data); + void invalidateTileData(); void setNecessity(TileNecessity) final; @@ -25,10 +33,12 @@ public: const SourceQueryOptions&) override; private: + bool stale = true; TileNecessity necessity; const style::CustomGeometrySource::TileOptions options; ActorRef<style::CustomTileLoader> loader; - Actor<style::SetTileDataFunction> actor; + std::shared_ptr<Mailbox> mailbox; + ActorRef<CustomGeometryTile> actorRef; }; } // namespace mbgl |