summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorJesse Bounds <jesse@rebounds.net>2017-02-20 16:39:23 -0800
committerJesse Bounds <jesse@rebounds.net>2017-02-23 15:07:43 -0800
commit59820fb63d9970c1e2cda9cf950b819b79b1e7f7 (patch)
tree4b8a17e6b22373c16195037a0ea70249e979088b /platform
parentde1913e2234179b4a569444dc4219381694f12fe (diff)
downloadqtlocation-mapboxgl-59820fb63d9970c1e2cda9cf950b819b79b1e7f7.tar.gz
[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.
Diffstat (limited to 'platform')
-rw-r--r--platform/darwin/src/MGLBackgroundStyleLayer.mm7
-rw-r--r--platform/darwin/src/MGLCircleStyleLayer.mm8
-rw-r--r--platform/darwin/src/MGLFillStyleLayer.mm8
-rw-r--r--platform/darwin/src/MGLLineStyleLayer.mm8
-rw-r--r--platform/darwin/src/MGLRasterStyleLayer.mm8
-rw-r--r--platform/darwin/src/MGLStyleLayer.mm.ejs11
-rw-r--r--platform/darwin/src/MGLSymbolStyleLayer.mm8
-rw-r--r--platform/darwin/test/MGLStyleTests.mm17
8 files changed, 44 insertions, 31 deletions
diff --git a/platform/darwin/src/MGLBackgroundStyleLayer.mm b/platform/darwin/src/MGLBackgroundStyleLayer.mm
index f6a6973363..bcad0aa11b 100644
--- a/platform/darwin/src/MGLBackgroundStyleLayer.mm
+++ b/platform/darwin/src/MGLBackgroundStyleLayer.mm
@@ -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) {
diff --git a/platform/darwin/src/MGLCircleStyleLayer.mm b/platform/darwin/src/MGLCircleStyleLayer.mm
index ad087c5d02..808e00bc38 100644
--- a/platform/darwin/src/MGLCircleStyleLayer.mm
+++ b/platform/darwin/src/MGLCircleStyleLayer.mm
@@ -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) {
diff --git a/platform/darwin/src/MGLFillStyleLayer.mm b/platform/darwin/src/MGLFillStyleLayer.mm
index ffd55884c4..6716e0efb1 100644
--- a/platform/darwin/src/MGLFillStyleLayer.mm
+++ b/platform/darwin/src/MGLFillStyleLayer.mm
@@ -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) {
diff --git a/platform/darwin/src/MGLLineStyleLayer.mm b/platform/darwin/src/MGLLineStyleLayer.mm
index fc220650f4..80b1e907e6 100644
--- a/platform/darwin/src/MGLLineStyleLayer.mm
+++ b/platform/darwin/src/MGLLineStyleLayer.mm
@@ -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) {
diff --git a/platform/darwin/src/MGLRasterStyleLayer.mm b/platform/darwin/src/MGLRasterStyleLayer.mm
index 0ddb6baf0e..2108a5a0c8 100644
--- a/platform/darwin/src/MGLRasterStyleLayer.mm
+++ b/platform/darwin/src/MGLRasterStyleLayer.mm
@@ -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) {
diff --git a/platform/darwin/src/MGLStyleLayer.mm.ejs b/platform/darwin/src/MGLStyleLayer.mm.ejs
index 7f44a7b4ae..24aff7fca8 100644
--- a/platform/darwin/src/MGLStyleLayer.mm.ejs
+++ b/platform/darwin/src/MGLStyleLayer.mm.ejs
@@ -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) {
diff --git a/platform/darwin/src/MGLSymbolStyleLayer.mm b/platform/darwin/src/MGLSymbolStyleLayer.mm
index ae0ac2d6fa..0b065cd7b9 100644
--- a/platform/darwin/src/MGLSymbolStyleLayer.mm
+++ b/platform/darwin/src/MGLSymbolStyleLayer.mm
@@ -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) {
diff --git a/platform/darwin/test/MGLStyleTests.mm b/platform/darwin/test/MGLStyleTests.mm
index 86cf11d4aa..4f6f5f0dba 100644
--- a/platform/darwin/test/MGLStyleTests.mm
+++ b/platform/darwin/test/MGLStyleTests.mm
@@ -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]