package com.mobidevelop.maps.editor.views;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
import com.badlogic.gdx.scenes.scene2d.ui.Window;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.mobidevelop.maps.MapLayer;
import com.mobidevelop.maps.editor.controllers.ControllerMap;
import com.mobidevelop.maps.editor.events.MapLayerChangeEvent;
import com.mobidevelop.maps.editor.events.MapLayersChangeEvent;
import com.mobidevelop.maps.editor.models.ModelMapLayer;
import com.mobidevelop.maps.editor.models.ModelMapLayers;
import com.mobidevelop.utils.events.Event;
import com.mobidevelop.utils.events.EventDispatcher;
import com.mobidevelop.utils.events.EventListener;
/**
*
* @author Justin Shapcott
*/
public class ViewMapLayers extends Window implements EventListener {
private Skin skin;
private VerticalGroup group;
private ScrollPane scroll;
private ModelMapLayers layers;
private ControllerMap controller;
public ViewMapLayers(String title, Skin skin) {
super(title, skin);
this.skin = skin;
setup();
}
public ViewMapLayers(String title, Skin skin, String styleName) {
super(title, skin, styleName);
this.skin = skin;
setup();
}
public ViewMapLayers(String title, WindowStyle style) {
super(title, style);
}
private void setup() {
group = new VerticalGroup();
scroll = new ScrollPane(group, skin);
add(scroll).colspan(2).expand().fill();
row();
Button add = new TextButton("+", skin);
Button rem = new TextButton("-", skin);
add(add).expandX().fill();
add(rem).expandX().fill();
add.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
if (controller != null) {
controller.createLayer();
}
}
});
rem.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
}
});
}
public void setController(ControllerMap controller) {
this.controller = controller;
}
public void setLayers(ModelMapLayers layers) {
if (this.layers != null) {
this.layers.removeEventListener(this);
}
this.layers = layers;
if (this.layers != null) {
this.layers.addEventListener(this);
for (MapLayer layer : layers) {
group.addActor(createView((ModelMapLayer) layer));
}
}
invalidateHierarchy();
}
@Override
public void onEvent(EventDispatcher dispatcher, Event event) {
MapLayersChangeEvent typed = (MapLayersChangeEvent) event;
if (layers == typed.getTarget()) {
MapLayer layer = typed.getLayer();
if (layer != null) {
if (layers.getIndex(layer) > 0) {
boolean newLayer = true;
for (Actor actor : group.getChildren()) {
if (actor instanceof ViewMapLayer) {
ViewMapLayer view = (ViewMapLayer) actor;
if (layer == view.getLayer()) {
// TODO: Anything to do here?
newLayer = false;
}
break;
}
}
if (newLayer) {
group.addActorAt(0, createView((ModelMapLayer) layer));
}
} else {
for (Actor actor : group.getChildren()) {
if (actor instanceof ViewMapLayer) {
ViewMapLayer view = (ViewMapLayer) actor;
if (view.getLayer() == layer) {
view.setLayer(null);
group.removeActor(actor);
break;
}
}
}
}
} else {
// TODO: Must have been a multiple layer operation (swap, sort, clear)
}
}
}
private ViewMapLayer createView(ModelMapLayer layer) {
return new ViewMapLayer(layer, skin);
}
public class ViewMapLayer extends Table implements EventListener {
private Skin skin;
private Label label;
private ModelMapLayer layer;
public ViewMapLayer(ModelMapLayer layer, Skin skin) {
super(skin);
this.skin = skin;
setup();
this.setLayer(layer);
}
private void setup() {
this.left();
label = new Label("", skin);
add(label);
}
public ModelMapLayer getLayer() {
return layer;
}
public void setLayer(ModelMapLayer layer) {
if (this.layer != null) {
this.layer.removeEventListener(this);
}
this.layer = layer;
if (this.layer != null) {
this.layer.addEventListener(this);
this.label.setText(layer.getName());
} else {
// TODO: Clear all the things
}
}
@Override
public void onEvent(EventDispatcher dispatcher, Event event) {
if (event instanceof MapLayerChangeEvent) {
MapLayerChangeEvent typed = (MapLayerChangeEvent) event;
if (layer == typed.getTarget()) {
label.setText(layer.getName());
}
}
}
}
}