diff options
author | Jesse Bounds <jesse@rebounds.net> | 2017-01-04 07:35:25 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2017-02-02 09:44:42 -0800 |
commit | 22b3834caa5fe3ae91cf957124a3f1ad1d165cee (patch) | |
tree | 95439ccd498c414acfec70dc41b94ab9591f18c8 /platform/darwin/src/MGLStyleValue.mm | |
parent | f562ecdfc3a08f7b9b0c2be938f237852a82d374 (diff) | |
download | qtlocation-mapboxgl-22b3834caa5fe3ae91cf957124a3f1ad1d165cee.tar.gz |
[ios, macos] Add support for data-driven property functions
Diffstat (limited to 'platform/darwin/src/MGLStyleValue.mm')
-rw-r--r-- | platform/darwin/src/MGLStyleValue.mm | 214 |
1 files changed, 193 insertions, 21 deletions
diff --git a/platform/darwin/src/MGLStyleValue.mm b/platform/darwin/src/MGLStyleValue.mm index 9e77114378..1a8e6edeab 100644 --- a/platform/darwin/src/MGLStyleValue.mm +++ b/platform/darwin/src/MGLStyleValue.mm @@ -1,5 +1,8 @@ #import "MGLStyleValue_Private.h" +const MGLStyleFunctionOption MGLStyleFunctionOptionInterpolationBase = @"MGLStyleFunctionOptionInterpolationBase"; +const MGLStyleFunctionOption MGLStyleFunctionOptionDefaultValue = @"MGLStyleFunctionOptionDefaultValue"; + @implementation MGLStyleValue + (instancetype)valueWithRawValue:(id)rawValue { @@ -7,11 +10,23 @@ } + (instancetype)valueWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops { - return [MGLStyleFunction functionWithInterpolationBase:interpolationBase stops:stops]; + return [MGLCameraStyleFunction functionWithInterpolationMode:MGLInterpolationModeExponential stops:stops options:@{MGLStyleFunctionOptionInterpolationBase: @(interpolationBase)}]; } + (instancetype)valueWithStops:(NSDictionary *)stops { - return [MGLStyleFunction functionWithStops:stops]; + return [MGLCameraStyleFunction functionWithInterpolationMode:MGLInterpolationModeExponential stops:stops options:nil]; +} + ++ (instancetype)valueWithInterpolationMode:(MGLInterpolationMode)interpolationMode cameraStops:(NSDictionary *)stops options:(NSDictionary *)options { + return [MGLCameraStyleFunction functionWithInterpolationMode:interpolationMode stops:stops options:options]; +} + ++ (instancetype)valueWithInterpolationMode:(MGLInterpolationMode)interpolationMode sourceStops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options { + return [MGLSourceStyleFunction functionWithInterpolationMode:interpolationMode stops:stops attributeName:attributeName options:options]; +} + ++ (instancetype)valueWithInterpolationMode:(MGLInterpolationMode)interpolationMode compositeStops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options { + return [MGLCompositeStyleFunction functionWithInterpolationMode:interpolationMode stops:stops attributeName:attributeName options:options]; } @end @@ -47,46 +62,203 @@ @end -@implementation MGLStyleFunction +@implementation MGLCameraStyleFunction + +@synthesize interpolationMode = _interpolationMode; + ++ (instancetype)functionWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops options:(NSDictionary *)options { + return [[self alloc] initWithInterpolationMode:interpolationMode stops:stops options:options]; +} + +- (instancetype)init { + return [self initWithInterpolationMode:MGLInterpolationModeExponential stops:@{} options:nil]; +} + +- (instancetype)initWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops options:(NSDictionary *)options { + if (![stops count]) { + [NSException raise:NSInvalidArgumentException + format:@"Camera functions must have at least one stop."]; + return {}; + } + + if (self == [super init]) { + _interpolationMode = interpolationMode; + _stops = stops; + _interpolationBase = 1.0; + + if ([options.allKeys containsObject:MGLStyleFunctionOptionInterpolationBase]) { + if ([options[MGLStyleFunctionOptionInterpolationBase] isKindOfClass:[NSNumber class]]) { + NSNumber *value = (NSNumber *)options[MGLStyleFunctionOptionInterpolationBase]; + _interpolationBase = [value floatValue]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Interpolation base must be an NSNumber that represents a CGFloat."]; + } + } + } + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, \ + interpolationMode = %lu, \ + stops = %@, \ + interpolationBase = %f>", + NSStringFromClass([self class]), (void *)self, + (unsigned long)self.interpolationMode, + self.stops, + self.interpolationBase]; +} -+ (instancetype)functionWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops { - return [[self alloc] initWithInterpolationBase:interpolationBase stops:stops]; +- (BOOL)isEqual:(MGLCameraStyleFunction *)other { + return ([other isKindOfClass:[self class]] + && other.interpolationMode == self.interpolationMode + && [other.stops isEqualToDictionary:self.stops] + && other.interpolationBase == self.interpolationBase); } -+ (instancetype)functionWithStops:(NSDictionary *)stops { - return [[self alloc] initWithInterpolationBase:1 stops:stops]; +- (NSUInteger)hash { + return self.interpolationMode + self.stops.hash + self.interpolationBase; +} + +@end + +@implementation MGLSourceStyleFunction + +@synthesize interpolationMode = _interpolationMode; + ++ (instancetype)functionWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options { + return [[self alloc] initWithInterpolationMode:interpolationMode stops:stops attributeName:attributeName options:options]; } - (instancetype)init { - return [self initWithInterpolationBase:1 stops:@{}]; + return [self initWithInterpolationMode:MGLInterpolationModeExponential stops:nil attributeName:@"" options:nil]; } -- (instancetype)initWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops { - if (self = [super init]) { - if (!stops.count) - { - [NSException raise:NSInvalidArgumentException format:@"%@ requires at least one stop.", self]; +- (instancetype)initWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options { + if (self == [super init]) { + _interpolationMode = interpolationMode; + _stops = stops; + _attributeName = attributeName; + _interpolationBase = 1.0; + + if ([options.allKeys containsObject:MGLStyleFunctionOptionDefaultValue]) { + if ([options[MGLStyleFunctionOptionDefaultValue] isKindOfClass:[MGLStyleValue class]]) { + MGLStyleValue *value = (MGLStyleValue *)options[MGLStyleFunctionOptionDefaultValue]; + _defaultValue = value; + } else { + [NSException raise:NSInvalidArgumentException format:@"Default value must be an MGLStyleValue"]; + } } - _interpolationBase = interpolationBase; + + if ([options.allKeys containsObject:MGLStyleFunctionOptionInterpolationBase]) { + if ([options[MGLStyleFunctionOptionInterpolationBase] isKindOfClass:[NSNumber class]]) { + NSNumber *value = (NSNumber *)options[MGLStyleFunctionOptionInterpolationBase]; + _interpolationBase = [value floatValue]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Interpolation base must be an NSNumber that represents a CGFloat."]; + } + } + } + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, \ + interpolationMode = %lu, \ + stops = %@, \ + attributeName = %@, \ + defaultValue = %@, \ + interpolationBase = %f>", + NSStringFromClass([self class]), + (void *)self, + (unsigned long)self.interpolationMode, + self.stops, + self.attributeName, + self.defaultValue, + self.interpolationBase]; +} + +- (BOOL)isEqual:(MGLSourceStyleFunction *)other { + return ([other isKindOfClass:[self class]] + && other.interpolationMode == self.interpolationMode + && ((self.stops && [other.stops isEqualToDictionary:self.stops]) || (!self.stops && !other.stops)) + && [other.attributeName isEqual:self.attributeName] + && ((self.defaultValue && [other.defaultValue isEqual:self.defaultValue]) || (!self.defaultValue && !other.defaultValue)) + && other.interpolationBase == self.interpolationBase); +} + +- (NSUInteger)hash { + return self.interpolationMode + self.stops.hash + self.attributeName.hash + self.defaultValue.hash + self.interpolationBase; +} + +@end + +@implementation MGLCompositeStyleFunction + +@synthesize interpolationMode = _interpolationMode; + ++ (instancetype)functionWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options { + return [[self alloc] initWithInterpolationMode:interpolationMode stops:stops attributeName:attributeName options:options]; +} + +- (instancetype)init { + return [self initWithInterpolationMode:MGLInterpolationModeExponential stops:@{} attributeName:@"" options:nil]; +} + +- (instancetype)initWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options { + if (self == [super init]) { + _interpolationMode = interpolationMode; _stops = stops; + _attributeName = attributeName; + _interpolationBase = 1.0; + + if ([options.allKeys containsObject:MGLStyleFunctionOptionDefaultValue]) { + if ([options[MGLStyleFunctionOptionDefaultValue] isKindOfClass:[MGLStyleValue class]]) { + MGLStyleValue *value = (MGLStyleValue *)options[MGLStyleFunctionOptionDefaultValue]; + _defaultValue = value; + } else { + [NSException raise:NSInvalidArgumentException format:@"Default value must be an MGLStyleValue"]; + } + } + + if ([options.allKeys containsObject:MGLStyleFunctionOptionInterpolationBase]) { + if ([options[MGLStyleFunctionOptionInterpolationBase] isKindOfClass:[NSNumber class]]) { + NSNumber *value = (NSNumber *)options[MGLStyleFunctionOptionInterpolationBase]; + _interpolationBase = [value floatValue]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Interpolation base must be an NSNumber that represents a CGFloat."]; + } + } } return self; } - (NSString *)description { - return [NSString stringWithFormat:@"<%@: %p, interpolationBase = %f; stops = %@>", + return [NSString stringWithFormat:@"<%@: %p, \ + interpolationMode = %lu, \ + stops = %@, \ + attributeName = %@, \ + defaultValue = %@, \ + interpolationBase = %f>", NSStringFromClass([self class]), (void *)self, - self.interpolationBase, - self.stops]; + (unsigned long)self.interpolationMode, + self.stops, + self.attributeName, + self.defaultValue, + self.interpolationBase]; } -- (BOOL)isEqual:(MGLStyleFunction *)other { - return ([other isKindOfClass:[self class]] && other.interpolationBase == self.interpolationBase - && [other.stops isEqualToDictionary:self.stops]); +- (BOOL)isEqual:(MGLCompositeStyleFunction *)other { + return ([other isKindOfClass:[self class]] + && other.interpolationMode == self.interpolationMode + && [other.stops isEqualToDictionary:self.stops] + && [other.attributeName isEqual:self.attributeName] + && ((self.defaultValue && [other.defaultValue isEqual:self.defaultValue]) || (!self.defaultValue && !other.defaultValue)) + && other.interpolationBase == self.interpolationBase); } - (NSUInteger)hash { - return self.interpolationBase + self.stops.hash; + return self.interpolationMode + self.stops.hash + self.attributeName.hash + self.interpolationBase; } @end |