diff --git a/src/mbgl/tile/file_based_tile_source_impl.hpp b/src/mbgl/tile/file_based_tile_source_impl.hpp index 4a1172833..b8a69e3f6 100644 --- a/src/mbgl/tile/file_based_tile_source_impl.hpp +++ b/src/mbgl/tile/file_based_tile_source_impl.hpp @@ -40,6 +40,8 @@ void FileBasedTileSource::loadOptional() { request = fileSource.request(resource, [this](Response res) { request.reset(); + T::tileData.setTriedOptional(); + if (res.error && res.error->reason == Response::Error::Reason::NotFound) { // When the optional request could not be satisfied, don't treat it as an error. // Instead, we make sure that the next request knows that there has been an optional diff --git a/src/mbgl/tile/tile_data.cpp b/src/mbgl/tile/tile_data.cpp index a5822b2c1..a64de4d1e 100644 --- a/src/mbgl/tile/tile_data.cpp +++ b/src/mbgl/tile/tile_data.cpp @@ -24,6 +24,11 @@ void TileData::setTileSource(std::unique_ptr tileSource_) { tileSource = std::move(tileSource_); } +void TileData::setTriedOptional() { + triedOptional = true; + observer->onNeedsRepaint(); +} + void TileData::dumpDebugLogs() const { Log::Info(Event::General, "TileData::id: %s", util::toString(id).c_str()); Log::Info(Event::General, "TileData::renderable: %s", isRenderable() ? "yes" : "no"); diff --git a/src/mbgl/tile/tile_data.hpp b/src/mbgl/tile/tile_data.hpp index c3877d0d6..d22e87118 100644 --- a/src/mbgl/tile/tile_data.hpp +++ b/src/mbgl/tile/tile_data.hpp @@ -50,6 +50,14 @@ public: const TransformState&, const optional>& layerIDs); + void setTriedOptional(); + + // Returns true when the tile source has received a first response, regardless of whether a load + // error occurred or actual data was loaded. + bool hasTriedOptional() const { + return triedOptional; + } + // Tile data considered "Renderable" can be used for rendering. Data in // partial state is still waiting for network resources but can also // be rendered, although layers will be missing. @@ -74,6 +82,8 @@ public: std::unique_ptr debugBucket; protected: + bool triedOptional = false; + enum class DataAvailability : uint8_t { // Still waiting for data to load or parse. None, diff --git a/test/algorithm/mock.hpp b/test/algorithm/mock.hpp index 28c78854b..ff5849930 100644 --- a/test/algorithm/mock.hpp +++ b/test/algorithm/mock.hpp @@ -29,11 +29,17 @@ struct MockBucket {}; struct MockTileData { MockTileData(const mbgl::OverscaledTileID& tileID_) : tileID(tileID_) {} - bool isRenderable() { + + bool hasTriedOptional() const { + return triedOptional; + } + + bool isRenderable() const { return renderable; } bool renderable = false; + bool triedOptional = false; const mbgl::OverscaledTileID tileID; };