`MGLStyleLayer` was updated to support a raw pointer to the mbgl object, which is always initialized, either to the value returned by `mbgl::Map getLayer`, or for independently created objects, to the pointer value held in `pendingLayer`. In the latter case, this raw pointer value stays even after ownership of the object is transferred via `mbgl::Map addLayer`.
Although functionality was not affected, a previous merge garbled
the language test with a temporary test done for annotation view
performance improvement.
Use queryPointAnnotations to drive annotation view updates
- Get sets of visible and offscreen annotations using the mbgl query
mechanism and updates and enqueues as required
- Query viewport adjusted if tilted (avoid apparent issue with
queryPointAnnotations when the query box is larger than the actual
viewport)
- Add a small debugging display in iOS app to see annotations going in
and out of the reuse queue
This also works around a performance issue that made getting an annotation
context expensive by implementing a map of annotations to tags. It works
around another issue with the underlying mbgl query so that even if it (rarely)
returns an incorrect result, the correct visual effect still occurs and the reuse
queue is added to and drained as expected.
Finally, this refactors MGLMapView viewForAnnotation: to use the maps to
access the requested annotation context and view. This avoids a more
expensive lookup done previously.
Along for the ride: sync up the ios and macos names (and types) for
MGLAnnotationTagContextMap
Add visibleAnnotations API to make it easier for clients of MGLMapView
to query for all visible annotations in the map or all visible annotations
in a subsection of the map.
Use common initialization logic to create an unique pointer to an mbgl
source object, up front, when a MGL source is created. Keep a raw
pointer to the unique pointer that is pointed at the mbgl source
instance when a MGL source is created or when a MGL source is
obtained by identifier from MGLStyle. Once the transfer of ownership of the
mbgl source takes place, the unique ptr is null. The raw pointer can be used
internally for future work that involves mutating the source.
This also changes the URL, features, and geoJSONData content
properties for MGLGeoJSON source to be writable. If they are set with
valid data after a source has been added to the map then the map will
update to reflect the new data.
* [ios, macos] Introduce MGLPointCollection
This makes MGLMultiPoint abstract again so that it is only a place
for shared functionality of polygons and polylines. The multipoint
feature replaces the point collection feature and can be
used to initialize a MGLGeoJSONSource. The previously added
swift_names for polyline and polygon are removed, for now.
This also updates the iOS and macOS annotation adding logic so that
unwanted shapes really are avoided. Previously the combined OR
conditions meant that an annotation had to logically be NOT a kind
of all three types so the check always let the annotation slip through.
This also expands the guard to deflect the new MGLPointCollection.
* [ios, macos] Make feature attributes and identifier writable
Instances of MGLFeature subclasses can now have their attributes
and identifier properties mutated.
MGLShape subclasses can now return NSDictionaries that represent the shapes' GeoJSON geometries. MGLFeature classes can now return NSDictionaries that represent the features as GeoJSON features. This makes it trivial to serialize iOS and macOS shapes and features into GeoJSON.
MGLFeature instances can also return a representation of themselves as an mbgl::Feature. This capability is used in a refactoring of the implementations of MGLGeoJSONSource to more efficiently transform MGLFeatures into mbgl::Features so they can be fed directly into mbgl::GeoJSONSource without having to round trip through NSJSONSerialization. The MGLFeature identifier is converted into the mbgl::identifier type based on the type of the identifier. The MGLFeature attributes are recursively converted into an mbgl::PropertyMap and each value is converted into one of the types that the PropertyMap's Value variant supports.
This adds a features initializer to MGLGeoJSONSource. The initializer
takes shapes and converts them to JSON representation before passing
to core. This also adds methods to the MGLShape concrete subclasses
so that they can represent themselves in NSDictionary form suitable
for transforming to JSON (GeoJSON).
Removed the MGLStyleLayer protocol, because almost none of its members was actually implemented in every class that adopted the protocol. Removed the unused mapView backpointer property with no replacement. Renamed MGLBaseStyleLayer to MGLStyleLayer. Created the intermediate abstract classes MGLForegroundStyleLayer and MGLVectorStyleLayer to cover subsets of style layer classes with like functionality.
Moved each MGLBaseStyleLayer initializer and the corresponding properties down to an abstract subclass such that the initializer makes sense for all concrete subclasses. Moved more initializers and the predicate property up to MGLVectorStyleLayer to eliminate duplication among the concrete subclasses. Marked these initializers as designated initializers.
Removed “source” or “layer” before identifier wherever the type of identifier is apparent. Removed extra MGLGeoJSONSource initializer variants in favor of nullable parameters.
Added copious documentation comments for source and style layer classes, including several previously undocumented methods and properties. In particular, some preconditions and postconditions have been documented. Added pragma marks to break up the jazzy documentation pages into sections. Reformatted exceptions for consistency.
Previously, we declared MGLStyleLayer initializers in the MGLStyleLayer
protocol as optional methods. This made it easy to opt in and out
of initializers that did or or did not make sense for the subclass.
However, this approach was dangerous since it was easy for an
application developer to initialize an MGLStyleLayer subclass with an
init method that was actually not implemented in that class causing
an exception at runtime.
This commit moves the init methods that each subclass supports to
each subclass so xcode (and the compiler) help the developer avoid
the previously possible runtime exception.
In addition, a new init method is added that takes the source layer
and passes that on to `mbgl::style:Layer` (but only on classes
where this is possible in core). This allows an application developer
to style a specific source layer (i.e. the contour lines of the mapbox
terrain vector source).
Finally, this refactors MGLStyleLayer classes to use an MGLSource instead of a
string identifier for the source when initializing the style.
The PR to add filter predicates (#6049) added logic to apply some
runtime styling to the iosapp as soon as the map finished loading.
This removes that logic.
A new class, `MGLUserLocationAnnotationView`, has been added that inherits from `MGLAnnotationView`.
Use a subclass of `MGLUserLocationAnnotationView` to customize the appearance of the user location annotation. Use your custom view with the `MGLMapView.userLocation` annotation via the `-mapView:viewForAnnotation:` delegate method.
* [ios] wip runtime styling
* [ios, macos] Outlined header templates
* [ios, macos] cleanup and use appropiate data types
* [ios, macos] removed refs to mbgl and added convenient color methods on UIColor and NSColor
* [ios, macos] updated header template, included doc string
* [ios, macos] outlined template for layer implementation files
* [ios, macos] moved script to platform/darwin and updated comments
* [ios, macos] Cleaned up the implementation template
* [ios, macos] removed unused function and added support for more datatypes
* [ios, macos] overhauling the type protocols
* [ios, macos] removed unnecessary style classes
* [ios, macos] added support for more types
* [ios, macos] fixed string and number prop values
* [ios, macos] enum getters
* [ios, macos] added removeLayer() and removed unused layer ref
* [ios, macos] fixed remaining layer types and converted style layer into a protocol
* [ios, macos] fixed addLayer() and added example for line layer
* [ios] GeoJSON source now works
* [ios] fixed raster layer and raster source
* [ios] fixed attr prop number and outlined prop function
* [ios] wip functions
* [ios] bool and float function fix
* [ios] cleanup
* [macos] fixed support for macos
* [ios] fixed string functions
* [ios] extended array functions
* [ios] added tests and fixed a few bugs
* [ios] less verbose functions and improved tests
* [ios, macos] Removed unnecessary use of default arguments
Default arguments aren’t supported in Node v4, and they aren’t needed here anyways, because we’re only testing for truthiness.
* [ios, macos] Enum setters
Rely on a macro instead of category methods to specialize the setter implementation for enum attributes, since generic types are disallowed in Objective-C method signatures and mbgl::style::PropertyType must be type-qualified.
* [ios, macos] Got macOS closer to parity w/ iOS
Added various classes and test classes to the macOS workspace. Also fixed lots of compiler errors and updated macosapp runtime styling example to use the new dictionary syntax for function stops.
Updated all conversions from Objective-C stops to C++ stops to enumerate over the dictionary. Fixed compiler errors in enum setter implementations.
Also corrected path to script in generated file comments.
* [ios, macos] Added EJS templates to project
* [ios, macos] Code formatting
Made code format more consistent.
* [ios, macos] Spelled out ID
Cocoa convention is to always spell out “ID” as “identifier”, in part to avoid confusion with the id keyword. Also, URL is capitalized in most contexts, including property names.
* [ios, macos] Grouped related headers together
* [ios, macos] Cleaned up layer transformation
Also added support for converting background layers into Objective-C.
* [ios, macos] Cleaned up tests
Also made the tests work on macOS by introducing a new window to host the map.
* [ios, macos] Replaced TODOs with #warnings
* [ios] convert array based property values
* [ios, macos] color function/undefined getter
* [ios, macos] fixed function/undefined getters for bool and float properties
* [ios, macos] more function/undefined property getters
* [ios, macos] more type conversion and cleanup
* [ios, macos] disable macos runtime styling tests for now
* [ios, macos] cleaned up style code script
* [ios, macos] more type conversion
* [ios] added a base layer to handle visibility min/max zoom
* [macos] fixed base layer
* [ios, macos] use accessor methods
* [ios, macos] cleanup
* [ios, macos] add geojson to ios and macos
* [macos] rebase fix
* [ios, macos] fixed enum getters and added tests for enums
* [ios, macos] added an update method to base layer
* [ios, macos] added some documentation
* [ios, macos] docs
* [ios, macos] removed refs to filters for now
* [ios, macos] various tail work
* [ios, macos] missing import and incorrect type
Long pressing drops pins again. The minimum press duration has been extended to a second to avoid preempting the built-in gesture for draggable annotations.
A verb doesn’t make sense in this enum value. Instead, use a descriptive word for this effect and describe it in detail in the documentation comment.
Cherry-picked from 415c182946.
Ignore multipoints (as opposed to polylines and polygons) when adding annotations, just like we ignore multipolylines, multipolygons, and shape collections.
In osxapp, break multipoint features into points before adding them as annotations.
Add a container view to hold annotations. This gets around a performance
issue with `UIView:addSubview:` where adding views is N^2. It helps
annotation views avoid cutting into callout views when the annotation
views are transformed to be "flat".
MGLPolygon (and by extension MGLMultiPolygon) now supports interior rings. The data is preserved in feature querying results, and interior rings are respected when adding polygon overlays to the map.
Fixes#1729.
[ios, osx] Updated changelog
Added methods to MGLMapView that return the rendered features at a visible point or within a visible rectangle on the map, optionally restricted to a set of layers, plus voluminous documentation.
Added several new geometry classes corresponding to distinct geometry types supported by geometry.hpp. Added parallel “feature” classes to represent these geometries along with tags (IDs) and attributes (properties) from the source.
Grouped classes in the Foundation and SDK groups by theme.
In iosapp, dropped pins’ callout views now display the name of the topmost named feature at that point.
In osxapp, a long press on the map highlights the features under the cursor. Dropping a pin via the menu or context menu item shows the usual dropped pin, but the pin’s title is now the name of a feature under the cursor, if available, rather than “Dropped Pin”.
Fixes the iOS/OS X side of #352.
This adds an option to MGLAnnotationView so that a developer can control
how their annotation views scale in size as they approach the top of
the map view (along the Y axis). The size change is also affected by
the pitch (tilt) of the map view. If there is no tilt then scaling
is not performed. As the map is tilted scaling is gradually applied.
This turns the MGLAnnotationView implementation into an Objective C++
class so that SDK constants from C++ files can be used.
The new behavior is enabled by default to maintain consistency with
annotations backed by GL sprites. The MBXViewController redundantly
sets the new property as an illustration of use.
Add an UIView subclass that can be used as the base class for all
client provided UIViews for annotations.
Teach MGLMapView to be able to display annotation views over the map if provided by the client delegate. For now, if the delegate provides a UIView then it will be used. If not, the map view will fall back to the old strategy of using GL annotations with an image provided by the delegate or a default image if not.
The map keeps a reuse queue and will store annotation views that are panned
offscreen in the queue if the application developer supplied a reuse queue identifer. The views in the queue are reused when more annotation
views are required. This view reuse provides a performance gain when many
annotations are shown and most of them are offscreen.
iosapp now implements the new delegate method to supply
a native view.
Add a playground to the workspace to facilitate experimentation
with new features. A playground is capable of importing frameworks if it
exists in the same workspace that builds the imported framework. The
initial playground demonstrates annotation views.
This also fixes a crash due to nullptr in annotations array If the `annotations` method is called while the user dot's callout view was showing, the userdot annotation is represented as null in the annotation context map. This
caused a crash when the null pointer was attempted to be converted
into an NSArray via C array. This protects against this bug by filtering out such a null annotation.
Renamed MGLStyleCurrentVersion to MGLStyleDefaultVersion to emphasize the constant’s role as an indicator of the default version used by SDK classes, which may be behind depending on release schedules. In the documentation for each style URL method, include the actual version number instead of the constant. In unit tests, verify that this documentation is in sync with the constant.
Link each style URL method’s documentation to a forthcoming webpage on mapbox.com that describes the style in rich detail.
Updated default styles from v8 to v9. Deprecated the MGLMapView class methods in favor of new methods that take a version parameter. Deprecated Emerald outright in favor of Outdoors. Replaced usage of the unversioned MGLStyle methods with the corresponding versioned methods and MGLStyleCurrentVersion to ensure consistency.
Expanded MGLStyle unit tests to also assert that MGLStyle has the right number of style URL methods and that they’re all public. Linked the OS X SDK unit test bundle to libmbgl-core.a. Removed an unnecessary dependency on osxapp.
Replaced Emerald with Outdoors in iosapp and osxapp.
Fixes the iOS and OS X side of #4577 and #4702.
Fixed an issue where the “return to map” accessibility element lacked a label. Always update the title and subtitle of an annotation accessibility element, in case the title or subtitle changes from one showing to the next.
Added a hint for annotations. Use declarative rather than imperative for hints.
Marked the map view and its annotations as adjustable so that swiping up and down with VoiceOver zooms out and in, respectively.
Added accessibility values to toolbar buttons in iosapp.