diff options
| author | Jérémy Zurcher <jeremy@asynk.ch> | 2020-05-17 06:23:33 +0200 | 
|---|---|---|
| committer | Jérémy Zurcher <jeremy@asynk.ch> | 2020-05-17 06:23:33 +0200 | 
| commit | 8647dafb89759dc3b7e4d80781405878e196bca0 (patch) | |
| tree | f560e8b6e3a8459f5de6af0ebe860d714f9b218e /core/src/ch/asynk/gdx/boardgame | |
| parent | b6074b00c0cdb14becdecd896c1e4db7af2b2df1 (diff) | |
| download | gdx-boardgame-8647dafb89759dc3b7e4d80781405878e196bca0.zip gdx-boardgame-8647dafb89759dc3b7e4d80781405878e196bca0.tar.gz | |
UI : computeGeometry is called from Root before drawing if dirty or resized
Diffstat (limited to 'core/src/ch/asynk/gdx/boardgame')
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Button.java | 11 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Container.java | 20 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Element.java | 47 | ||||
| -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 | 16 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Menu.java | 14 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Root.java | 16 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java | 20 | 
8 files changed, 71 insertions, 77 deletions
| diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Button.java b/core/src/ch/asynk/gdx/boardgame/ui/Button.java index 488fcfa..7fdc799 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Button.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Button.java @@ -41,22 +41,21 @@ public class Button extends Patch          label.setAlignment(alignment);      } -    @Override public void computeGeometry(Rectangle area) +    @Override public void computeGeometry(Rectangle area, boolean resized)      { +        label.computeDimensions();          float dd = 2 * (padding + spacing); -        label.computeGeometry(area);          rect.width = label.getWidth() + dd;          rect.height = label.getHeight() + dd; -        if (DEBUG_GEOMETRY) System.err.println("  dim " + print(-1)); -        super.computeGeometry(area); -        label.computeGeometry(innerRect); +        super.computeGeometry(area, resized); +        label.computeGeometry(innerRect, resized);      }      @Override public void drawReal(Batch batch)      {          super.drawReal(batch); -        label.drawReal(batch); +        label.draw(batch);      }      @Override public void drawDebug(ShapeRenderer shapeRenderer) diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Container.java b/core/src/ch/asynk/gdx/boardgame/ui/Container.java index 0a82a67..30b5f20 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Container.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Container.java @@ -38,27 +38,19 @@ public class Container extends Element          }      } -    @Override public void drip() +    @Override public void computeGeometry(Rectangle area, boolean resized)      { -        super.drip(); -        if (children != null) -            children.forEach( c -> c.drip() ); -    } - -    @Override public void computeGeometry(Rectangle area) -    { -        if (children != null) { -            for(Element e : children) { -                e.computeGeometry(area); -                e.clear(); -            } +        if (dirty || resized) { +            if (children != null) +                children.forEach( c -> c.computeGeometry(area, resized) ); +            super.computeGeometry(area, resized);          }      }      @Override public void drawReal(Batch batch)      {          if (children != null) -            children.forEach( c -> c.draw(batch, innerRect) ); +            children.forEach( c -> c.draw(batch) );      }      @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 54d2953..89e28a7 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Element.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Element.java @@ -35,7 +35,7 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch          this.rect = new Rectangle(0, 0, 0, 0);          this.innerRect = new Rectangle(0, 0, 0, 0);          this.x = this.y = 0; -        taint(); +        this.dirty = true;      }      @Override public final float getX()         { return rect.x; } @@ -85,23 +85,15 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch          this.dirty = false;      } -    public void mark() -    { -        if (DEBUG_GEOMETRY) print("  mark"); -        this.dirty = true; -    } - -    public void drip() -    { -        if (DEBUG_GEOMETRY) print("  drip"); -        this.dirty = true; -    } -      public void taint()      { +        if (this.dirty) { +            if (DEBUG_GEOMETRY) print("  already dirty"); +            return; +        }          if (DEBUG_GEOMETRY) print(" taint"); -        mark(); -        if (parent != null) parent.mark(); +        this.dirty = true; +        if (parent != null) parent.taint();      }      @Override public void setPosition(float x, float y, float w, float h) @@ -171,12 +163,10 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch         setPosition(x, y, rect.width, rect.height);      } +    protected void computeDimensions() { } +      private void computePosition(Rectangle area)      { -        if (area == null) { -            System.err.println("******** ERROR : computeGeometry(null) check for draw(batch) calls : " + print(-1)); -            return; -        }          if (alignment == Alignment.ABSOLUTE) {              rect.x = x;              rect.y = y; @@ -191,27 +181,20 @@ public abstract class Element implements Drawable, Paddable, Positionable, Touch          if (DEBUG_GEOMETRY) System.err.println("  pos " + print(-1));      } -    public void computeGeometry(Rectangle area) +    public void computeGeometry(Rectangle area, boolean resized)      { -        computePosition(area); +        if (dirty || resized) { +            computeDimensions(); +            computePosition(area); +            clear(); +        }      }      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)); } -            computeGeometry(area); -            clear(); -            if (DEBUG_GEOMETRY) System.err.println("Geometry]"); -        }          drawReal(batch);      } diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Label.java b/core/src/ch/asynk/gdx/boardgame/ui/Label.java index 8acb5e5..6129547 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Label.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Label.java @@ -53,12 +53,10 @@ public class Label extends Element          taint();      } -    @Override public void computeGeometry(Rectangle area) +    @Override public void computeDimensions()      {          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 b316241..4b0d388 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/List.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/List.java @@ -47,7 +47,7 @@ public class List extends Element              if (i >= 0 && i < items.size()) {                  if (idx == null || idx != i) {                      idx = i; -                    selected.setPosition(0, getInnerHeight() - ((idx + 1) * itemHeight) + spacing / 2f, getWidth(), itemHeight); +                    selected.setPosition(0, getHeight() - padding + spacing / 2 - ((idx + 1) * itemHeight), getWidth(), itemHeight);                      selected.visible = true;                  }                  return touched; @@ -68,10 +68,10 @@ public class List extends Element      @Override public void translate(float x, float y)      {          super.translate(x, y); -        selected.mark(); +        selected.taint();      } -    @Override public void computeGeometry(Rectangle area) +    public void computeDimensions()      {          float w = 0f;          for (Item e: items) { @@ -81,9 +81,13 @@ public class List extends Element          itemHeight = (layout.height + spacing);          rect.width = w + (2 * padding);          rect.height = (itemHeight * items.size()) + (2 * padding) - spacing; -        if (DEBUG_GEOMETRY) System.err.println("  dim " + print(-1)); +    } -        super.computeGeometry(area); +    @Override public void computeGeometry(Rectangle area, boolean resized) +    { +        computeDimensions(); +        super.computeGeometry(area, resized); +        selected.computeGeometry(rect, resized);      }      @Override public void drawReal(Batch batch) @@ -94,6 +98,6 @@ public class List extends Element              font.draw(batch, e.s(), x, y);              y -= itemHeight;          } -        selected.draw(batch, innerRect); +        selected.draw(batch);      }  } diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Menu.java b/core/src/ch/asynk/gdx/boardgame/ui/Menu.java index 14c8f2f..b754083 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Menu.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Menu.java @@ -66,13 +66,13 @@ public class Menu extends Patch          taint();      } -    @Override public void computeGeometry(Rectangle area) +    @Override public void computeGeometry(Rectangle area, boolean resized)      { -        title.computeGeometry(area); +        title.computeGeometry(area, resized);          float h = title.getHeight();          float w = title.getWidth();          for (Label label : entries) { -            label.computeGeometry(area); +            label.computeGeometry(area, resized);              h += label.getHeight();              float t = label.getWidth() + entriesOffset;              if (t > w) @@ -80,9 +80,8 @@ 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)); -        super.computeGeometry(area); +        super.computeGeometry(area, resized);          float y = getInnerHeight() - title.getHeight();          title.setPositionClear(0, y, innerRect); @@ -91,7 +90,6 @@ public class Menu extends Patch              l.setPositionClear(x + entriesOffset, y - l.getHeight(), innerRect);              y -= (l.getHeight() + entriesSpacing);          } -        if (DEBUG_GEOMETRY) System.err.println("  pos " + print(-1));      }      public int touched() @@ -117,9 +115,9 @@ public class Menu extends Patch      @Override public void drawReal(Batch batch)      {          super.drawReal(batch); -        title.drawReal(batch); +        title.draw(batch);          for (Label label : entries) { -            label.drawReal(batch); +            label.draw(batch);          }      } diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Root.java b/core/src/ch/asynk/gdx/boardgame/ui/Root.java index 2099cbd..750f574 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Root.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Root.java @@ -8,6 +8,7 @@ import ch.asynk.gdx.boardgame.utils.IterableSet;  public class Root extends Container  {      private Element touched; +    private boolean resized;      public Root(int c)      { @@ -28,15 +29,15 @@ public class Root extends Container      public void resize(float x, float y, float width, float height)      {          setPosition(x, y, width, height); -        drip(); +        resized = true;      } -    @Override public void computeGeometry(Rectangle area) +    @Override public void computeGeometry(Rectangle area, boolean resized)      {          rect.x = x;          rect.y = y;          innerRect.set(getInnerX(), getInnerY(), getInnerWidth(), getInnerHeight()); -        super.computeGeometry(innerRect); +        super.computeGeometry(innerRect, resized);      }      public Element touched() @@ -44,6 +45,15 @@ public class Root extends Container          return touched;      } +    @Override public void draw(Batch batch) +    { +        if (dirty || resized) { +            computeGeometry(null, resized); +            resized = false; +        } +        super.draw(batch); +    } +      @Override public Element touch(float x, float y)      {          touched = super.touch(x, y); diff --git a/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java b/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java index e07df0f..c95c7f1 100644 --- a/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java +++ b/core/src/ch/asynk/gdx/boardgame/ui/Scrollable.java @@ -20,9 +20,10 @@ public class Scrollable extends Element          super();          this.vScroll = true;          this.hScroll = false; -        this.child = child;          this.scissorIdx = -1;          this.clip = new Rectangle(); +        this.child = child; +        child.setParent(this);      }      public Element getChild() { return child; } @@ -37,11 +38,20 @@ public class Scrollable extends Element          return (child.getHeight() + (2 * padding));      } -    @Override public void computeGeometry(Rectangle area) +    public void computeDimensions() +    { +        child.computeDimensions(); +    } + +    @Override public void computeGeometry(Rectangle area, boolean resized)      { -        child.computeGeometry(area); +        if (resized || scissorIdx == -1) +            setPosition(area.x, area.y, area.width, area.height); +        child.computeGeometry(clip, resized); +        clear();      } +      @Override public Element touch(float x, float y)      {          if (clip.contains(x, y)) { @@ -88,8 +98,8 @@ 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), innerRect);          scissorIdx = Scissors.compute(scissorIdx, clip); +        child.setPositionClear(0, - (child.rect.height - clip.height), clip);      }      @Override public void drawReal(Batch batch) @@ -98,7 +108,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, innerRect); +        child.draw(batch);          batch.flush();          Gdx.gl.glDisable(GL20.GL_SCISSOR_TEST);      } | 
