diff --git a/vtm-gdx/src/org/oscim/gdx/InputHandler.java b/vtm-gdx/src/org/oscim/gdx/InputHandler.java index 7e20de9d..505ef85f 100644 --- a/vtm-gdx/src/org/oscim/gdx/InputHandler.java +++ b/vtm-gdx/src/org/oscim/gdx/InputHandler.java @@ -22,12 +22,18 @@ import com.badlogic.gdx.Input.Buttons; import com.badlogic.gdx.InputProcessor; import org.oscim.layers.GenericLayer; +import org.oscim.layers.GroupLayer; +import org.oscim.layers.Layer; import org.oscim.layers.TileGridLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; +import org.oscim.map.Layers; import org.oscim.map.Map; import org.oscim.map.ViewController; import org.oscim.theme.VtmThemes; import org.oscim.utils.Easing; +import java.util.List; + public class InputHandler implements InputProcessor { private ViewController mViewport; @@ -145,10 +151,47 @@ public class InputHandler implements InputProcessor { } mMap.render(); break; + + case Input.Keys.B: + toggleBuildingLayer(mMap.layers()); + mMap.render(); + break; } return false; } + private boolean toggleBuildingLayer(Layers layers) { + //search building layer + for (Layer l : layers) { + if (l instanceof BuildingLayer) { + l.setEnabled(!l.isEnabled()); + return true; + } else if (l instanceof GroupLayer) { + if (toggleBuildingLayer(((GroupLayer) l).layers)) { + return true; + } + } + } + return false; + } + + private boolean toggleBuildingLayer(List layers) { + for (Layer l : layers) { + if (l instanceof BuildingLayer) { + l.setEnabled(!l.isEnabled()); + return true; + } else if (l instanceof GroupLayer) { + if (toggleBuildingLayer(((GroupLayer) l).layers)) { + return true; + } + } + } + return false; + } + + ; + + @Override public boolean keyUp(int keycode) { switch (keycode) { diff --git a/vtm/src/org/oscim/layers/Layer.java b/vtm/src/org/oscim/layers/Layer.java index 969a221b..4540dc37 100644 --- a/vtm/src/org/oscim/layers/Layer.java +++ b/vtm/src/org/oscim/layers/Layer.java @@ -21,12 +21,17 @@ import org.oscim.renderer.LayerRenderer; public abstract class Layer { + public interface EnableChangeHandler{ + void changed(boolean enabled); + } + public Layer(Map map) { mMap = map; } private boolean mEnabled = true; protected final Map mMap; + private EnableChangeHandler handler; protected LayerRenderer mRenderer; @@ -41,13 +46,23 @@ public abstract class Layer { * @param enabled */ public void setEnabled(boolean enabled) { + boolean changed = mEnabled != enabled; mEnabled = enabled; + if (changed && this.handler != null) this.handler.changed(mEnabled); } public boolean isEnabled() { return mEnabled; } + public void setChangeHandler(EnableChangeHandler handler) { + this.handler = handler; + } + + public void removeEnabledChangeHandler() { + this.handler = null; + } + /** * Override to perform clean up of resources before shutdown. */ diff --git a/vtm/src/org/oscim/map/Layers.java b/vtm/src/org/oscim/map/Layers.java index 7f88c5f8..96419783 100644 --- a/vtm/src/org/oscim/map/Layers.java +++ b/vtm/src/org/oscim/map/Layers.java @@ -81,10 +81,41 @@ public final class Layers extends AbstractList { } } + layer.setChangeHandler(layerEnabledChangeHandler); + if(layer instanceof GroupLayer){ + addEnableChangeHandlerToGroupLayer((GroupLayer) layer); + } mLayerList.add(index, layer); mDirtyLayers = true; } + private void addEnableChangeHandlerToGroupLayer(GroupLayer gl){ + for (Layer l: gl.layers){ + if(l instanceof GroupLayer){ + addEnableChangeHandlerToGroupLayer((GroupLayer)l); + }else{ + l.setChangeHandler(layerEnabledChangeHandler); + } + } + } + + private void removeEnableChangeHandlerToGroupLayer(GroupLayer gl){ + for (Layer l: gl.layers){ + if(l instanceof GroupLayer){ + removeEnableChangeHandlerToGroupLayer((GroupLayer)l); + }else{ + l.removeEnabledChangeHandler(); + } + } + } + + private final Layer.EnableChangeHandler layerEnabledChangeHandler = new Layer.EnableChangeHandler() { + @Override + public void changed(boolean enabled) { + mDirtyLayers = true; + } + }; + /** * Add using layer groups. */ @@ -114,6 +145,7 @@ public final class Layers extends AbstractList { Layer remove = mLayerList.remove(index); // unbind removed layer + remove.removeEnabledChangeHandler(); if (remove instanceof UpdateListener) mMap.events.unbind((UpdateListener) remove); if (remove instanceof InputListener) @@ -128,6 +160,7 @@ public final class Layers extends AbstractList { if (gl instanceof InputListener) mMap.input.unbind((InputListener) gl); } + removeEnableChangeHandlerToGroupLayer((GroupLayer) remove); } // update layer group pointers @@ -225,13 +258,13 @@ public final class Layers extends AbstractList { for (int i = 0, n = mLayerList.size(); i < n; i++) { Layer o = mLayerList.get(i); - if (o.getRenderer() != null) + if (o.isEnabled() && o.getRenderer() != null) numRenderLayers++; if (o instanceof GroupLayer) { GroupLayer groupLayer = (GroupLayer) o; for (Layer gl : groupLayer.layers) { - if (gl.getRenderer() != null) + if (gl.isEnabled() && gl.getRenderer() != null) numRenderLayers++; } } @@ -244,14 +277,14 @@ public final class Layers extends AbstractList { for (int i = 0, cnt = 0, n = mLayerList.size(); i < n; i++) { Layer o = mLayerList.get(i); LayerRenderer l = o.getRenderer(); - if (l != null) + if (o.isEnabled() && l != null) mLayerRenderer[cnt++] = l; if (o instanceof GroupLayer) { GroupLayer groupLayer = (GroupLayer) o; for (Layer gl : groupLayer.layers) { l = gl.getRenderer(); - if (l != null) + if (gl.isEnabled() && l != null) mLayerRenderer[cnt++] = l; } }