1 #pragma once
2 
3 #include <mbgl/style/style.hpp>
4 #include <mbgl/style/transition_options.hpp>
5 #include <mbgl/style/observer.hpp>
6 #include <mbgl/style/source_observer.hpp>
7 #include <mbgl/style/layer_observer.hpp>
8 #include <mbgl/style/light_observer.hpp>
9 #include <mbgl/sprite/sprite_loader_observer.hpp>
10 #include <mbgl/style/image.hpp>
11 #include <mbgl/style/source.hpp>
12 #include <mbgl/style/layer.hpp>
13 #include <mbgl/style/collection.hpp>
14 
15 #include <mbgl/map/camera.hpp>
16 
17 #include <mbgl/util/noncopyable.hpp>
18 #include <mbgl/util/optional.hpp>
19 #include <mbgl/util/geo.hpp>
20 
21 #include <memory>
22 #include <string>
23 #include <vector>
24 #include <unordered_map>
25 
26 namespace mbgl {
27 
28 class Scheduler;
29 class FileSource;
30 class AsyncRequest;
31 class SpriteLoader;
32 
33 namespace style {
34 
35 class Style::Impl : public SpriteLoaderObserver,
36                     public SourceObserver,
37                     public LayerObserver,
38                     public LightObserver,
39                     public util::noncopyable {
40 public:
41     Impl(Scheduler&, FileSource&, float pixelRatio);
42     ~Impl() override;
43 
44     void loadJSON(const std::string&);
45     void loadURL(const std::string&);
46 
47     std::string getJSON() const;
48     std::string getURL() const;
49 
50     void setObserver(Observer*);
51 
52     bool isLoaded() const;
53 
getLastError() const54     std::exception_ptr getLastError() const {
55         return lastError;
56     }
57 
58     std::vector<      Source*> getSources();
59     std::vector<const Source*> getSources() const;
60     Source* getSource(const std::string& id) const;
61 
62     void addSource(std::unique_ptr<Source>);
63     std::unique_ptr<Source> removeSource(const std::string& sourceID);
64 
65     std::vector<      Layer*> getLayers();
66     std::vector<const Layer*> getLayers() const;
67     Layer* getLayer(const std::string& id) const;
68 
69     Layer* addLayer(std::unique_ptr<Layer>,
70                     optional<std::string> beforeLayerID = {});
71     std::unique_ptr<Layer> removeLayer(const std::string& layerID);
72 
73     std::string getName() const;
74     CameraOptions getDefaultCamera() const;
75 
76     TransitionOptions getTransitionOptions() const;
77     void setTransitionOptions(const TransitionOptions&);
78 
79     void setLight(std::unique_ptr<Light>);
80     Light* getLight() const;
81 
82     const style::Image* getImage(const std::string&) const;
83     void addImage(std::unique_ptr<style::Image>);
84     void removeImage(const std::string&);
85 
86     const std::string& getGlyphURL() const;
87 
88     Immutable<std::vector<Immutable<Image::Impl>>> getImageImpls() const;
89     Immutable<std::vector<Immutable<Source::Impl>>> getSourceImpls() const;
90     Immutable<std::vector<Immutable<Layer::Impl>>> getLayerImpls() const;
91 
92     void dumpDebugLogs() const;
93 
94     bool mutated = false;
95     bool loaded = false;
96     bool spriteLoaded = false;
97 
98 private:
99     void parse(const std::string&);
100 
101     Scheduler& scheduler;
102     FileSource& fileSource;
103 
104     std::string url;
105     std::string json;
106 
107     std::unique_ptr<AsyncRequest> styleRequest;
108     std::unique_ptr<SpriteLoader> spriteLoader;
109 
110     std::string glyphURL;
111     Collection<style::Image> images;
112     Collection<Source> sources;
113     Collection<Layer> layers;
114     TransitionOptions transitionOptions;
115     std::unique_ptr<Light> light;
116 
117     // Defaults
118     std::string name;
119     CameraOptions defaultCamera;
120 
121     // SpriteLoaderObserver implementation.
122     void onSpriteLoaded(std::vector<std::unique_ptr<Image>>&&) override;
123     void onSpriteError(std::exception_ptr) override;
124 
125     // SourceObserver implementation.
126     void onSourceLoaded(Source&) override;
127     void onSourceChanged(Source&) override;
128     void onSourceError(Source&, std::exception_ptr) override;
129     void onSourceDescriptionChanged(Source&) override;
130 
131     // LayerObserver implementation.
132     void onLayerChanged(Layer&) override;
133 
134     // LightObserver implementation.
135     void onLightChanged(const Light&) override;
136 
137     Observer nullObserver;
138     Observer* observer = &nullObserver;
139 
140     std::exception_ptr lastError;
141 };
142 
143 } // namespace style
144 } // namespace mbgl
145