1 #pragma once
2
3 #include <mbgl/style/layer.hpp>
4 #include <mbgl/style/layers/symbol_layer.hpp>
5 #include <mbgl/style/conversion.hpp>
6 #include <mbgl/style/conversion/color_ramp_property_value.hpp>
7 #include <mbgl/style/conversion/constant.hpp>
8 #include <mbgl/style/conversion/property_value.hpp>
9 #include <mbgl/style/conversion/data_driven_property_value.hpp>
10 #include <mbgl/style/conversion/transition_options.hpp>
11
12 #include <string>
13
14 namespace mbgl {
15 namespace style {
16 namespace conversion {
17
18 using PropertySetter = optional<Error> (*) (Layer&, const Convertible&);
19
20 template <class L, class PropertyValue, void (L::*setter)(PropertyValue), bool convertTokens = false>
setProperty(Layer & layer,const Convertible & value)21 optional<Error> setProperty(Layer& layer, const Convertible& value) {
22 auto* typedLayer = layer.as<L>();
23 if (!typedLayer) {
24 return Error { "layer doesn't support this property" };
25 }
26
27 Error error;
28 optional<PropertyValue> typedValue = convert<PropertyValue>(value, error, convertTokens);
29 if (!typedValue) {
30 return error;
31 }
32
33 (typedLayer->*setter)(*typedValue);
34 return {};
35 }
36
37 template <class L, void (L::*setter)(const TransitionOptions&)>
setTransition(Layer & layer,const Convertible & value)38 optional<Error> setTransition(Layer& layer, const Convertible& value) {
39 auto* typedLayer = layer.as<L>();
40 if (!typedLayer) {
41 return Error { "layer doesn't support this property" };
42 }
43
44 Error error;
45 optional<TransitionOptions> transition = convert<TransitionOptions>(value, error);
46 if (!transition) {
47 return error;
48 }
49
50 (typedLayer->*setter)(*transition);
51 return {};
52 }
53
setVisibility(Layer & layer,const Convertible & value)54 inline optional<Error> setVisibility(Layer& layer, const Convertible& value) {
55 if (isUndefined(value)) {
56 layer.setVisibility(VisibilityType::Visible);
57 return {};
58 }
59
60 Error error;
61 optional<VisibilityType> visibility = convert<VisibilityType>(value, error);
62 if (!visibility) {
63 return error;
64 }
65
66 layer.setVisibility(*visibility);
67 return {};
68 }
69
70 } // namespace conversion
71 } // namespace style
72 } // namespace mbgl
73