[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:
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user