From 42fd941d64b7a460ce4d0370f6a33400911f915b Mon Sep 17 00:00:00 2001 From: Emux Date: Fri, 22 Jul 2016 19:27:54 +0300 Subject: [PATCH] Group layer implementation, closes #99 --- .../oscim/android/test/SimpleMapActivity.java | 11 +-- .../src/org/oscim/test/MapTest.java | 23 ++++++- vtm/src/org/oscim/layers/GroupLayer.java | 42 +++++++++++ vtm/src/org/oscim/map/Layers.java | 69 ++++++++++++++++++- 4 files changed, 135 insertions(+), 10 deletions(-) create mode 100644 vtm/src/org/oscim/layers/GroupLayer.java 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 bcd6ebc92..d053518dd 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.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 void onCreate(Bundle savedInstanceState) { 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 309e7f52d..bbf557fbb 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 void createLayers() { 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 000000000..b55bbd0f4 --- /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 4b80be82e..1d5ace033 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 @@ 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 synchronized void add(int index, Layer layer) { 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 synchronized Layer remove(int index) { 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 synchronized Layer set(int index, Layer layer) { 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 @@ boolean handleGesture(Gesture g, MotionEvent e) { 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 @@ private synchronized void updateLayers() { 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 @@ private synchronized void updateLayers() { 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;