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.MapObject; import com.mobidevelop.maps.editor.events.MapObjectChangeEvent; import com.mobidevelop.maps.editor.events.MapObjectsChangeEvent; import com.mobidevelop.maps.editor.models.ModelMapObject; import com.mobidevelop.maps.editor.models.ModelMapObjects; import com.mobidevelop.utils.events.Event; import com.mobidevelop.utils.events.EventDispatcher; import com.mobidevelop.utils.events.EventListener; /** * * @author Justin Shapcott */ public class ViewMapObjects extends Window implements EventListener { private Skin skin; private VerticalGroup group; private ScrollPane scroll; private ModelMapObjects objects; public ViewMapObjects(String title, Skin skin) { super(title, skin); this.skin = skin; setup(); } public ViewMapObjects(String title, Skin skin, String styleName) { super(title, skin, styleName); this.skin = skin; setup(); } public ViewMapObjects(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) { } }); rem.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { } }); } public void setObjects(ModelMapObjects objects) { if (this.objects != null) { this.objects.removeEventListener(this); } this.objects = objects; if (this.objects != null) { this.objects.addEventListener(this); for (MapObject object : objects) { group.addActor(createView((ModelMapObject) object)); } } invalidateHierarchy(); } @Override public void onEvent(EventDispatcher dispatcher, Event event) { MapObjectsChangeEvent typed = (MapObjectsChangeEvent) event; if (objects == typed.getTarget()) { MapObject object = typed.getObject(); if (object != null) { if (objects.getIndex(object) > 0) { boolean newObject = true; for (Actor actor : group.getChildren()) { if (actor instanceof ViewMapObject) { ViewMapObject view = (ViewMapObject) actor; if (object == view.getObject()) { // TODO: Anything to do here? newObject = false; } break; } } if (newObject) { group.addActorAt(0, createView((ModelMapObject) object)); } } else { for (Actor actor : group.getChildren()) { if (actor instanceof ViewMapObject) { ViewMapObject view = (ViewMapObject) actor; if (view.getObject() == object) { view.setObject(null); group.removeActor(actor); break; } } } } } else { // TODO: Must have been a multiple object operation (swap, sort, clear) } } } private ViewMapObject createView(ModelMapObject object) { return new ViewMapObject(object, skin); } public class ViewMapObject extends Table implements EventListener { private Skin skin; private Label label; private ModelMapObject object; public ViewMapObject(ModelMapObject object, Skin skin) { super(skin); this.skin = skin; setup(); this.setObject(object); } private void setup() { this.left(); label = new Label("", skin); add(label); } public ModelMapObject getObject() { return object; } public void setObject(ModelMapObject object) { if (this.object != null) { this.object.removeEventListener(this); } this.object = object; if (this.object != null) { this.object.addEventListener(this); this.label.setText(object.getName()); } else { // TODO: Clear all the things } } @Override public void onEvent(EventDispatcher dispatcher, Event event) { if (event instanceof MapObjectChangeEvent) { MapObjectChangeEvent typed = (MapObjectChangeEvent) event; if (object == typed.getTarget()) { label.setText(object.getName()); } } } } }