diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2020-05-15 12:11:31 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2020-05-15 12:11:31 +0200 |
commit | b6074b00c0cdb14becdecd896c1e4db7af2b2df1 (patch) | |
tree | e47c4f6f1a7df9f4ee6fb9f5c1ad88a7592a2780 | |
parent | 639f146d92e0e2503f4360e40f79b885db6d1ba5 (diff) | |
download | gdx-boardgame-b6074b00c0cdb14becdecd896c1e4db7af2b2df1.zip gdx-boardgame-b6074b00c0cdb14becdecd896c1e4db7af2b2df1.tar.gz |
UI : computeDimensons()+computePosition() -> computeGeometry(rect)
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Alignment.java | 18 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Button.java | 12 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Container.java | 13 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Element.java | 50 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Label.java | 4 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/List.java | 18 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Menu.java | 16 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Root.java | 8 | ||||
-rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java | 13 | ||||
-rw-r--r-- | test/src/ch/asynk/gdx/boardgame/test/UiScreen.java | 20 |
10 files changed, 94 insertions, 78 deletions
diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Alignment.java b/core/src/ch/asynk/gdx/boardgame/ui/Alignment.java index 67da089..3c12087 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Alignment.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Alignment.java @@ -1,5 +1,7 @@ package ch.asynk.gdx.boardgame.ui; +import com.badlogic.gdx.math.Rectangle; + public enum Alignment { ABSOLUTE, // Root @@ -122,9 +124,9 @@ public enum Alignment return false; } - public float getX(Element element, float width) + public float getX(Rectangle area, float width) { - float x = element.getInnerX(); + float x = area.x; switch(this) { case TOP_LEFT: case MIDDLE_LEFT: @@ -133,30 +135,30 @@ public enum Alignment case TOP_CENTER: case MIDDLE_CENTER: case BOTTOM_CENTER: - x += ((element.getInnerWidth() - width) / 2); + x += ((area.width - width) / 2); break; case TOP_RIGHT: case MIDDLE_RIGHT: case BOTTOM_RIGHT: - x += (element.getInnerWidth() - width); + x += (area.width - width); break; } return x; } - public float getY(Element element, float height) + public float getY(Rectangle area, float height) { - float y = element.getInnerY(); + float y = area.y; switch(this) { case TOP_LEFT: case TOP_CENTER: case TOP_RIGHT: - y += (element.getInnerHeight() - height); + y += (area.height - height); break; case MIDDLE_LEFT: case MIDDLE_CENTER: case MIDDLE_RIGHT: - y += ((element.getInnerHeight() - height) / 2); + y += ((area.height - height) / 2); break; case BOTTOM_LEFT: case BOTTOM_CENTER: diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Button.java b/core/src/ch/asynk/gdx/boardgame/ui/Button.java index 46232ba..488fcfa 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Button.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Button.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.NinePatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.math.Rectangle; public class Button extends Patch { @@ -40,19 +41,16 @@ public class Button extends Patch label.setAlignment(alignment); } - @Override public void computeDimensions() + @Override public void computeGeometry(Rectangle area) { float dd = 2 * (padding + spacing); - label.computeDimensions(); + label.computeGeometry(area); rect.width = label.getWidth() + dd; rect.height = label.getHeight() + dd; if (DEBUG_GEOMETRY) System.err.println(" dim " + print(-1)); - } - @Override public void computePosition() - { - super.computePosition(); - label.computePosition(); + super.computeGeometry(area); + label.computeGeometry(innerRect); } @Override public void drawReal(Batch batch) diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Container.java b/core/src/ch/asynk/gdx/boardgame/ui/Container.java index ab6b781..0a82a67 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Container.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Container.java @@ -2,6 +2,7 @@ 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; import ch.asynk.gdx.boardgame.utils.IterableSet; @@ -44,10 +45,20 @@ public class Container extends Element children.forEach( c -> c.drip() ); } + @Override public void computeGeometry(Rectangle area) + { + if (children != null) { + for(Element e : children) { + e.computeGeometry(area); + e.clear(); + } + } + } + @Override public void drawReal(Batch batch) { if (children != null) - children.forEach( c -> c.draw(batch) ); + children.forEach( c -> c.draw(batch, innerRect) ); } @Override public void drawDebug(ShapeRenderer shapeRenderer) diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Element.java b/core/src/ch/asynk/gdx/boardgame/ui/Element.java index b7604f6..54d2953 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Element.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Element.java @@ -20,6 +20,7 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch protected Sizing sizing; // sizing policy protected Alignment alignment; // where to position itself protected Rectangle rect; // outer drawing coordinates + protected Rectangle innerRect; // inner drawing coordinates protected float x, y; // given position protected boolean dirty; // geometry must be computed @@ -32,6 +33,7 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch this.sizing = Sizing.NONE; this.alignment = alignment.RELATIVE; this.rect = new Rectangle(0, 0, 0, 0); + this.innerRect = new Rectangle(0, 0, 0, 0); this.x = this.y = 0; taint(); } @@ -111,11 +113,11 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch taint(); } - public final void setPositionClear(float x, float y) + public final void setPositionClear(float x, float y, Rectangle area) { this.x = x; this.y = y; - computePosition(); + computePosition(area); clear(); } @@ -154,7 +156,7 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch setPosition((cx - (rect.width / 2f)), (cy - (rect.height / 2f))); } - @Override public final void translate(float dx, float dy) + @Override public void translate(float dx, float dy) { setPosition(x + dx, y + dy); } @@ -169,44 +171,44 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch setPosition(x, y, rect.width, rect.height); } - public void computeDimensions() + private void computePosition(Rectangle area) { - if (parent != null && sizing.fill()) { - if (sizing.fillWidth()) { - rect.width = parent.getInnerWidth(); - } - if (sizing.fillHeight()) { - rect.height = parent.getInnerHeight(); - } + if (area == null) { + System.err.println("******** ERROR : computeGeometry(null) check for draw(batch) calls : " + print(-1)); + return; } - // it is up to the subclass to implement the expand logic - if (DEBUG_GEOMETRY) System.err.println(" dim " + print(-1)); - } - - public void computePosition() - { - if (alignment == Alignment.ABSOLUTE || parent == null) { + if (alignment == Alignment.ABSOLUTE) { rect.x = x; rect.y = y; } else if (alignment == Alignment.RELATIVE) { - rect.x = x + parent.getInnerX(); - rect.y = y + parent.getInnerY(); + rect.x = x + area.x; + rect.y = y + area.y; } else { - rect.x = x + alignment.getX(parent, rect.width); - rect.y = y + alignment.getY(parent, rect.height); + rect.x = x + alignment.getX(area, rect.width); + rect.y = y + alignment.getY(area, rect.height); } + innerRect.set(getInnerX(), getInnerY(), getInnerWidth(), getInnerHeight()); if (DEBUG_GEOMETRY) System.err.println(" pos " + print(-1)); } + public void computeGeometry(Rectangle area) + { + computePosition(area); + } + public abstract void drawReal(Batch batch); @Override public void draw(Batch batch) { + draw(batch, null); + } + + public void draw(Batch batch, Rectangle area) + { if (!visible) return; if (dirty) { if (DEBUG_GEOMETRY) { print("[Geometry"); System.err.println(" --> " + print(-1)); } - computeDimensions(); - computePosition(); + computeGeometry(area); clear(); if (DEBUG_GEOMETRY) System.err.println("Geometry]"); } diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Label.java b/core/src/ch/asynk/gdx/boardgame/ui/Label.java index 4ff4789..8acb5e5 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Label.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Label.java @@ -3,6 +3,7 @@ package ch.asynk.gdx.boardgame.ui; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.GlyphLayout; +import com.badlogic.gdx.math.Rectangle; public class Label extends Element { @@ -52,11 +53,12 @@ public class Label extends Element taint(); } - @Override public void computeDimensions() + @Override public void computeGeometry(Rectangle area) { this.rect.width = (layout.width + (2 * padding)); this.rect.height = (layout.height + (2 * padding)); if (DEBUG_GEOMETRY) System.err.println(" dim " + print(-1)); + super.computeGeometry(area); } @Override public void drawReal(Batch batch) diff --git a/core/src/ch/asynk/gdx/boardgame/ui/List.java b/core/src/ch/asynk/gdx/boardgame/ui/List.java index 2d84a94..b316241 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/List.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/List.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.GlyphLayout; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; import ch.asynk.gdx.boardgame.utils.Collection; @@ -64,7 +65,13 @@ public class List extends Element taint(); } - @Override public void computeDimensions() + @Override public void translate(float x, float y) + { + super.translate(x, y); + selected.mark(); + } + + @Override public void computeGeometry(Rectangle area) { float w = 0f; for (Item e: items) { @@ -75,13 +82,8 @@ public class List extends Element rect.width = w + (2 * padding); rect.height = (itemHeight * items.size()) + (2 * padding) - spacing; if (DEBUG_GEOMETRY) System.err.println(" dim " + print(-1)); - } - @Override public void computePosition() - { - super.computePosition(); - selected.computePosition(); - if (DEBUG_GEOMETRY) System.err.println(" pos " + print(-1)); + super.computeGeometry(area); } @Override public void drawReal(Batch batch) @@ -92,6 +94,6 @@ public class List extends Element font.draw(batch, e.s(), x, y); y -= itemHeight; } - selected.draw(batch); + selected.draw(batch, innerRect); } } diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Menu.java b/core/src/ch/asynk/gdx/boardgame/ui/Menu.java index 2c0c429..14c8f2f 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Menu.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Menu.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.NinePatch; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.math.Rectangle; public class Menu extends Patch { @@ -65,13 +66,13 @@ public class Menu extends Patch taint(); } - @Override public void computeDimensions() + @Override public void computeGeometry(Rectangle area) { - title.computeDimensions(); + title.computeGeometry(area); float h = title.getHeight(); float w = title.getWidth(); for (Label label : entries) { - label.computeDimensions(); + label.computeGeometry(area); h += label.getHeight(); float t = label.getWidth() + entriesOffset; if (t > w) @@ -80,17 +81,14 @@ public class Menu extends Patch rect.width = w + (2 * padding); rect.height = h + (titleSpacing + (entriesSpacing * (entries.length - 1)) + (2 * padding)); if (DEBUG_GEOMETRY) System.err.println(" dim " + print(-1)); - } - @Override public void computePosition() - { - super.computePosition(); + super.computeGeometry(area); float y = getInnerHeight() - title.getHeight(); - title.setPositionClear(0, y); + title.setPositionClear(0, y, innerRect); y -= titleSpacing; for (Label l : entries) { - l.setPositionClear(x + entriesOffset, y - l.getHeight()); + l.setPositionClear(x + entriesOffset, y - l.getHeight(), innerRect); y -= (l.getHeight() + entriesSpacing); } if (DEBUG_GEOMETRY) System.err.println(" pos " + print(-1)); diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Root.java b/core/src/ch/asynk/gdx/boardgame/ui/Root.java index f11a617..2099cbd 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Root.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Root.java @@ -31,6 +31,14 @@ public class Root extends Container drip(); } + @Override public void computeGeometry(Rectangle area) + { + rect.x = x; + rect.y = y; + innerRect.set(getInnerX(), getInnerY(), getInnerWidth(), getInnerHeight()); + super.computeGeometry(innerRect); + } + public Element touched() { return touched; diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java b/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java index b5f55f4..e07df0f 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java @@ -37,14 +37,9 @@ public class Scrollable extends Element return (child.getHeight() + (2 * padding)); } - @Override public void computeDimensions() + @Override public void computeGeometry(Rectangle area) { - child.computeDimensions(); - } - - @Override public void computePosition() - { - child.computePosition(); + child.computeGeometry(area); } @Override public Element touch(float x, float y) @@ -93,7 +88,7 @@ public class Scrollable extends Element { rect.set(x, y, w, h); clip.set((x + padding), (y + padding), (w - 2 * padding), (h - 2 * padding)); - child.setPositionClear(clip.x, clip.y - (child.rect.height - clip.height)); + child.setPositionClear(clip.x, clip.y - (child.rect.height - clip.height), innerRect); scissorIdx = Scissors.compute(scissorIdx, clip); } @@ -103,7 +98,7 @@ public class Scrollable extends Element Rectangle scissor = Scissors.get(scissorIdx, clip); HdpiUtils.glScissor((int)scissor.x, (int)scissor.y, (int)scissor.width, (int)scissor.height); Gdx.gl.glEnable(GL20.GL_SCISSOR_TEST); - child.draw(batch); + child.draw(batch, innerRect); batch.flush(); Gdx.gl.glDisable(GL20.GL_SCISSOR_TEST); } diff --git a/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java b/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java index 58ad764..8a732b3 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java @@ -7,6 +7,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.math.Rectangle; import ch.asynk.gdx.boardgame.ui.Alignment; import ch.asynk.gdx.boardgame.ui.Button; @@ -152,9 +153,9 @@ class MyButton extends Button super(font, patch, padding, spacing); } - @Override public void computePosition() + @Override public void computeGeometry(Rectangle space) { - super.computePosition(); + super.computeGeometry(space); System.err.println("call to label.write(…)"); label.write(String.format("%04d;%04d", (int)getX(), (int)getY())); } @@ -197,18 +198,15 @@ class MyList extends Patch this.scrollable.hScroll = true; } - @Override public void computeDimensions() + @Override public void computeGeometry(Rectangle space) { - title.computeDimensions(); - scrollable.computeDimensions(); + scrollable.computeGeometry(space); rect.height = 300; rect.width = scrollable.getBestWidth() + (2 * padding) - 100; - } - @Override public void computePosition() - { - super.computePosition(); - title.computePosition(); + super.computeGeometry(space); + title.computeGeometry(innerRect); + scrollable.computeGeometry(space); scrollable.setPosition(getInnerX(), getInnerY(), getInnerWidth(), getInnerHeight() - title.getHeight() - 15); } @@ -226,7 +224,7 @@ class MyList extends Patch { super.drawReal(batch); title.drawReal(batch); - scrollable.draw(batch); + scrollable.drawReal(batch); } @Override public void drawDebug(ShapeRenderer shapeRenderer) |