From 20712b7c84bd91bcf658d74bf25f3460354b5fd6 Mon Sep 17 00:00:00 2001 From: Fabian Guerra Soto Date: Fri, 10 Mar 2017 11:33:31 -0800 Subject: Per-attribute transition properties on MGLStyleLayer (#8225) * [ios, macos] new struct MGLTransition * [ios] MGLTransition struct moved to MGLTypes.h * [ios] MGLTransition implemented for style layer properties * [ios, macos] added support for getting property transitions * [ios, macos] updated to MGLDurationFromTimeInterval and MGLTimeIntervalFromDuration * [ios, macos] added transition properties test * [ios, macos] modified key strings imp * [ios, macos] The impl for transition properties were changed to public methods * [ios, macos] Changelog update * [ios] Fixed layer space formatting * [core] The name space was fixed for getters that returned TransitionOptions * [ios, macos] Added rawLayer transition property tests * [ios] Added a factory method for MGLTransition and transition-related methods to NSValue(MGLAdditions) * [ios, macos] Copyedited changelog blurbs about transition properties --- platform/darwin/src/MGLBackgroundStyleLayer.h | 21 ++ platform/darwin/src/MGLBackgroundStyleLayer.mm | 54 +++++ platform/darwin/src/MGLCircleStyleLayer.h | 56 ++++++ platform/darwin/src/MGLCircleStyleLayer.mm | 146 +++++++++++++- platform/darwin/src/MGLFillStyleLayer.h | 35 ++++ platform/darwin/src/MGLFillStyleLayer.mm | 92 ++++++++- platform/darwin/src/MGLLineStyleLayer.h | 63 ++++++ platform/darwin/src/MGLLineStyleLayer.mm | 162 +++++++++++++++ platform/darwin/src/MGLRasterStyleLayer.h | 49 +++++ platform/darwin/src/MGLRasterStyleLayer.mm | 126 ++++++++++++ platform/darwin/src/MGLStyle.h | 22 +-- platform/darwin/src/MGLStyle.mm | 26 +-- platform/darwin/src/MGLStyleLayer.h.ejs | 9 + platform/darwin/src/MGLStyleLayer.mm.ejs | 24 ++- platform/darwin/src/MGLSymbolStyleLayer.h | 87 +++++++- platform/darwin/src/MGLSymbolStyleLayer.mm | 218 ++++++++++++++++++++- platform/darwin/src/MGLTypes.h | 33 ++++ platform/darwin/src/NSValue+MGLAdditions.h | 17 ++ platform/darwin/src/NSValue+MGLAdditions.m | 12 ++ .../darwin/test/MGLBackgroundStyleLayerTests.mm | 32 +++ platform/darwin/test/MGLCircleStyleLayerTests.mm | 68 +++++++ platform/darwin/test/MGLFillStyleLayerTests.mm | 41 ++++ platform/darwin/test/MGLLineStyleLayerTests.mm | 68 +++++++ platform/darwin/test/MGLRasterStyleLayerTests.mm | 41 ++++ platform/darwin/test/MGLStyleLayerTests.mm.ejs | 16 ++ platform/darwin/test/MGLSymbolStyleLayerTests.mm | 95 +++++++++ platform/ios/CHANGELOG.md | 3 +- platform/ios/app/MBXViewController.m | 4 +- platform/macos/CHANGELOG.md | 3 +- platform/macos/app/MapDocument.m | 4 +- 30 files changed, 1583 insertions(+), 44 deletions(-) (limited to 'platform') diff --git a/platform/darwin/src/MGLBackgroundStyleLayer.h b/platform/darwin/src/MGLBackgroundStyleLayer.h index 0d0eccd685..3b987dbc99 100644 --- a/platform/darwin/src/MGLBackgroundStyleLayer.h +++ b/platform/darwin/src/MGLBackgroundStyleLayer.h @@ -68,6 +68,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *backgroundColor; #endif +/** + The transition affecting any changes to this layer’s `backgroundColor` property. + + This property corresponds to the `background-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition backgroundColorTransition; + /** The opacity at which the background will be drawn. @@ -84,6 +91,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *backgroundOpacity; +/** + The transition affecting any changes to this layer’s `backgroundOpacity` property. + + This property corresponds to the `background-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition backgroundOpacityTransition; + /** Name of image in style images to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, @@ -97,6 +111,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *backgroundPattern; +/** + The transition affecting any changes to this layer’s `backgroundPattern` property. + + This property corresponds to the `background-pattern-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition backgroundPatternTransition; + @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MGLBackgroundStyleLayer.mm b/platform/darwin/src/MGLBackgroundStyleLayer.mm index bcad0aa11b..8f416a0ea2 100644 --- a/platform/darwin/src/MGLBackgroundStyleLayer.mm +++ b/platform/darwin/src/MGLBackgroundStyleLayer.mm @@ -4,6 +4,7 @@ #import "MGLSource.h" #import "MGLMapView_Private.h" #import "NSPredicate+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #import "MGLStyleValue_Private.h" #import "MGLBackgroundStyleLayer.h" @@ -101,6 +102,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setBackgroundColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setBackgroundColorTransition(options); +} + +- (MGLTransition)backgroundColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getBackgroundColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setBackgroundOpacity:(MGLStyleValue *)backgroundOpacity { MGLAssertStyleLayerIsValid(); @@ -118,6 +137,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setBackgroundOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setBackgroundOpacityTransition(options); +} + +- (MGLTransition)backgroundOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getBackgroundOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setBackgroundPattern:(MGLStyleValue *)backgroundPattern { MGLAssertStyleLayerIsValid(); @@ -135,5 +172,22 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setBackgroundPatternTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setBackgroundPatternTransition(options); +} + +- (MGLTransition)backgroundPatternTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getBackgroundPatternTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} @end diff --git a/platform/darwin/src/MGLCircleStyleLayer.h b/platform/darwin/src/MGLCircleStyleLayer.h index 7a64c25a23..d1d48d65c6 100644 --- a/platform/darwin/src/MGLCircleStyleLayer.h +++ b/platform/darwin/src/MGLCircleStyleLayer.h @@ -107,6 +107,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *circleBlur; +/** + The transition affecting any changes to this layer’s `circleBlur` property. + + This property corresponds to the `circle-blur-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleBlurTransition; + #if TARGET_OS_IPHONE /** The fill color of the circle. @@ -159,6 +166,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *circleColor; #endif +/** + The transition affecting any changes to this layer’s `circleColor` property. + + This property corresponds to the `circle-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleColorTransition; + /** The opacity at which the circle will be drawn. @@ -184,6 +198,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *circleOpacity; +/** + The transition affecting any changes to this layer’s `circleOpacity` property. + + This property corresponds to the `circle-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleOpacityTransition; + /** Circle radius. @@ -211,6 +232,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *circleRadius; +/** + The transition affecting any changes to this layer’s `circleRadius` property. + + This property corresponds to the `circle-radius-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleRadiusTransition; + /** Controls the scaling behavior of the circle when the map is pitched. @@ -284,6 +312,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *circleStrokeColor; #endif +/** + The transition affecting any changes to this layer’s `circleStrokeColor` property. + + This property corresponds to the `circle-stroke-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleStrokeColorTransition; + /** The opacity of the circle's stroke. @@ -309,6 +344,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *circleStrokeOpacity; +/** + The transition affecting any changes to this layer’s `circleStrokeOpacity` property. + + This property corresponds to the `circle-stroke-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleStrokeOpacityTransition; + /** The width of the circle's stroke. Strokes are placed outside of the `circleRadius`. @@ -337,6 +379,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *circleStrokeWidth; +/** + The transition affecting any changes to this layer’s `circleStrokeWidth` property. + + This property corresponds to the `circle-stroke-width-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleStrokeWidthTransition; + #if TARGET_OS_IPHONE /** The geometry's offset. @@ -383,6 +432,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *circleTranslation; #endif +/** + The transition affecting any changes to this layer’s `circleTranslation` property. + + This property corresponds to the `circle-translate-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition circleTranslationTransition; + @property (nonatomic, null_resettable) MGLStyleValue *circleTranslate __attribute__((unavailable("Use circleTranslation instead."))); /** diff --git a/platform/darwin/src/MGLCircleStyleLayer.mm b/platform/darwin/src/MGLCircleStyleLayer.mm index 808e00bc38..330b9cdac0 100644 --- a/platform/darwin/src/MGLCircleStyleLayer.mm +++ b/platform/darwin/src/MGLCircleStyleLayer.mm @@ -4,6 +4,7 @@ #import "MGLSource.h" #import "MGLMapView_Private.h" #import "NSPredicate+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #import "MGLStyleValue_Private.h" #import "MGLCircleStyleLayer.h" @@ -151,6 +152,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setCircleBlurTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleBlurTransition(options); +} + +- (MGLTransition)circleBlurTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleBlurTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleColor:(MGLStyleValue *)circleColor { MGLAssertStyleLayerIsValid(); @@ -168,6 +187,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setCircleColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleColorTransition(options); +} + +- (MGLTransition)circleColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleOpacity:(MGLStyleValue *)circleOpacity { MGLAssertStyleLayerIsValid(); @@ -185,6 +222,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setCircleOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleOpacityTransition(options); +} + +- (MGLTransition)circleOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleRadius:(MGLStyleValue *)circleRadius { MGLAssertStyleLayerIsValid(); @@ -202,6 +257,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setCircleRadiusTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleRadiusTransition(options); +} + +- (MGLTransition)circleRadiusTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleRadiusTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleScaleAlignment:(MGLStyleValue *)circleScaleAlignment { MGLAssertStyleLayerIsValid(); @@ -243,6 +316,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setCircleStrokeColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleStrokeColorTransition(options); +} + +- (MGLTransition)circleStrokeColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleStrokeColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleStrokeOpacity:(MGLStyleValue *)circleStrokeOpacity { MGLAssertStyleLayerIsValid(); @@ -260,6 +351,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setCircleStrokeOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleStrokeOpacityTransition(options); +} + +- (MGLTransition)circleStrokeOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleStrokeOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleStrokeWidth:(MGLStyleValue *)circleStrokeWidth { MGLAssertStyleLayerIsValid(); @@ -277,6 +386,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setCircleStrokeWidthTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleStrokeWidthTransition(options); +} + +- (MGLTransition)circleStrokeWidthTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleStrokeWidthTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleTranslation:(MGLStyleValue *)circleTranslation { MGLAssertStyleLayerIsValid(); @@ -294,6 +421,24 @@ namespace mbgl { return MGLStyleValueTransformer, NSValue *>().toStyleValue(propertyValue); } +- (void)setCircleTranslationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setCircleTranslateTransition(options); +} + +- (MGLTransition)circleTranslationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getCircleTranslateTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setCircleTranslate:(MGLStyleValue *)circleTranslate { } @@ -325,7 +470,6 @@ namespace mbgl { return self.circleTranslationAnchor; } - @end @implementation NSValue (MGLCircleStyleLayerAdditions) diff --git a/platform/darwin/src/MGLFillStyleLayer.h b/platform/darwin/src/MGLFillStyleLayer.h index 32b62344c7..d1d90b5a23 100644 --- a/platform/darwin/src/MGLFillStyleLayer.h +++ b/platform/darwin/src/MGLFillStyleLayer.h @@ -133,6 +133,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *fillColor; #endif +/** + The transition affecting any changes to this layer’s `fillColor` property. + + This property corresponds to the `fill-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition fillColorTransition; + /** The opacity of the entire fill layer. In contrast to the `fillColor`, this value will also affect the 1pt stroke around the fill, if the stroke is used. @@ -159,6 +166,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *fillOpacity; +/** + The transition affecting any changes to this layer’s `fillOpacity` property. + + This property corresponds to the `fill-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition fillOpacityTransition; + #if TARGET_OS_IPHONE /** The outline color of the fill. Matches the value of `fillColor` if unspecified. @@ -211,6 +225,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *fillOutlineColor; #endif +/** + The transition affecting any changes to this layer’s `fillOutlineColor` property. + + This property corresponds to the `fill-outline-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition fillOutlineColorTransition; + /** Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). @@ -223,6 +244,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *fillPattern; +/** + The transition affecting any changes to this layer’s `fillPattern` property. + + This property corresponds to the `fill-pattern-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition fillPatternTransition; + #if TARGET_OS_IPHONE /** The geometry's offset. @@ -269,6 +297,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *fillTranslation; #endif +/** + The transition affecting any changes to this layer’s `fillTranslation` property. + + This property corresponds to the `fill-translate-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition fillTranslationTransition; + @property (nonatomic, null_resettable) MGLStyleValue *fillTranslate __attribute__((unavailable("Use fillTranslation instead."))); /** diff --git a/platform/darwin/src/MGLFillStyleLayer.mm b/platform/darwin/src/MGLFillStyleLayer.mm index 6716e0efb1..1322a7a0b6 100644 --- a/platform/darwin/src/MGLFillStyleLayer.mm +++ b/platform/darwin/src/MGLFillStyleLayer.mm @@ -4,6 +4,7 @@ #import "MGLSource.h" #import "MGLMapView_Private.h" #import "NSPredicate+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #import "MGLStyleValue_Private.h" #import "MGLFillStyleLayer.h" @@ -170,6 +171,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setFillColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setFillColorTransition(options); +} + +- (MGLTransition)fillColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getFillColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setFillOpacity:(MGLStyleValue *)fillOpacity { MGLAssertStyleLayerIsValid(); @@ -187,6 +206,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setFillOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setFillOpacityTransition(options); +} + +- (MGLTransition)fillOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getFillOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setFillOutlineColor:(MGLStyleValue *)fillOutlineColor { MGLAssertStyleLayerIsValid(); @@ -204,6 +241,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setFillOutlineColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setFillOutlineColorTransition(options); +} + +- (MGLTransition)fillOutlineColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getFillOutlineColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setFillPattern:(MGLStyleValue *)fillPattern { MGLAssertStyleLayerIsValid(); @@ -221,6 +276,24 @@ namespace mbgl { return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setFillPatternTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setFillPatternTransition(options); +} + +- (MGLTransition)fillPatternTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getFillPatternTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setFillTranslation:(MGLStyleValue *)fillTranslation { MGLAssertStyleLayerIsValid(); @@ -238,6 +311,24 @@ namespace mbgl { return MGLStyleValueTransformer, NSValue *>().toStyleValue(propertyValue); } +- (void)setFillTranslationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setFillTranslateTransition(options); +} + +- (MGLTransition)fillTranslationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getFillTranslateTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setFillTranslate:(MGLStyleValue *)fillTranslate { } @@ -269,7 +360,6 @@ namespace mbgl { return self.fillTranslationAnchor; } - @end @implementation NSValue (MGLFillStyleLayerAdditions) diff --git a/platform/darwin/src/MGLLineStyleLayer.h b/platform/darwin/src/MGLLineStyleLayer.h index 7cfa27e1cc..e0f8d69a81 100644 --- a/platform/darwin/src/MGLLineStyleLayer.h +++ b/platform/darwin/src/MGLLineStyleLayer.h @@ -208,6 +208,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *lineBlur; +/** + The transition affecting any changes to this layer’s `lineBlur` property. + + This property corresponds to the `line-blur-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineBlurTransition; + #if TARGET_OS_IPHONE /** The color with which the line will be drawn. @@ -266,6 +273,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *lineColor; #endif +/** + The transition affecting any changes to this layer’s `lineColor` property. + + This property corresponds to the `line-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineColorTransition; + /** Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash @@ -288,6 +302,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *> *lineDashPattern; +/** + The transition affecting any changes to this layer’s `lineDashPattern` property. + + This property corresponds to the `line-dasharray-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineDashPatternTransition; + @property (nonatomic, null_resettable) MGLStyleValue *> *lineDasharray __attribute__((unavailable("Use lineDashPattern instead."))); /** @@ -318,6 +339,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *lineGapWidth; +/** + The transition affecting any changes to this layer’s `lineGapWidth` property. + + This property corresponds to the `line-gap-width-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineGapWidthTransition; + /** The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the @@ -348,6 +376,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *lineOffset; +/** + The transition affecting any changes to this layer’s `lineOffset` property. + + This property corresponds to the `line-offset-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineOffsetTransition; + /** The opacity at which the line will be drawn. @@ -373,6 +408,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *lineOpacity; +/** + The transition affecting any changes to this layer’s `lineOpacity` property. + + This property corresponds to the `line-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineOpacityTransition; + /** Name of image in style images to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). @@ -385,6 +427,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *linePattern; +/** + The transition affecting any changes to this layer’s `linePattern` property. + + This property corresponds to the `line-pattern-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition linePatternTransition; + #if TARGET_OS_IPHONE /** The geometry's offset. @@ -431,6 +480,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *lineTranslation; #endif +/** + The transition affecting any changes to this layer’s `lineTranslation` property. + + This property corresponds to the `line-translate-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineTranslationTransition; + @property (nonatomic, null_resettable) MGLStyleValue *lineTranslate __attribute__((unavailable("Use lineTranslation instead."))); /** @@ -475,6 +531,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *lineWidth; +/** + The transition affecting any changes to this layer’s `lineWidth` property. + + This property corresponds to the `line-width-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition lineWidthTransition; + @end /** diff --git a/platform/darwin/src/MGLLineStyleLayer.mm b/platform/darwin/src/MGLLineStyleLayer.mm index 80b1e907e6..e37489cf0b 100644 --- a/platform/darwin/src/MGLLineStyleLayer.mm +++ b/platform/darwin/src/MGLLineStyleLayer.mm @@ -4,6 +4,7 @@ #import "MGLSource.h" #import "MGLMapView_Private.h" #import "NSPredicate+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #import "MGLStyleValue_Private.h" #import "MGLLineStyleLayer.h" @@ -228,6 +229,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setLineBlurTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineBlurTransition(options); +} + +- (MGLTransition)lineBlurTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineBlurTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLineColor:(MGLStyleValue *)lineColor { MGLAssertStyleLayerIsValid(); @@ -245,6 +264,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setLineColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineColorTransition(options); +} + +- (MGLTransition)lineColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLineDashPattern:(MGLStyleValue *> *)lineDashPattern { MGLAssertStyleLayerIsValid(); @@ -262,6 +299,24 @@ namespace mbgl { return MGLStyleValueTransformer, NSArray *, float>().toStyleValue(propertyValue); } +- (void)setLineDashPatternTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineDasharrayTransition(options); +} + +- (MGLTransition)lineDashPatternTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineDasharrayTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLineDasharray:(MGLStyleValue *> *)lineDasharray { } @@ -286,6 +341,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setLineGapWidthTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineGapWidthTransition(options); +} + +- (MGLTransition)lineGapWidthTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineGapWidthTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLineOffset:(MGLStyleValue *)lineOffset { MGLAssertStyleLayerIsValid(); @@ -303,6 +376,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setLineOffsetTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineOffsetTransition(options); +} + +- (MGLTransition)lineOffsetTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineOffsetTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLineOpacity:(MGLStyleValue *)lineOpacity { MGLAssertStyleLayerIsValid(); @@ -320,6 +411,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setLineOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineOpacityTransition(options); +} + +- (MGLTransition)lineOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLinePattern:(MGLStyleValue *)linePattern { MGLAssertStyleLayerIsValid(); @@ -337,6 +446,24 @@ namespace mbgl { return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setLinePatternTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLinePatternTransition(options); +} + +- (MGLTransition)linePatternTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLinePatternTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLineTranslation:(MGLStyleValue *)lineTranslation { MGLAssertStyleLayerIsValid(); @@ -354,6 +481,24 @@ namespace mbgl { return MGLStyleValueTransformer, NSValue *>().toStyleValue(propertyValue); } +- (void)setLineTranslationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineTranslateTransition(options); +} + +- (MGLTransition)lineTranslationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineTranslateTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setLineTranslate:(MGLStyleValue *)lineTranslate { } @@ -402,6 +547,23 @@ namespace mbgl { return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setLineWidthTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setLineWidthTransition(options); +} + +- (MGLTransition)lineWidthTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getLineWidthTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} @end diff --git a/platform/darwin/src/MGLRasterStyleLayer.h b/platform/darwin/src/MGLRasterStyleLayer.h index edd88c319d..d411cba5f0 100644 --- a/platform/darwin/src/MGLRasterStyleLayer.h +++ b/platform/darwin/src/MGLRasterStyleLayer.h @@ -59,6 +59,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *maximumRasterBrightness; +/** + The transition affecting any changes to this layer’s `maximumRasterBrightness` property. + + This property corresponds to the `raster-brightness-max-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition maximumRasterBrightnessTransition; + @property (nonatomic, null_resettable) MGLStyleValue *rasterBrightnessMax __attribute__((unavailable("Use maximumRasterBrightness instead."))); /** @@ -82,6 +89,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *minimumRasterBrightness; +/** + The transition affecting any changes to this layer’s `minimumRasterBrightness` property. + + This property corresponds to the `raster-brightness-min-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition minimumRasterBrightnessTransition; + @property (nonatomic, null_resettable) MGLStyleValue *rasterBrightnessMin __attribute__((unavailable("Use minimumRasterBrightness instead."))); /** @@ -100,6 +114,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *rasterContrast; +/** + The transition affecting any changes to this layer’s `rasterContrast` property. + + This property corresponds to the `raster-contrast-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition rasterContrastTransition; + /** Fade duration when a new tile is added. @@ -118,6 +139,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *rasterFadeDuration; +/** + The transition affecting any changes to this layer’s `rasterFadeDuration` property. + + This property corresponds to the `raster-fade-duration-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition rasterFadeDurationTransition; + /** Rotates hues around the color wheel. @@ -140,6 +168,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *rasterHueRotation; +/** + The transition affecting any changes to this layer’s `rasterHueRotation` property. + + This property corresponds to the `raster-hue-rotate-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition rasterHueRotationTransition; + @property (nonatomic, null_resettable) MGLStyleValue *rasterHueRotate __attribute__((unavailable("Use rasterHueRotation instead."))); /** @@ -158,6 +193,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *rasterOpacity; +/** + The transition affecting any changes to this layer’s `rasterOpacity` property. + + This property corresponds to the `raster-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition rasterOpacityTransition; + /** Increase or reduce the saturation of the image. @@ -174,6 +216,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *rasterSaturation; +/** + The transition affecting any changes to this layer’s `rasterSaturation` property. + + This property corresponds to the `raster-saturation-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition rasterSaturationTransition; + @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MGLRasterStyleLayer.mm b/platform/darwin/src/MGLRasterStyleLayer.mm index 2108a5a0c8..80508e4e70 100644 --- a/platform/darwin/src/MGLRasterStyleLayer.mm +++ b/platform/darwin/src/MGLRasterStyleLayer.mm @@ -4,6 +4,7 @@ #import "MGLSource.h" #import "MGLMapView_Private.h" #import "NSPredicate+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #import "MGLStyleValue_Private.h" #import "MGLRasterStyleLayer.h" @@ -108,6 +109,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setMaximumRasterBrightnessTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setRasterBrightnessMaxTransition(options); +} + +- (MGLTransition)maximumRasterBrightnessTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getRasterBrightnessMaxTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setRasterBrightnessMax:(MGLStyleValue *)rasterBrightnessMax { } @@ -132,6 +151,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setMinimumRasterBrightnessTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setRasterBrightnessMinTransition(options); +} + +- (MGLTransition)minimumRasterBrightnessTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getRasterBrightnessMinTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setRasterBrightnessMin:(MGLStyleValue *)rasterBrightnessMin { } @@ -156,6 +193,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setRasterContrastTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setRasterContrastTransition(options); +} + +- (MGLTransition)rasterContrastTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getRasterContrastTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setRasterFadeDuration:(MGLStyleValue *)rasterFadeDuration { MGLAssertStyleLayerIsValid(); @@ -173,6 +228,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setRasterFadeDurationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setRasterFadeDurationTransition(options); +} + +- (MGLTransition)rasterFadeDurationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getRasterFadeDurationTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setRasterHueRotation:(MGLStyleValue *)rasterHueRotation { MGLAssertStyleLayerIsValid(); @@ -190,6 +263,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setRasterHueRotationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setRasterHueRotateTransition(options); +} + +- (MGLTransition)rasterHueRotationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getRasterHueRotateTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setRasterHueRotate:(MGLStyleValue *)rasterHueRotate { } @@ -214,6 +305,24 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setRasterOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setRasterOpacityTransition(options); +} + +- (MGLTransition)rasterOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getRasterOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setRasterSaturation:(MGLStyleValue *)rasterSaturation { MGLAssertStyleLayerIsValid(); @@ -231,5 +340,22 @@ return MGLStyleValueTransformer().toStyleValue(propertyValue); } +- (void)setRasterSaturationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setRasterSaturationTransition(options); +} + +- (MGLTransition)rasterSaturationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getRasterSaturationTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} @end diff --git a/platform/darwin/src/MGLStyle.h b/platform/darwin/src/MGLStyle.h index 689faf78cf..0dddec307b 100644 --- a/platform/darwin/src/MGLStyle.h +++ b/platform/darwin/src/MGLStyle.h @@ -193,6 +193,12 @@ MGL_EXPORT */ @property (nonatomic, strong) NS_SET_OF(__kindof MGLSource *) *sources; +/** + Values describing animated transitions to styling changes, either to the style URL + or to individual properties. + */ +@property (nonatomic) MGLTransition transition; + /** Returns a source with the given identifier in the current style. @@ -442,22 +448,6 @@ MGL_EXPORT */ - (void)removeImageForName:(NSString *)name; -#pragma mark Managing a Style’s Transition Options - -/** - The duration in seconds to animate any changes to the style URL or to layout and paint attributes. - - By default, this property is set to zero seconds, so any changes take effect without animation. - */ -@property (nonatomic) NSTimeInterval transitionDuration; - -/** - The delay in seconds to before applying any changes to the style URL or to layout and paint attributes. - - By default, this property is set to zero seconds, so any changes begin to animate immediately. - */ -@property (nonatomic) NSTimeInterval transitionDelay; - @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MGLStyle.mm b/platform/darwin/src/MGLStyle.mm index be82e34cb4..2e999a5165 100644 --- a/platform/darwin/src/MGLStyle.mm +++ b/platform/darwin/src/MGLStyle.mm @@ -572,30 +572,24 @@ static NSURL *MGLStyleURL_emerald; #pragma mark Style transitions -- (void)setTransitionDuration:(NSTimeInterval)duration +- (void)setTransition:(MGLTransition)transition { auto transitionOptions = self.mapView.mbglMap->getTransitionOptions(); - transitionOptions.duration = MGLDurationFromTimeInterval(duration); + transitionOptions.duration = MGLDurationFromTimeInterval(transition.duration); + transitionOptions.delay = MGLDurationFromTimeInterval(transition.delay); + self.mapView.mbglMap->setTransitionOptions(transitionOptions); } -- (NSTimeInterval)transitionDuration +- (MGLTransition)transition { + MGLTransition transition; const mbgl::style::TransitionOptions transitionOptions = self.mapView.mbglMap->getTransitionOptions(); - return MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); -} - -- (void)setTransitionDelay:(NSTimeInterval)delay -{ - auto transitionOptions = self.mapView.mbglMap->getTransitionOptions(); - transitionOptions.delay = MGLDurationFromTimeInterval(delay); - self.mapView.mbglMap->setTransitionOptions(transitionOptions); -} -- (NSTimeInterval)transitionDelay -{ - const mbgl::style::TransitionOptions transitionOptions = self.mapView.mbglMap->getTransitionOptions(); - return MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + + return transition; } - (NSString *)description diff --git a/platform/darwin/src/MGLStyleLayer.h.ejs b/platform/darwin/src/MGLStyleLayer.h.ejs index f0a4ba64a3..d5540aa3df 100644 --- a/platform/darwin/src/MGLStyleLayer.h.ejs +++ b/platform/darwin/src/MGLStyleLayer.h.ejs @@ -111,6 +111,15 @@ MGL_EXPORT */ @property (nonatomic<% if (!property.required) { %>, null_resettable<% } if (property.getter) { %>, getter=<%- objCGetter(property) -%><% } %>) MGLStyleValue<<%- propertyType(property, true) %>> *<%- camelizeWithLeadingLowercase(property.name) %>; +<% if (property["transition"]) { -%> +/** + The transition affecting any changes to this layer’s `<%- camelizeWithLeadingLowercase(property.name) %>` property. + + This property corresponds to the `<%- originalPropertyName(property) %>-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition <%- camelizeWithLeadingLowercase(property.name) %>Transition; + +<% } -%> <% if (property.original) { -%> @property (nonatomic<% if (!property.required) { %>, null_resettable<% } %>) MGLStyleValue<<%- propertyType(property, true) %>> *<%- camelizeWithLeadingLowercase(originalPropertyName(property)) %> __attribute__((unavailable("Use <%- camelizeWithLeadingLowercase(property.name) %> instead."))); diff --git a/platform/darwin/src/MGLStyleLayer.mm.ejs b/platform/darwin/src/MGLStyleLayer.mm.ejs index 24aff7fca8..1e5f3df160 100644 --- a/platform/darwin/src/MGLStyleLayer.mm.ejs +++ b/platform/darwin/src/MGLStyleLayer.mm.ejs @@ -10,6 +10,7 @@ #import "MGLSource.h" #import "MGLMapView_Private.h" #import "NSPredicate+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #import "MGLStyleValue_Private.h" #import "MGL<%- camelize(type) %>StyleLayer.h" @@ -228,8 +229,8 @@ namespace mbgl { <% } -%> <% if (paintProperties.length) { -%> #pragma mark - Accessing the Paint Attributes - <% for (const property of paintProperties) { -%> + - (void)set<%- camelize(property.name) %>:(MGLStyleValue<<%- propertyType(property, true) %>> *)<%- objCName(property) %> { MGLAssertStyleLayerIsValid(); @@ -270,15 +271,34 @@ namespace mbgl { <% } -%> <% } -%> } +<% if (property["transition"]) { -%> + +- (void)set<%- camelize(property.name) %>Transition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->set<%- camelize(originalPropertyName(property)) %>Transition(options); +} + +- (MGLTransition)<%- objCGetter(property) %>Transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->get<%- camelize(originalPropertyName(property)) %>Transition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} +<% } -%> <% if (property.original) { -%> + - (void)set<%- camelize(originalPropertyName(property)) %>:(MGLStyleValue<<%- propertyType(property, true) %>> *)<%- camelizeWithLeadingLowercase(originalPropertyName(property)) %> { } - (MGLStyleValue<<%- propertyType(property, true) %>> *)<%- camelizeWithLeadingLowercase(originalPropertyName(property)) %> { return self.<%- objCGetter(property) %>; } - <% } -%> <% } -%> <% } -%> diff --git a/platform/darwin/src/MGLSymbolStyleLayer.h b/platform/darwin/src/MGLSymbolStyleLayer.h index 47d140f91f..f3ea5e9179 100644 --- a/platform/darwin/src/MGLSymbolStyleLayer.h +++ b/platform/darwin/src/MGLSymbolStyleLayer.h @@ -334,7 +334,8 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *iconIgnorePlacement __attribute__((unavailable("Use iconIgnoresPlacement instead."))); /** - A string with {tokens} replaced, referencing the data property to pull from. + Name of image in sprite to use for drawing an image background. A string with + {tokens} replaced, referencing the data property to pull from. This attribute corresponds to the icon-image @@ -1246,6 +1247,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *iconColor; #endif +/** + The transition affecting any changes to this layer’s `iconColor` property. + + This property corresponds to the `icon-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition iconColorTransition; + /** Fade out the halo towards the outside. @@ -1276,6 +1284,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *iconHaloBlur; +/** + The transition affecting any changes to this layer’s `iconHaloBlur` property. + + This property corresponds to the `icon-halo-blur-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition iconHaloBlurTransition; + #if TARGET_OS_IPHONE /** The color of the icon’s halo. The `iconImageName` property must be set to a @@ -1336,6 +1351,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *iconHaloColor; #endif +/** + The transition affecting any changes to this layer’s `iconHaloColor` property. + + This property corresponds to the `icon-halo-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition iconHaloColorTransition; + /** Distance of halo to the icon outline. @@ -1366,6 +1388,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *iconHaloWidth; +/** + The transition affecting any changes to this layer’s `iconHaloWidth` property. + + This property corresponds to the `icon-halo-width-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition iconHaloWidthTransition; + /** The opacity at which the icon will be drawn. @@ -1394,6 +1423,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *iconOpacity; +/** + The transition affecting any changes to this layer’s `iconOpacity` property. + + This property corresponds to the `icon-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition iconOpacityTransition; + #if TARGET_OS_IPHONE /** Distance that the icon's anchor is moved from its original placement. @@ -1446,6 +1482,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *iconTranslation; #endif +/** + The transition affecting any changes to this layer’s `iconTranslation` property. + + This property corresponds to the `icon-translate-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition iconTranslationTransition; + @property (nonatomic, null_resettable) MGLStyleValue *iconTranslate __attribute__((unavailable("Use iconTranslation instead."))); /** @@ -1530,6 +1573,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *textColor; #endif +/** + The transition affecting any changes to this layer’s `textColor` property. + + This property corresponds to the `text-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition textColorTransition; + /** The halo's fadeout distance towards the outside. @@ -1560,6 +1610,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *textHaloBlur; +/** + The transition affecting any changes to this layer’s `textHaloBlur` property. + + This property corresponds to the `text-halo-blur-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition textHaloBlurTransition; + #if TARGET_OS_IPHONE /** The color of the text's halo, which helps it stand out from backgrounds. @@ -1618,6 +1675,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *textHaloColor; #endif +/** + The transition affecting any changes to this layer’s `textHaloColor` property. + + This property corresponds to the `text-halo-color-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition textHaloColorTransition; + /** Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. @@ -1649,6 +1713,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *textHaloWidth; +/** + The transition affecting any changes to this layer’s `textHaloWidth` property. + + This property corresponds to the `text-halo-width-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition textHaloWidthTransition; + /** The opacity at which the text will be drawn. @@ -1677,6 +1748,13 @@ MGL_EXPORT */ @property (nonatomic, null_resettable) MGLStyleValue *textOpacity; +/** + The transition affecting any changes to this layer’s `textOpacity` property. + + This property corresponds to the `text-opacity-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition textOpacityTransition; + #if TARGET_OS_IPHONE /** Distance that the text's anchor is moved from its original placement. @@ -1729,6 +1807,13 @@ MGL_EXPORT @property (nonatomic, null_resettable) MGLStyleValue *textTranslation; #endif +/** + The transition affecting any changes to this layer’s `textTranslation` property. + + This property corresponds to the `text-translate-transition` property in the style JSON file format. +*/ +@property (nonatomic) MGLTransition textTranslationTransition; + @property (nonatomic, null_resettable) MGLStyleValue *textTranslate __attribute__((unavailable("Use textTranslation instead."))); /** diff --git a/platform/darwin/src/MGLSymbolStyleLayer.mm b/platform/darwin/src/MGLSymbolStyleLayer.mm index 52648e7a05..8441931685 100644 --- a/platform/darwin/src/MGLSymbolStyleLayer.mm +++ b/platform/darwin/src/MGLSymbolStyleLayer.mm @@ -4,6 +4,7 @@ #import "MGLSource.h" #import "MGLMapView_Private.h" #import "NSPredicate+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #import "MGLStyleValue_Private.h" #import "MGLSymbolStyleLayer.h" @@ -904,6 +905,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setIconColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setIconColorTransition(options); +} + +- (MGLTransition)iconColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getIconColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setIconHaloBlur:(MGLStyleValue *)iconHaloBlur { MGLAssertStyleLayerIsValid(); @@ -921,6 +940,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setIconHaloBlurTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setIconHaloBlurTransition(options); +} + +- (MGLTransition)iconHaloBlurTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getIconHaloBlurTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setIconHaloColor:(MGLStyleValue *)iconHaloColor { MGLAssertStyleLayerIsValid(); @@ -938,6 +975,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setIconHaloColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setIconHaloColorTransition(options); +} + +- (MGLTransition)iconHaloColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getIconHaloColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setIconHaloWidth:(MGLStyleValue *)iconHaloWidth { MGLAssertStyleLayerIsValid(); @@ -955,6 +1010,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setIconHaloWidthTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setIconHaloWidthTransition(options); +} + +- (MGLTransition)iconHaloWidthTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getIconHaloWidthTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setIconOpacity:(MGLStyleValue *)iconOpacity { MGLAssertStyleLayerIsValid(); @@ -972,6 +1045,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setIconOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setIconOpacityTransition(options); +} + +- (MGLTransition)iconOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getIconOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setIconTranslation:(MGLStyleValue *)iconTranslation { MGLAssertStyleLayerIsValid(); @@ -989,6 +1080,24 @@ namespace mbgl { return MGLStyleValueTransformer, NSValue *>().toStyleValue(propertyValue); } +- (void)setIconTranslationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setIconTranslateTransition(options); +} + +- (MGLTransition)iconTranslationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getIconTranslateTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setIconTranslate:(MGLStyleValue *)iconTranslate { } @@ -1037,6 +1146,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setTextColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setTextColorTransition(options); +} + +- (MGLTransition)textColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getTextColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setTextHaloBlur:(MGLStyleValue *)textHaloBlur { MGLAssertStyleLayerIsValid(); @@ -1054,6 +1181,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setTextHaloBlurTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setTextHaloBlurTransition(options); +} + +- (MGLTransition)textHaloBlurTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getTextHaloBlurTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setTextHaloColor:(MGLStyleValue *)textHaloColor { MGLAssertStyleLayerIsValid(); @@ -1071,6 +1216,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setTextHaloColorTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setTextHaloColorTransition(options); +} + +- (MGLTransition)textHaloColorTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getTextHaloColorTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setTextHaloWidth:(MGLStyleValue *)textHaloWidth { MGLAssertStyleLayerIsValid(); @@ -1088,6 +1251,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setTextHaloWidthTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setTextHaloWidthTransition(options); +} + +- (MGLTransition)textHaloWidthTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getTextHaloWidthTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setTextOpacity:(MGLStyleValue *)textOpacity { MGLAssertStyleLayerIsValid(); @@ -1105,6 +1286,24 @@ namespace mbgl { return MGLStyleValueTransformer().toDataDrivenStyleValue(propertyValue); } +- (void)setTextOpacityTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setTextOpacityTransition(options); +} + +- (MGLTransition)textOpacityTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getTextOpacityTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setTextTranslation:(MGLStyleValue *)textTranslation { MGLAssertStyleLayerIsValid(); @@ -1122,6 +1321,24 @@ namespace mbgl { return MGLStyleValueTransformer, NSValue *>().toStyleValue(propertyValue); } +- (void)setTextTranslationTransition:(MGLTransition )transition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions options { { MGLDurationFromTimeInterval(transition.duration) }, { MGLDurationFromTimeInterval(transition.delay) } }; + self.rawLayer->setTextTranslateTransition(options); +} + +- (MGLTransition)textTranslationTransition { + MGLAssertStyleLayerIsValid(); + + mbgl::style::TransitionOptions transitionOptions = self.rawLayer->getTextTranslateTransition(); + MGLTransition transition; + transition.duration = MGLTimeIntervalFromDuration(transitionOptions.duration.value_or(mbgl::Duration::zero())); + transition.delay = MGLTimeIntervalFromDuration(transitionOptions.delay.value_or(mbgl::Duration::zero())); + + return transition; +} + - (void)setTextTranslate:(MGLStyleValue *)textTranslate { } @@ -1153,7 +1370,6 @@ namespace mbgl { return self.textTranslationAnchor; } - @end @implementation NSValue (MGLSymbolStyleLayerAdditions) diff --git a/platform/darwin/src/MGLTypes.h b/platform/darwin/src/MGLTypes.h index 65cebbe5f4..5216e921f1 100644 --- a/platform/darwin/src/MGLTypes.h +++ b/platform/darwin/src/MGLTypes.h @@ -70,6 +70,39 @@ typedef NS_OPTIONS(NSUInteger, MGLMapDebugMaskOptions) { #endif }; +/** + A structure containing information about a transition. + */ +typedef struct MGLTransition { + /** + The amount of time the animation should take, not including the delay. + */ + NSTimeInterval duration; + + /** + The amount of time in seconds to wait before beginning the animation. + */ + NSTimeInterval delay; +} MGLTransition; + +/** + Creates a new `MGLTransition` from the given duration and delay. + + @param duration The amount of time the animation should take, not including + the delay. + @param delay The amount of time in seconds to wait before beginning the + animation. + + @return Returns a `MGLTransition` struct containing the transition attributes. + */ +NS_INLINE MGLTransition MGLTransitionMake(NSTimeInterval duration, NSTimeInterval delay) { + MGLTransition transition; + transition.duration = duration; + transition.delay = delay; + + return transition; +} + NS_ASSUME_NONNULL_END #ifndef NS_ARRAY_OF diff --git a/platform/darwin/src/NSValue+MGLAdditions.h b/platform/darwin/src/NSValue+MGLAdditions.h index 76388cf2bb..e6755021d0 100644 --- a/platform/darwin/src/NSValue+MGLAdditions.h +++ b/platform/darwin/src/NSValue+MGLAdditions.h @@ -2,6 +2,7 @@ #import "MGLGeometry.h" #import "MGLOfflinePack.h" +#import "MGLTypes.h" NS_ASSUME_NONNULL_BEGIN @@ -70,6 +71,22 @@ NS_ASSUME_NONNULL_BEGIN */ @property (readonly) MGLOfflinePackProgress MGLOfflinePackProgressValue; +#pragma mark Working with Transition Values + +/** + Creates a new value object containing the given `MGLTransition` + structure. + + @param transition The value for the new object. + @return A new value object that contains the transition information. + */ ++ (NSValue *)valueWithMGLTransition:(MGLTransition)transition; + +/** + The `MGLTransition` structure representation of the value. + */ +@property (readonly) MGLTransition MGLTransitionValue; + @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/NSValue+MGLAdditions.m b/platform/darwin/src/NSValue+MGLAdditions.m index 0d2128bea8..a95ef23941 100644 --- a/platform/darwin/src/NSValue+MGLAdditions.m +++ b/platform/darwin/src/NSValue+MGLAdditions.m @@ -46,4 +46,16 @@ return progress; } +#pragma mark Working with Transition Values + ++ (NSValue *)valueWithMGLTransition:(MGLTransition)transition; { + return [NSValue value:&transition withObjCType:@encode(MGLTransition)]; +} + +- (MGLTransition)MGLTransitionValue { + MGLTransition transition; + [self getValue:&transition]; + return transition; +} + @end diff --git a/platform/darwin/test/MGLBackgroundStyleLayerTests.mm b/platform/darwin/test/MGLBackgroundStyleLayerTests.mm index 92c0ac7cbc..c96a4fe7fa 100644 --- a/platform/darwin/test/MGLBackgroundStyleLayerTests.mm +++ b/platform/darwin/test/MGLBackgroundStyleLayerTests.mm @@ -2,10 +2,12 @@ // Edit platform/darwin/scripts/generate-style-code.js, then run `make darwin-style-code`. #import "MGLStyleLayerTests.h" +#import "../../darwin/src/NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #include +#include @interface MGLBackgroundLayerTests : MGLStyleLayerTests @end @@ -22,6 +24,9 @@ XCTAssertTrue(layer.rawLayer->is()); auto rawLayer = layer.rawLayer->as(); + MGLTransition transitionTest = MGLTransitionMake(5, 4); + + // background-color { XCTAssertTrue(rawLayer->getBackgroundColor().isUndefined(), @@ -59,6 +64,15 @@ XCTAssertThrowsSpecificNamed(layer.backgroundColor = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.backgroundColor = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.backgroundColorTransition = transitionTest; + auto toptions = rawLayer->getBackgroundColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition backgroundColorTransition = layer.backgroundColorTransition; + XCTAssertEqual(backgroundColorTransition.delay, transitionTest.delay); + XCTAssertEqual(backgroundColorTransition.duration, transitionTest.duration); } // background-opacity @@ -98,6 +112,15 @@ XCTAssertThrowsSpecificNamed(layer.backgroundOpacity = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.backgroundOpacity = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.backgroundOpacityTransition = transitionTest; + auto toptions = rawLayer->getBackgroundOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition backgroundOpacityTransition = layer.backgroundOpacityTransition; + XCTAssertEqual(backgroundOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(backgroundOpacityTransition.duration, transitionTest.duration); } // background-pattern @@ -137,6 +160,15 @@ XCTAssertThrowsSpecificNamed(layer.backgroundPattern = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.backgroundPattern = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.backgroundPatternTransition = transitionTest; + auto toptions = rawLayer->getBackgroundPatternTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition backgroundPatternTransition = layer.backgroundPatternTransition; + XCTAssertEqual(backgroundPatternTransition.delay, transitionTest.delay); + XCTAssertEqual(backgroundPatternTransition.duration, transitionTest.duration); } } diff --git a/platform/darwin/test/MGLCircleStyleLayerTests.mm b/platform/darwin/test/MGLCircleStyleLayerTests.mm index d7515e8e4e..2a2e9f2d4a 100644 --- a/platform/darwin/test/MGLCircleStyleLayerTests.mm +++ b/platform/darwin/test/MGLCircleStyleLayerTests.mm @@ -2,10 +2,12 @@ // Edit platform/darwin/scripts/generate-style-code.js, then run `make darwin-style-code`. #import "MGLStyleLayerTests.h" +#import "../../darwin/src/NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #include +#include @interface MGLCircleLayerTests : MGLStyleLayerTests @end @@ -43,6 +45,9 @@ XCTAssertTrue(layer.rawLayer->is()); auto rawLayer = layer.rawLayer->as(); + MGLTransition transitionTest = MGLTransitionMake(5, 4); + + // circle-blur { XCTAssertTrue(rawLayer->getCircleBlur().isUndefined(), @@ -98,6 +103,15 @@ @"Unsetting circleBlur should return circle-blur to the default value."); XCTAssertEqualObjects(layer.circleBlur, defaultStyleValue, @"circleBlur should return the default value after being unset."); + // Transition property test + layer.circleBlurTransition = transitionTest; + auto toptions = rawLayer->getCircleBlurTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition circleBlurTransition = layer.circleBlurTransition; + XCTAssertEqual(circleBlurTransition.delay, transitionTest.delay); + XCTAssertEqual(circleBlurTransition.duration, transitionTest.duration); } // circle-color @@ -155,6 +169,15 @@ @"Unsetting circleColor should return circle-color to the default value."); XCTAssertEqualObjects(layer.circleColor, defaultStyleValue, @"circleColor should return the default value after being unset."); + // Transition property test + layer.circleColorTransition = transitionTest; + auto toptions = rawLayer->getCircleColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition circleColorTransition = layer.circleColorTransition; + XCTAssertEqual(circleColorTransition.delay, transitionTest.delay); + XCTAssertEqual(circleColorTransition.duration, transitionTest.duration); } // circle-opacity @@ -212,6 +235,15 @@ @"Unsetting circleOpacity should return circle-opacity to the default value."); XCTAssertEqualObjects(layer.circleOpacity, defaultStyleValue, @"circleOpacity should return the default value after being unset."); + // Transition property test + layer.circleOpacityTransition = transitionTest; + auto toptions = rawLayer->getCircleOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition circleOpacityTransition = layer.circleOpacityTransition; + XCTAssertEqual(circleOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(circleOpacityTransition.duration, transitionTest.duration); } // circle-radius @@ -269,6 +301,15 @@ @"Unsetting circleRadius should return circle-radius to the default value."); XCTAssertEqualObjects(layer.circleRadius, defaultStyleValue, @"circleRadius should return the default value after being unset."); + // Transition property test + layer.circleRadiusTransition = transitionTest; + auto toptions = rawLayer->getCircleRadiusTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition circleRadiusTransition = layer.circleRadiusTransition; + XCTAssertEqual(circleRadiusTransition.delay, transitionTest.delay); + XCTAssertEqual(circleRadiusTransition.duration, transitionTest.duration); } // circle-pitch-scale @@ -365,6 +406,15 @@ @"Unsetting circleStrokeColor should return circle-stroke-color to the default value."); XCTAssertEqualObjects(layer.circleStrokeColor, defaultStyleValue, @"circleStrokeColor should return the default value after being unset."); + // Transition property test + layer.circleStrokeColorTransition = transitionTest; + auto toptions = rawLayer->getCircleStrokeColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition circleStrokeColorTransition = layer.circleStrokeColorTransition; + XCTAssertEqual(circleStrokeColorTransition.delay, transitionTest.delay); + XCTAssertEqual(circleStrokeColorTransition.duration, transitionTest.duration); } // circle-stroke-opacity @@ -422,6 +472,15 @@ @"Unsetting circleStrokeOpacity should return circle-stroke-opacity to the default value."); XCTAssertEqualObjects(layer.circleStrokeOpacity, defaultStyleValue, @"circleStrokeOpacity should return the default value after being unset."); + // Transition property test + layer.circleStrokeOpacityTransition = transitionTest; + auto toptions = rawLayer->getCircleStrokeOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition circleStrokeOpacityTransition = layer.circleStrokeOpacityTransition; + XCTAssertEqual(circleStrokeOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(circleStrokeOpacityTransition.duration, transitionTest.duration); } // circle-stroke-width @@ -479,6 +538,15 @@ @"Unsetting circleStrokeWidth should return circle-stroke-width to the default value."); XCTAssertEqualObjects(layer.circleStrokeWidth, defaultStyleValue, @"circleStrokeWidth should return the default value after being unset."); + // Transition property test + layer.circleStrokeWidthTransition = transitionTest; + auto toptions = rawLayer->getCircleStrokeWidthTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition circleStrokeWidthTransition = layer.circleStrokeWidthTransition; + XCTAssertEqual(circleStrokeWidthTransition.delay, transitionTest.delay); + XCTAssertEqual(circleStrokeWidthTransition.duration, transitionTest.duration); } // circle-translate diff --git a/platform/darwin/test/MGLFillStyleLayerTests.mm b/platform/darwin/test/MGLFillStyleLayerTests.mm index c03b22c399..85f0b24fa7 100644 --- a/platform/darwin/test/MGLFillStyleLayerTests.mm +++ b/platform/darwin/test/MGLFillStyleLayerTests.mm @@ -2,10 +2,12 @@ // Edit platform/darwin/scripts/generate-style-code.js, then run `make darwin-style-code`. #import "MGLStyleLayerTests.h" +#import "../../darwin/src/NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #include +#include @interface MGLFillLayerTests : MGLStyleLayerTests @end @@ -43,6 +45,9 @@ XCTAssertTrue(layer.rawLayer->is()); auto rawLayer = layer.rawLayer->as(); + MGLTransition transitionTest = MGLTransitionMake(5, 4); + + // fill-antialias { XCTAssertTrue(rawLayer->getFillAntialias().isUndefined(), @@ -137,6 +142,15 @@ @"Unsetting fillColor should return fill-color to the default value."); XCTAssertEqualObjects(layer.fillColor, defaultStyleValue, @"fillColor should return the default value after being unset."); + // Transition property test + layer.fillColorTransition = transitionTest; + auto toptions = rawLayer->getFillColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition fillColorTransition = layer.fillColorTransition; + XCTAssertEqual(fillColorTransition.delay, transitionTest.delay); + XCTAssertEqual(fillColorTransition.duration, transitionTest.duration); } // fill-opacity @@ -194,6 +208,15 @@ @"Unsetting fillOpacity should return fill-opacity to the default value."); XCTAssertEqualObjects(layer.fillOpacity, defaultStyleValue, @"fillOpacity should return the default value after being unset."); + // Transition property test + layer.fillOpacityTransition = transitionTest; + auto toptions = rawLayer->getFillOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition fillOpacityTransition = layer.fillOpacityTransition; + XCTAssertEqual(fillOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(fillOpacityTransition.duration, transitionTest.duration); } // fill-outline-color @@ -251,6 +274,15 @@ @"Unsetting fillOutlineColor should return fill-outline-color to the default value."); XCTAssertEqualObjects(layer.fillOutlineColor, defaultStyleValue, @"fillOutlineColor should return the default value after being unset."); + // Transition property test + layer.fillOutlineColorTransition = transitionTest; + auto toptions = rawLayer->getFillOutlineColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition fillOutlineColorTransition = layer.fillOutlineColorTransition; + XCTAssertEqual(fillOutlineColorTransition.delay, transitionTest.delay); + XCTAssertEqual(fillOutlineColorTransition.duration, transitionTest.duration); } // fill-pattern @@ -290,6 +322,15 @@ XCTAssertThrowsSpecificNamed(layer.fillPattern = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.fillPattern = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.fillPatternTransition = transitionTest; + auto toptions = rawLayer->getFillPatternTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition fillPatternTransition = layer.fillPatternTransition; + XCTAssertEqual(fillPatternTransition.delay, transitionTest.delay); + XCTAssertEqual(fillPatternTransition.duration, transitionTest.duration); } // fill-translate diff --git a/platform/darwin/test/MGLLineStyleLayerTests.mm b/platform/darwin/test/MGLLineStyleLayerTests.mm index 95c3e434c0..1e92959520 100644 --- a/platform/darwin/test/MGLLineStyleLayerTests.mm +++ b/platform/darwin/test/MGLLineStyleLayerTests.mm @@ -2,10 +2,12 @@ // Edit platform/darwin/scripts/generate-style-code.js, then run `make darwin-style-code`. #import "MGLStyleLayerTests.h" +#import "../../darwin/src/NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #include +#include @interface MGLLineLayerTests : MGLStyleLayerTests @end @@ -43,6 +45,9 @@ XCTAssertTrue(layer.rawLayer->is()); auto rawLayer = layer.rawLayer->as(); + MGLTransition transitionTest = MGLTransitionMake(5, 4); + + // line-cap { XCTAssertTrue(rawLayer->getLineCap().isUndefined(), @@ -254,6 +259,15 @@ @"Unsetting lineBlur should return line-blur to the default value."); XCTAssertEqualObjects(layer.lineBlur, defaultStyleValue, @"lineBlur should return the default value after being unset."); + // Transition property test + layer.lineBlurTransition = transitionTest; + auto toptions = rawLayer->getLineBlurTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition lineBlurTransition = layer.lineBlurTransition; + XCTAssertEqual(lineBlurTransition.delay, transitionTest.delay); + XCTAssertEqual(lineBlurTransition.duration, transitionTest.duration); } // line-color @@ -311,6 +325,15 @@ @"Unsetting lineColor should return line-color to the default value."); XCTAssertEqualObjects(layer.lineColor, defaultStyleValue, @"lineColor should return the default value after being unset."); + // Transition property test + layer.lineColorTransition = transitionTest; + auto toptions = rawLayer->getLineColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition lineColorTransition = layer.lineColorTransition; + XCTAssertEqual(lineColorTransition.delay, transitionTest.delay); + XCTAssertEqual(lineColorTransition.duration, transitionTest.duration); } // line-dasharray @@ -407,6 +430,15 @@ @"Unsetting lineGapWidth should return line-gap-width to the default value."); XCTAssertEqualObjects(layer.lineGapWidth, defaultStyleValue, @"lineGapWidth should return the default value after being unset."); + // Transition property test + layer.lineGapWidthTransition = transitionTest; + auto toptions = rawLayer->getLineGapWidthTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition lineGapWidthTransition = layer.lineGapWidthTransition; + XCTAssertEqual(lineGapWidthTransition.delay, transitionTest.delay); + XCTAssertEqual(lineGapWidthTransition.duration, transitionTest.duration); } // line-offset @@ -464,6 +496,15 @@ @"Unsetting lineOffset should return line-offset to the default value."); XCTAssertEqualObjects(layer.lineOffset, defaultStyleValue, @"lineOffset should return the default value after being unset."); + // Transition property test + layer.lineOffsetTransition = transitionTest; + auto toptions = rawLayer->getLineOffsetTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition lineOffsetTransition = layer.lineOffsetTransition; + XCTAssertEqual(lineOffsetTransition.delay, transitionTest.delay); + XCTAssertEqual(lineOffsetTransition.duration, transitionTest.duration); } // line-opacity @@ -521,6 +562,15 @@ @"Unsetting lineOpacity should return line-opacity to the default value."); XCTAssertEqualObjects(layer.lineOpacity, defaultStyleValue, @"lineOpacity should return the default value after being unset."); + // Transition property test + layer.lineOpacityTransition = transitionTest; + auto toptions = rawLayer->getLineOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition lineOpacityTransition = layer.lineOpacityTransition; + XCTAssertEqual(lineOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(lineOpacityTransition.duration, transitionTest.duration); } // line-pattern @@ -560,6 +610,15 @@ XCTAssertThrowsSpecificNamed(layer.linePattern = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.linePattern = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.linePatternTransition = transitionTest; + auto toptions = rawLayer->getLinePatternTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition linePatternTransition = layer.linePatternTransition; + XCTAssertEqual(linePatternTransition.delay, transitionTest.delay); + XCTAssertEqual(linePatternTransition.duration, transitionTest.duration); } // line-translate @@ -683,6 +742,15 @@ XCTAssertThrowsSpecificNamed(layer.lineWidth = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.lineWidth = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.lineWidthTransition = transitionTest; + auto toptions = rawLayer->getLineWidthTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition lineWidthTransition = layer.lineWidthTransition; + XCTAssertEqual(lineWidthTransition.delay, transitionTest.delay); + XCTAssertEqual(lineWidthTransition.duration, transitionTest.duration); } } diff --git a/platform/darwin/test/MGLRasterStyleLayerTests.mm b/platform/darwin/test/MGLRasterStyleLayerTests.mm index b7a764e6c2..7b0757eeb6 100644 --- a/platform/darwin/test/MGLRasterStyleLayerTests.mm +++ b/platform/darwin/test/MGLRasterStyleLayerTests.mm @@ -2,10 +2,12 @@ // Edit platform/darwin/scripts/generate-style-code.js, then run `make darwin-style-code`. #import "MGLStyleLayerTests.h" +#import "../../darwin/src/NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #include +#include @interface MGLRasterLayerTests : MGLStyleLayerTests @end @@ -25,6 +27,9 @@ XCTAssertTrue(layer.rawLayer->is()); auto rawLayer = layer.rawLayer->as(); + MGLTransition transitionTest = MGLTransitionMake(5, 4); + + // raster-brightness-max { XCTAssertTrue(rawLayer->getRasterBrightnessMax().isUndefined(), @@ -140,6 +145,15 @@ XCTAssertThrowsSpecificNamed(layer.rasterContrast = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.rasterContrast = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.rasterContrastTransition = transitionTest; + auto toptions = rawLayer->getRasterContrastTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition rasterContrastTransition = layer.rasterContrastTransition; + XCTAssertEqual(rasterContrastTransition.delay, transitionTest.delay); + XCTAssertEqual(rasterContrastTransition.duration, transitionTest.duration); } // raster-fade-duration @@ -179,6 +193,15 @@ XCTAssertThrowsSpecificNamed(layer.rasterFadeDuration = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.rasterFadeDuration = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.rasterFadeDurationTransition = transitionTest; + auto toptions = rawLayer->getRasterFadeDurationTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition rasterFadeDurationTransition = layer.rasterFadeDurationTransition; + XCTAssertEqual(rasterFadeDurationTransition.delay, transitionTest.delay); + XCTAssertEqual(rasterFadeDurationTransition.duration, transitionTest.duration); } // raster-hue-rotate @@ -257,6 +280,15 @@ XCTAssertThrowsSpecificNamed(layer.rasterOpacity = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.rasterOpacity = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.rasterOpacityTransition = transitionTest; + auto toptions = rawLayer->getRasterOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition rasterOpacityTransition = layer.rasterOpacityTransition; + XCTAssertEqual(rasterOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(rasterOpacityTransition.duration, transitionTest.duration); } // raster-saturation @@ -296,6 +328,15 @@ XCTAssertThrowsSpecificNamed(layer.rasterSaturation = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.rasterSaturation = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); + // Transition property test + layer.rasterSaturationTransition = transitionTest; + auto toptions = rawLayer->getRasterSaturationTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition rasterSaturationTransition = layer.rasterSaturationTransition; + XCTAssertEqual(rasterSaturationTransition.delay, transitionTest.delay); + XCTAssertEqual(rasterSaturationTransition.duration, transitionTest.duration); } } diff --git a/platform/darwin/test/MGLStyleLayerTests.mm.ejs b/platform/darwin/test/MGLStyleLayerTests.mm.ejs index 810d7fbd3b..a405ae58c4 100644 --- a/platform/darwin/test/MGLStyleLayerTests.mm.ejs +++ b/platform/darwin/test/MGLStyleLayerTests.mm.ejs @@ -7,10 +7,12 @@ // Edit platform/darwin/scripts/generate-style-code.js, then run `make darwin-style-code`. #import "MGLStyleLayerTests.h" +#import "../../darwin/src/NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #include _layer.hpp> +#include @interface MGL<%- camelize(type) %>LayerTests : MGLStyleLayerTests @end @@ -53,6 +55,9 @@ XCTAssertNotEqual(layer.rawLayer, nullptr); XCTAssertTrue(layer.rawLayer->isLayer>()); auto rawLayer = layer.rawLayer->asLayer>(); + + MGLTransition transitionTest = MGLTransitionMake(5, 4); + <% for (const property of properties) { -%> // <%- originalPropertyName(property) %> @@ -123,6 +128,17 @@ XCTAssertThrowsSpecificNamed(layer.<%- objCName(property) %> = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); functionStyleValue = [MGLStyleValue<<%- propertyType(property) %>> valueWithInterpolationMode:MGLInterpolationModeInterval compositeStops:@{@18: constantStyleValue} attributeName:@"" options:nil]; XCTAssertThrowsSpecificNamed(layer.<%- objCName(property) %> = functionStyleValue, NSException, NSInvalidArgumentException, @"MGLStyleValue should raise an exception if it is applied to a property that cannot support it"); +<% } -%> +<% if (property["transition"] && !property.original) { -%> + // Transition property test + layer.<%- camelizeWithLeadingLowercase(originalPropertyName(property)) %>Transition = transitionTest; + auto toptions = rawLayer->get<%- camelize(originalPropertyName(property)) %>Transition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition <%- camelizeWithLeadingLowercase(originalPropertyName(property)) %>Transition = layer.<%- camelizeWithLeadingLowercase(originalPropertyName(property)) %>Transition; + XCTAssertEqual(<%- camelizeWithLeadingLowercase(originalPropertyName(property)) %>Transition.delay, transitionTest.delay); + XCTAssertEqual(<%- camelizeWithLeadingLowercase(originalPropertyName(property)) %>Transition.duration, transitionTest.duration); <% } -%> } <% } -%> diff --git a/platform/darwin/test/MGLSymbolStyleLayerTests.mm b/platform/darwin/test/MGLSymbolStyleLayerTests.mm index 1d599f5aca..e3e473ef78 100644 --- a/platform/darwin/test/MGLSymbolStyleLayerTests.mm +++ b/platform/darwin/test/MGLSymbolStyleLayerTests.mm @@ -2,10 +2,12 @@ // Edit platform/darwin/scripts/generate-style-code.js, then run `make darwin-style-code`. #import "MGLStyleLayerTests.h" +#import "../../darwin/src/NSDate+MGLAdditions.h" #import "MGLStyleLayer_Private.h" #include +#include @interface MGLSymbolLayerTests : MGLStyleLayerTests @end @@ -43,6 +45,9 @@ XCTAssertTrue(layer.rawLayer->is()); auto rawLayer = layer.rawLayer->as(); + MGLTransition transitionTest = MGLTransitionMake(5, 4); + + // icon-allow-overlap { XCTAssertTrue(rawLayer->getIconAllowOverlap().isUndefined(), @@ -1468,6 +1473,15 @@ @"Unsetting iconColor should return icon-color to the default value."); XCTAssertEqualObjects(layer.iconColor, defaultStyleValue, @"iconColor should return the default value after being unset."); + // Transition property test + layer.iconColorTransition = transitionTest; + auto toptions = rawLayer->getIconColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition iconColorTransition = layer.iconColorTransition; + XCTAssertEqual(iconColorTransition.delay, transitionTest.delay); + XCTAssertEqual(iconColorTransition.duration, transitionTest.duration); } // icon-halo-blur @@ -1525,6 +1539,15 @@ @"Unsetting iconHaloBlur should return icon-halo-blur to the default value."); XCTAssertEqualObjects(layer.iconHaloBlur, defaultStyleValue, @"iconHaloBlur should return the default value after being unset."); + // Transition property test + layer.iconHaloBlurTransition = transitionTest; + auto toptions = rawLayer->getIconHaloBlurTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition iconHaloBlurTransition = layer.iconHaloBlurTransition; + XCTAssertEqual(iconHaloBlurTransition.delay, transitionTest.delay); + XCTAssertEqual(iconHaloBlurTransition.duration, transitionTest.duration); } // icon-halo-color @@ -1582,6 +1605,15 @@ @"Unsetting iconHaloColor should return icon-halo-color to the default value."); XCTAssertEqualObjects(layer.iconHaloColor, defaultStyleValue, @"iconHaloColor should return the default value after being unset."); + // Transition property test + layer.iconHaloColorTransition = transitionTest; + auto toptions = rawLayer->getIconHaloColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition iconHaloColorTransition = layer.iconHaloColorTransition; + XCTAssertEqual(iconHaloColorTransition.delay, transitionTest.delay); + XCTAssertEqual(iconHaloColorTransition.duration, transitionTest.duration); } // icon-halo-width @@ -1639,6 +1671,15 @@ @"Unsetting iconHaloWidth should return icon-halo-width to the default value."); XCTAssertEqualObjects(layer.iconHaloWidth, defaultStyleValue, @"iconHaloWidth should return the default value after being unset."); + // Transition property test + layer.iconHaloWidthTransition = transitionTest; + auto toptions = rawLayer->getIconHaloWidthTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition iconHaloWidthTransition = layer.iconHaloWidthTransition; + XCTAssertEqual(iconHaloWidthTransition.delay, transitionTest.delay); + XCTAssertEqual(iconHaloWidthTransition.duration, transitionTest.duration); } // icon-opacity @@ -1696,6 +1737,15 @@ @"Unsetting iconOpacity should return icon-opacity to the default value."); XCTAssertEqualObjects(layer.iconOpacity, defaultStyleValue, @"iconOpacity should return the default value after being unset."); + // Transition property test + layer.iconOpacityTransition = transitionTest; + auto toptions = rawLayer->getIconOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition iconOpacityTransition = layer.iconOpacityTransition; + XCTAssertEqual(iconOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(iconOpacityTransition.duration, transitionTest.duration); } // icon-translate @@ -1837,6 +1887,15 @@ @"Unsetting textColor should return text-color to the default value."); XCTAssertEqualObjects(layer.textColor, defaultStyleValue, @"textColor should return the default value after being unset."); + // Transition property test + layer.textColorTransition = transitionTest; + auto toptions = rawLayer->getTextColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition textColorTransition = layer.textColorTransition; + XCTAssertEqual(textColorTransition.delay, transitionTest.delay); + XCTAssertEqual(textColorTransition.duration, transitionTest.duration); } // text-halo-blur @@ -1894,6 +1953,15 @@ @"Unsetting textHaloBlur should return text-halo-blur to the default value."); XCTAssertEqualObjects(layer.textHaloBlur, defaultStyleValue, @"textHaloBlur should return the default value after being unset."); + // Transition property test + layer.textHaloBlurTransition = transitionTest; + auto toptions = rawLayer->getTextHaloBlurTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition textHaloBlurTransition = layer.textHaloBlurTransition; + XCTAssertEqual(textHaloBlurTransition.delay, transitionTest.delay); + XCTAssertEqual(textHaloBlurTransition.duration, transitionTest.duration); } // text-halo-color @@ -1951,6 +2019,15 @@ @"Unsetting textHaloColor should return text-halo-color to the default value."); XCTAssertEqualObjects(layer.textHaloColor, defaultStyleValue, @"textHaloColor should return the default value after being unset."); + // Transition property test + layer.textHaloColorTransition = transitionTest; + auto toptions = rawLayer->getTextHaloColorTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition textHaloColorTransition = layer.textHaloColorTransition; + XCTAssertEqual(textHaloColorTransition.delay, transitionTest.delay); + XCTAssertEqual(textHaloColorTransition.duration, transitionTest.duration); } // text-halo-width @@ -2008,6 +2085,15 @@ @"Unsetting textHaloWidth should return text-halo-width to the default value."); XCTAssertEqualObjects(layer.textHaloWidth, defaultStyleValue, @"textHaloWidth should return the default value after being unset."); + // Transition property test + layer.textHaloWidthTransition = transitionTest; + auto toptions = rawLayer->getTextHaloWidthTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition textHaloWidthTransition = layer.textHaloWidthTransition; + XCTAssertEqual(textHaloWidthTransition.delay, transitionTest.delay); + XCTAssertEqual(textHaloWidthTransition.duration, transitionTest.duration); } // text-opacity @@ -2065,6 +2151,15 @@ @"Unsetting textOpacity should return text-opacity to the default value."); XCTAssertEqualObjects(layer.textOpacity, defaultStyleValue, @"textOpacity should return the default value after being unset."); + // Transition property test + layer.textOpacityTransition = transitionTest; + auto toptions = rawLayer->getTextOpacityTransition(); + XCTAssert(toptions.delay && MGLTimeIntervalFromDuration(*toptions.delay) == transitionTest.delay); + XCTAssert(toptions.duration && MGLTimeIntervalFromDuration(*toptions.duration) == transitionTest.duration); + + MGLTransition textOpacityTransition = layer.textOpacityTransition; + XCTAssertEqual(textOpacityTransition.delay, transitionTest.delay); + XCTAssertEqual(textOpacityTransition.duration, transitionTest.duration); } // text-translate diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 56f600187a..7ddb503543 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -26,7 +26,8 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT * Point-placed labels in symbol style layers are now placed at more optimal locations within polygons. ([#7465](https://github.com/mapbox/mapbox-gl-native/pull/7465)) * Fixed flickering that occurred when manipulating a style layer. ([#7616](https://github.com/mapbox/mapbox-gl-native/pull/7616)) * Symbol style layers can now render point collections (known as multipoints in GeoJSON). ([#7445](https://github.com/mapbox/mapbox-gl-native/pull/7445)) -* Added properties to MGLStyle to delay or animate changes to style layers. ([#7711](https://github.com/mapbox/mapbox-gl-native/pull/7711)) +* Added a `transition` property to MGLStyle to customize the timing of changes to style layers. ([#7711](https://github.com/mapbox/mapbox-gl-native/pull/7711)) +* Added properties to MGLStyleLayer subclasses to customize the timing of transitions between values of individual attributes. ([#8225](https://github.com/mapbox/mapbox-gl-native/pull/8225)) * Fixed an issue causing lines and text labels toward the top of the map view to appear blurry when the map is tilted. ([#7444](https://github.com/mapbox/mapbox-gl-native/pull/7444)) * Fixed incorrect interpolation of style functions in Boolean-typed style attributes. ([#7526](https://github.com/mapbox/mapbox-gl-native/pull/7526)) * Removed support for the `ref` property in layers in style JSON files. ([#7586](https://github.com/mapbox/mapbox-gl-native/pull/7586)) diff --git a/platform/ios/app/MBXViewController.m b/platform/ios/app/MBXViewController.m index e1ff440e9e..39458c4f31 100644 --- a/platform/ios/app/MBXViewController.m +++ b/platform/ios/app/MBXViewController.m @@ -915,8 +915,8 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) { - (void)styleBuildingLayer { - self.mapView.style.transitionDuration = 5; - self.mapView.style.transitionDelay = 1; + MGLTransition transition = { 5, 1 }; + self.mapView.style.transition = transition; MGLFillStyleLayer *buildingLayer = (MGLFillStyleLayer *)[self.mapView.style layerWithIdentifier:@"building"]; buildingLayer.fillColor = [MGLStyleValue valueWithRawValue:[UIColor purpleColor]]; } diff --git a/platform/macos/CHANGELOG.md b/platform/macos/CHANGELOG.md index 8f52719f91..7c00f14be7 100644 --- a/platform/macos/CHANGELOG.md +++ b/platform/macos/CHANGELOG.md @@ -18,7 +18,8 @@ * Point-placed labels in symbol style layers are now placed at more optimal locations within polygons. ([#7465](https://github.com/mapbox/mapbox-gl-native/pull/7465)) * Fixed flickering that occurred when manipulating a style layer. ([#7616](https://github.com/mapbox/mapbox-gl-native/pull/7616)) * Symbol style layers can now render point collections (known as multipoints in GeoJSON). ([#7445](https://github.com/mapbox/mapbox-gl-native/pull/7445)) -* Added properties to MGLStyle to delay or animate changes to style layers. ([#7711](https://github.com/mapbox/mapbox-gl-native/pull/7711)) +* Added a `transition` property to MGLStyle to customize the timing of changes to style layers. ([#7711](https://github.com/mapbox/mapbox-gl-native/pull/7711)) +* Added properties to MGLStyleLayer subclasses to customize the timing of transitions between values of individual attributes. ([#8225](https://github.com/mapbox/mapbox-gl-native/pull/8225)) * Fixed an issue causing lines and text labels toward the top of the map view to appear blurry when the map is tilted. ([#7444](https://github.com/mapbox/mapbox-gl-native/pull/7444)) * Fixed incorrect interpolation of style functions in Boolean-typed style attributes. ([#7526](https://github.com/mapbox/mapbox-gl-native/pull/7526)) * Removed support for the `ref` property in layers in style JSON files. ([#7586](https://github.com/mapbox/mapbox-gl-native/pull/7586)) diff --git a/platform/macos/app/MapDocument.m b/platform/macos/app/MapDocument.m index b120f2da6d..ec90888084 100644 --- a/platform/macos/app/MapDocument.m +++ b/platform/macos/app/MapDocument.m @@ -683,8 +683,8 @@ NS_ARRAY_OF(id ) *MBXFlattenedShapes(NS_ARRAY_OF(id