package net.onedaybeard.dominatrix.experimental.ui; import java.util.Comparator; import java.util.Set; import net.onedaybeard.dominatrix.artemis.ComponentUtils; import net.onedaybeard.dominatrix.artemis.JsonId; import com.artemis.Component; import com.artemis.Entity; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.Window; import com.badlogic.gdx.scenes.scene2d.utils.Align; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Array; /** * SAdds components to entities. */ public final class ComponentsHud { private static final int PADDING = 10; private static final int COLUMNS = 5; private final Window componentsWindow; private Entity entity; private OnEntityChangedListener onEntityChangedListener; public ComponentsHud(Skin skin, Stage ui, Class<? extends JsonId> jsonComponent) { componentsWindow = createComponentsWindow(skin, jsonComponent.getPackage()); componentsWindow.setPosition(ui.getWidth() / 2 - componentsWindow.getWidth() / 2, ui.getHeight() - componentsWindow.getHeight() - PADDING); componentsWindow.setVisible(false); ui.addActor(componentsWindow); } public void showFor(Entity entity) { this.entity = entity; componentsWindow.setTitle("Add component to " + entity); componentsWindow.setVisible(true); } public boolean isVisible() { return componentsWindow.isVisible(); } public void setVisible(boolean visible) { if (!visible) entity = null; componentsWindow.setVisible(visible); } private Window createComponentsWindow(Skin skin, Package componentPackage) { Set<Class<? extends Component>> componentSet = ComponentUtils.getComponents(componentPackage); Array<Class<?>> components = new Array<Class<?>>(); for (Class<? extends Component> c : componentSet) { components.add(c); } components.sort(new ClassNameComparator()); Window w = new Window("", skin); w.defaults().pad(PADDING).align(Align.center); addComponentsToWindow(w, skin, components); w.pack(); return w; } private void addComponentsToWindow(Window w, Skin skin, Array<Class<?>> components) { for (int i = 0; components.size > i; i++) { if (i % COLUMNS == 0) w.row(); w.add(addButton(skin, components.get(i))).fillX(); } } private TextButton addButton(Skin skin, final Class<?> component) { String title = component.getSimpleName(); final TextButton button = new TextButton(title, skin); button.setName(component.getSimpleName()); button.addListener(new ClickListener() { @SuppressWarnings("unchecked") @Override public void clicked(InputEvent event, float x, float y) { ComponentUtils.addComponent(entity, component); if (onEntityChangedListener != null) onEntityChangedListener.onComponentAdded(entity.getId(), (Class<? extends Component>)component); componentsWindow.setVisible(false); event.cancel(); } }); return button; } private static final class ClassNameComparator implements Comparator<Class<?>> { @Override public int compare(Class<?> o1, Class<?> o2) { return o1.getSimpleName().compareTo(o2.getSimpleName()); } } public static interface OnEntityChangedListener { void onComponentAdded(int entityId, Class<? extends Component> addedType); } }