[ios, macos] Simplify implementation of layer removal from map view

This reverts a previous change that recreated the pending and raw
layer pointers if an identifier match caused a layer to be removed
but the removed layer was of a different type than the layer triggering
the removal

This refactors the pointer replacement to use a simpler solution that
returns early if the layer does not have a raw pointer loaded in the
mbgl map instance.
This commit is contained in:
Jesse Bounds
2017-02-20 16:39:23 -08:00
parent de1913e223
commit 59820fb63d
8 changed files with 44 additions and 31 deletions

View File

@@ -62,13 +62,14 @@
- (void)removeFromMapView:(MGLMapView *)mapView
{
if (self.rawLayer != mapView.mbglMap->getLayer(self.identifier.UTF8String)) {
return;
}
auto removedLayer = mapView.mbglMap->removeLayer(self.identifier.UTF8String);
if (!removedLayer) {
return;
}
auto originalLayer = std::make_unique<mbgl::style::BackgroundLayer>(self.identifier.UTF8String);
_pendingLayer = std::move(originalLayer);
self.rawLayer = _pendingLayer.get();
mbgl::style::BackgroundLayer *layer = dynamic_cast<mbgl::style::BackgroundLayer *>(removedLayer.get());
if (!layer) {

View File

@@ -112,14 +112,14 @@ namespace mbgl {
- (void)removeFromMapView:(MGLMapView *)mapView
{
if (self.rawLayer != mapView.mbglMap->getLayer(self.identifier.UTF8String)) {
return;
}
auto removedLayer = mapView.mbglMap->removeLayer(self.identifier.UTF8String);
if (!removedLayer) {
return;
}
auto originalLayer = std::make_unique<mbgl::style::CircleLayer>(self.identifier.UTF8String, self.sourceIdentifier.UTF8String);
_pendingLayer = std::move(originalLayer);
self.rawLayer = _pendingLayer.get();
mbgl::style::CircleLayer *layer = dynamic_cast<mbgl::style::CircleLayer *>(removedLayer.get());
if (!layer) {

View File

@@ -107,14 +107,14 @@ namespace mbgl {
- (void)removeFromMapView:(MGLMapView *)mapView
{
if (self.rawLayer != mapView.mbglMap->getLayer(self.identifier.UTF8String)) {
return;
}
auto removedLayer = mapView.mbglMap->removeLayer(self.identifier.UTF8String);
if (!removedLayer) {
return;
}
auto originalLayer = std::make_unique<mbgl::style::FillLayer>(self.identifier.UTF8String, self.sourceIdentifier.UTF8String);
_pendingLayer = std::move(originalLayer);
self.rawLayer = _pendingLayer.get();
mbgl::style::FillLayer *layer = dynamic_cast<mbgl::style::FillLayer *>(removedLayer.get());
if (!layer) {

View File

@@ -119,14 +119,14 @@ namespace mbgl {
- (void)removeFromMapView:(MGLMapView *)mapView
{
if (self.rawLayer != mapView.mbglMap->getLayer(self.identifier.UTF8String)) {
return;
}
auto removedLayer = mapView.mbglMap->removeLayer(self.identifier.UTF8String);
if (!removedLayer) {
return;
}
auto originalLayer = std::make_unique<mbgl::style::LineLayer>(self.identifier.UTF8String, self.sourceIdentifier.UTF8String);
_pendingLayer = std::move(originalLayer);
self.rawLayer = _pendingLayer.get();
mbgl::style::LineLayer *layer = dynamic_cast<mbgl::style::LineLayer *>(removedLayer.get());
if (!layer) {

View File

@@ -69,14 +69,14 @@
- (void)removeFromMapView:(MGLMapView *)mapView
{
if (self.rawLayer != mapView.mbglMap->getLayer(self.identifier.UTF8String)) {
return;
}
auto removedLayer = mapView.mbglMap->removeLayer(self.identifier.UTF8String);
if (!removedLayer) {
return;
}
auto originalLayer = std::make_unique<mbgl::style::RasterLayer>(self.identifier.UTF8String, self.sourceIdentifier.UTF8String);
_pendingLayer = std::move(originalLayer);
self.rawLayer = _pendingLayer.get();
mbgl::style::RasterLayer *layer = dynamic_cast<mbgl::style::RasterLayer *>(removedLayer.get());
if (!layer) {

View File

@@ -150,17 +150,14 @@ namespace mbgl {
- (void)removeFromMapView:(MGLMapView *)mapView
{
if (self.rawLayer != mapView.mbglMap->getLayer(self.identifier.UTF8String)) {
return;
}
auto removedLayer = mapView.mbglMap->removeLayer(self.identifier.UTF8String);
if (!removedLayer) {
return;
}
<% if (type == 'background') { -%>
auto originalLayer = std::make_unique<mbgl::style::<%- camelize(type) %>Layer>(self.identifier.UTF8String);
<% } else { -%>
auto originalLayer = std::make_unique<mbgl::style::<%- camelize(type) %>Layer>(self.identifier.UTF8String, self.sourceIdentifier.UTF8String);
<% } -%>
_pendingLayer = std::move(originalLayer);
self.rawLayer = _pendingLayer.get();
mbgl::style::<%- camelize(type) %>Layer *layer = dynamic_cast<mbgl::style::<%- camelize(type) %>Layer *>(removedLayer.get());
if (!layer) {

View File

@@ -166,14 +166,14 @@ namespace mbgl {
- (void)removeFromMapView:(MGLMapView *)mapView
{
if (self.rawLayer != mapView.mbglMap->getLayer(self.identifier.UTF8String)) {
return;
}
auto removedLayer = mapView.mbglMap->removeLayer(self.identifier.UTF8String);
if (!removedLayer) {
return;
}
auto originalLayer = std::make_unique<mbgl::style::SymbolLayer>(self.identifier.UTF8String, self.sourceIdentifier.UTF8String);
_pendingLayer = std::move(originalLayer);
self.rawLayer = _pendingLayer.get();
mbgl::style::SymbolLayer *layer = dynamic_cast<mbgl::style::SymbolLayer *>(removedLayer.get());
if (!layer) {

View File

@@ -284,12 +284,27 @@
[self.style addLayer:circleLayer];
XCTAssertNotNil([self.style layerWithIdentifier:circleLayer.identifier]);
MGLBackgroundStyleLayer *backgroundLayer = [[MGLBackgroundStyleLayer alloc] initWithIdentifier:@"circle-layer"];
MGLBackgroundStyleLayer *backgroundLayer = [[MGLBackgroundStyleLayer alloc] initWithIdentifier:@"background-layer"];
[self.style removeLayer:backgroundLayer];
[self.style addLayer:backgroundLayer];
XCTAssertNotNil([self.style layerWithIdentifier:backgroundLayer.identifier]);
}
- (void)testAddingLayerOfTypeABeforeRemovingLayerOfTypeBWithSameIdentifier {
MGLShapeSource *source = [[MGLShapeSource alloc] initWithIdentifier:@"shape-source-removing-before-adding" shape:nil options:nil];
[self.style addSource:source];
// Add a fill layer with an identifer
MGLFillStyleLayer *fillLayer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"some-identifier" source:source];
[self.style addLayer:fillLayer];
// Remove a line layer (before adding it) with the same identifier as the fill layer previously added
MGLLineStyleLayer *lineLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:fillLayer.identifier source:source];
[self.style removeLayer:lineLayer];
XCTAssertTrue([[self.style layerWithIdentifier:fillLayer.identifier] isMemberOfClass:[MGLFillStyleLayer class]]);
}
- (NSString *)stringWithContentsOfStyleHeader {
NSURL *styleHeaderURL = [[[NSBundle mgl_frameworkBundle].bundleURL
URLByAppendingPathComponent:@"Headers" isDirectory:YES]