2025-06-07 17:43:34 +08:00

439 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}