You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
438 lines
12 KiB
438 lines
12 KiB
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; |
|
} |
|
} |
|
}
|
|
|