UETextInput.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. using CommonLang.Xml;
  2. using CommonUnity3D.UGUI;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Xml;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. using CommonUI.Data;
  11. using TextAnchor = CommonUI.Data.TextAnchor;
  12. using FontStyle = CommonUI.Data.FontStyle;
  13. using UnityEngine.EventSystems;
  14. namespace CommonUnity3D.UGUIEditor.UI
  15. {
  16. public class UETextInput : UIComponent
  17. {
  18. protected readonly DisplayText mTextSprite;
  19. protected readonly DisplayText mPlaceHolder;
  20. protected readonly IInputField mInputField;
  21. protected float mBorderSize = 1;
  22. protected bool mLayoutDirty = true;
  23. protected readonly bool mUseBitmapFont;
  24. public UETextInput(string name, bool use_bitmap) : base(name)
  25. {
  26. this.mUseBitmapFont = use_bitmap;
  27. this.Enable = true;
  28. this.EnableChildren = false;
  29. if (use_bitmap)
  30. {
  31. InitWithBitmap(out mTextSprite, out mPlaceHolder, out mInputField);
  32. }
  33. else
  34. {
  35. InitWithText(out mTextSprite, out mPlaceHolder, out mInputField);
  36. }
  37. this.mInputField.event_ValueChanged += (onValueChanged);
  38. this.mInputField.event_EndEdit += (onEndEdit);
  39. this.IsInteractive = true;
  40. }
  41. public UETextInput() : this("", UIEditor.GlobalUseBitmapText)
  42. {
  43. }
  44. protected virtual void InitWithBitmap(out DisplayText text, out DisplayText placeholder, out IInputField inputfield)
  45. {
  46. var ph = new BitmapTextSprite("place_holder");
  47. ph.FontColor = Color.gray;
  48. this.AddChild(ph);
  49. var tx = new BitmapTextSprite("text");
  50. tx.FontColor = Color.white;
  51. tx.AutoScrollToCaret = true;
  52. this.AddChild(tx);
  53. var input = mGameObject.AddComponent<TextLayerInputField>();
  54. input.TextComponent = tx.Graphics;
  55. input.Placeholder = ph.Graphics;
  56. input.inputType = UnityEngine.UI.InputField.InputType.Standard;
  57. text = tx;
  58. placeholder = ph;
  59. inputfield = input;
  60. }
  61. protected virtual void InitWithText(out DisplayText text, out DisplayText placeholder, out IInputField inputfield)
  62. {
  63. var ph = new TextSprite("place_holder");
  64. ph.FontColor = Color.gray;
  65. ph.Graphics.resizeTextForBestFit = false;
  66. this.AddChild(ph);
  67. var tx = new TextSprite("text");
  68. tx.Graphics.supportRichText = false;
  69. tx.Graphics.resizeTextForBestFit = false;
  70. tx.Graphics.horizontalOverflow = HorizontalWrapMode.Wrap;
  71. tx.Graphics.verticalOverflow = VerticalWrapMode.Overflow;
  72. tx.FontColor = Color.white;
  73. this.AddChild(tx);
  74. var input = mGameObject.AddComponent<InteractiveInputField>();
  75. input.textComponent = tx.Graphics;
  76. input.placeholder = ph.Graphics;
  77. input.inputType = UnityEngine.UI.InputField.InputType.Standard;
  78. text = tx;
  79. placeholder = ph;
  80. inputfield = input;
  81. }
  82. protected override IInteractiveComponent GenInteractive()
  83. {
  84. return mInputField;
  85. }
  86. public DisplayText TextSprite { get { return mTextSprite; } }
  87. public DisplayText PlaceHolder { get { return mPlaceHolder; } }
  88. public IInputField Input { get { return mInputField; } }
  89. public float BorderSize
  90. {
  91. get { return mBorderSize; }
  92. set
  93. {
  94. if (mBorderSize != value)
  95. {
  96. this.mBorderSize = value;
  97. this.mLayoutDirty = true;
  98. }
  99. }
  100. }
  101. public string Text
  102. {
  103. get { return mTextSprite.Text; }
  104. set
  105. {
  106. if (IsDispose) return;
  107. mTextSprite.Text = value;
  108. }
  109. }
  110. public string PlaceHolderText
  111. {
  112. get { return mPlaceHolder.Text; }
  113. set
  114. {
  115. if (IsDispose) return;
  116. mPlaceHolder.Text = value;
  117. }
  118. }
  119. public int FontSize
  120. {
  121. get { return mTextSprite.FontSize; }
  122. set
  123. {
  124. mTextSprite.FontSize = value;
  125. mPlaceHolder.FontSize = value;
  126. }
  127. }
  128. public CommonUI.Data.FontStyle Style
  129. {
  130. get { return TextSprite.Style; }
  131. set
  132. {
  133. TextSprite.Style = value;
  134. PlaceHolder.Style = value;
  135. }
  136. }
  137. public UnityEngine.Color FontColor
  138. {
  139. get { return mTextSprite.FontColor; }
  140. set
  141. {
  142. mTextSprite.FontColor = value;
  143. value.a = value.a / 2;
  144. mPlaceHolder.FontColor = value;
  145. }
  146. }
  147. public void SetFont(Font font)
  148. {
  149. TextSprite.SetFont(font);
  150. PlaceHolder.SetFont(font);
  151. }
  152. protected override void OnUpdate()
  153. {
  154. base.OnUpdate();
  155. if (mLayoutDirty)
  156. {
  157. this.mLayoutDirty = false;
  158. Vector2 csize = this.Size2D;
  159. this.mPlaceHolder.Bounds2D = this.mTextSprite.Bounds2D = new Rect(
  160. mBorderSize,
  161. mBorderSize,
  162. csize.x - mBorderSize * 2,
  163. csize.y - mBorderSize * 2);
  164. }
  165. }
  166. protected override void DecodeBegin(UIEditor.Decoder editor, UIComponentMeta e)
  167. {
  168. base.DecodeBegin(editor, e);
  169. }
  170. protected override void DecodeEnd(UIEditor.Decoder editor, UIComponentMeta e)
  171. {
  172. base.DecodeEnd(editor, e);
  173. this.Decode_Text(editor, e as UETextInputBaseMeta);
  174. this.BorderSize = (this.Layout != null) ? this.Layout.ClipSize : 1;
  175. this.Enable = true;
  176. this.EnableChildren = false;
  177. }
  178. private void Decode_Text(UIEditor.Decoder editor, UETextInputBaseMeta e)
  179. {
  180. if (e.textFontSize > 0)
  181. {
  182. this.FontSize = e.textFontSize;
  183. }
  184. if (!string.IsNullOrEmpty(e.textFontName))
  185. {
  186. this.SetFont(editor.editor.CreateFont(e.textFontName));
  187. this.Style = e.textFontStyle;
  188. }
  189. this.FontColor = UIUtils.UInt32_ARGB_To_Color(e.textColor);
  190. this.Input.inputType = e.isPassword ? InputField.InputType.Password : InputField.InputType.Standard;
  191. this.PlaceHolderText = e.Text;
  192. }
  193. //-----------------------------------------------------------------------------------------------------
  194. #region _Event_
  195. protected override void OnDisposeEvents()
  196. {
  197. this.event_ValueChanged = null;
  198. this.event_endEdit = null;
  199. if (mInputField != null)
  200. {
  201. event_PointerClick = null;
  202. }
  203. base.OnDisposeEvents();
  204. }
  205. private void onValueChanged(string value)
  206. {
  207. if (event_ValueChanged != null)
  208. event_ValueChanged.Invoke(this, value);
  209. }
  210. private void onEndEdit(string value)
  211. {
  212. if (event_endEdit != null)
  213. event_endEdit.Invoke(this, value);
  214. }
  215. public delegate void InputValueChangedHandler(DisplayNode sender, string text);
  216. public InputValueChangedHandler event_ValueChanged;
  217. public InputValueChangedHandler event_endEdit;
  218. public event InputValueChangedHandler ValueChanged { add { event_ValueChanged += value; } remove { event_ValueChanged -= value; } }
  219. public event InputValueChangedHandler EndEdit { add { event_endEdit += value; } remove { event_endEdit -= value; } }
  220. #endregion
  221. //-----------------------------------------------------------------------------------------------------
  222. }
  223. //----------------------------------------------------------------------
  224. public class UETextInputMultiline : UETextInput
  225. {
  226. public UETextInputMultiline(string name, bool use_bitmap)
  227. : base(name, use_bitmap)
  228. {
  229. }
  230. public UETextInputMultiline() : this("", UIEditor.GlobalUseBitmapText)
  231. {
  232. }
  233. protected override void InitWithBitmap(out DisplayText text, out DisplayText placeholder, out IInputField inputfield)
  234. {
  235. var ph = new BitmapTextSprite("place_holder");
  236. ph.FontColor = Color.gray;
  237. this.AddChild(ph);
  238. var tx = new RichTextPan(true, "rich_text");
  239. tx.FontColor = Color.white;
  240. tx.AutoScrollToCaret = true;
  241. this.AddChild(tx);
  242. var input = mGameObject.AddComponent<TextLayerInputField>();
  243. input.TextComponent = tx;
  244. input.Placeholder = ph.Graphics;
  245. input.inputType = UnityEngine.UI.InputField.InputType.Standard;
  246. input.lineType = InputField.LineType.MultiLineNewline;
  247. input.characterLimit = 500;
  248. text = tx;
  249. placeholder = ph;
  250. inputfield = input;
  251. }
  252. protected override void InitWithText(out DisplayText text, out DisplayText placeholder, out IInputField inputfield)
  253. {
  254. base.InitWithText(out text, out placeholder, out inputfield);
  255. var tx = text as TextSprite;
  256. var tf = inputfield as InteractiveInputField;
  257. tf.lineType = InputField.LineType.MultiLineNewline;
  258. }
  259. }
  260. }