summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-09-26 18:26:11 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-09-26 18:33:28 +0300
commit6e4ebad5910b1ffe4be7a8c94c956493d0ac8446 (patch)
tree489d68b1186a3fe7da0b77c77e5e5f79fc1c6d31
parentfd99c53e66299428f2b34360092b5b3884397067 (diff)
downloadqtlocation-mapboxgl-upstream/mikhail_universal_layout_light_properties.tar.gz
[core] Introduce Light::getProperty()upstream/mikhail_universal_layout_light_properties
-rw-r--r--include/mbgl/style/conversion_impl.hpp7
-rw-r--r--include/mbgl/style/light.hpp2
-rw-r--r--include/mbgl/style/light.hpp.ejs2
-rw-r--r--src/mbgl/style/light.cpp83
-rw-r--r--src/mbgl/style/light.cpp.ejs49
5 files changed, 104 insertions, 39 deletions
diff --git a/include/mbgl/style/conversion_impl.hpp b/include/mbgl/style/conversion_impl.hpp
index 7abe7bf923..3e4236949e 100644
--- a/include/mbgl/style/conversion_impl.hpp
+++ b/include/mbgl/style/conversion_impl.hpp
@@ -342,6 +342,13 @@ struct ValueFactory<T, typename std::enable_if<is_linear_container<T>::value>::t
}
};
+template <>
+struct ValueFactory<Position> {
+ static Value make(const Position& position) {
+ return ValueFactory<std::array<float, 3>>::make(position.getSpherical());
+ }
+};
+
template <typename T>
Value makeValue(T&& arg) {
return ValueFactory<std::decay_t<T>>::make(std::forward<T>(arg));
diff --git a/include/mbgl/style/light.hpp b/include/mbgl/style/light.hpp
index 9a82eb14b5..7434fb2882 100644
--- a/include/mbgl/style/light.hpp
+++ b/include/mbgl/style/light.hpp
@@ -6,6 +6,7 @@
#include <mbgl/style/conversion.hpp>
#include <mbgl/style/property_value.hpp>
+#include <mbgl/style/style_property.hpp>
#include <mbgl/style/transition_options.hpp>
#include <mbgl/style/types.hpp>
#include <mbgl/util/immutable.hpp>
@@ -22,6 +23,7 @@ public:
// Dynamic properties
optional<conversion::Error> setProperty(const std::string& name, const conversion::Convertible& value);
+ StyleProperty getProperty(const std::string&) const;
static LightAnchorType getDefaultAnchor();
PropertyValue<LightAnchorType> getAnchor() const;
diff --git a/include/mbgl/style/light.hpp.ejs b/include/mbgl/style/light.hpp.ejs
index a5b907b4dc..e4661dc59b 100644
--- a/include/mbgl/style/light.hpp.ejs
+++ b/include/mbgl/style/light.hpp.ejs
@@ -9,6 +9,7 @@
#include <mbgl/style/conversion.hpp>
#include <mbgl/style/property_value.hpp>
+#include <mbgl/style/style_property.hpp>
#include <mbgl/style/transition_options.hpp>
#include <mbgl/style/types.hpp>
#include <mbgl/util/immutable.hpp>
@@ -25,6 +26,7 @@ public:
// Dynamic properties
optional<conversion::Error> setProperty(const std::string& name, const conversion::Convertible& value);
+ StyleProperty getProperty(const std::string&) const;
<% for (const property of properties) { -%>
static <%- evaluatedType(property) %> getDefault<%- camelize(property.name) %>();
diff --git a/src/mbgl/style/light.cpp b/src/mbgl/style/light.cpp
index be56a0d93b..a10e693073 100644
--- a/src/mbgl/style/light.cpp
+++ b/src/mbgl/style/light.cpp
@@ -1,5 +1,3 @@
-// clang-format off
-
// This file is generated. Do not edit.
#include <mbgl/style/light.hpp>
@@ -36,29 +34,37 @@ Mutable<Light::Impl> Light::mutableImpl() const {
using namespace conversion;
-optional<Error> Light::setProperty(const std::string& name, const Convertible& value) {
- enum class Property {
- Anchor,
- Color,
- Intensity,
- Position,
- AnchorTransition,
- ColorTransition,
- IntensityTransition,
- PositionTransition,
- };
-
- MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map<mapbox::eternal::string, uint8_t>({
- { "anchor", mbgl::underlying_type(Property::Anchor) },
- { "color", mbgl::underlying_type(Property::Color) },
- { "intensity", mbgl::underlying_type(Property::Intensity) },
- { "position", mbgl::underlying_type(Property::Position) },
- { "anchor-transition", mbgl::underlying_type(Property::AnchorTransition) },
- { "color-transition", mbgl::underlying_type(Property::ColorTransition) },
- { "intensity-transition", mbgl::underlying_type(Property::IntensityTransition) },
- { "position-transition", mbgl::underlying_type(Property::PositionTransition) }
- });
+namespace {
+
+enum class Property : uint8_t {
+ Anchor,
+ Color,
+ Intensity,
+ Position,
+ AnchorTransition,
+ ColorTransition,
+ IntensityTransition,
+ PositionTransition,
+};
+
+template <typename T>
+constexpr uint8_t toUint8(T t) noexcept {
+ return uint8_t(mbgl::underlying_type(t));
+}
+
+MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map<mapbox::eternal::string, uint8_t>(
+ {{"anchor", toUint8(Property::Anchor)},
+ {"color", toUint8(Property::Color)},
+ {"intensity", toUint8(Property::Intensity)},
+ {"position", toUint8(Property::Position)},
+ {"anchor-transition", toUint8(Property::AnchorTransition)},
+ {"color-transition", toUint8(Property::ColorTransition)},
+ {"intensity-transition", toUint8(Property::IntensityTransition)},
+ {"position-transition", toUint8(Property::PositionTransition)}});
+} // namespace
+
+optional<Error> Light::setProperty(const std::string& name, const Convertible& value) {
const auto it = properties.find(name.c_str());
if (it == properties.end()) {
return Error { "light doesn't support this property" };
@@ -146,6 +152,33 @@ optional<Error> Light::setProperty(const std::string& name, const Convertible& v
return Error { "light doesn't support this property" };
}
+StyleProperty Light::getProperty(const std::string& name) const {
+ const auto it = properties.find(name.c_str());
+ if (it == properties.end()) {
+ return {};
+ }
+
+ switch (static_cast<Property>(it->second)) {
+ case Property::Anchor:
+ return makeStyleProperty(getAnchor());
+ case Property::Color:
+ return makeStyleProperty(getColor());
+ case Property::Intensity:
+ return makeStyleProperty(getIntensity());
+ case Property::Position:
+ return makeStyleProperty(getPosition());
+ case Property::AnchorTransition:
+ return makeStyleProperty(getAnchorTransition());
+ case Property::ColorTransition:
+ return makeStyleProperty(getColorTransition());
+ case Property::IntensityTransition:
+ return makeStyleProperty(getIntensityTransition());
+ case Property::PositionTransition:
+ return makeStyleProperty(getPositionTransition());
+ }
+ return {};
+}
+
LightAnchorType Light::getDefaultAnchor() {
return LightAnchor::defaultValue();
}
@@ -253,5 +286,3 @@ TransitionOptions Light::getPositionTransition() const {
} // namespace style
} // namespace mbgl
-
-// clang-format on
diff --git a/src/mbgl/style/light.cpp.ejs b/src/mbgl/style/light.cpp.ejs
index 55cc013827..68c1bf59e2 100644
--- a/src/mbgl/style/light.cpp.ejs
+++ b/src/mbgl/style/light.cpp.ejs
@@ -1,8 +1,6 @@
<%
const properties = locals.properties;
-%>
-// clang-format off
-
// This file is generated. Do not edit.
#include <mbgl/style/light.hpp>
@@ -39,21 +37,29 @@ Mutable<Light::Impl> Light::mutableImpl() const {
using namespace conversion;
-optional<Error> Light::setProperty(const std::string& name, const Convertible& value) {
- enum class Property {
+namespace {
+
+enum class Property : uint8_t {
<% for (const property of properties) { -%>
- <%- camelize(property.name) %>,
+ <%- camelize(property.name) %>,
<% } -%>
<% for (const property of properties) { -%>
- <%- camelize(property.name) %>Transition,
+ <%- camelize(property.name) %>Transition,
<% } -%>
- };
+};
+
+template <typename T>
+constexpr uint8_t toUint8(T t) noexcept {
+ return uint8_t(mbgl::underlying_type(t));
+}
- MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map<mapbox::eternal::string, uint8_t>({
- <%- properties.map(p => `{ "${p.name}", mbgl::underlying_type(Property::${camelize(p.name)}) }`).join(',\n ') %>,
- <%- properties.map(p => `{ "${p.name}-transition", mbgl::underlying_type(Property::${camelize(p.name)}Transition) }`).join(',\n ') %>
- });
+MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map<mapbox::eternal::string, uint8_t>(
+ {<%- properties.map(p => `{"${p.name}", toUint8(Property::${camelize(p.name)})}`).join(',\n ') %>,
+ <%- properties.map(p => `{"${p.name}-transition", toUint8(Property::${camelize(p.name)}Transition)}`).join(',\n ') %>});
+} // namespace
+
+optional<Error> Light::setProperty(const std::string& name, const Convertible& value) {
const auto it = properties.find(name.c_str());
if (it == properties.end()) {
return Error { "light doesn't support this property" };
@@ -107,6 +113,25 @@ optional<Error> Light::setProperty(const std::string& name, const Convertible& v
return Error { "light doesn't support this property" };
}
+StyleProperty Light::getProperty(const std::string& name) const {
+ const auto it = properties.find(name.c_str());
+ if (it == properties.end()) {
+ return {};
+ }
+
+ switch (static_cast<Property>(it->second)) {
+<% for (const property of properties) { -%>
+ case Property::<%- camelize(property.name) %>:
+ return makeStyleProperty(get<%- camelize(property.name) %>());
+<% } -%>
+<% for (const property of properties) { -%>
+ case Property::<%- camelize(property.name) %>Transition:
+ return makeStyleProperty(get<%- camelize(property.name) %>Transition());
+<% } -%>
+ }
+ return {};
+}
+
<% for (const property of properties) { -%>
<%- evaluatedType(property) %> Light::getDefault<%- camelize(property.name) %>() {
return Light<%- camelize(property.name) %>::defaultValue();
@@ -138,5 +163,3 @@ TransitionOptions Light::get<%- camelize(property.name) %>Transition() const {
} // namespace style
} // namespace mbgl
-
-// clang-format on