From b6e5edc26844df6a5f1f6e34881826828d36ce6a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 9 Feb 2017 12:36:40 -0800 Subject: [core] Restore support for *-transition properties --- .../style/conversion/make_property_setters.hpp | 58 ++++++++++++++++++++++ .../style/conversion/make_property_setters.hpp.ejs | 1 + include/mbgl/style/conversion/property_setter.hpp | 19 +++++++ .../mbgl/style/conversion/transition_options.hpp | 45 +++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 include/mbgl/style/conversion/transition_options.hpp (limited to 'include/mbgl/style/conversion') diff --git a/include/mbgl/style/conversion/make_property_setters.hpp b/include/mbgl/style/conversion/make_property_setters.hpp index e30359937e..32fa810f0b 100644 --- a/include/mbgl/style/conversion/make_property_setters.hpp +++ b/include/mbgl/style/conversion/make_property_setters.hpp @@ -77,69 +77,127 @@ auto makePaintPropertySetters() { std::unordered_map> result; result["fill-antialias"] = makePropertySetter(&FillLayer::setFillAntialias); + result["fill-antialias-transition"] = makeTransitionSetter(&FillLayer::setFillAntialiasTransition); result["fill-opacity"] = makePropertySetter(&FillLayer::setFillOpacity); + result["fill-opacity-transition"] = makeTransitionSetter(&FillLayer::setFillOpacityTransition); result["fill-color"] = makePropertySetter(&FillLayer::setFillColor); + result["fill-color-transition"] = makeTransitionSetter(&FillLayer::setFillColorTransition); result["fill-outline-color"] = makePropertySetter(&FillLayer::setFillOutlineColor); + result["fill-outline-color-transition"] = makeTransitionSetter(&FillLayer::setFillOutlineColorTransition); result["fill-translate"] = makePropertySetter(&FillLayer::setFillTranslate); + result["fill-translate-transition"] = makeTransitionSetter(&FillLayer::setFillTranslateTransition); result["fill-translate-anchor"] = makePropertySetter(&FillLayer::setFillTranslateAnchor); + result["fill-translate-anchor-transition"] = makeTransitionSetter(&FillLayer::setFillTranslateAnchorTransition); result["fill-pattern"] = makePropertySetter(&FillLayer::setFillPattern); + result["fill-pattern-transition"] = makeTransitionSetter(&FillLayer::setFillPatternTransition); result["line-opacity"] = makePropertySetter(&LineLayer::setLineOpacity); + result["line-opacity-transition"] = makeTransitionSetter(&LineLayer::setLineOpacityTransition); result["line-color"] = makePropertySetter(&LineLayer::setLineColor); + result["line-color-transition"] = makeTransitionSetter(&LineLayer::setLineColorTransition); result["line-translate"] = makePropertySetter(&LineLayer::setLineTranslate); + result["line-translate-transition"] = makeTransitionSetter(&LineLayer::setLineTranslateTransition); result["line-translate-anchor"] = makePropertySetter(&LineLayer::setLineTranslateAnchor); + result["line-translate-anchor-transition"] = makeTransitionSetter(&LineLayer::setLineTranslateAnchorTransition); result["line-width"] = makePropertySetter(&LineLayer::setLineWidth); + result["line-width-transition"] = makeTransitionSetter(&LineLayer::setLineWidthTransition); result["line-gap-width"] = makePropertySetter(&LineLayer::setLineGapWidth); + result["line-gap-width-transition"] = makeTransitionSetter(&LineLayer::setLineGapWidthTransition); result["line-offset"] = makePropertySetter(&LineLayer::setLineOffset); + result["line-offset-transition"] = makeTransitionSetter(&LineLayer::setLineOffsetTransition); result["line-blur"] = makePropertySetter(&LineLayer::setLineBlur); + result["line-blur-transition"] = makeTransitionSetter(&LineLayer::setLineBlurTransition); result["line-dasharray"] = makePropertySetter(&LineLayer::setLineDasharray); + result["line-dasharray-transition"] = makeTransitionSetter(&LineLayer::setLineDasharrayTransition); result["line-pattern"] = makePropertySetter(&LineLayer::setLinePattern); + result["line-pattern-transition"] = makeTransitionSetter(&LineLayer::setLinePatternTransition); result["icon-opacity"] = makePropertySetter(&SymbolLayer::setIconOpacity); + result["icon-opacity-transition"] = makeTransitionSetter(&SymbolLayer::setIconOpacityTransition); result["icon-color"] = makePropertySetter(&SymbolLayer::setIconColor); + result["icon-color-transition"] = makeTransitionSetter(&SymbolLayer::setIconColorTransition); result["icon-halo-color"] = makePropertySetter(&SymbolLayer::setIconHaloColor); + result["icon-halo-color-transition"] = makeTransitionSetter(&SymbolLayer::setIconHaloColorTransition); result["icon-halo-width"] = makePropertySetter(&SymbolLayer::setIconHaloWidth); + result["icon-halo-width-transition"] = makeTransitionSetter(&SymbolLayer::setIconHaloWidthTransition); result["icon-halo-blur"] = makePropertySetter(&SymbolLayer::setIconHaloBlur); + result["icon-halo-blur-transition"] = makeTransitionSetter(&SymbolLayer::setIconHaloBlurTransition); result["icon-translate"] = makePropertySetter(&SymbolLayer::setIconTranslate); + result["icon-translate-transition"] = makeTransitionSetter(&SymbolLayer::setIconTranslateTransition); result["icon-translate-anchor"] = makePropertySetter(&SymbolLayer::setIconTranslateAnchor); + result["icon-translate-anchor-transition"] = makeTransitionSetter(&SymbolLayer::setIconTranslateAnchorTransition); result["text-opacity"] = makePropertySetter(&SymbolLayer::setTextOpacity); + result["text-opacity-transition"] = makeTransitionSetter(&SymbolLayer::setTextOpacityTransition); result["text-color"] = makePropertySetter(&SymbolLayer::setTextColor); + result["text-color-transition"] = makeTransitionSetter(&SymbolLayer::setTextColorTransition); result["text-halo-color"] = makePropertySetter(&SymbolLayer::setTextHaloColor); + result["text-halo-color-transition"] = makeTransitionSetter(&SymbolLayer::setTextHaloColorTransition); result["text-halo-width"] = makePropertySetter(&SymbolLayer::setTextHaloWidth); + result["text-halo-width-transition"] = makeTransitionSetter(&SymbolLayer::setTextHaloWidthTransition); result["text-halo-blur"] = makePropertySetter(&SymbolLayer::setTextHaloBlur); + result["text-halo-blur-transition"] = makeTransitionSetter(&SymbolLayer::setTextHaloBlurTransition); result["text-translate"] = makePropertySetter(&SymbolLayer::setTextTranslate); + result["text-translate-transition"] = makeTransitionSetter(&SymbolLayer::setTextTranslateTransition); result["text-translate-anchor"] = makePropertySetter(&SymbolLayer::setTextTranslateAnchor); + result["text-translate-anchor-transition"] = makeTransitionSetter(&SymbolLayer::setTextTranslateAnchorTransition); result["circle-radius"] = makePropertySetter(&CircleLayer::setCircleRadius); + result["circle-radius-transition"] = makeTransitionSetter(&CircleLayer::setCircleRadiusTransition); result["circle-color"] = makePropertySetter(&CircleLayer::setCircleColor); + result["circle-color-transition"] = makeTransitionSetter(&CircleLayer::setCircleColorTransition); result["circle-blur"] = makePropertySetter(&CircleLayer::setCircleBlur); + result["circle-blur-transition"] = makeTransitionSetter(&CircleLayer::setCircleBlurTransition); result["circle-opacity"] = makePropertySetter(&CircleLayer::setCircleOpacity); + result["circle-opacity-transition"] = makeTransitionSetter(&CircleLayer::setCircleOpacityTransition); result["circle-translate"] = makePropertySetter(&CircleLayer::setCircleTranslate); + result["circle-translate-transition"] = makeTransitionSetter(&CircleLayer::setCircleTranslateTransition); result["circle-translate-anchor"] = makePropertySetter(&CircleLayer::setCircleTranslateAnchor); + result["circle-translate-anchor-transition"] = makeTransitionSetter(&CircleLayer::setCircleTranslateAnchorTransition); result["circle-pitch-scale"] = makePropertySetter(&CircleLayer::setCirclePitchScale); + result["circle-pitch-scale-transition"] = makeTransitionSetter(&CircleLayer::setCirclePitchScaleTransition); result["circle-stroke-width"] = makePropertySetter(&CircleLayer::setCircleStrokeWidth); + result["circle-stroke-width-transition"] = makeTransitionSetter(&CircleLayer::setCircleStrokeWidthTransition); result["circle-stroke-color"] = makePropertySetter(&CircleLayer::setCircleStrokeColor); + result["circle-stroke-color-transition"] = makeTransitionSetter(&CircleLayer::setCircleStrokeColorTransition); result["circle-stroke-opacity"] = makePropertySetter(&CircleLayer::setCircleStrokeOpacity); + result["circle-stroke-opacity-transition"] = makeTransitionSetter(&CircleLayer::setCircleStrokeOpacityTransition); result["fill-extrusion-opacity"] = makePropertySetter(&FillExtrusionLayer::setFillExtrusionOpacity); + result["fill-extrusion-opacity-transition"] = makeTransitionSetter(&FillExtrusionLayer::setFillExtrusionOpacityTransition); result["fill-extrusion-color"] = makePropertySetter(&FillExtrusionLayer::setFillExtrusionColor); + result["fill-extrusion-color-transition"] = makeTransitionSetter(&FillExtrusionLayer::setFillExtrusionColorTransition); result["fill-extrusion-translate"] = makePropertySetter(&FillExtrusionLayer::setFillExtrusionTranslate); + result["fill-extrusion-translate-transition"] = makeTransitionSetter(&FillExtrusionLayer::setFillExtrusionTranslateTransition); result["fill-extrusion-translate-anchor"] = makePropertySetter(&FillExtrusionLayer::setFillExtrusionTranslateAnchor); + result["fill-extrusion-translate-anchor-transition"] = makeTransitionSetter(&FillExtrusionLayer::setFillExtrusionTranslateAnchorTransition); result["fill-extrusion-pattern"] = makePropertySetter(&FillExtrusionLayer::setFillExtrusionPattern); + result["fill-extrusion-pattern-transition"] = makeTransitionSetter(&FillExtrusionLayer::setFillExtrusionPatternTransition); result["fill-extrusion-height"] = makePropertySetter(&FillExtrusionLayer::setFillExtrusionHeight); + result["fill-extrusion-height-transition"] = makeTransitionSetter(&FillExtrusionLayer::setFillExtrusionHeightTransition); result["fill-extrusion-base"] = makePropertySetter(&FillExtrusionLayer::setFillExtrusionBase); + result["fill-extrusion-base-transition"] = makeTransitionSetter(&FillExtrusionLayer::setFillExtrusionBaseTransition); result["raster-opacity"] = makePropertySetter(&RasterLayer::setRasterOpacity); + result["raster-opacity-transition"] = makeTransitionSetter(&RasterLayer::setRasterOpacityTransition); result["raster-hue-rotate"] = makePropertySetter(&RasterLayer::setRasterHueRotate); + result["raster-hue-rotate-transition"] = makeTransitionSetter(&RasterLayer::setRasterHueRotateTransition); result["raster-brightness-min"] = makePropertySetter(&RasterLayer::setRasterBrightnessMin); + result["raster-brightness-min-transition"] = makeTransitionSetter(&RasterLayer::setRasterBrightnessMinTransition); result["raster-brightness-max"] = makePropertySetter(&RasterLayer::setRasterBrightnessMax); + result["raster-brightness-max-transition"] = makeTransitionSetter(&RasterLayer::setRasterBrightnessMaxTransition); result["raster-saturation"] = makePropertySetter(&RasterLayer::setRasterSaturation); + result["raster-saturation-transition"] = makeTransitionSetter(&RasterLayer::setRasterSaturationTransition); result["raster-contrast"] = makePropertySetter(&RasterLayer::setRasterContrast); + result["raster-contrast-transition"] = makeTransitionSetter(&RasterLayer::setRasterContrastTransition); result["raster-fade-duration"] = makePropertySetter(&RasterLayer::setRasterFadeDuration); + result["raster-fade-duration-transition"] = makeTransitionSetter(&RasterLayer::setRasterFadeDurationTransition); result["background-color"] = makePropertySetter(&BackgroundLayer::setBackgroundColor); + result["background-color-transition"] = makeTransitionSetter(&BackgroundLayer::setBackgroundColorTransition); result["background-pattern"] = makePropertySetter(&BackgroundLayer::setBackgroundPattern); + result["background-pattern-transition"] = makeTransitionSetter(&BackgroundLayer::setBackgroundPatternTransition); result["background-opacity"] = makePropertySetter(&BackgroundLayer::setBackgroundOpacity); + result["background-opacity-transition"] = makeTransitionSetter(&BackgroundLayer::setBackgroundOpacityTransition); return result; } diff --git a/include/mbgl/style/conversion/make_property_setters.hpp.ejs b/include/mbgl/style/conversion/make_property_setters.hpp.ejs index ed8f6e891c..65fbdea63e 100644 --- a/include/mbgl/style/conversion/make_property_setters.hpp.ejs +++ b/include/mbgl/style/conversion/make_property_setters.hpp.ejs @@ -36,6 +36,7 @@ auto makePaintPropertySetters() { <% for (const layer of locals.layers) { -%> <% for (const property of layer.paintProperties) { -%> result["<%- property.name %>"] = makePropertySetter(&<%- camelize(layer.type) %>Layer::set<%- camelize(property.name) %>); + result["<%- property.name %>-transition"] = makeTransitionSetter(&<%- camelize(layer.type) %>Layer::set<%- camelize(property.name) %>Transition); <% } -%> <% } -%> diff --git a/include/mbgl/style/conversion/property_setter.hpp b/include/mbgl/style/conversion/property_setter.hpp index 52fb160fde..6a15c64026 100644 --- a/include/mbgl/style/conversion/property_setter.hpp +++ b/include/mbgl/style/conversion/property_setter.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,24 @@ auto makePropertySetter(void (L::*setter)(PropertyValue, const Args&...args)) { }; } +template +auto makeTransitionSetter(void (L::*setter)(const TransitionOptions&, const Args&...args)) { + return [setter] (Layer& layer, const V& value, const Args&...args) -> optional { + L* typedLayer = layer.as(); + if (!typedLayer) { + return Error { "layer doesn't support this property" }; + } + + Result transition = convert(value); + if (!transition) { + return transition.error(); + } + + (typedLayer->*setter)(*transition, args...); + return {}; + }; +} + template optional setVisibility(Layer& layer, const V& value) { if (isUndefined(value)) { diff --git a/include/mbgl/style/conversion/transition_options.hpp b/include/mbgl/style/conversion/transition_options.hpp new file mode 100644 index 0000000000..cdd65cfe9f --- /dev/null +++ b/include/mbgl/style/conversion/transition_options.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { +public: + template + Result operator()(const V& value) const { + if (!isObject(value)) { + return Error { "transition must be an object" }; + } + + TransitionOptions result; + + auto duration = objectMember(value, "duration"); + if (duration) { + auto number = toNumber(*duration); + if (!number) { + return Error { "duration must be a number" }; + } + result.duration = { std::chrono::milliseconds(int64_t(*number)) }; + } + + auto delay = objectMember(value, "delay"); + if (delay) { + auto number = toNumber(*delay); + if (!number) { + return Error { "delay must be a number" }; + } + result.delay = { std::chrono::milliseconds(int64_t(*number)) }; + } + + return result; + } +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl -- cgit v1.2.1