diff --git a/src/mbgl/map/change.hpp b/src/mbgl/map/change.hpp index 483ce8289..343d7d8e4 100644 --- a/src/mbgl/map/change.hpp +++ b/src/mbgl/map/change.hpp @@ -19,6 +19,7 @@ enum MapChange : uint8_t { MapChangeWillStartRenderingMap = 11, MapChangeDidFinishRenderingMap = 12, MapChangeDidFinishRenderingMapFullyRendered = 13, + MapChangeDidFinishLoadingStyle = 14 }; } // namespace mbgl diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index ad77ac19f..1c376e40a 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -39,6 +39,7 @@ public: Impl(View&, FileSource&, MapMode, GLContextMode, ConstrainMode, ViewportMode); void onUpdate(Update) override; + void onStyleLoaded() override; void onStyleError() override; void onResourceError(std::exception_ptr) override; @@ -965,6 +966,10 @@ void Map::Impl::onUpdate(Update flags) { updateFlags |= flags; asyncUpdate.send(); } + +void Map::Impl::onStyleLoaded() { + view.notifyMapChange(MapChangeDidFinishLoadingStyle); +} void Map::Impl::onStyleError() { view.notifyMapChange(MapChangeDidFailLoadingMap); diff --git a/src/mbgl/style/observer.hpp b/src/mbgl/style/observer.hpp index 6694819bc..f28fdfc08 100644 --- a/src/mbgl/style/observer.hpp +++ b/src/mbgl/style/observer.hpp @@ -14,6 +14,7 @@ class Observer : public GlyphAtlasObserver, public: virtual void onUpdate(Update) {} virtual void onStyleError() {} + virtual void onStyleLoaded() {} virtual void onResourceError(std::exception_ptr) {} }; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index e51923863..1c0d7f539 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -105,6 +105,8 @@ void Style::setJSON(const std::string& json) { observer->onResourceError(error); return; + } else { + observer->onStyleLoaded(); } for (auto& source : parser.sources) { diff --git a/test/map/map.cpp b/test/map/map.cpp index e78160a32..6ecbc52e5 100644 --- a/test/map/map.cpp +++ b/test/map/map.cpp @@ -202,6 +202,26 @@ TEST(Map, StyleEarlyMutation) { EXPECT_NE(nullptr, map.getLayer("water")); } +TEST(Map, StyleLoadedSignal) { + MapTest test; + Map map(test.view, test.fileSource, MapMode::Still); + + // The map should emit a signal on style loaded + bool emitted = false; + test.view.setMapChangeCallback([&](MapChange change) { + if (change == mbgl::MapChangeDidFinishLoadingStyle) { + emitted = true; + } + }); + map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); + EXPECT_TRUE(emitted); + + // But not when the style couldn't be parsed + emitted = false; + map.setStyleJSON("invalid"); + EXPECT_FALSE(emitted); +} + TEST(Map, AddLayer) { MapTest test;