From ea93755e4b9d56181bc4e7910044bdc321e748c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Wed, 13 May 2020 07:11:00 +0200 Subject: add ui/Container --- core/src/ch/asynk/gdx/boardgame/ui/Container.java | 75 +++++++++++++++++++++++ core/src/ch/asynk/gdx/boardgame/ui/Element.java | 47 +------------- core/src/ch/asynk/gdx/boardgame/ui/Root.java | 10 +-- 3 files changed, 77 insertions(+), 55 deletions(-) create mode 100644 core/src/ch/asynk/gdx/boardgame/ui/Container.java diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Container.java b/core/src/ch/asynk/gdx/boardgame/ui/Container.java new file mode 100644 index 0000000..f12a15d --- /dev/null +++ b/core/src/ch/asynk/gdx/boardgame/ui/Container.java @@ -0,0 +1,75 @@ +package ch.asynk.gdx.boardgame.ui; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; + +import ch.asynk.gdx.boardgame.utils.IterableSet; + +public class Container extends Element +{ + public static int DEFAULT_CHILD_COUNT = 2; + + protected IterableSet children; + + protected Container() + { + super(); + this.children = null; + } + + public void add(Element e) + { + if (children == null) + children = new IterableSet(DEFAULT_CHILD_COUNT); + if (children.add(e)) { + e.setParent(this); + } + } + + public void remove(Element e) + { + if (children != null) { + if (children.remove(e)) { + e.setParent(null); + } + } + } + + @Override public void taint() + { + super.taint(); + if (children != null) + children.forEach( c -> c.taint() ); + } + + @Override public void draw(Batch batch) + { + if (!visible) return; + if (tainted) computeGeometry(); + if (children != null) + children.forEach( c -> c.draw(batch) ); + } + + @Override public void drawDebug(ShapeRenderer shapeRenderer) + { + shapeRenderer.rect(getX(), getY(), getWidth(), getHeight()); + if (children != null) + children.forEach( c -> c.drawDebug(shapeRenderer) ); + } + + @Override public Element touch(float x, float y) + { + if (super.touch(x, y) != null) { + if (children != null) { + for (Element e : children) { + final Element t = e.touch(x, y); + if (t != null) + return t; + } + } + return this; + } + return null; + } +} + diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Element.java b/core/src/ch/asynk/gdx/boardgame/ui/Element.java index 41adf29..5df6587 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Element.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Element.java @@ -1,6 +1,5 @@ package ch.asynk.gdx.boardgame.ui; -import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Rectangle; @@ -8,26 +7,22 @@ import ch.asynk.gdx.boardgame.Drawable; import ch.asynk.gdx.boardgame.Paddable; import ch.asynk.gdx.boardgame.Positionable; import ch.asynk.gdx.boardgame.Touchable; -import ch.asynk.gdx.boardgame.utils.IterableSet; public abstract class Element implements Drawable, Paddable, Positionable, Touchable { public static boolean DEBUG_GEOMETRY = false; - public static int DEFAULT_CHILD_COUNT = 2; public boolean blocked; public boolean visible; protected float padding; protected Element parent; - protected Sizing sizing; // set dimensions according to parent and children + protected Sizing sizing; // sizing policy protected Alignment alignment; // where to position itself protected Rectangle rect; // outer drawing coordinates protected float x, y; // given position protected boolean tainted; // geometry must be computed public boolean taintParent; // propagate tainted state up the tree - protected IterableSet children; - protected Element() { this(false); @@ -45,7 +40,6 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch this.x = this.y = 0; this.tainted = true; this.taintParent = taintParent; - this.children = null; } @Override public final float getX() { return rect.x; } @@ -84,36 +78,12 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch return r; } - public void add(Element e) - { - if (children == null) - children = new IterableSet(DEFAULT_CHILD_COUNT); - if (children.add(e)) { - e.setParent(this); - } - } - - public void remove(Element e) - { - if (children != null) { - if (children.remove(e)) { - e.setParent(null); - } - } - } - public void taint() { this.tainted = true; if (parent != null && taintParent) parent.taint(); } - public void taintChildren() - { - if (children != null) - children.forEach( c -> c.taint() ); - } - @Override public void setPosition(float x, float y, float w, float h) { this.x = x; @@ -211,29 +181,14 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch this.tainted = false; } - public void drawChildren(Batch batch) - { - if (children != null) - children.forEach( c -> c.draw(batch) ); - } - @Override public void drawDebug(ShapeRenderer shapeRenderer) { shapeRenderer.rect(getX(), getY(), getWidth(), getHeight()); - if (children != null) - children.forEach( c -> c.drawDebug(shapeRenderer) ); } @Override public Element touch(float x, float y) { if (!blocked && visible && rect.contains(x, y)) { - if (children != null) { - for (Element e : children) { - final Element t = e.touch(x, y); - if (t != null) - return t; - } - } return this; } return null; diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Root.java b/core/src/ch/asynk/gdx/boardgame/ui/Root.java index c84287b..c3ad0c3 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Root.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Root.java @@ -5,7 +5,7 @@ import com.badlogic.gdx.math.Rectangle; import ch.asynk.gdx.boardgame.utils.IterableSet; -public class Root extends Element +public class Root extends Container { private Element touched; @@ -29,7 +29,6 @@ public class Root extends Element { setPosition(x, y, width, height); taint(); - taintChildren(); } public Element touched() @@ -52,11 +51,4 @@ public class Root extends Element } return false; } - - @Override public void draw(Batch batch) - { - if (!visible) return; - if (tainted) computeGeometry(); - children.forEach( c -> c.draw(batch) ); - } } -- cgit v1.1-2-g2b99