diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2017-06-20 17:12:58 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2017-06-22 08:04:39 -0700 |
commit | 40e47556214e999c952c1e88e026d673cdd96c72 (patch) | |
tree | e8d15795cbecc07c94908a8ebed31b73def64614 /src/mbgl/style | |
parent | 1520a56813f82bbe875774fdc2b3df26392278d6 (diff) | |
download | qtlocation-mapboxgl-40e47556214e999c952c1e88e026d673cdd96c72.tar.gz |
[core] Move setStyleJSON/URL to Style; add Map::setStyle
Diffstat (limited to 'src/mbgl/style')
-rw-r--r-- | src/mbgl/style/observer.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/style/style.cpp | 16 | ||||
-rw-r--r-- | src/mbgl/style/style_impl.cpp | 80 | ||||
-rw-r--r-- | src/mbgl/style/style_impl.hpp | 16 |
4 files changed, 97 insertions, 18 deletions
diff --git a/src/mbgl/style/observer.hpp b/src/mbgl/style/observer.hpp index 3b2c0db3c0..ea19c599e9 100644 --- a/src/mbgl/style/observer.hpp +++ b/src/mbgl/style/observer.hpp @@ -10,9 +10,10 @@ namespace style { class Observer : public SourceObserver { public: + virtual void onStyleLoading() {} + virtual void onStyleLoaded() {} virtual void onUpdate(Update) {} virtual void onStyleError(std::exception_ptr) {} - virtual void onStyleLoaded() {} virtual void onResourceError(std::exception_ptr) {} }; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index f8dfd48b5c..5fe1ab4a06 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -14,6 +14,22 @@ Style::Style(Scheduler& scheduler, FileSource& fileSource, float pixelRatio) Style::~Style() = default; +void Style::loadJSON(const std::string& json) { + impl->loadJSON(json); +} + +void Style::loadURL(const std::string& url) { + impl->loadURL(url); +} + +std::string Style::getJSON() const { + return impl->getJSON(); +} + +std::string Style::getURL() const { + return impl->getURL(); +} + std::string Style::getName() const { return impl->getName(); } diff --git a/src/mbgl/style/style_impl.cpp b/src/mbgl/style/style_impl.cpp index 7235226f84..2d42afd086 100644 --- a/src/mbgl/style/style_impl.cpp +++ b/src/mbgl/style/style_impl.cpp @@ -16,6 +16,9 @@ #include <mbgl/util/exception.hpp> #include <mbgl/util/string.hpp> #include <mbgl/util/logging.hpp> +#include <mbgl/storage/file_source.hpp> +#include <mbgl/storage/resource.hpp> +#include <mbgl/storage/response.hpp> namespace mbgl { namespace style { @@ -34,26 +37,47 @@ Style::Impl::Impl(Scheduler& scheduler_, FileSource& fileSource_, float pixelRat Style::Impl::~Impl() = default; -void Style::Impl::setTransitionOptions(const TransitionOptions& options) { - transitionOptions = options; -} +void Style::Impl::loadJSON(const std::string& json_) { + observer->onStyleLoading(); -TransitionOptions Style::Impl::getTransitionOptions() const { - return transitionOptions; + url.clear(); + parse(json_); } -void Style::Impl::setJSON(const std::string& json) { - sources.clear(); - layers.clear(); - images.clear(); +void Style::Impl::loadURL(const std::string& url_) { + observer->onStyleLoading(); - transitionOptions = {}; - transitionOptions.duration = util::DEFAULT_TRANSITION_DURATION; + loaded = false; + url = url_; + styleRequest = fileSource.request(Resource::style(url), [this](Response res) { + // Once we get a fresh style, or the style is mutated, stop revalidating. + if (res.isFresh() || mutated) { + styleRequest.reset(); + } + + // Don't allow a loaded, mutated style to be overwritten with a new version. + if (mutated && loaded) { + return; + } + + if (res.error) { + const std::string message = "loading style failed: " + res.error->message; + Log::Error(Event::Setup, message.c_str()); + observer->onStyleError(std::make_exception_ptr(util::StyleLoadException(message))); + observer->onResourceError(std::make_exception_ptr(std::runtime_error(res.error->message))); + } else if (res.notModified || res.noContent) { + return; + } else { + parse(*res.data); + } + }); +} + +void Style::Impl::parse(const std::string& json_) { Parser parser; - auto error = parser.parse(json); - if (error) { + if (auto error = parser.parse(json_)) { std::string message = "Failed to parse style: " + util::toString(error); Log::Error(Event::ParseStyle, message.c_str()); observer->onStyleError(std::make_exception_ptr(util::StyleParseException(message))); @@ -61,6 +85,17 @@ void Style::Impl::setJSON(const std::string& json) { return; } + mutated = false; + loaded = true; + json = json_; + + sources.clear(); + layers.clear(); + images.clear(); + + transitionOptions = {}; + transitionOptions.duration = util::DEFAULT_TRANSITION_DURATION; + for (auto& source : parser.sources) { addSource(std::move(source)); } @@ -79,11 +114,25 @@ void Style::Impl::setJSON(const std::string& json) { spriteLoader->load(parser.spriteURL, scheduler, fileSource); glyphURL = parser.glyphURL; - loaded = true; - observer->onStyleLoaded(); } +std::string Style::Impl::getJSON() const { + return json; +} + +std::string Style::Impl::getURL() const { + return url; +} + +void Style::Impl::setTransitionOptions(const TransitionOptions& options) { + transitionOptions = options; +} + +TransitionOptions Style::Impl::getTransitionOptions() const { + return transitionOptions; +} + void Style::Impl::addSource(std::unique_ptr<Source> source) { if (sources.get(source->getID())) { std::string msg = "Source " + source->getID() + " already exists"; @@ -296,6 +345,7 @@ void Style::Impl::onLightChanged(const Light&) { } void Style::Impl::dumpDebugLogs() const { + Log::Info(Event::General, "styleURL: %s", url.c_str()); for (const auto& source : sources) { source->dumpDebugLogs(); } diff --git a/src/mbgl/style/style_impl.hpp b/src/mbgl/style/style_impl.hpp index 2bdb51a26c..76f244d5a4 100644 --- a/src/mbgl/style/style_impl.hpp +++ b/src/mbgl/style/style_impl.hpp @@ -25,6 +25,7 @@ namespace mbgl { class Scheduler; class FileSource; +class AsyncRequest; class SpriteLoader; namespace style { @@ -38,7 +39,11 @@ public: Impl(Scheduler&, FileSource&, float pixelRatio); ~Impl() override; - void setJSON(const std::string&); + void loadJSON(const std::string&); + void loadURL(const std::string&); + + std::string getJSON() const; + std::string getURL() const; void setObserver(Observer*); @@ -92,11 +97,18 @@ public: bool spriteLoaded = false; private: + void parse(const std::string&); + Scheduler& scheduler; FileSource& fileSource; + + std::string url; + std::string json; + + std::unique_ptr<AsyncRequest> styleRequest; std::unique_ptr<SpriteLoader> spriteLoader; - std::string glyphURL; + std::string glyphURL; Collection<style::Image> images; Collection<Source> sources; Collection<Layer> layers; |