package net.alcuria.umbracraft.editor.widget; import net.alcuria.umbracraft.definitions.area.AreaNodeDefinition; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Array; import com.kotcrab.vis.ui.widget.VisTextButton; /** Recursively displays a list of {@link AreaNodeDefinition} buttons, with * children below and pointers to parents/children. * @author Andrew Keturi */ public class AreaNodeWidget extends Table { public interface NodeClickHandler { void onClick(AreaNodeDefinition definition); } private final Array<VisTextButton> childrenButtons = new Array<VisTextButton>(); private Vector2 dst, src; private final AreaNodeDefinition root; private VisTextButton rootButton; private final ShapeRenderer shapeRenderer = new ShapeRenderer(); private final Vector2 tmp = new Vector2(), tmp2 = new Vector2(); public AreaNodeWidget(final AreaNodeDefinition root, final NodeClickHandler listener) { this.root = root; defaults().pad(10); add(rootButton = new VisTextButton(root.getName()) { { addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { listener.onClick(root); }; }); } }).maxWidth(100).row(); add(new Table() { { if (root.children != null) { for (AreaNodeDefinition child : root.children) { final AreaNodeWidget widget = new AreaNodeWidget(child, listener); add(widget); childrenButtons.add(widget.getRootButton()); } } } }); } @Override public void draw(Batch batch, float parentAlpha) { super.draw(batch, parentAlpha); if (root != null && root.children != null) { drawConnector(batch); } } private void drawConnector(Batch batch) { if (childrenButtons == null) { return; } batch.end(); shapeRenderer.begin(ShapeType.Line); shapeRenderer.setColor(1, 1, 0, 1); tmp.set(rootButton.getWidth() / 2, 0); src = rootButton.localToStageCoordinates(tmp); for (VisTextButton button : childrenButtons) { tmp2.set(button.getWidth() / 2, button.getHeight()); dst = button.localToStageCoordinates(tmp2); shapeRenderer.line(src, dst); } shapeRenderer.end(); batch.begin(); } protected VisTextButton getRootButton() { return rootButton; } }