diff --git a/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java b/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java
index bcd6ebc9..d053518d 100644
--- a/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java
+++ b/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java
@@ -27,9 +27,9 @@ import org.oscim.android.scalebar.MetricUnitAdapter;
import org.oscim.backend.CanvasAdapter;
import org.oscim.core.MapPosition;
import org.oscim.core.MercatorProjection;
+import org.oscim.layers.GroupLayer;
import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
-import org.oscim.map.Layers;
import org.oscim.renderer.BitmapRenderer;
import org.oscim.renderer.GLViewport;
import org.oscim.theme.IRenderTheme;
@@ -43,9 +43,10 @@ public class SimpleMapActivity extends BaseMapActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- Layers layers = mMap.layers();
- layers.add(new BuildingLayer(mMap, mBaseLayer));
- layers.add(new LabelLayer(mMap, mBaseLayer));
+ GroupLayer groupLayer = new GroupLayer(mMap);
+ groupLayer.layers.add(new BuildingLayer(mMap, mBaseLayer));
+ groupLayer.layers.add(new LabelLayer(mMap, mBaseLayer));
+ mMap.layers().add(groupLayer);
mapScaleBar = new DefaultMapScaleBar(mMap);
mapScaleBar.setScaleBarMode(DefaultMapScaleBar.ScaleBarMode.BOTH);
@@ -57,7 +58,7 @@ public class SimpleMapActivity extends BaseMapActivity {
BitmapRenderer renderer = (BitmapRenderer) mapScaleBarLayer.getRenderer();
renderer.setPosition(GLViewport.Position.BOTTOM_LEFT);
renderer.setOffset(5 * CanvasAdapter.dpi / 160, 0);
- layers.add(mapScaleBarLayer);
+ mMap.layers().add(mapScaleBarLayer);
mMap.setTheme(VtmThemes.DEFAULT);
}
diff --git a/vtm-playground/src/org/oscim/test/MapTest.java b/vtm-playground/src/org/oscim/test/MapTest.java
index 309e7f52..bbf557fb 100644
--- a/vtm-playground/src/org/oscim/test/MapTest.java
+++ b/vtm-playground/src/org/oscim/test/MapTest.java
@@ -1,6 +1,23 @@
+/*
+ * Copyright 2016 devemux86
+ *
+ * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
+ *
+ * This program is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with
+ * this program. If not, see .
+ */
package org.oscim.test;
import org.oscim.gdx.GdxMapApp;
+import org.oscim.layers.GroupLayer;
import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
@@ -16,8 +33,10 @@ public class MapTest extends GdxMapApp {
VectorTileLayer l = map.setBaseMap(new OSciMap4TileSource());
- map.layers().add(new BuildingLayer(map, l));
- map.layers().add(new LabelLayer(map, l));
+ GroupLayer groupLayer = new GroupLayer(mMap);
+ groupLayer.layers.add(new BuildingLayer(map, l));
+ groupLayer.layers.add(new LabelLayer(map, l));
+ map.layers().add(groupLayer);
map.setTheme(VtmThemes.DEFAULT);
map.setMapPosition(53.075, 8.808, 1 << 17);
diff --git a/vtm/src/org/oscim/layers/GroupLayer.java b/vtm/src/org/oscim/layers/GroupLayer.java
new file mode 100644
index 00000000..b55bbd0f
--- /dev/null
+++ b/vtm/src/org/oscim/layers/GroupLayer.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016 devemux86
+ *
+ * This program is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with
+ * this program. If not, see .
+ */
+package org.oscim.layers;
+
+import org.oscim.map.Map;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A layer which is a group of other layers.
+ */
+public class GroupLayer extends Layer {
+
+ /**
+ * The group of other layers.
+ */
+ public final List layers = new ArrayList<>();
+
+ public GroupLayer(Map map) {
+ super(map);
+ }
+
+ @Override
+ public void onDetach() {
+ for (Layer layer : layers) {
+ layer.onDetach();
+ }
+ }
+}
diff --git a/vtm/src/org/oscim/map/Layers.java b/vtm/src/org/oscim/map/Layers.java
index 4b80be82..1d5ace03 100644
--- a/vtm/src/org/oscim/map/Layers.java
+++ b/vtm/src/org/oscim/map/Layers.java
@@ -1,5 +1,6 @@
/*
* Copyright 2013 Hannes Janetzek
+ * Copyright 2016 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@@ -19,6 +20,7 @@ package org.oscim.map;
import org.oscim.event.Gesture;
import org.oscim.event.GestureListener;
import org.oscim.event.MotionEvent;
+import org.oscim.layers.GroupLayer;
import org.oscim.layers.Layer;
import org.oscim.map.Map.InputListener;
import org.oscim.map.Map.UpdateListener;
@@ -38,7 +40,7 @@ public final class Layers extends AbstractList {
Layers(Map map) {
mMap = map;
- mLayerList = new CopyOnWriteArrayList();
+ mLayerList = new CopyOnWriteArrayList<>();
}
@Override
@@ -56,12 +58,23 @@ public final class Layers extends AbstractList {
if (mLayerList.contains(layer))
throw new IllegalArgumentException("layer added twice");
+ // bind added layer
if (layer instanceof UpdateListener)
mMap.events.bind((UpdateListener) layer);
-
if (layer instanceof InputListener)
mMap.input.bind((InputListener) layer);
+ // bind added group layer
+ if (layer instanceof GroupLayer) {
+ GroupLayer groupLayer = (GroupLayer) layer;
+ for (Layer gl : groupLayer.layers) {
+ if (gl instanceof UpdateListener)
+ mMap.events.bind((UpdateListener) gl);
+ if (gl instanceof InputListener)
+ mMap.input.bind((InputListener) gl);
+ }
+ }
+
mLayerList.add(index, layer);
mDirtyLayers = true;
}
@@ -72,11 +85,23 @@ public final class Layers extends AbstractList {
Layer remove = mLayerList.remove(index);
+ // unbind removed layer
if (remove instanceof UpdateListener)
mMap.events.unbind((UpdateListener) remove);
if (remove instanceof InputListener)
mMap.input.unbind((InputListener) remove);
+ // unbind removed group layer
+ if (remove instanceof GroupLayer) {
+ GroupLayer groupLayer = (GroupLayer) remove;
+ for (Layer gl : groupLayer.layers) {
+ if (gl instanceof UpdateListener)
+ mMap.events.unbind((UpdateListener) gl);
+ if (gl instanceof InputListener)
+ mMap.input.unbind((InputListener) gl);
+ }
+ }
+
return remove;
}
@@ -94,6 +119,17 @@ public final class Layers extends AbstractList {
if (remove instanceof InputListener)
mMap.input.unbind((InputListener) remove);
+ // unbind replaced group layer
+ if (remove instanceof GroupLayer) {
+ GroupLayer groupLayer = (GroupLayer) remove;
+ for (Layer gl : groupLayer.layers) {
+ if (gl instanceof UpdateListener)
+ mMap.events.unbind((UpdateListener) gl);
+ if (gl instanceof InputListener)
+ mMap.input.unbind((InputListener) gl);
+ }
+ }
+
return remove;
}
@@ -121,11 +157,21 @@ public final class Layers extends AbstractList {
if (mDirtyLayers)
updateLayers();
- for (Layer o : mLayers)
+ for (Layer o : mLayers) {
if (o instanceof GestureListener)
if (((GestureListener) o).onGesture(g, e))
return true;
+ if (o instanceof GroupLayer) {
+ GroupLayer groupLayer = (GroupLayer) o;
+ for (Layer gl : groupLayer.layers) {
+ if (gl instanceof GestureListener)
+ if (((GestureListener) gl).onGesture(g, e))
+ return true;
+ }
+ }
+ }
+
return false;
}
@@ -139,6 +185,14 @@ public final class Layers extends AbstractList {
if (o.getRenderer() != null)
numRenderLayers++;
+ if (o instanceof GroupLayer) {
+ GroupLayer groupLayer = (GroupLayer) o;
+ for (Layer gl : groupLayer.layers) {
+ if (gl.getRenderer() != null)
+ numRenderLayers++;
+ }
+ }
+
mLayers[n - i - 1] = o;
}
@@ -149,6 +203,15 @@ public final class Layers extends AbstractList {
LayerRenderer l = o.getRenderer();
if (l != null)
mLayerRenderer[cnt++] = l;
+
+ if (o instanceof GroupLayer) {
+ GroupLayer groupLayer = (GroupLayer) o;
+ for (Layer gl : groupLayer.layers) {
+ l = gl.getRenderer();
+ if (l != null)
+ mLayerRenderer[cnt++] = l;
+ }
+ }
}
mDirtyLayers = false;