summaryrefslogtreecommitdiff
path: root/platform/osx
diff options
context:
space:
mode:
Diffstat (limited to 'platform/osx')
-rw-r--r--platform/osx/INSTALL.md2
-rw-r--r--platform/osx/README.md2
-rw-r--r--platform/osx/app/MainMenu.xib16
-rw-r--r--platform/osx/app/MapDocument.m44
-rw-r--r--platform/osx/include/MGLAccountManager.h44
-rw-r--r--platform/osx/include/MGLAnnotationImage.h58
-rw-r--r--platform/osx/include/MGLMapView+IBAdditions.h68
-rw-r--r--platform/osx/include/MGLMapView.h639
-rw-r--r--platform/osx/include/MGLMapViewDelegate.h199
-rwxr-xr-xplatform/osx/scripts/run.sh5
-rw-r--r--platform/osx/sdk/Mapbox.m2
-rw-r--r--platform/osx/sdk/framework-osx.gypi2
-rw-r--r--platform/osx/src/MGLAccountManager.m2
-rw-r--r--platform/osx/src/MGLAccountManager_Private.h2
-rw-r--r--platform/osx/src/MGLAnnotationImage.m2
-rw-r--r--platform/osx/src/MGLMapView+IBAdditions.m2
-rw-r--r--platform/osx/src/MGLMapView.mm24
-rw-r--r--platform/osx/src/MGLMapView_Private.h2
-rw-r--r--platform/osx/src/MGLOpenGLLayer.mm2
-rw-r--r--platform/osx/test/MGLGeometryTests.mm2
-rw-r--r--platform/osx/test/osxtest.gypi4
21 files changed, 1087 insertions, 36 deletions
diff --git a/platform/osx/INSTALL.md b/platform/osx/INSTALL.md
index 4016c360c6..e4566625eb 100644
--- a/platform/osx/INSTALL.md
+++ b/platform/osx/INSTALL.md
@@ -23,7 +23,7 @@ The Mapbox OS X SDK requires the OS X 10.10.0 SDK or above.
## Use
-The [Mapbox iOS SDK’s API documentation](https://www.mapbox.com/ios-sdk/api/3.0.1/) applies to the Mapbox OS X SDK with few differences, mostly around unimplemented features like user location tracking.
+The [Mapbox iOS SDK’s API documentation](https://www.mapbox.com/ios-sdk/api/) applies to the Mapbox OS X SDK with few differences, mostly around unimplemented features like user location tracking.
## Troubleshooting
diff --git a/platform/osx/README.md b/platform/osx/README.md
index 8a21897f64..3f9a5cd62e 100644
--- a/platform/osx/README.md
+++ b/platform/osx/README.md
@@ -4,7 +4,7 @@
A library based on [Mapbox GL Native](../../README.md) for embedding interactive map views with scalable, customizable vector maps into Cocoa applications on OS X 10.10.0 and above using Objective-C, Swift, or Interface Builder.
-This SDK is analogous to the Mapbox iOS SDK, and much of the iOS SDK documentation applies here. Mapbox does not officially support the OS X to the same extent as the iOS SDK; however, bug reports and pull requests are certainly welcome.
+This SDK is analogous to the Mapbox iOS SDK, and much of the iOS SDK documentation applies here. Mapbox does not officially support the OS X SDK to the same extent as the iOS SDK; however, bug reports and pull requests are certainly welcome.
* [Integrating the Mapbox OS X SDK into your application](INSTALL.md)
* [Contributing to the Mapbox OS X SDK](DEVELOPING.md)
diff --git a/platform/osx/app/MainMenu.xib b/platform/osx/app/MainMenu.xib
index 844af08f3e..64ff4e550d 100644
--- a/platform/osx/app/MainMenu.xib
+++ b/platform/osx/app/MainMenu.xib
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10109" systemVersion="15E39d" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
- <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9531"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10109"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -473,10 +473,16 @@
<action selector="dropManyPins:" target="-1" id="Rtv-8N-3Z8"/>
</connections>
</menuItem>
- <menuItem title="Remove All Pins" id="6rC-68-vk0">
+ <menuItem title="Add Polygon and Polyline" id="DVr-vT-lpe">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
- <action selector="removeAllPins:" target="-1" id="NRM-y5-Wul"/>
+ <action selector="drawPolygonAndPolyLineAnnotations:" target="-1" id="EhT-CB-gee"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Remove All Annotations" id="6rC-68-vk0">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="removeAllAnnotations:" target="-1" id="6v3-0E-LsR"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="wQq-Mx-QY0"/>
@@ -545,7 +551,7 @@
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="109" y="131" width="350" height="62"/>
- <rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1050"/>
<view key="contentView" id="eA4-n3-qPe">
<rect key="frame" x="0.0" y="0.0" width="350" height="62"/>
<autoresizingMask key="autoresizingMask"/>
diff --git a/platform/osx/app/MapDocument.m b/platform/osx/app/MapDocument.m
index 6881f6bd5b..7c42bc9802 100644
--- a/platform/osx/app/MapDocument.m
+++ b/platform/osx/app/MapDocument.m
@@ -33,6 +33,7 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = {
BOOL _showsToolTipsOnDroppedPins;
BOOL _randomizesCursorsOnDroppedPins;
BOOL _isTouringWorld;
+ BOOL _isShowingPolygonAndPolylineAnnotations;
}
#pragma mark Lifecycle
@@ -241,7 +242,7 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = {
}
- (IBAction)dropManyPins:(id)sender {
- [self.mapView removeAnnotations:self.mapView.annotations];
+ [self removeAllAnnotations:sender];
NSRect bounds = self.mapView.bounds;
NSMutableArray *annotations = [NSMutableArray array];
@@ -273,14 +274,15 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = {
}
}
-- (IBAction)removeAllPins:(id)sender {
+- (IBAction)removeAllAnnotations:(id)sender {
[self.mapView removeAnnotations:self.mapView.annotations];
+ _isShowingPolygonAndPolylineAnnotations = NO;
}
- (IBAction)startWorldTour:(id)sender {
_isTouringWorld = YES;
- [self removeAllPins:sender];
+ [self removeAllAnnotations:sender];
NSUInteger numberOfAnnotations = sizeof(WorldTourDestinations) / sizeof(WorldTourDestinations[0]);
NSMutableArray *annotations = [NSMutableArray arrayWithCapacity:numberOfAnnotations];
for (NSUInteger i = 0; i < numberOfAnnotations; i++) {
@@ -319,6 +321,35 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = {
self.mapView.camera = self.mapView.camera;
}
+- (IBAction)drawPolygonAndPolyLineAnnotations:(id)sender {
+
+ if (_isShowingPolygonAndPolylineAnnotations) {
+ [self removeAllAnnotations:sender];
+ return;
+ }
+
+ _isShowingPolygonAndPolylineAnnotations = YES;
+
+ // Pacific Northwest triangle
+ CLLocationCoordinate2D triangleCoordinates[3] = {
+ CLLocationCoordinate2DMake(44, -122),
+ CLLocationCoordinate2DMake(46, -122),
+ CLLocationCoordinate2DMake(46, -121)
+ };
+ MGLPolygon *triangle = [MGLPolygon polygonWithCoordinates:triangleCoordinates count:3];
+ [self.mapView addAnnotation:triangle];
+
+ // West coast line
+ CLLocationCoordinate2D lineCoordinates[4] = {
+ CLLocationCoordinate2DMake(47.6025, -122.3327),
+ CLLocationCoordinate2DMake(45.5189, -122.6726),
+ CLLocationCoordinate2DMake(37.7790, -122.4177),
+ CLLocationCoordinate2DMake(34.0532, -118.2349)
+ };
+ MGLPolyline *line = [MGLPolyline polylineWithCoordinates:lineCoordinates count:4];
+ [self.mapView addAnnotation:line];
+}
+
#pragma mark Help methods
- (IBAction)giveFeedback:(id)sender {
@@ -457,8 +488,8 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = {
if (menuItem.action == @selector(dropManyPins:)) {
return YES;
}
- if (menuItem.action == @selector(removeAllPins:)) {
- return self.mapView.annotations.count;
+ if (menuItem.action == @selector(removeAllAnnotations:)) {
+ return self.mapView.annotations.count > 0;
}
if (menuItem.action == @selector(startWorldTour:)) {
return !_isTouringWorld;
@@ -466,6 +497,9 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = {
if (menuItem.action == @selector(stopWorldTour:)) {
return _isTouringWorld;
}
+ if (menuItem.action == @selector(drawPolygonAndPolyLineAnnotations:)) {
+ return !_isShowingPolygonAndPolylineAnnotations;
+ }
if (menuItem.action == @selector(giveFeedback:)) {
return YES;
}
diff --git a/platform/osx/include/MGLAccountManager.h b/platform/osx/include/MGLAccountManager.h
new file mode 100644
index 0000000000..efcec5419c
--- /dev/null
+++ b/platform/osx/include/MGLAccountManager.h
@@ -0,0 +1,44 @@
+#import <Foundation/Foundation.h>
+
+#import "MGLTypes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** The MGLAccountManager object provides a global way to set a Mapbox API
+ access token, as well as other settings used framework-wide. */
+@interface MGLAccountManager : NSObject
+
+#pragma mark Authorizing access
+/** @name Authorizing Access */
+
+/** Set the
+ [Mapbox access token](https://www.mapbox.com/help/define-access-token/) to
+ used by all instances of MGLMapView in the current application.
+
+ Mapbox-hosted vector tiles and styles require an API access token, which you
+ can obtain from the
+ [Mapbox account page](https://www.mapbox.com/studio/account/tokens/). Access
+ tokens associate requests to Mapbox’s vector tile and style APIs with your
+ Mapbox account. They also deter other developers from using your styles
+ without your permission.
+
+ @param accessToken A Mapbox access token. Calling this method with a value
+ of `nil` has no effect.
+
+ @note You must set the access token before attempting to load any
+ Mapbox-hosted style. Therefore, you should generally set it before
+ creating an instance of MGLMapView. The recommended way to set an access
+ token is to add an entry to your application’s Info.plist file with the
+ key `MGLMapboxAccessToken` and the type String. Alternatively, you may
+ call this method from your application delegate’s
+ -applicationDidFinishLaunching: method. */
++ (void)setAccessToken:(nullable NSString *)accessToken;
+
+/** Returns the
+ [Mapbox access token](https://www.mapbox.com/help/define-access-token/) in
+ use by instances of MGLMapView in the current application. */
++ (nullable NSString *)accessToken;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/osx/include/MGLAnnotationImage.h b/platform/osx/include/MGLAnnotationImage.h
new file mode 100644
index 0000000000..a33ea75a5e
--- /dev/null
+++ b/platform/osx/include/MGLAnnotationImage.h
@@ -0,0 +1,58 @@
+#import <AppKit/AppKit.h>
+
+#import "MGLTypes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** The MGLAnnotationImage class is responsible for presenting point-based
+ annotations visually on an MGLMapView instance. Annotation image objects
+ pair NSImage objects with annotation-related metadata. They may be recycled
+ later and put into a reuse queue that is maintained by the map view. */
+@interface MGLAnnotationImage : NSObject
+
+#pragma mark Initializing and preparing the image object
+/** @name Initializing and Preparing the Image Object */
+
+/** Initializes and returns a new annotation image object.
+
+ @param image The image to display for the annotation.
+ @param reuseIdentifier The string that identifies this annotation image in
+ the reuse queue.
+ @return The initialized annotation image object or `nil` if there was a
+ problem initializing the object. */
++ (instancetype)annotationImageWithImage:(NSImage *)image reuseIdentifier:(NSString *)reuseIdentifier;
+
+#pragma mark Getting and setting attributes
+/** @name Getting and Setting Attributes */
+
+/** The image to display for the annotation. */
+@property (nonatomic, readonly) NSImage *image;
+
+/** The string that identifies this annotation image in the reuse queue.
+ (read-only)
+
+ You specify the reuse identifier when you create the image object. You use
+ this type later to retrieve an annotation image object that was created
+ previously but which is currently unused because its annotation is not
+ on-screen.
+
+ If you define distinctly different types of annotations (with distinctly
+ different annotation images to go with them), you can differentiate between
+ the annotation types by specifying different reuse identifiers for each one.
+ */
+@property (nonatomic, readonly) NSString *reuseIdentifier;
+
+/** A Boolean value indicating whether the annotation is selectable.
+
+ The default value of this property is `YES`. If the value of this property
+ is `NO`, the annotation image ignores click events and cannot be selected.
+ */
+@property (nonatomic, getter=isSelectable) BOOL selectable;
+
+/** The cursor that appears above any annotation using this annotation image. By
+ default, this property is set to `nil`, representing the current cursor. */
+@property (nonatomic, nullable) NSCursor *cursor;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/osx/include/MGLMapView+IBAdditions.h b/platform/osx/include/MGLMapView+IBAdditions.h
new file mode 100644
index 0000000000..81f4506a57
--- /dev/null
+++ b/platform/osx/include/MGLMapView+IBAdditions.h
@@ -0,0 +1,68 @@
+#import <Foundation/Foundation.h>
+
+#import "MGLMapView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MGLMapView (IBAdditions)
+
+#if TARGET_INTERFACE_BUILDER
+
+// Core properties that can be manipulated in the Attributes inspector in
+// Interface Builder. These redeclarations merely add the IBInspectable keyword.
+// They appear here to ensure that they appear above the convenience properties;
+// inspectables declared in MGLMapView.h are always sorted before those in
+// MGLMapView+IBAdditions.h, due to ASCII sort order.
+
+// We want this property to look like a URL bar in the Attributes inspector, but
+// just calling it styleURL would violate Cocoa naming conventions and conflict
+// with the existing NSURL property. Fortunately, IB strips out the two
+// underscores for display.
+
+/** URL of the style currently displayed in the receiver.
+
+ The URL may be a full HTTP or HTTPS URL, a Mapbox URL indicating the style’s
+ map ID (`mapbox://styles/<user>/<style>`), or a path to a local file
+ relative to the application’s resource path. Leave this field blank for the
+ default style. */
+@property (nonatomic, nullable) IBInspectable NSString *styleURL__;
+
+// Convenience properties related to the initial viewport. These properties
+// are not meant to be used outside of Interface Builder. latitude and longitude
+// are backed by properties of type CLLocationDegrees, but these declarations
+// must use the type double because Interface Builder is unaware that
+// CLLocationDegrees is a typedef for double.
+
+/** The initial center latitude. */
+@property (nonatomic) IBInspectable double latitude;
+
+/** The initial center longitude. */
+@property (nonatomic) IBInspectable double longitude;
+
+@property (nonatomic) IBInspectable double zoomLevel;
+
+// Renamed properties. Interface Builder derives the display name of each
+// inspectable from the runtime name, but runtime names don’t always make sense
+// in UI.
+
+/** A Boolean value that determines whether the user may zoom the map, changing
+ its zoom level. */
+@property (nonatomic) IBInspectable BOOL allowsZooming;
+
+/** A Boolean value that determines whether the user may scroll around the map,
+ changing its center coordinate. */
+@property (nonatomic) IBInspectable BOOL allowsScrolling;
+
+/** A Boolean value that determines whether the user may rotate the map,
+ changing its direction. */
+@property (nonatomic) IBInspectable BOOL allowsRotating;
+
+/** A Boolean value that determines whether the user may tilt the map, changing
+ its pitch. */
+@property (nonatomic) IBInspectable BOOL allowsTilting;
+
+#endif
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/osx/include/MGLMapView.h b/platform/osx/include/MGLMapView.h
new file mode 100644
index 0000000000..ca55ba7cd5
--- /dev/null
+++ b/platform/osx/include/MGLMapView.h
@@ -0,0 +1,639 @@
+#import <Cocoa/Cocoa.h>
+#import <CoreLocation/CoreLocation.h>
+
+#import "MGLGeometry.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** Options for enabling debugging features in an MGLMapView instance. */
+typedef NS_OPTIONS(NSUInteger, MGLMapDebugMaskOptions) {
+ /** Edges of tile boundaries are shown as thick, red lines to help diagnose
+ tile clipping issues. */
+ MGLMapDebugTileBoundariesMask = 1 << 1,
+
+ /** Each tile shows its tile coordinate (x/y/z) in the upper-left corner. */
+ MGLMapDebugTileInfoMask = 1 << 2,
+
+ /** Each tile shows a timestamp indicating when it was loaded. */
+ MGLMapDebugTimestampsMask = 1 << 3,
+
+ /** Edges of glyphs and symbols are shown as faint, green lines to help
+ diagnose collision and label placement issues. */
+ MGLMapDebugCollisionBoxesMask = 1 << 4,
+};
+
+@class MGLAnnotationImage;
+@class MGLMapCamera;
+
+@protocol MGLAnnotation;
+@protocol MGLMapViewDelegate;
+@protocol MGLOverlay;
+
+/** An interactive, customizable map view with an interface similar to the one
+ provided by Apple’s MapKit.
+
+ Using MGLMapView, you can embed the map inside a view, allow users to
+ manipulate it with standard gestures, animate the map between different
+ viewpoints, and present information in the form of annotations and overlays.
+
+ The map view loads scalable vector tiles that conform to the
+ [Mapbox Vector Tile Specification](https://github.com/mapbox/vector-tile-spec).
+ It styles them with a style that conforms to the
+ [Mapbox GL style specification](https://www.mapbox.com/mapbox-gl-style-spec/).
+ Such styles can be designed in [Mapbox Studio](https://www.mapbox.com/studio/)
+ and hosted on mapbox.com.
+
+ A collection of Mapbox-hosted styles is available through the MGLStyle
+ class. These basic styles use
+ [Mapbox Streets](https://www.mapbox.com/developers/vector-tiles/mapbox-streets)
+ or [Mapbox Satellite](https://www.mapbox.com/satellite/) data sources, but
+ you can specify a custom style that makes use of your own data.
+
+ Mapbox-hosted vector tiles and styles require an API access token, which you
+ can obtain from the
+ [Mapbox account page](https://www.mapbox.com/studio/account/tokens/). Access
+ tokens associate requests to Mapbox’s vector tile and style APIs with your
+ Mapbox account. They also deter other developers from using your styles
+ without your permission.
+
+ @note You are responsible for getting permission to use the map data and for
+ ensuring that your use adheres to the relevant terms of use. */
+IB_DESIGNABLE
+@interface MGLMapView : NSView
+
+#pragma mark Creating instances
+/** @name Creating Instances */
+
+/** Initializes and returns a newly allocated map view with the specified frame
+ and the default style.
+
+ @param frame The frame for the view, measured in points.
+ @return An initialized map view. */
+- (instancetype)initWithFrame:(NSRect)frame;
+
+/** Initializes and returns a newly allocated map view with the specified frame
+ and style URL.
+
+ @param frame The frame for the view, measured in points.
+ @param styleURL URL of the map style to display. The URL may be a full HTTP
+ or HTTPS URL, a Mapbox URL indicating the style’s map ID
+ (`mapbox://styles/<user>/<style>`), or a path to a local file relative
+ to the application’s resource path. Specify `nil` for the default style.
+ @return An initialized map view. */
+- (instancetype)initWithFrame:(NSRect)frame styleURL:(nullable NSURL *)styleURL;
+
+#pragma mark Accessing the delegate
+/** @name Accessing the Delegate */
+
+/** The receiver’s delegate.
+
+ A map view sends messages to its delegate to notify it of changes to its
+ contents or the viewpoint. The delegate also provides information about
+ annotations displayed on the map, such as the styles to apply to individual
+ annotations. */
+@property (nonatomic, weak, nullable) IBOutlet id <MGLMapViewDelegate> delegate;
+
+#pragma mark Configuring the map’s appearance
+/** @name Configuring the Map’s Appearance */
+
+
+/** URL of the style currently displayed in the receiver.
+
+ The URL may be a full HTTP or HTTPS URL, a Mapbox URL indicating the style’s
+ map ID (`mapbox://styles/<user>/<style>`), or a path to a local file
+ relative to the application’s resource path.
+
+ If you set this property to `nil`, the receiver will use the default style
+ and this property will automatically be set to that style’s URL. */
+@property (nonatomic, null_resettable) NSURL *styleURL;
+
+/** Reloads the style.
+
+ You do not normally need to call this method. The map view automatically
+ responds to changes in network connectivity by reloading the style. You may
+ need to call this method if you change the access token after a style has
+ loaded but before loading a style associated with a different Mapbox
+ account. */
+- (IBAction)reloadStyle:(id)sender;
+
+/** A control for zooming in and out, positioned in the lower-right corner. */
+@property (nonatomic, readonly) NSSegmentedControl *zoomControls;
+
+/** A control indicating the map’s direction and allowing the user to manipulate
+ the direction, positioned above the zoom controls in the lower-right corner.
+ */
+@property (nonatomic, readonly) NSSlider *compass;
+
+/** The Mapbox logo, positioned in the lower-left corner.
+
+ @note The Mapbox terms of service, which governs the use of Mapbox-hosted
+ vector tiles and styles,
+ [requires](https://www.mapbox.com/help/mapbox-logo/) most Mapbox
+ customers to display the Mapbox logo. If this applies to you, do not
+ hide this view or change its contents. */
+@property (nonatomic, readonly) NSImageView *logoView;
+
+/** A view showing legally required copyright notices, positioned along the
+ bottom of the map view, to the left of the Mapbox logo.
+
+ @note The Mapbox terms of service, which governs the use of Mapbox-hosted
+ vector tiles and styles,
+ [requires](https://www.mapbox.com/help/attribution/) these copyright
+ notices to accompany any map that features Mapbox-designed styles,
+ OpenStreetMap data, or other Mapbox data such as satellite or terrain
+ data. If that applies to this map view, do not hide this view or remove
+ any notices from it. */
+@property (nonatomic, readonly) NSView *attributionView;
+
+#pragma mark Manipulating the viewpoint
+/** @name Manipulating the Viewpoint */
+
+/** The geographic coordinate at the center of the map view.
+
+ Changing the value of this property centers the map on the new coordinate
+ without changing the current zoom level.
+
+ Changing the value of this property updates the map view immediately. If you
+ want to animate the change, use the -setCenterCoordinate:animated: method
+ instead. */
+@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
+
+/** Changes the center coordinate of the map and optionally animates the change.
+
+ Changing the center coordinate centers the map on the new coordinate without
+ changing the current zoom level.
+
+ @param coordinate The new center coordinate for the map.
+ @param animated Specify `YES` if you want the map view to scroll to the new
+ location or `NO` if you want the map to display the new location
+ immediately. */
+- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
+
+/** The zoom level of the receiver.
+
+ In addition to affecting the visual size and detail of features on the map,
+ the zoom level affects the size of the vector tiles that are loaded. At zoom
+ level 0, each tile covers the entire world map; at zoom level 1, it covers ¼
+ of the world; at zoom level 2, <sup>1</sup>⁄<sub>16</sub> of the world, and
+ so on.
+
+ Changing the value of this property updates the map view immediately. If you
+ want to animate the change, use the -setZoomLevel:animated: method instead.
+ */
+@property (nonatomic) double zoomLevel;
+
+/**
+ * The minimum zoom level at which the map can be shown.
+ *
+ * Depending on the map view’s aspect ratio, the map view may be prevented
+ * from reaching the minimum zoom level, in order to keep the map from
+ * repeating within the current viewport.
+ *
+ * If the value of this property is greater than that of the
+ * maximumZoomLevel property, the behavior is undefined.
+ *
+ * The default minimumZoomLevel is 0.
+ */
+@property (nonatomic) double minimumZoomLevel;
+
+/**
+ * The maximum zoom level the map can be shown at.
+ *
+ * If the value of this property is smaller than that of the
+ * minimumZoomLevel property, the behavior is undefined.
+ *
+ * The default maximumZoomLevel is 20.
+ */
+@property (nonatomic) double maximumZoomLevel;
+
+/** Changes the zoom level of the map and optionally animates the change.
+
+ Changing the zoom level scales the map without changing the current center
+ coordinate.
+
+ @param zoomLevel The new zoom level for the map.
+ @param animated Specify `YES` if you want the map view to animate the change
+ to the new zoom level or `NO` if you want the map to display the new
+ zoom level immediately. */
+- (void)setZoomLevel:(double)zoomLevel animated:(BOOL)animated;
+
+/** The heading of the map, measured in degrees clockwise from true north.
+
+ The value `0` means that the top edge of the map view corresponds to true
+ north. The value `90` means the top of the map is pointing due east. The
+ value `180` means the top of the map points due south, and so on.
+
+ Changing the value of this property updates the map view immediately. If you
+ want to animate the change, use the -setDirection:animated: method instead.
+ */
+@property (nonatomic) CLLocationDirection direction;
+
+/** Changes the heading of the map and optionally animates the change.
+
+ @param direction The heading of the map, measured in degrees clockwise from
+ true north.
+ @param animated Specify `YES` if you want the map view to animate the change
+ to the new heading or `NO` if you want the map to display the new
+ heading immediately.
+
+ Changing the heading rotates the map without changing the current center
+ coordinate or zoom level. */
+- (void)setDirection:(CLLocationDirection)direction animated:(BOOL)animated;
+
+/** A camera representing the current viewpoint of the map. */
+@property (nonatomic, copy) MGLMapCamera *camera;
+
+/** Moves the viewpoint to a different location with respect to the map with an
+ optional transition animation.
+
+ @param camera The new viewpoint.
+ @param animated Specify `YES` if you want the map view to animate the change
+ to the new viewpoint or `NO` if you want the map to display the new
+ viewpoint immediately. */
+- (void)setCamera:(MGLMapCamera *)camera animated:(BOOL)animated;
+
+/** Moves the viewpoint to a different location with respect to the map with an
+ optional transition duration and timing function.
+
+ @param camera The new viewpoint.
+ @param duration The amount of time, measured in seconds, that the transition
+ animation should take. Specify `0` to jump to the new viewpoint
+ instantaneously.
+ @param function A timing function used for the animation. Set this parameter
+ to `nil` for a transition that matches most system animations. If the
+ duration is `0`, this parameter is ignored.
+ @param completion The block to execute after the animation finishes. */
+- (void)setCamera:(MGLMapCamera *)camera withDuration:(NSTimeInterval)duration animationTimingFunction:(nullable CAMediaTimingFunction *)function completionHandler:(nullable void (^)(void))completion;
+
+/** Moves the viewpoint to a different location using a transition animation
+ that evokes powered flight and a default duration based on the length of the
+ flight path.
+
+ The transition animation seamlessly incorporates zooming and panning to help
+ the user find his or her bearings even after traversing a great distance.
+
+ @param camera The new viewpoint.
+ @param completion The block to execute after the animation finishes. */
+- (void)flyToCamera:(MGLMapCamera *)camera completionHandler:(nullable void (^)(void))completion;
+
+/** Moves the viewpoint to a different location using a transition animation
+ that evokes powered flight and an optional transition duration.
+
+ The transition animation seamlessly incorporates zooming and panning to help
+ the user find his or her bearings even after traversing a great distance.
+
+ @param camera The new viewpoint.
+ @param duration The amount of time, measured in seconds, that the transition
+ animation should take. Specify `0` to jump to the new viewpoint
+ instantaneously. Specify a negative value to use the default duration,
+ which is based on the length of the flight path.
+ @param completion The block to execute after the animation finishes. */
+- (void)flyToCamera:(MGLMapCamera *)camera withDuration:(NSTimeInterval)duration completionHandler:(nullable void (^)(void))completion;
+
+/** Moves the viewpoint to a different location using a transition animation
+ that evokes powered flight and an optional transition duration and peak
+ altitude.
+
+ The transition animation seamlessly incorporates zooming and panning to help
+ the user find his or her bearings even after traversing a great distance.
+
+ @param camera The new viewpoint.
+ @param duration The amount of time, measured in seconds, that the transition
+ animation should take. Specify `0` to jump to the new viewpoint
+ instantaneously. Specify a negative value to use the default duration,
+ which is based on the length of the flight path.
+ @param peakAltitude The altitude, measured in meters, at the midpoint of the
+ animation. The value of this parameter is ignored if it is negative or
+ if the animation transition resulting from a similar call to
+ `-setCamera:animated:` would have a midpoint at a higher altitude.
+ @param completion The block to execute after the animation finishes. */
+- (void)flyToCamera:(MGLMapCamera *)camera withDuration:(NSTimeInterval)duration peakAltitude:(CLLocationDistance)peakAltitude completionHandler:(nullable void (^)(void))completion;
+
+/** The geographic coordinate bounds visible in the receiver’s viewport.
+
+ Changing the value of this property updates the receiver immediately. If you
+ want to animate the change, use the -setVisibleCoordinateBounds:animated:
+ method instead. */
+@property (nonatomic) MGLCoordinateBounds visibleCoordinateBounds;
+
+/** Changes the receiver’s viewport to fit the given coordinate bounds,
+ optionally animating the change.
+
+ @param bounds The bounds that the viewport will show in its entirety.
+ @param animated Specify `YES` to animate the change by smoothly scrolling
+ and zooming or `NO` to immediately display the given bounds. */
+- (void)setVisibleCoordinateBounds:(MGLCoordinateBounds)bounds animated:(BOOL)animated;
+
+/** A Boolean value indicating whether the receiver automatically adjusts its
+ content insets.
+
+ When the value of this property is `YES`, the map view automatically updates
+ its `contentInsets` property to account for any overlapping title bar or
+ toolbar. To overlap with the title bar or toolbar, the containing window’s
+ style mask must have `NSFullSizeContentViewWindowMask` set, and the title
+ bar must not be transparent.
+
+ The default value of this property is `YES`. */
+@property (nonatomic, assign) BOOL automaticallyAdjustsContentInsets;
+
+/** The distance from the edges of the map view’s frame to the edges of the map
+ view’s logical viewport.
+
+ When the value of this property is equal to `NSEdgeInsetsZero`, viewport
+ properties such as `centerCoordinate` assume a viewport that matches the map
+ view’s frame. Otherwise, those properties are inset, excluding part of the
+ frame from the viewport. For instance, if the only the top edge is inset,
+ the map center is effectively shifted downward.
+
+ When the value of the `automaticallyAdjustsContentInsets` property is `YES`,
+ the value of this property may be overridden at any time.
+
+ Changing the value of this property updates the map view immediately. If you
+ want to animate the change, use the `-setContentInsets:animated:` method
+ instead. */
+@property (nonatomic, assign) NSEdgeInsets contentInsets;
+
+/** Sets the distance from the edges of the map view’s frame to the edges of the
+ map view’s logical viewport, with an optional transition animation.
+
+ When the value of this property is equal to `NSEdgeInsetsZero`, viewport
+ properties such as `centerCoordinate` assume a viewport that matches the map
+ view’s frame. Otherwise, those properties are inset, excluding part of the
+ frame from the viewport. For instance, if the only the top edge is inset,
+ the map center is effectively shifted downward.
+
+ When the value of the `automaticallyAdjustsContentInsets` property is `YES`,
+ the value of this property may be overridden at any time.
+
+ @param contentInsets The new values to inset the content by.
+ @param animated Specify `YES` if you want the map view to animate the change
+ to the content insets or `NO` if you want the map to inset the content
+ immediately. */
+- (void)setContentInsets:(NSEdgeInsets)contentInsets animated:(BOOL)animated;
+
+#pragma mark Configuring gesture recognition
+/** @name Configuring How the User Interacts with the Map */
+
+/** A Boolean value that determines whether the user may zoom the map in and
+ out, changing the zoom level.
+
+ When this property is set to `YES`, the default, the user may zoom the map
+ in and out by pinching two fingers, by using a scroll wheel on a
+ traditional mouse, or by dragging the mouse cursor up and down while holding
+ down the Shift key. When the receiver has focus, the user may also zoom by
+ pressing the up and down arrow keys while holding down the Option key.
+
+ This property controls only user interactions with the map. If you set the
+ value of this property to `NO`, you may still change the map zoom
+ programmatically. */
+@property (nonatomic, getter=isZoomEnabled) BOOL zoomEnabled;
+
+/** A Boolean value that determines whether the user may scroll around the map,
+ changing the center coordinate.
+
+ When this property is set to `YES`, the default, the user may scroll the map
+ by swiping with two fingers or dragging the mouse cursor. When the receiver
+ has focus, the user may also scroll around the map by pressing the arrow
+ keys.
+
+ This property controls only user interactions with the map. If you set the
+ value of this property to `NO`, you may still change the map location
+ programmatically. */
+@property (nonatomic, getter=isScrollEnabled) BOOL scrollEnabled;
+
+/** A Boolean value that determines whether the user may rotate the map,
+ changing the direction.
+
+ When this property is set to `YES`, the default, the user may rotate the map
+ by moving two fingers in a circular motion or by dragging the mouse cursor
+ left and right while holding down the Option key. When the receiver has
+ focus, the user may also zoom by pressing the left and right arrow keys
+ while holding down the Option key.
+
+ This property controls only user interactions with the map. If you set the
+ value of this property to `NO`, you may still rotate the map
+ programmatically. */
+@property (nonatomic, getter=isRotateEnabled) BOOL rotateEnabled;
+
+/** A Boolean value that determines whether the user may tilt of the map,
+ changing the pitch.
+
+ When this property is set to `YES`, the default, the user may rotate the map
+ by dragging the mouse cursor up and down while holding down the Option key.
+
+ This property controls only user interactions with the map. If you set the
+ value of this property to `NO`, you may still change the pitch of the map
+ programmatically. */
+@property (nonatomic, getter=isPitchEnabled) BOOL pitchEnabled;
+
+#pragma mark Annotating the map
+/** @name Annotating the Map */
+
+/** The complete list of annotations associated with the receiver. (read-only)
+
+ The objects in this array must adopt the MGLAnnotation protocol. If no
+ annotations are associated with the map view, the value of this property is
+ `nil`. */
+@property (nonatomic, readonly, nullable) NS_ARRAY_OF(id <MGLAnnotation>) *annotations;
+
+/** Adds an annotation to the map view.
+
+ @param annotation The annotation object to add to the receiver. This object
+ must conform to the MGLAnnotation protocol. The map view retains the
+ annotation object. */
+- (void)addAnnotation:(id <MGLAnnotation>)annotation;
+
+/** Adds an array of annotations to the map view.
+
+ @param annotations An array of annotation objects. Each object in the array
+ must conform to the MGLAnnotation protocol. The map view retains each
+ individual annotation object. */
+- (void)addAnnotations:(NS_ARRAY_OF(id <MGLAnnotation>) *)annotations;
+
+/** Removes an annotation from the map view, deselecting it if it is selected.
+
+ Removing an annotation object dissociates it from the map view entirely,
+ preventing it from being displayed on the map. Thus you would typically call
+ this method only when you want to hide or delete a given annotation.
+
+ @param annotation The annotation object to remove. This object must conform
+ to the MGLAnnotation protocol. */
+- (void)removeAnnotation:(id <MGLAnnotation>)annotation;
+
+/** Removes an array of annotations from the map view, deselecting any selected
+ annotations in the array.
+
+ Removing annotation objects dissociates them from the map view entirely,
+ preventing them from being displayed on the map. Thus you would typically
+ call this method only when you want to hide or delete the given annotations.
+
+ @param annotations The array of annotation objects to remove. Objects in the
+ array must conform to the MGLAnnotation protocol. */
+- (void)removeAnnotations:(NS_ARRAY_OF(id <MGLAnnotation>) *)annotations;
+
+/** Returns a reusable annotation image object associated with its identifier.
+
+ For performance reasons, you should generally reuse MGLAnnotationImage
+ objects for identical-looking annotations in your map views. Dequeueing
+ saves time and memory during performance-critical operations such as
+ scrolling.
+
+ @param identifier A string identifying the annotation image to be reused.
+ This string is the same one you specify when initially returning the
+ annotation image object using the -mapView:imageForAnnotation: method.
+ @return An annotation image object with the given identifier, or `nil` if no
+ such object exists in the reuse queue. */
+- (nullable MGLAnnotationImage *)dequeueReusableAnnotationImageWithIdentifier:(NSString *)identifier;
+
+#pragma mark Managing annotation selections
+/** @name Managing Annotation Selections */
+
+/** The currently selected annotations.
+
+ Assigning a new array to this property selects only the first annotation in
+ the array. */
+@property (nonatomic, copy) NS_ARRAY_OF(id <MGLAnnotation>) *selectedAnnotations;
+
+/** Selects an annotation and displays a callout popover for it.
+
+ If the given annotation is not visible within the current viewport, this
+ method has no effect.
+
+ @param annotation The annotation object to select. */
+- (void)selectAnnotation:(id <MGLAnnotation>)annotation;
+
+/** Deselects an annotation and hides its callout popover.
+
+ @param annotation The annotation object to deselect. */
+- (void)deselectAnnotation:(nullable id <MGLAnnotation>)annotation;
+
+/** A common view controller for managing a callout popover’s content view.
+
+ Like any instance of NSPopover, an annotation callout manages its contents
+ with a view controller. The annotation object is the view controller’s
+ represented object. This means that you can bind controls in the view
+ controller’s content view to KVO-compliant properties of the annotation
+ object, such as -title and -subtitle.
+
+ This property defines a common view controller that is used for every
+ annotation’s callout view. If you set this property to `nil`, a default
+ view controller will be used that manages a simple title label and subtitle
+ label. If you need distinct view controllers for different annotations, the
+ map view’s delegate should implement
+ -mapView:calloutViewControllerForAnnotation: instead. */
+@property (nonatomic, strong, null_resettable) IBOutlet NSViewController *calloutViewController;
+
+#pragma mark Finding annotations
+/** @name Finding Annotations */
+
+/** Returns a point annotation located at the given point.
+
+ @param point A point in the view’s coordinate system.
+ @return A point annotation whose annotation image coincides with the point.
+ If multiple point annotations coincide with the point, the return value
+ is the annotation that would be selected if the user clicks at this
+ point.
+ */
+- (id <MGLAnnotation>)annotationAtPoint:(NSPoint)point;
+
+#pragma mark Overlaying the map
+/** @name Overlaying the Map */
+
+/** Adds a single overlay to the map.
+
+ To remove an overlay from a map, use the -removeOverlay: method.
+
+ @param overlay The overlay object to add. This object must conform to the
+ MGLOverlay protocol. */
+- (void)addOverlay:(id <MGLOverlay>)overlay;
+
+/** Adds an array of overlays to the map.
+
+ To remove multiple overlays from a map, use the -removeOverlays: method.
+
+ @param overlays An array of objects, each of which must conform to the
+ MGLOverlay protocol. */
+- (void)addOverlays:(NS_ARRAY_OF(id <MGLOverlay>) *)overlays;
+
+/** Removes a single overlay from the map.
+
+ If the specified overlay is not currently associated with the map view, this
+ method does nothing.
+
+ @param overlay The overlay object to remove. */
+- (void)removeOverlay:(id <MGLOverlay>)overlay;
+
+/** Removes an array of overlays from the map.
+
+ If a given overlay object is not associated with the map view, it is
+ ignored.
+
+ @param overlays An array of objects, each of which conforms to the
+ MGLOverlay protocol. */
+- (void)removeOverlays:(NS_ARRAY_OF(id <MGLOverlay>) *)overlays;
+
+#pragma mark Converting geographic coordinates
+/** @name Converting Geographic Coordinates */
+
+/** Converts a geographic coordinate to a point in the given view’s coordinate
+ system.
+
+ @param coordinate The geographic coordinate to convert.
+ @param view The view in whose coordinate system the returned point should be
+ expressed. If this parameter is `nil`, the returned point is expressed
+ in the window’s coordinate system. If `view` is not `nil`, it must
+ belong to the same window as the map view.
+ @return The point (in the appropriate view or window coordinate system)
+ corresponding to the given geographic coordinate. */
+- (NSPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(nullable NSView *)view;
+
+/** Converts a point in the given view’s coordinate system to a geographic
+ coordinate.
+
+ @param point The point to convert.
+ @param view The view in whose coordinate system the point is expressed.
+ @return The geographic coordinate at the given point. */
+- (CLLocationCoordinate2D)convertPoint:(NSPoint)point toCoordinateFromView:(nullable NSView *)view;
+
+/** Converts a geographic bounding box to a rectangle in the given view’s
+ coordinate system.
+
+ @param bounds The geographic bounding box to convert.
+ @param view The view in whose coordinate system the returned rectangle
+ should be expressed. If this parameter is `nil`, the returned rectangle
+ is expressed in the window’s coordinate system. If `view` is not `nil`,
+ it must belong to the same window as the map view. */
+- (NSRect)convertCoordinateBounds:(MGLCoordinateBounds)bounds toRectToView:(nullable NSView *)view;
+
+/** Converts a rectangle in the given view’s coordinate system to a geographic
+ bounding box.
+
+ @param rect The rectangle to convert.
+ @param view The view in whose coordinate system the rectangle is expressed.
+ @return The geographic bounding box coextensive with the given rectangle. */
+- (MGLCoordinateBounds)convertRect:(NSRect)rect toCoordinateBoundsFromView:(nullable NSView *)view;
+
+/** Returns the distance spanned by one point in the map view’s coordinate
+ system at the given latitude and current zoom level.
+
+ The distance between points decreases as the latitude approaches the poles.
+ This relationship parallels the relationship between longitudinal
+ coordinates at different latitudes.
+
+ @param latitude The latitude of the geographic coordinate represented by the
+ point.
+ @return The distance in meters spanned by a single point. */
+- (CLLocationDistance)metersPerPointAtLatitude:(CLLocationDegrees)latitude;
+
+#pragma mark Debugging the map
+/** @name Debugging the Map */
+
+/** The options that determine which debugging aids are shown on the map.
+
+ These options are all disabled by default and should remain disabled in
+ released software for performance and aesthetic reasons. */
+@property (nonatomic) MGLMapDebugMaskOptions debugMask;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/osx/include/MGLMapViewDelegate.h b/platform/osx/include/MGLMapViewDelegate.h
new file mode 100644
index 0000000000..fcd013284d
--- /dev/null
+++ b/platform/osx/include/MGLMapViewDelegate.h
@@ -0,0 +1,199 @@
+#import <Foundation/Foundation.h>
+
+#import "MGLTypes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MGLMapView;
+@class MGLAnnotationImage;
+@class MGLPolygon;
+@class MGLPolyline;
+@class MGLShape;
+
+/** The MGLMapViewDelegate protocol defines a set of optional methods that you
+ can use to receive messages from an MGLMapView instance. Because many map
+ operations require the MGLMapView class to load data asynchronously, the map
+ view calls these methods to notify your application when specific operations
+ complete. The map view also uses these methods to request information about
+ annotations displayed on the map, such as the styles and interaction modes
+ to apply to individual annotations. */
+@protocol MGLMapViewDelegate <NSObject>
+
+@optional
+
+#pragma mark Responding to map viewpoint changes
+/** @name Responding to Map Viewpoint Changes */
+
+/** Tells the delegate that the viewpoint depicted by the map view is about to
+ change.
+
+ This method is called whenever the currently displayed map camera will start
+ changing for any reason.
+
+ @param mapView The map view whose viewpoint will change.
+ @param animated Whether the change will cause an animated effect on the map.
+ */
+- (void)mapView:(MGLMapView *)mapView cameraWillChangeAnimated:(BOOL)animated;
+
+/** Tells the delegate that the viewpoint depicted by the map view is changing.
+
+ This method is called as the currently displayed map camera changes due to
+ animation. During movement, this method may be called many times to report
+ updates to the viewpoint. Therefore, your implementation of this method
+ should be as lightweight as possible to avoid affecting performance.
+
+ @param mapView The map view whose viewpoint is changing. */
+- (void)mapViewCameraIsChanging:(MGLMapView *)mapView;
+
+/** Tells the delegate that the viewpoint depicted by the map view has finished
+ changing.
+
+ This method is called whenever the currently displayed map camera has
+ finished changing.
+
+ @param mapView The map view whose viewpoint has changed.
+ @param animated Whether the change caused an animated effect on the map. */
+- (void)mapView:(MGLMapView *)mapView cameraDidChangeAnimated:(BOOL)animated;
+
+#pragma mark Loading the map
+/** @name Loading the Map */
+
+/** Tells the delegate that the map view will begin to load.
+
+ This method is called whenever the map view starts loading, including when a
+ new style has been set and the map must reload.
+
+ @param mapView The map view that is starting to load. */
+- (void)mapViewWillStartLoadingMap:(MGLMapView *)mapView;
+
+/** Tells the delegate that the map view has finished loading.
+
+ This method is called whenever the map view finishes loading, either after
+ the initial load or after a style change has forced a reload.
+
+ @param mapView The map view that has finished loading. */
+- (void)mapViewDidFinishLoadingMap:(MGLMapView *)mapView;
+
+- (void)mapViewWillStartRenderingMap:(MGLMapView *)mapView;
+- (void)mapViewDidFinishRenderingMap:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered;
+- (void)mapViewWillStartRenderingFrame:(MGLMapView *)mapView;
+- (void)mapViewDidFinishRenderingFrame:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered;
+
+#pragma mark Managing the display of annotations
+/** @name Managing the Display of Annotations */
+
+/** Returns an annotation image object to mark the given point annotation object
+ on the map.
+
+ @param mapView The map view that requested the annotation image.
+ @param annotation The object representing the annotation that is about to be
+ displayed.
+ @return The image object to display for the given annotation or `nil` if you
+ want to display the default marker image. */
+- (nullable MGLAnnotationImage *)mapView:(MGLMapView *)mapView imageForAnnotation:(id <MGLAnnotation>)annotation;
+
+/** Returns the alpha value to use when rendering a shape annotation.
+
+ A value of 0.0 results in a completely transparent shape. A value of 1.0,
+ the default, results in a completely opaque shape.
+
+ @param mapView The map view rendering the shape annotation.
+ @param annotation The annotation being rendered.
+ @return An alpha value between 0 and 1.0. */
+- (CGFloat)mapView:(MGLMapView *)mapView alphaForShapeAnnotation:(MGLShape *)annotation;
+
+/** Returns the color to use when rendering the outline of a shape annotation.
+
+ The default stroke color is the selected menu item color. If a pattern
+ color is specified, the result is undefined.
+
+ @param mapView The map view rendering the shape annotation.
+ @param annotation The annotation being rendered.
+ @return A color to use for the shape outline. */
+- (NSColor *)mapView:(MGLMapView *)mapView strokeColorForShapeAnnotation:(MGLShape *)annotation;
+
+/** Returns the color to use when rendering the fill of a polygon annotation.
+
+ The default fill color is selected menu item color. If a pattern color
+ is specified, the result is undefined.
+
+ @param mapView The map view rendering the polygon annotation.
+ @param annotation The annotation being rendered.
+ @return The polygon’s interior fill color. */
+- (NSColor *)mapView:(MGLMapView *)mapView fillColorForPolygonAnnotation:(MGLPolygon *)annotation;
+
+/** Returns the line width in points to use when rendering the outline of a
+ polyline annotation.
+
+ By default, the polyline is outlined with a line 3.0 points wide.
+
+ @param mapView The map view rendering the polygon annotation.
+ @param annotation The annotation being rendered.
+ @return A line width for the polyline, measured in points. */
+- (CGFloat)mapView:(MGLMapView *)mapView lineWidthForPolylineAnnotation:(MGLPolyline *)annotation;
+
+#pragma mark Selecting annotations
+/** @name Selecting annotations */
+
+/** Tells the delegate that one of its annotations has been selected.
+
+ You can use this method to track changes to the selection state of
+ annotations.
+
+ @param mapView The map view containing the annotation.
+ @param annotation The annotation that was selected. */
+- (void)mapView:(MGLMapView *)mapView didSelectAnnotation:(id <MGLAnnotation>)annotation;
+
+/** Tells the delegate that one of its annotations has been deselected.
+
+ You can use this method to track changes in the selection state of
+ annotations.
+
+ @param mapView The map view containing the annotation.
+ @param annotation The annotation that was deselected. */
+- (void)mapView:(MGLMapView *)mapView didDeselectAnnotation:(id <MGLAnnotation>)annotation;
+
+#pragma mark Displaying information about annotations
+/** @name Displaying Information About Annotations */
+
+/** Returns a Boolean value indicating whether the annotation is able to display
+ extra information in a callout popover.
+
+ This method is called after an annotation is selected, before any callout is
+ displayed for the annotation.
+
+ If the return value is `YES`, a callout popover is shown when the user
+ clicks on a selected annotation. The default callout displays the
+ annotation’s title and subtitle. You can customize the popover’s contents by
+ implementing the -mapView:calloutViewControllerForAnnotation: method.
+
+ If the return value is `NO`, or if this method is unimplemented, or if the
+ annotation lacks a title, the annotation will not show a callout even when
+ selected.
+
+ @param mapView The map view that has selected the annotation.
+ @param annotation The object representing the annotation.
+ @return A Boolean value indicating whether the annotation should show a
+ callout.
+ */
+- (BOOL)mapView:(MGLMapView *)mapView annotationCanShowCallout:(id <MGLAnnotation>)annotation;
+
+/** Returns a view controller to manage the callout popover’s content view.
+
+ Like any instance of NSPopover, an annotation callout manages its contents
+ with a view controller. The annotation object is the view controller’s
+ represented object. This means that you can bind controls in the view
+ controller’s content view to KVO-compliant properties of the annotation
+ object, such as -title and -subtitle.
+
+ If each annotation should have an identical callout, you can set the
+ MGLMapView instance’s -setCalloutViewController: method instead.
+
+ @param mapView The map view that is requesting a callout view controller.
+ @param annotation The object representing the annotation.
+ @return A view controller for the given annotation. */
+- (nullable NSViewController *)mapView:(MGLMapView *)mapView calloutViewControllerForAnnotation:(id <MGLAnnotation>)annotation;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/osx/scripts/run.sh b/platform/osx/scripts/run.sh
index 6969863afd..6d00d1b977 100755
--- a/platform/osx/scripts/run.sh
+++ b/platform/osx/scripts/run.sh
@@ -12,7 +12,10 @@ BUILDTYPE=${BUILDTYPE:-Release}
################################################################################
mapbox_time "compile_render_binary" \
-make xrender -j${JOBS} BUILDTYPE=${BUILDTYPE}
+make render -j${JOBS} BUILDTYPE=${BUILDTYPE}
+
+mapbox_time "compile_offline_binary" \
+make offline -j${JOBS} BUILDTYPE=${BUILDTYPE}
mapbox_time "compile_tests" \
make xtest -j${JOBS} BUILDTYPE=${BUILDTYPE}
diff --git a/platform/osx/sdk/Mapbox.m b/platform/osx/sdk/Mapbox.m
index a96ec6df2d..58ebb408e0 100644
--- a/platform/osx/sdk/Mapbox.m
+++ b/platform/osx/sdk/Mapbox.m
@@ -3,7 +3,7 @@
#import "../src/MGLMapView_Private.h"
#import "../src/NSBundle+MGLAdditions.h"
#import "../src/NSProcessInfo+MGLAdditions.h"
-#import "../../darwin/NSString+MGLAdditions.h"
+#import "../../darwin/src/NSString+MGLAdditions.h"
__attribute__((constructor))
static void InitializeMapbox() {
diff --git a/platform/osx/sdk/framework-osx.gypi b/platform/osx/sdk/framework-osx.gypi
index 3f03f9edaf..259066f702 100644
--- a/platform/osx/sdk/framework-osx.gypi
+++ b/platform/osx/sdk/framework-osx.gypi
@@ -37,7 +37,7 @@
'mac_framework_headers': [
'./Mapbox.h',
- '<!@(find ../include/mbgl/{darwin,osx} -type f \! -name \'.*\')',
+ '<!@(find ../platform/{darwin,osx}/include -type f \! -name \'.*\')',
],
'sources': [
diff --git a/platform/osx/src/MGLAccountManager.m b/platform/osx/src/MGLAccountManager.m
index f3a2fce7cf..8458248357 100644
--- a/platform/osx/src/MGLAccountManager.m
+++ b/platform/osx/src/MGLAccountManager.m
@@ -1,6 +1,6 @@
#import "MGLAccountManager_Private.h"
-#import <mbgl/osx/MGLMapView.h>
+#import <MGLMapView.h>
@interface MGLAccountManager ()
diff --git a/platform/osx/src/MGLAccountManager_Private.h b/platform/osx/src/MGLAccountManager_Private.h
index a918f2b2d3..5088c8dfd2 100644
--- a/platform/osx/src/MGLAccountManager_Private.h
+++ b/platform/osx/src/MGLAccountManager_Private.h
@@ -1,4 +1,4 @@
-#import <mbgl/osx/MGLAccountManager.h>
+#import <MGLAccountManager.h>
@interface MGLAccountManager (Private)
diff --git a/platform/osx/src/MGLAnnotationImage.m b/platform/osx/src/MGLAnnotationImage.m
index 855105fded..e65a6d15cf 100644
--- a/platform/osx/src/MGLAnnotationImage.m
+++ b/platform/osx/src/MGLAnnotationImage.m
@@ -1,4 +1,4 @@
-#import <mbgl/osx/MGLAnnotationImage.h>
+#import <MGLAnnotationImage.h>
@interface MGLAnnotationImage ()
diff --git a/platform/osx/src/MGLMapView+IBAdditions.m b/platform/osx/src/MGLMapView+IBAdditions.m
index 2d37d29037..cafd4511f1 100644
--- a/platform/osx/src/MGLMapView+IBAdditions.m
+++ b/platform/osx/src/MGLMapView+IBAdditions.m
@@ -1,4 +1,4 @@
-#import <mbgl/osx/MGLMapView+IBAdditions.h>
+#import <MGLMapView+IBAdditions.h>
#import "MGLMapView_Private.h"
diff --git a/platform/osx/src/MGLMapView.mm b/platform/osx/src/MGLMapView.mm
index ca282facdb..cd8cd45265 100644
--- a/platform/osx/src/MGLMapView.mm
+++ b/platform/osx/src/MGLMapView.mm
@@ -5,20 +5,20 @@
#import "MGLOpenGLLayer.h"
#import "MGLStyle.h"
-#import "../../darwin/MGLGeometry_Private.h"
-#import "../../darwin/MGLMultiPoint_Private.h"
+#import "../../darwin/src/MGLGeometry_Private.h"
+#import "../../darwin/src/MGLMultiPoint_Private.h"
-#import <mbgl/darwin/MGLMapCamera.h>
-#import <mbgl/darwin/MGLPolygon.h>
-#import <mbgl/darwin/MGLPolyline.h>
-#import <mbgl/osx/MGLAnnotationImage.h>
-#import <mbgl/osx/MGLMapViewDelegate.h>
+#import <MGLMapCamera.h>
+#import <MGLPolygon.h>
+#import <MGLPolyline.h>
+#import <MGLAnnotationImage.h>
+#import <MGLMapViewDelegate.h>
#import <mbgl/mbgl.hpp>
#import <mbgl/annotation/point_annotation.hpp>
#import <mbgl/map/camera.hpp>
#import <mbgl/platform/darwin/reachability.h>
-#import <mbgl/platform/gl.hpp>
+#import <mbgl/gl/gl.hpp>
#import <mbgl/sprite/sprite_image.hpp>
#import <mbgl/storage/default_file_source.hpp>
#import <mbgl/storage/network_status.hpp>
@@ -32,8 +32,8 @@
#import "NSBundle+MGLAdditions.h"
#import "NSProcessInfo+MGLAdditions.h"
-#import "../../darwin/NSException+MGLAdditions.h"
-#import "../../darwin/NSString+MGLAdditions.h"
+#import "../../darwin/src/NSException+MGLAdditions.h"
+#import "../../darwin/src/NSString+MGLAdditions.h"
#import <QuartzCore/QuartzCore.h>
@@ -1999,14 +1999,14 @@ public:
- (mbgl::Color)strokeColorForShapeAnnotation:(MGLShape *)annotation {
NSColor *color = (_delegateHasStrokeColorsForShapeAnnotations
? [self.delegate mapView:self strokeColorForShapeAnnotation:annotation]
- : [NSColor blackColor]);
+ : [NSColor selectedMenuItemColor]);
return MGLColorObjectFromNSColor(color);
}
- (mbgl::Color)fillColorForPolygonAnnotation:(MGLPolygon *)annotation {
NSColor *color = (_delegateHasFillColorsForShapeAnnotations
? [self.delegate mapView:self fillColorForPolygonAnnotation:annotation]
- : [NSColor blueColor]);
+ : [NSColor selectedMenuItemColor]);
return MGLColorObjectFromNSColor(color);
}
diff --git a/platform/osx/src/MGLMapView_Private.h b/platform/osx/src/MGLMapView_Private.h
index 77f2aab323..a162beca61 100644
--- a/platform/osx/src/MGLMapView_Private.h
+++ b/platform/osx/src/MGLMapView_Private.h
@@ -1,4 +1,4 @@
-#import <mbgl/osx/MGLMapView.h>
+#import <MGLMapView.h>
void mgl_linkMapViewIBCategory();
diff --git a/platform/osx/src/MGLOpenGLLayer.mm b/platform/osx/src/MGLOpenGLLayer.mm
index 06a7be961c..e8fa521351 100644
--- a/platform/osx/src/MGLOpenGLLayer.mm
+++ b/platform/osx/src/MGLOpenGLLayer.mm
@@ -2,7 +2,7 @@
#import "MGLMapView_Private.h"
-#import <mbgl/platform/gl.hpp>
+#import <mbgl/gl/gl.hpp>
@implementation MGLOpenGLLayer
diff --git a/platform/osx/test/MGLGeometryTests.mm b/platform/osx/test/MGLGeometryTests.mm
index be3c7cb2da..e6e7c4b45c 100644
--- a/platform/osx/test/MGLGeometryTests.mm
+++ b/platform/osx/test/MGLGeometryTests.mm
@@ -1,4 +1,4 @@
-#import "../../darwin/MGLGeometry_Private.h"
+#import "../../darwin/src/MGLGeometry_Private.h"
#pragma clang diagnostic ignored "-Wgnu-statement-expression"
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
diff --git a/platform/osx/test/osxtest.gypi b/platform/osx/test/osxtest.gypi
index d5d54f3c22..30bced31c4 100644
--- a/platform/osx/test/osxtest.gypi
+++ b/platform/osx/test/osxtest.gypi
@@ -48,8 +48,8 @@
],
'include_dirs': [
- '../../../include/mbgl/osx',
- '../../../include/mbgl/darwin',
+ '../../../platform/osx/include',
+ '../../../platform/darwin/include',
'../../../include',
'../../../src',
],