summaryrefslogtreecommitdiff
path: root/platform/darwin/src/MGLStyleLayer.mm
blob: 87f6c18f334858cb4833e8770ae203877181565a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#import "MGLStyleLayer_Private.h"
#import "MGLMapView_Private.h"

#include <mbgl/style/layer.hpp>

@interface MGLStyleLayer ()

@property (nonatomic) mbgl::style::Layer *rawLayer;

@end

@implementation MGLStyleLayer

- (instancetype)initWithIdentifier:(NSString *)identifier
{
    if (self = [super init]) {
        _identifier = identifier;
    }
    return self;
}

- (void)setVisible:(BOOL)visible
{
    MGLAssertStyleLayerIsValid();

    mbgl::style::VisibilityType v = visible
    ? mbgl::style::VisibilityType::Visible
    : mbgl::style::VisibilityType::None;
    self.rawLayer->setVisibility(v);
}

- (BOOL)isVisible
{
    MGLAssertStyleLayerIsValid();

    mbgl::style::VisibilityType v = self.rawLayer->getVisibility();
    return (v == mbgl::style::VisibilityType::Visible);
}

- (void)setMaximumZoomLevel:(float)maximumZoomLevel
{
    MGLAssertStyleLayerIsValid();

    self.rawLayer->setMaxZoom(maximumZoomLevel);
}

- (float)maximumZoomLevel
{
    MGLAssertStyleLayerIsValid();

    return self.rawLayer->getMaxZoom();
}

- (void)setMinimumZoomLevel:(float)minimumZoomLevel
{
    MGLAssertStyleLayerIsValid();

    self.rawLayer->setMinZoom(minimumZoomLevel);
}

- (float)minimumZoomLevel
{
    MGLAssertStyleLayerIsValid();

    return self.rawLayer->getMinZoom();
}

- (void)setTransition:(MGLTransition)transition forKey:(NSString *)key
{
    SEL setPropertyTransitionSelector = [self mbx_selectorForKey:key type:@"set" hasParams:YES];
    
    if ([self respondsToSelector:setPropertyTransitionSelector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        [self performSelector:setPropertyTransitionSelector withObject:[NSValue value:&transition withObjCType:@encode(MGLTransition)] ];
#pragma clang diagnostic pop
    }
}

- (MGLTransition)transitionForKey:(NSString *)key
{
    MGLTransition transition;
    
    SEL getPropertyTransitionSelector = [self mbx_selectorForKey:key type:@"get" hasParams:NO];
    
    if ([self respondsToSelector:getPropertyTransitionSelector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        NSValue *transitionValue = [self performSelector:getPropertyTransitionSelector];
        [transitionValue getValue:&transition];
#pragma clang diagnostic pop
    }
    
    return transition;
}

- (SEL)mbx_selectorForKey:(NSString *)key type:(NSString *)type hasParams:(BOOL)params
{
    NSString *camelCaseKey;
    NSString *parameters = params ? @":" : @"";
    if ([key length] > 1) {
        camelCaseKey = [NSString stringWithFormat:@"%@%@", [[key substringToIndex:1] uppercaseString], [key substringFromIndex:1]];
    } else {
        camelCaseKey = [key uppercaseString];
    }
    NSString *setPropertyTransitionString = [NSString stringWithFormat:@"mbx_%@%@Transition%@", type, camelCaseKey, parameters];
    SEL propertyTransitionSelector = NSSelectorFromString(setPropertyTransitionString);
    
    return propertyTransitionSelector;
}

+ (NSArray *)transitionKeys
{
    // This is overridden by subclasses
    [NSException raise:@"MGLAbstractClassException"
                format:@"MGLStyleLayer is an abstract class"];
    return nil;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p; identifier = %@; visible = %@>",
            NSStringFromClass([self class]), (void *)self, self.identifier,
            self.visible ? @"YES" : @"NO"];
}

@end