From fe728ebdd8b58edc1d01ce538fcec8dbec247031 Mon Sep 17 00:00:00 2001 From: Nathan Gass Date: Fri, 5 Jan 2024 17:29:26 +0100 Subject: [PATCH] add methods getTiles and setTiles to mimick maplibre-gl-js interface (#149) --- include/mbgl/style/sources/vector_source.hpp | 8 ++++ src/mbgl/style/sources/vector_source.cpp | 19 +++++++++ test/style/source.test.cpp | 44 ++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/include/mbgl/style/sources/vector_source.hpp b/include/mbgl/style/sources/vector_source.hpp index 0adb529a73b..1b57851269e 100644 --- a/include/mbgl/style/sources/vector_source.hpp +++ b/include/mbgl/style/sources/vector_source.hpp @@ -26,6 +26,14 @@ class VectorSource final : public Source { 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 b3ad9513c3c..47630bf3e9f 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 1aefe5332ff..b14f53af199 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");