com.uwsoft.editor.renderer.components.label.LabelComponent Maven / Gradle / Ivy
Show all versions of overlap2d-runtime-libgdx Show documentation
package com.uwsoft.editor.renderer.components.label;
import com.badlogic.ashley.core.Component;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFontCache;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.StringBuilder;
public class LabelComponent implements Component {
public LabelStyle style;
public final GlyphLayout layout = new GlyphLayout();
public BitmapFontCache cache;
public final StringBuilder text = new StringBuilder();
public String fontName;
public int fontSize;
public int labelAlign = Align.center;
public int lineAlign = Align.center;
public boolean wrap;
public float fontScaleX = 1f;
public float fontScaleY = 1f;
public LabelComponent (CharSequence text, Skin skin) {
this(text, skin.get(LabelStyle.class));
}
public LabelComponent (CharSequence text, Skin skin, String styleName) {
this(text, skin.get(styleName, LabelStyle.class));
}
/** Creates a label, using a {@link LabelStyle} that has a BitmapFont with the specified name from the skin and the specified
* color. */
public LabelComponent (CharSequence text, Skin skin, String fontName, Color color) {
this(text, new LabelStyle(skin.getFont(fontName), color));
}
/** Creates a label, using a {@link LabelStyle} that has a BitmapFont with the specified name and the specified color from the
* skin. */
public LabelComponent (CharSequence text, Skin skin, String fontName, String colorName) {
this(text, new LabelStyle(skin.getFont(fontName), skin.getColor(colorName)));
}
public LabelComponent (CharSequence text, LabelStyle style) {
if (text != null) this.text.append(text);
setStyle(style);
}
public void setStyle (LabelStyle style) {
if (style == null) throw new IllegalArgumentException("style cannot be null.");
if (style.font == null) throw new IllegalArgumentException("Missing LabelStyle font.");
this.style = style;
cache = style.font.newFontCache();
}
public LabelStyle getStyle () {
return style;
}
/** @param newText May be null, "" will be used. */
public void setText (CharSequence newText) {
if (newText == null) newText = "";
if (newText instanceof StringBuilder) {
if (text.equals(newText)) return;
text.setLength(0);
text.append((StringBuilder)newText);
} else {
if (textEquals(newText)) return;
text.setLength(0);
text.append(newText);
}
}
public boolean textEquals (CharSequence other) {
int length = text.length;
char[] chars = text.chars;
if (length != other.length()) return false;
for (int i = 0; i < length; i++)
if (chars[i] != other.charAt(i)) return false;
return true;
}
public StringBuilder getText () {
return text;
}
public GlyphLayout getGlyphLayout () {
return layout;
}
/** If false, the text will only wrap where it contains newlines (\n). The preferred size of the label will be the text bounds.
* If true, the text will word wrap using the width of the label. The preferred width of the label will be 0, it is expected
* that the something external will set the width of the label. Wrapping will not occur when ellipsis is true. Default is
* false.
*
* When wrap is enabled, the label's preferred height depends on the width of the label. In some cases the parent of the label
* will need to layout twice: once to set the width of the label and a second time to adjust to the label's new preferred
* height. */
public void setWrap (boolean wrap) {
this.wrap = wrap;
}
/** @param alignment Aligns each line of text horizontally and all the text vertically.
* @see Align */
public void setAlignment (int alignment) {
setAlignment(alignment, alignment);
}
/** @param labelAlign Aligns all the text with the label widget.
* @param lineAlign Aligns each line of text (left, right, or center).
* @see Align */
public void setAlignment (int labelAlign, int lineAlign) {
this.labelAlign = labelAlign;
if ((lineAlign & Align.left) != 0)
this.lineAlign = Align.left;
else if ((lineAlign & Align.right) != 0)
this.lineAlign = Align.right;
else
this.lineAlign = Align.center;
}
public void setFontScale (float fontScale) {
this.fontScaleX = fontScale;
this.fontScaleY = fontScale;
}
public void setFontScale (float fontScaleX, float fontScaleY) {
this.fontScaleX = fontScaleX;
this.fontScaleY = fontScaleY;
}
public float getFontScaleX () {
return fontScaleX;
}
public void setFontScaleX (float fontScaleX) {
this.fontScaleX = fontScaleX;
}
public float getFontScaleY () {
return fontScaleY;
}
public void setFontScaleY (float fontScaleY) {
this.fontScaleY = fontScaleY;
}
}