From 7d44da82eca7fad722a82e73efd9c63f7798a25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Tue, 5 Aug 2014 17:13:48 +0200 Subject: allow moving to map positions with mapboxgl://?center=[lat],[lon]&zoom=[z]&bearing=[b] --- macosx/Info.plist | 11 +++++++++ macosx/main.mm | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) (limited to 'macosx') diff --git a/macosx/Info.plist b/macosx/Info.plist index 366a5d8abc..514db118ea 100644 --- a/macosx/Info.plist +++ b/macosx/Info.plist @@ -32,5 +32,16 @@ 0.0.1 NSHighResolutionCapable + CFBundleURLTypes + + + CFBundleURLName + ${PRODUCT_NAME} + CFBundleURLSchemes + + mapboxgl + + + \ No newline at end of file diff --git a/macosx/main.mm b/macosx/main.mm index 3df85a782a..a1b01de7b3 100644 --- a/macosx/main.mm +++ b/macosx/main.mm @@ -4,6 +4,67 @@ #import +@interface URLHandler : NSObject +@property (nonatomic) mbgl::Map *map; + +- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event + withReplyEvent:(NSAppleEventDescriptor *)replyEvent; +@end + +@implementation URLHandler + +- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event + withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + NSString* urlString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; + NSURL *url = [NSURL URLWithString:urlString]; + NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; + for (NSString *param in [[url query] componentsSeparatedByString:@"&"]) { + NSArray *parts = [param componentsSeparatedByString:@"="]; + if([parts count] < 2) continue; + [params setObject:[parts objectAtIndex:1] forKey:[parts objectAtIndex:0]]; + } + + double latitude = 0, longitude = 0, zoom = 0, bearing = 0; + bool hasCenter = false, hasZoom = false, hasBearing = false; + + NSString *centerString = [params objectForKey:@"center"]; + if (centerString) { + NSArray *latlon = [centerString componentsSeparatedByString:@","]; + if ([latlon count] == 2) { + latitude = [[latlon objectAtIndex:0] doubleValue]; + longitude = [[latlon objectAtIndex:1] doubleValue]; + hasCenter = true; + } + } + + NSString *zoomString = [params objectForKey:@"zoom"]; + if (zoomString) { + zoom = [zoomString doubleValue]; + hasZoom = true; + } + + NSString *bearingString = [params objectForKey:@"bearing"]; + if (bearingString) { + bearing = [bearingString doubleValue]; + hasBearing = true; + } + + if ([self map]) { + if (hasCenter && hasZoom) { + [self map]->setLonLatZoom(longitude, latitude, zoom); + } else if (hasCenter) { + [self map]->setLonLat(longitude, latitude); + } else if (hasZoom) { + [self map]->setZoom(zoom); + } + + if (hasBearing) { + [self map]->setBearing(bearing); + } + } +} +@end + int main() { mbgl::Log::Set(); @@ -16,6 +77,9 @@ int main() { map.setBearing(settings.bearing); map.setDebug(settings.debug); + URLHandler *handler = [[URLHandler alloc] init]; + [handler setMap:&map]; + // Set access token if present NSString *accessToken = [[NSProcessInfo processInfo] environment][@"MAPBOX_ACCESS_TOKEN"]; if ( ! accessToken) mbgl::Log::Warning(mbgl::Event::Setup, "No access token set. Mapbox vector tiles won't work."); @@ -28,6 +92,10 @@ int main() { error:nil]; map.setStyleJSON((std::string)[json cStringUsingEncoding:[NSString defaultCStringEncoding]]); + NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager]; + [appleEventManager setEventHandler:handler andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; + + int ret = view.run(); // Save settings -- cgit v1.2.1