OSDN Git Service

[added] Layout class so scene2d actors can support being laid out.
authornathan.sweet <nathan.sweet@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Sun, 10 Apr 2011 01:00:47 +0000 (01:00 +0000)
committernathan.sweet <nathan.sweet@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Sun, 10 Apr 2011 01:00:47 +0000 (01:00 +0000)
[changed] Label to support multiline and wrapped text.

backends/gdx-openal/src/com/badlogic/gdx/backends/openal/OpenALAudio.java
gdx/src/com/badlogic/gdx/math/Matrix4.java
gdx/src/com/badlogic/gdx/scenes/scene2d/Layout.java [new file with mode: 0644]
gdx/src/com/badlogic/gdx/scenes/scene2d/actors/Label.java

index c6cfd90..36f42df 100644 (file)
@@ -164,6 +164,7 @@ public class OpenALAudio implements Audio {
        }\r
 \r
        public AudioDevice newAudioDevice (boolean isMono) {\r
+               // BOZO - Write OpenAL device.\r
                return new JavaSoundAudioDevice(isMono);\r
        }\r
 \r
index 1c229d3..7a6eb53 100644 (file)
@@ -597,12 +597,12 @@ public class Matrix4 implements Serializable {
         * @param angle The angle in degrees\r
         * @return This matrix for chaining\r
         */     \r
-       static final Vector3 tmpV = new Vector3();\r
        public Matrix4 setToRotation (float axisX, float axisY, float axisZ, float angle) {\r
                idt();\r
                if (angle == 0) return this;\r
                return this.set(quat.set(tmpV.set(axisX, axisY, axisZ), angle));\r
        }\r
+       static final Vector3 tmpV = new Vector3();\r
 \r
        /**\r
         * Sets this matrix to a rotation matrix from the given euler angles.\r
diff --git a/gdx/src/com/badlogic/gdx/scenes/scene2d/Layout.java b/gdx/src/com/badlogic/gdx/scenes/scene2d/Layout.java
new file mode 100644 (file)
index 0000000..bf303bb
--- /dev/null
@@ -0,0 +1,10 @@
+\r
+package com.badlogic.gdx.scenes.scene2d;\r
+\r
+public interface Layout {\r
+       public void layout ();\r
+\r
+       public float getPrefWidth ();\r
+\r
+       public float getPrefHeight ();\r
+}\r
index c451095..a446251 100644 (file)
 package com.badlogic.gdx.scenes.scene2d.actors;\r
 \r
 import com.badlogic.gdx.graphics.g2d.BitmapFont;\r
+import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;\r
 import com.badlogic.gdx.graphics.g2d.BitmapFont.TextBounds;\r
 import com.badlogic.gdx.graphics.g2d.BitmapFontCache;\r
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;\r
 import com.badlogic.gdx.scenes.scene2d.Actor;\r
+import com.badlogic.gdx.scenes.scene2d.Layout;\r
 \r
-public class Label extends Actor {\r
+public class Label extends Actor implements Layout {\r
        public BitmapFontCache cache;\r
+       public VAlignment valignment = VAlignment.BOTTOM;\r
+       public String text;\r
+       public TextBounds bounds;\r
 \r
-       public Label (String name, BitmapFont font, String text) {\r
+       private WrapType wrapType;\r
+       private HAlignment halignment;\r
+       private float lastWidth = -1;\r
+\r
+       public Label (String name, BitmapFont font) {\r
                super(name);\r
                cache = new BitmapFontCache(font);\r
+       }\r
+\r
+       public Label (String name, BitmapFont font, String text) {\r
+               this(name, font);\r
                setText(text);\r
        }\r
 \r
        public void setText (String text) {\r
-               cache.setText(text, 0, cache.getFont().isFlipped() ? 0 : cache.getFont().getCapHeight());\r
-               TextBounds bounds = cache.getBounds();\r
+               this.text = text;\r
+               wrapType = WrapType.singleLine;\r
+               bounds = cache.setText(text, 0, cache.getFont().isFlipped() ? 0 : cache.getFont().getCapHeight());\r
+               width = bounds.width;\r
+               height = bounds.height;\r
+       }\r
+\r
+       public void setMultiLineText (String text) {\r
+               this.text = text;\r
+               wrapType = WrapType.multiLine;\r
+               bounds = cache.getFont().getMultiLineBounds(text);\r
+               cache.setMultiLineText(text, 0, cache.getFont().isFlipped() ? 0 : bounds.height);\r
                width = bounds.width;\r
                height = bounds.height;\r
        }\r
 \r
+       public void setWrappedText (String text, HAlignment alignment) {\r
+               this.text = text;\r
+               this.halignment = alignment;\r
+               wrapType = WrapType.wrapped;\r
+               bounds = cache.getFont().getWrappedBounds(text, width);\r
+               cache.setWrappedText(text, 0, cache.getFont().isFlipped() ? 0 : bounds.height, width, alignment);\r
+       }\r
+\r
+       public void setFont (BitmapFont font) {\r
+               cache = new BitmapFontCache(font);\r
+               switch (wrapType) {\r
+               case singleLine:\r
+                       setText(text);\r
+                       break;\r
+               case multiLine:\r
+                       setMultiLineText(text);\r
+                       break;\r
+               case wrapped:\r
+                       setWrappedText(text, halignment);\r
+                       break;\r
+               }\r
+       }\r
+\r
        @Override protected void draw (SpriteBatch batch, float parentAlpha) {\r
                cache.setColor(color.r, color.g, color.b, color.a * parentAlpha);\r
-               cache.setPosition(x, y);\r
+               switch (valignment) {\r
+               case TOP:\r
+                       cache.setPosition(x, y + height - bounds.height);\r
+                       break;\r
+               case CENTER:\r
+                       cache.setPosition(x, y + (height - bounds.height) / 2);\r
+                       break;\r
+               case BOTTOM:\r
+                       cache.setPosition(x, y);\r
+                       break;\r
+               }\r
                cache.draw(batch);\r
        }\r
 \r
@@ -59,4 +115,39 @@ public class Label extends Actor {
        @Override public Actor hit (float x, float y) {\r
                return x > 0 && y > 0 && x < width && y < height ? this : null;\r
        }\r
+\r
+       public void layout () {\r
+               if (wrapType == WrapType.wrapped && lastWidth != width) setWrappedText(text, halignment);\r
+               lastWidth = width;\r
+       }\r
+\r
+       public float getPrefWidth () {\r
+               switch (wrapType) {\r
+               case singleLine:\r
+                       return cache.getFont().getBounds(text).width;\r
+               case multiLine:\r
+                       return cache.getFont().getMultiLineBounds(text).width;\r
+               case wrapped:\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       public float getPrefHeight () {\r
+               switch (wrapType) {\r
+               case singleLine:\r
+                       return cache.getFont().getBounds(text).height;\r
+               case multiLine:\r
+                       return cache.getFont().getMultiLineBounds(text).width;\r
+               case wrapped:\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       static public enum VAlignment {\r
+               TOP, CENTER, BOTTOM\r
+       }\r
+\r
+       static private enum WrapType {\r
+               singleLine, multiLine, wrapped\r
+       }\r
 }\r