diff options
author | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
commit | 6ce8b9e22fc13be34b442c7b6af48b42cd44275a (patch) | |
tree | b38119d2acf0a982cb67e381f146924b9bfc3b3f /TMPro/TMP_TextEventHandler.cs |
+init
Diffstat (limited to 'TMPro/TMP_TextEventHandler.cs')
-rw-r--r-- | TMPro/TMP_TextEventHandler.cs | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/TMPro/TMP_TextEventHandler.cs b/TMPro/TMP_TextEventHandler.cs new file mode 100644 index 0000000..d952b46 --- /dev/null +++ b/TMPro/TMP_TextEventHandler.cs @@ -0,0 +1,208 @@ +using System; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.EventSystems; + +namespace TMPro; + +public class TMP_TextEventHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IEventSystemHandler +{ + [Serializable] + public class CharacterSelectionEvent : UnityEvent<char, int> + { + } + + [Serializable] + public class WordSelectionEvent : UnityEvent<string, int, int> + { + } + + [Serializable] + public class LineSelectionEvent : UnityEvent<string, int, int> + { + } + + [Serializable] + public class LinkSelectionEvent : UnityEvent<string, string, int> + { + } + + [SerializeField] + private CharacterSelectionEvent m_OnCharacterSelection = new CharacterSelectionEvent(); + + [SerializeField] + private WordSelectionEvent m_OnWordSelection = new WordSelectionEvent(); + + [SerializeField] + private LineSelectionEvent m_OnLineSelection = new LineSelectionEvent(); + + [SerializeField] + private LinkSelectionEvent m_OnLinkSelection = new LinkSelectionEvent(); + + private TMP_Text m_TextComponent; + + private Camera m_Camera; + + private Canvas m_Canvas; + + private int m_selectedLink = -1; + + private int m_lastCharIndex = -1; + + private int m_lastWordIndex = -1; + + private int m_lastLineIndex = -1; + + public CharacterSelectionEvent onCharacterSelection + { + get + { + return m_OnCharacterSelection; + } + set + { + m_OnCharacterSelection = value; + } + } + + public WordSelectionEvent onWordSelection + { + get + { + return m_OnWordSelection; + } + set + { + m_OnWordSelection = value; + } + } + + public LineSelectionEvent onLineSelection + { + get + { + return m_OnLineSelection; + } + set + { + m_OnLineSelection = value; + } + } + + public LinkSelectionEvent onLinkSelection + { + get + { + return m_OnLinkSelection; + } + set + { + m_OnLinkSelection = value; + } + } + + private void Awake() + { + m_TextComponent = base.gameObject.GetComponent<TMP_Text>(); + if (m_TextComponent.GetType() == typeof(TextMeshProUGUI)) + { + m_Canvas = base.gameObject.GetComponentInParent<Canvas>(); + if (m_Canvas != null) + { + if (m_Canvas.renderMode == RenderMode.ScreenSpaceOverlay) + { + m_Camera = null; + } + else + { + m_Camera = m_Canvas.worldCamera; + } + } + } + else + { + m_Camera = Camera.main; + } + } + + private void LateUpdate() + { + if (!TMP_TextUtilities.IsIntersectingRectTransform(m_TextComponent.rectTransform, Input.mousePosition, m_Camera)) + { + return; + } + int num = TMP_TextUtilities.FindIntersectingCharacter(m_TextComponent, Input.mousePosition, m_Camera, visibleOnly: true); + if (num != -1 && num != m_lastCharIndex) + { + m_lastCharIndex = num; + SendOnCharacterSelection(m_TextComponent.textInfo.characterInfo[num].character, num); + } + int num2 = TMP_TextUtilities.FindIntersectingWord(m_TextComponent, Input.mousePosition, m_Camera); + if (num2 != -1 && num2 != m_lastWordIndex) + { + m_lastWordIndex = num2; + TMP_WordInfo tMP_WordInfo = m_TextComponent.textInfo.wordInfo[num2]; + SendOnWordSelection(tMP_WordInfo.GetWord(), tMP_WordInfo.firstCharacterIndex, tMP_WordInfo.characterCount); + } + int num3 = TMP_TextUtilities.FindIntersectingLine(m_TextComponent, Input.mousePosition, m_Camera); + if (num3 != -1 && num3 != m_lastLineIndex) + { + m_lastLineIndex = num3; + TMP_LineInfo tMP_LineInfo = m_TextComponent.textInfo.lineInfo[num3]; + char[] array = new char[tMP_LineInfo.characterCount]; + for (int i = 0; i < tMP_LineInfo.characterCount && i < m_TextComponent.textInfo.characterInfo.Length; i++) + { + array[i] = m_TextComponent.textInfo.characterInfo[i + tMP_LineInfo.firstCharacterIndex].character; + } + string line = new string(array); + SendOnLineSelection(line, tMP_LineInfo.firstCharacterIndex, tMP_LineInfo.characterCount); + } + int num4 = TMP_TextUtilities.FindIntersectingLink(m_TextComponent, Input.mousePosition, m_Camera); + if (num4 != -1 && num4 != m_selectedLink) + { + m_selectedLink = num4; + TMP_LinkInfo tMP_LinkInfo = m_TextComponent.textInfo.linkInfo[num4]; + SendOnLinkSelection(tMP_LinkInfo.GetLinkID(), tMP_LinkInfo.GetLinkText(), num4); + } + } + + public void OnPointerEnter(PointerEventData eventData) + { + } + + public void OnPointerExit(PointerEventData eventData) + { + } + + private void SendOnCharacterSelection(char character, int characterIndex) + { + if (onCharacterSelection != null) + { + onCharacterSelection.Invoke(character, characterIndex); + } + } + + private void SendOnWordSelection(string word, int charIndex, int length) + { + if (onWordSelection != null) + { + onWordSelection.Invoke(word, charIndex, length); + } + } + + private void SendOnLineSelection(string line, int charIndex, int length) + { + if (onLineSelection != null) + { + onLineSelection.Invoke(line, charIndex, length); + } + } + + private void SendOnLinkSelection(string linkID, string linkText, int linkIndex) + { + if (onLinkSelection != null) + { + onLinkSelection.Invoke(linkID, linkText, linkIndex); + } + } +} |