blob: 649ba98bca1356f135ccd66f2249fac2e7598751 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "GoogleMapPolygonController.h"
#import "JsonConversions.h"
@implementation FLTGoogleMapPolygonController {
GMSPolygon *_polygon;
GMSMapView *_mapView;
}
- (instancetype)initPolygonWithPath:(GMSMutablePath *)path
polygonId:(NSString *)polygonId
mapView:(GMSMapView *)mapView {
self = [super init];
if (self) {
_polygon = [GMSPolygon polygonWithPath:path];
_mapView = mapView;
_polygonId = polygonId;
_polygon.userData = @[ polygonId ];
}
return self;
}
- (void)removePolygon {
_polygon.map = nil;
}
#pragma mark - FLTGoogleMapPolygonOptionsSink methods
- (void)setConsumeTapEvents:(BOOL)consumes {
_polygon.tappable = consumes;
}
- (void)setVisible:(BOOL)visible {
_polygon.map = visible ? _mapView : nil;
}
- (void)setZIndex:(int)zIndex {
_polygon.zIndex = zIndex;
}
- (void)setPoints:(NSArray<CLLocation *> *)points {
GMSMutablePath *path = [GMSMutablePath path];
for (CLLocation *location in points) {
[path addCoordinate:location.coordinate];
}
_polygon.path = path;
}
- (void)setHoles:(NSArray<NSArray<CLLocation *> *> *)rawHoles {
NSMutableArray<GMSMutablePath *> *holes = [[NSMutableArray<GMSMutablePath *> alloc] init];
for (NSArray<CLLocation *> *points in rawHoles) {
GMSMutablePath *path = [GMSMutablePath path];
for (CLLocation *location in points) {
[path addCoordinate:location.coordinate];
}
[holes addObject:path];
}
_polygon.holes = holes;
}
- (void)setFillColor:(UIColor *)color {
_polygon.fillColor = color;
}
- (void)setStrokeColor:(UIColor *)color {
_polygon.strokeColor = color;
}
- (void)setStrokeWidth:(CGFloat)width {
_polygon.strokeWidth = width;
}
@end
static int ToInt(NSNumber *data) { return [FLTGoogleMapJsonConversions toInt:data]; }
static BOOL ToBool(NSNumber *data) { return [FLTGoogleMapJsonConversions toBool:data]; }
static NSArray<CLLocation *> *ToPoints(NSArray *data) {
return [FLTGoogleMapJsonConversions toPoints:data];
}
static NSArray<NSArray<CLLocation *> *> *ToHoles(NSArray<NSArray *> *data) {
return [FLTGoogleMapJsonConversions toHoles:data];
}
static UIColor *ToColor(NSNumber *data) { return [FLTGoogleMapJsonConversions toColor:data]; }
static void InterpretPolygonOptions(NSDictionary *data, id<FLTGoogleMapPolygonOptionsSink> sink,
NSObject<FlutterPluginRegistrar> *registrar) {
NSNumber *consumeTapEvents = data[@"consumeTapEvents"];
if (consumeTapEvents != nil) {
[sink setConsumeTapEvents:ToBool(consumeTapEvents)];
}
NSNumber *visible = data[@"visible"];
if (visible != nil) {
[sink setVisible:ToBool(visible)];
}
NSNumber *zIndex = data[@"zIndex"];
if (zIndex != nil) {
[sink setZIndex:ToInt(zIndex)];
}
NSArray *points = data[@"points"];
if (points) {
[sink setPoints:ToPoints(points)];
}
NSArray *holes = data[@"holes"];
if (holes) {
[sink setHoles:ToHoles(holes)];
}
NSNumber *fillColor = data[@"fillColor"];
if (fillColor != nil) {
[sink setFillColor:ToColor(fillColor)];
}
NSNumber *strokeColor = data[@"strokeColor"];
if (strokeColor != nil) {
[sink setStrokeColor:ToColor(strokeColor)];
}
NSNumber *strokeWidth = data[@"strokeWidth"];
if (strokeWidth != nil) {
[sink setStrokeWidth:ToInt(strokeWidth)];
}
}
@implementation FLTPolygonsController {
NSMutableDictionary *_polygonIdToController;
FlutterMethodChannel *_methodChannel;
NSObject<FlutterPluginRegistrar> *_registrar;
GMSMapView *_mapView;
}
- (instancetype)init:(FlutterMethodChannel *)methodChannel
mapView:(GMSMapView *)mapView
registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
self = [super init];
if (self) {
_methodChannel = methodChannel;
_mapView = mapView;
_polygonIdToController = [NSMutableDictionary dictionaryWithCapacity:1];
_registrar = registrar;
}
return self;
}
- (void)addPolygons:(NSArray *)polygonsToAdd {
for (NSDictionary *polygon in polygonsToAdd) {
GMSMutablePath *path = [FLTPolygonsController getPath:polygon];
NSString *polygonId = [FLTPolygonsController getPolygonId:polygon];
FLTGoogleMapPolygonController *controller =
[[FLTGoogleMapPolygonController alloc] initPolygonWithPath:path
polygonId:polygonId
mapView:_mapView];
InterpretPolygonOptions(polygon, controller, _registrar);
_polygonIdToController[polygonId] = controller;
}
}
- (void)changePolygons:(NSArray *)polygonsToChange {
for (NSDictionary *polygon in polygonsToChange) {
NSString *polygonId = [FLTPolygonsController getPolygonId:polygon];
FLTGoogleMapPolygonController *controller = _polygonIdToController[polygonId];
if (!controller) {
continue;
}
InterpretPolygonOptions(polygon, controller, _registrar);
}
}
- (void)removePolygonIds:(NSArray *)polygonIdsToRemove {
for (NSString *polygonId in polygonIdsToRemove) {
if (!polygonId) {
continue;
}
FLTGoogleMapPolygonController *controller = _polygonIdToController[polygonId];
if (!controller) {
continue;
}
[controller removePolygon];
[_polygonIdToController removeObjectForKey:polygonId];
}
}
- (void)onPolygonTap:(NSString *)polygonId {
if (!polygonId) {
return;
}
FLTGoogleMapPolygonController *controller = _polygonIdToController[polygonId];
if (!controller) {
return;
}
[_methodChannel invokeMethod:@"polygon#onTap" arguments:@{@"polygonId" : polygonId}];
}
- (bool)hasPolygonWithId:(NSString *)polygonId {
if (!polygonId) {
return false;
}
return _polygonIdToController[polygonId] != nil;
}
+ (GMSMutablePath *)getPath:(NSDictionary *)polygon {
NSArray *pointArray = polygon[@"points"];
NSArray<CLLocation *> *points = ToPoints(pointArray);
GMSMutablePath *path = [GMSMutablePath path];
for (CLLocation *location in points) {
[path addCoordinate:location.coordinate];
}
return path;
}
+ (NSString *)getPolygonId:(NSDictionary *)polygon {
return polygon[@"polygonId"];
}
@end