diff --git a/include/mbgl/style/sources/vector_source.hpp b/include/mbgl/style/sources/vector_source.hpp index 0adb529a7..1b5785126 100644 --- a/include/mbgl/style/sources/vector_source.hpp +++ b/include/mbgl/style/sources/vector_source.hpp @@ -26,6 +26,14 @@ public: void loadDescription(FileSource&) final; + /// @brief Gets the tile urls for this vector source. + /// @return List of tile urls. + const std::vector getTiles() const; + + /// @brief Sets the tile urls for this vector source. + /// @param tiles List of tile urls. + void setTiles(const std::vector& tiles); + bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override; mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } diff --git a/src/mbgl/style/sources/vector_source.cpp b/src/mbgl/style/sources/vector_source.cpp index b3ad9513c..47630bf3e 100644 --- a/src/mbgl/style/sources/vector_source.cpp +++ b/src/mbgl/style/sources/vector_source.cpp @@ -92,6 +92,25 @@ void VectorSource::loadDescription(FileSource& fileSource) { }); } +const std::vector VectorSource::getTiles() const { + auto tileset = impl().tileset; + if (tileset.has_value()) { + return tileset->tiles; + } else { + return {}; + } +} + +void VectorSource::setTiles(const std::vector& tiles) { + auto& tileset = impl().tileset; + if (!tileset.has_value()) return; + if (tileset->tiles == tiles) return; + Tileset newtileset(*tileset); + newtileset.tiles = tiles; + baseImpl = makeMutable(impl(), newtileset); + observer->onSourceChanged(*this); +} + bool VectorSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const { return mbgl::underlying_type(Tile::Kind::Geometry) == mbgl::underlying_type(info->tileKind); } diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp index 1aefe5332..b14f53af1 100644 --- a/test/style/source.test.cpp +++ b/test/style/source.test.cpp @@ -919,6 +919,50 @@ TEST(Source, RenderTileSetSourceUpdate) { renderSource->update(uninitialized.baseImpl, layers, true, true, test.tileParameters()); } +TEST(Source, VectorSourceSetTiles) { + SourceTest test; + test.styleObserver.sourceChanged = [&](Source& source) { + EXPECT_EQ(source.as()->getTiles(), std::vector{"new"}); + test.end(); + }; + + VectorSource source("source", Tileset{{"url"}}); + source.setObserver(&test.styleObserver); + source.setTiles({"unused"}); // make sure early setTiles does not segfault + source.loadDescription(*test.fileSource); + EXPECT_EQ(source.as()->getTiles(), std::vector{"url"}); + source.setTiles({"new"}); + test.run(); +} + +TEST(Source, VectorSourceUrlSetTiles) { + SourceTest test; + test.styleObserver.sourceLoaded = [&](Source& source) { + EXPECT_EQ(source.as()->getTiles(), std::vector{"tiles"}); + source.as()->setTiles({"new"}); + }; + int count = 0; + test.styleObserver.sourceChanged = [&](Source& source) { + if (count++) { + EXPECT_EQ(source.as()->getTiles(), std::vector{"new"}); + test.end(); + } + }; + + test.fileSource->sourceResponse = [&](const Resource& resource) { + EXPECT_EQ("url", resource.url); + Response response; + response.data = std::make_unique(R"({"tiles": ["tiles"]})"); + return response; + }; + + VectorSource source("source", "url"); + source.setObserver(&test.styleObserver); + source.setTiles({"unused"}); + source.loadDescription(*test.fileSource); + test.run(); +} + TEST(Source, GeoJSONSourceTilesAfterDataReset) { SourceTest test; GeoJSONSource source("source");