439 lines
12 KiB
C#
439 lines
12 KiB
C#
using System.Collections.Generic;
|
||
using System.Text;
|
||
using UnityEngine;
|
||
using FairyGUI.Utils;
|
||
|
||
namespace FairyGUI
|
||
{
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public class GTextField : GObject, ITextColorGear
|
||
{
|
||
protected TextField _textField;
|
||
protected string _text;
|
||
protected bool _ubbEnabled;
|
||
protected bool _updatingSize;
|
||
protected Dictionary<string, string> _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;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public Dictionary<string, string> templateVars
|
||
{
|
||
get { return _templateVars; }
|
||
set
|
||
{
|
||
if (_templateVars == null && value == null)
|
||
return;
|
||
|
||
_templateVars = value;
|
||
|
||
FlushVars();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="name"></param>
|
||
/// <param name="value"></param>
|
||
/// <returns></returns>
|
||
public GTextField SetVar(string name, string value)
|
||
{
|
||
if (_templateVars == null)
|
||
_templateVars = new Dictionary<string, string>();
|
||
_templateVars[name] = value;
|
||
|
||
return this;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public void FlushVars()
|
||
{
|
||
SetTextFieldText();
|
||
UpdateSize();
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
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();
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public TextFormat textFormat
|
||
{
|
||
get
|
||
{
|
||
return _textField.textFormat;
|
||
}
|
||
set
|
||
{
|
||
_textField.textFormat = value;
|
||
if (!underConstruct)
|
||
UpdateSize();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public AlignType align
|
||
{
|
||
get { return _textField.align; }
|
||
set { _textField.align = value; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public VertAlignType verticalAlign
|
||
{
|
||
get { return _textField.verticalAlign; }
|
||
set { _textField.verticalAlign = value; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public bool singleLine
|
||
{
|
||
get { return _textField.singleLine; }
|
||
set { _textField.singleLine = value; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public float stroke
|
||
{
|
||
get { return _textField.stroke; }
|
||
set { _textField.stroke = value; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public Color strokeColor
|
||
{
|
||
get { return _textField.strokeColor; }
|
||
set
|
||
{
|
||
_textField.strokeColor = value;
|
||
UpdateGear(4);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public Vector2 shadowOffset
|
||
{
|
||
get { return _textField.shadowOffset; }
|
||
set { _textField.shadowOffset = value; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public bool UBBEnabled
|
||
{
|
||
get { return _ubbEnabled; }
|
||
set { _ubbEnabled = value; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public float textWidth
|
||
{
|
||
get { return _textField.textWidth; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
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<string, string>();
|
||
|
||
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;
|
||
}
|
||
}
|
||
}
|