using System.Collections.Generic;
using System.Text;
using UnityEngine;
using FairyGUI.Utils;
namespace FairyGUI
{
///
///
///
public class GTextField : GObject, ITextColorGear
{
protected TextField _textField;
protected string _text;
protected bool _ubbEnabled;
protected bool _updatingSize;
protected Dictionary _templateVars;
public GTextField()
: base()
{
TextFormat tf = _textField.textFormat;
tf.font = UIConfig.defaultFont;
tf.size = 12;
tf.color = Color.black;
tf.lineSpacing = 3;
tf.letterSpacing = 0;
_textField.textFormat = tf;
_text = string.Empty;
_textField.autoSize = AutoSizeType.Both;
_textField.wordWrap = false;
}
override protected void CreateDisplayObject()
{
_textField = new TextField();
_textField.gOwner = this;
displayObject = _textField;
}
///
///
///
override public string text
{
get
{
if (this is GTextInput)
_text = ((GTextInput)this).inputTextField.text;
return _text;
}
set
{
if (value == null)
value = string.Empty;
_text = value;
SetTextFieldText();
UpdateSize();
UpdateGear(6);
}
}
virtual protected void SetTextFieldText()
{
string str = _text;
if (_templateVars != null)
str = ParseTemplate(str);
_textField.maxWidth = maxWidth;
if (_ubbEnabled)
_textField.htmlText = UBBParser.inst.Parse(XMLUtils.EncodeString(str));
else
_textField.text = str;
}
///
///
///
public Dictionary templateVars
{
get { return _templateVars; }
set
{
if (_templateVars == null && value == null)
return;
_templateVars = value;
FlushVars();
}
}
///
///
///
///
///
///
public GTextField SetVar(string name, string value)
{
if (_templateVars == null)
_templateVars = new Dictionary();
_templateVars[name] = value;
return this;
}
///
///
///
public void FlushVars()
{
SetTextFieldText();
UpdateSize();
}
///
///
///
public bool HasCharacter(char ch)
{
return _textField.HasCharacter(ch);
}
protected string ParseTemplate(string template)
{
int pos1 = 0, pos2 = 0;
int pos3;
string tag;
string value;
StringBuilder buffer = new StringBuilder();
while ((pos2 = template.IndexOf('{', pos1)) != -1)
{
if (pos2 > 0 && template[pos2 - 1] == '\\')
{
buffer.Append(template, pos1, pos2 - pos1 - 1);
buffer.Append('{');
pos1 = pos2 + 1;
continue;
}
buffer.Append(template, pos1, pos2 - pos1);
pos1 = pos2;
pos2 = template.IndexOf('}', pos1);
if (pos2 == -1)
break;
if (pos2 == pos1 + 1)
{
buffer.Append(template, pos1, 2);
pos1 = pos2 + 1;
continue;
}
tag = template.Substring(pos1 + 1, pos2 - pos1 - 1);
pos3 = tag.IndexOf('=');
if (pos3 != -1)
{
if (!_templateVars.TryGetValue(tag.Substring(0, pos3), out value))
value = tag.Substring(pos3 + 1);
}
else
{
if (!_templateVars.TryGetValue(tag, out value))
value = "";
}
buffer.Append(value);
pos1 = pos2 + 1;
}
if (pos1 < template.Length)
buffer.Append(template, pos1, template.Length - pos1);
return buffer.ToString();
}
///
///
///
public TextFormat textFormat
{
get
{
return _textField.textFormat;
}
set
{
_textField.textFormat = value;
if (!underConstruct)
UpdateSize();
}
}
///
///
///
public Color color
{
get
{
return _textField.textFormat.color;
}
set
{
if (_textField.textFormat.color != value)
{
TextFormat tf = _textField.textFormat;
tf.color = value;
_textField.textFormat = tf;
UpdateGear(4);
}
}
}
///
///
///
public AlignType align
{
get { return _textField.align; }
set { _textField.align = value; }
}
///
///
///
public VertAlignType verticalAlign
{
get { return _textField.verticalAlign; }
set { _textField.verticalAlign = value; }
}
///
///
///
public bool singleLine
{
get { return _textField.singleLine; }
set { _textField.singleLine = value; }
}
///
///
///
public float stroke
{
get { return _textField.stroke; }
set { _textField.stroke = value; }
}
///
///
///
public Color strokeColor
{
get { return _textField.strokeColor; }
set
{
_textField.strokeColor = value;
UpdateGear(4);
}
}
///
///
///
public Vector2 shadowOffset
{
get { return _textField.shadowOffset; }
set { _textField.shadowOffset = value; }
}
///
///
///
public bool UBBEnabled
{
get { return _ubbEnabled; }
set { _ubbEnabled = value; }
}
///
///
///
public AutoSizeType autoSize
{
get { return _textField.autoSize; }
set
{
_textField.autoSize = value;
if (value == AutoSizeType.Both)
{
_textField.wordWrap = false;
if (!underConstruct)
this.SetSize(_textField.textWidth, _textField.textHeight);
}
else
{
_textField.wordWrap = true;
if (value == AutoSizeType.Height)
{
if (!underConstruct)
{
displayObject.width = this.width;
this.height = _textField.textHeight;
}
}
else
displayObject.SetSize(this.width, this.height);
}
}
}
///
///
///
public float textWidth
{
get { return _textField.textWidth; }
}
///
///
///
public float textHeight
{
get { return _textField.textHeight; }
}
protected void UpdateSize()
{
if (_updatingSize)
return;
_updatingSize = true;
if (_textField.autoSize == AutoSizeType.Both)
{
this.size = displayObject.size;
InvalidateBatchingState();
}
else if (_textField.autoSize == AutoSizeType.Height)
{
this.height = displayObject.height;
InvalidateBatchingState();
}
_updatingSize = false;
}
override protected void HandleSizeChanged()
{
if (_updatingSize)
return;
if (underConstruct)
displayObject.SetSize(this.width, this.height);
else if (_textField.autoSize != AutoSizeType.Both)
{
if (_textField.autoSize == AutoSizeType.Height)
{
displayObject.width = this.width;//先调整宽度,让文本重排
if (_text != string.Empty) //文本为空时,1是本来就不需要调整, 2是为了防止改掉文本为空时的默认高度,造成关联错误
SetSizeDirectly(this.width, displayObject.height);
}
else
displayObject.SetSize(this.width, this.height);
}
}
override public void Setup_BeforeAdd(ByteBuffer buffer, int beginPos)
{
base.Setup_BeforeAdd(buffer, beginPos);
buffer.Seek(beginPos, 5);
TextFormat tf = _textField.textFormat;
tf.font = buffer.ReadS();
tf.size = buffer.ReadShort();
tf.color = buffer.ReadColor();
this.align = (AlignType)buffer.ReadByte();
this.verticalAlign = (VertAlignType)buffer.ReadByte();
tf.lineSpacing = buffer.ReadShort();
tf.letterSpacing = buffer.ReadShort();
_ubbEnabled = buffer.ReadBool();
this.autoSize = (AutoSizeType)buffer.ReadByte();
tf.underline = buffer.ReadBool();
tf.italic = buffer.ReadBool();
tf.bold = buffer.ReadBool();
this.singleLine = buffer.ReadBool();
if (buffer.ReadBool())
{
tf.outlineColor = buffer.ReadColor();
tf.outline = buffer.ReadFloat();
}
if (buffer.ReadBool())
{
tf.shadowColor = buffer.ReadColor();
float f1 = buffer.ReadFloat();
float f2 = buffer.ReadFloat();
tf.shadowOffset = new Vector2(f1, f2);
}
if (buffer.ReadBool())
_templateVars = new Dictionary();
if (buffer.version >= 3)
{
tf.strikethrough = buffer.ReadBool();
#if FAIRYGUI_TMPRO
tf.faceDilate = buffer.ReadFloat();
tf.outlineSoftness = buffer.ReadFloat();
tf.underlaySoftness = buffer.ReadFloat();
#else
buffer.Skip(12);
#endif
}
_textField.textFormat = tf;
}
override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
{
base.Setup_AfterAdd(buffer, beginPos);
buffer.Seek(beginPos, 6);
string str = buffer.ReadS();
if (str != null)
this.text = str;
}
}
}