Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[ios, macos] Added layers property to MGLStyle
Browse files Browse the repository at this point in the history
The property is KVO compliant with all the mutable to-many methods.

Fixes #6003.
  • Loading branch information
1ec5 committed Oct 19, 2016
1 parent 8047d6a commit aee9a82
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 5 deletions.
2 changes: 2 additions & 0 deletions include/mbgl/map/map.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,9 @@ class Map : private util::noncopyable {
void removeSource(const std::string& sourceID);

// Layers
std::vector<style::Layer*> getLayers();
style::Layer* getLayer(const std::string& layerID);
void setLayers(std::vector<style::Layer*>&);
void addLayer(std::unique_ptr<style::Layer>, const optional<std::string>& beforeLayerID = {});
void removeLayer(const std::string& layerID);

Expand Down
2 changes: 2 additions & 0 deletions platform/darwin/src/MGLStyle.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,8 @@ static const NSInteger MGLStyleDefaultVersion = 9;

#pragma mark Managing Style Layers

@property (nonatomic, strong) NS_MUTABLE_ARRAY_OF(MGLStyleLayer *) *layers;

/**
Returns a style layer with the given identifier in the current style.
Expand Down
80 changes: 75 additions & 5 deletions platform/darwin/src/MGLStyle.mm
Original file line number Diff line number Diff line change
Expand Up @@ -148,13 +148,77 @@ - (void)removeSource:(MGLSource *)source

#pragma mark Style layers

- (MGLStyleLayer *)layerWithIdentifier:(NSString *)identifier
- (NSMutableArray<MGLStyleLayer *> *)layers
{
auto mbglLayer = self.mapView.mbglMap->getLayer(identifier.UTF8String);
if (!mbglLayer) {
auto layers = self.mapView.mbglMap->getLayers();
NSMutableArray *styleLayers = [NSMutableArray arrayWithCapacity:layers.size()];
for (auto &layer : layers) {
MGLStyleLayer *styleLayer = [self layerFromMBGLLayer:layer];
[styleLayers addObject:styleLayer];
}
return styleLayers;
}

- (void)setLayers:(NSMutableArray<MGLStyleLayer *> *)layers {
std::vector<mbgl::style::Layer *> rawLayers;
rawLayers.reserve(layers.count);
for (MGLStyleLayer *layer in layers) {
rawLayers.push_back(layer.layer);
}
self.mapView.mbglMap->setLayers(rawLayers);
}

- (NSUInteger)countOfLayers
{
return self.mapView.mbglMap->getLayers().size();
}

- (MGLStyleLayer *)objectInLayersAtIndex:(NSUInteger)index
{
auto layers = self.mapView.mbglMap->getLayers();
auto layer = layers.at(index);
if (layer) {
return [self layerFromMBGLLayer:layer];
} else {
[NSException raise:NSRangeException
format:@"No style layer at index %lu", (unsigned long)index];
return nil;
}
}

- (void)getLayers:(MGLStyleLayer **)buffer range:(NSRange)inRange
{
auto layers = self.mapView.mbglMap->getLayers();
NSUInteger i = 0;
for (auto layer = *(layers.begin() + inRange.location); i < inRange.length; ++layer, ++i) {
MGLStyleLayer *styleLayer = [self layerFromMBGLLayer:layer];
buffer[i] = styleLayer;
}
}

- (void)insertObject:(MGLStyleLayer *)styleLayer inLayersAtIndex:(NSUInteger)index
{
auto layers = self.mapView.mbglMap->getLayers();
if (index == layers.size()) {
[self addLayer:styleLayer];
} else {
auto layerAbove = layers.at(index);
self.mapView.mbglMap->addLayer(std::unique_ptr<mbgl::style::Layer>(styleLayer.layer), layerAbove->getID());
}
}

- (void)removeObjectFromLayersAtIndex:(NSUInteger)index
{
auto layers = self.mapView.mbglMap->getLayers();
auto layer = layers.at(index);
self.mapView.mbglMap->removeLayer(layer->getID());
}

- (MGLStyleLayer *)layerFromMBGLLayer:(mbgl::style::Layer *)mbglLayer
{
NSParameterAssert(mbglLayer);

NSString *identifier = @(mbglLayer->getID().c_str());
MGLStyleLayer *styleLayer;
if (auto fillLayer = mbglLayer->as<mbgl::style::FillLayer>()) {
MGLSource *source = [self sourceWithIdentifier:@(fillLayer->getSourceID().c_str())];
Expand All @@ -177,12 +241,18 @@ - (MGLStyleLayer *)layerWithIdentifier:(NSString *)identifier
NSAssert(NO, @"Unrecognized layer type");
return nil;
}

styleLayer.layer = mbglLayer;

return styleLayer;
}

- (MGLStyleLayer *)layerWithIdentifier:(NSString *)identifier
{
auto mbglLayer = self.mapView.mbglMap->getLayer(identifier.UTF8String);
return mbglLayer ? [self layerFromMBGLLayer:mbglLayer] : nil;
}

- (void)removeLayer:(MGLStyleLayer *)layer
{
self.mapView.mbglMap->removeLayer(layer.identifier.UTF8String);
Expand Down
14 changes: 14 additions & 0 deletions src/mbgl/map/map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -785,6 +785,10 @@ void Map::removeSource(const std::string& sourceID) {
impl->style->removeSource(sourceID);
}
}

std::vector<style::Layer*> Map::getLayers() {
return impl->style ? impl->style->getLayers() : std::vector<style::Layer*>();
}

style::Layer* Map::getLayer(const std::string& layerID) {
if (impl->style) {
Expand All @@ -794,6 +798,16 @@ style::Layer* Map::getLayer(const std::string& layerID) {
return nullptr;
}

void Map::setLayers(std::vector<style::Layer*>& layers) {
impl->view.activate();

impl->style->setLayers(layers);
impl->updateFlags |= Update::Classes;
impl->asyncUpdate.send();

impl->view.deactivate();
}

void Map::addLayer(std::unique_ptr<Layer> layer, const optional<std::string>& before) {
if (!impl->style) {
return;
Expand Down
16 changes: 16 additions & 0 deletions src/mbgl/style/style.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,15 @@ std::vector<const Layer*> Style::getLayers() const {
return result;
}

std::vector<Layer*> Style::getLayers() {
std::vector<Layer*> result;
result.reserve(layers.size());
for (auto& layer : layers) {
result.push_back(layer.get());
}
return result;
}

std::vector<std::unique_ptr<Layer>>::const_iterator Style::findLayer(const std::string& id) const {
return std::find_if(layers.begin(), layers.end(), [&](const auto& layer) {
return layer->baseImpl->id == id;
Expand All @@ -167,6 +176,13 @@ Layer* Style::getLayer(const std::string& id) const {
return it != layers.end() ? it->get() : nullptr;
}

void Style::setLayers(std::vector<Layer*>& newLayers) {
layers.empty();
for (auto& layer : newLayers) {
addLayer(std::unique_ptr<Layer>(layer));
}
}

Layer* Style::addLayer(std::unique_ptr<Layer> layer, optional<std::string> before) {
// TODO: verify source

Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/style/style.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ class Style : public GlyphAtlasObserver,
void removeSource(const std::string& sourceID);

std::vector<const Layer*> getLayers() const;
std::vector<Layer*> getLayers();
Layer* getLayer(const std::string& id) const;
void setLayers(std::vector<Layer*>&);
Layer* addLayer(std::unique_ptr<Layer>,
optional<std::string> beforeLayerID = {});
void removeLayer(const std::string& layerID);
Expand Down

0 comments on commit aee9a82

Please sign in to comment.