diff options
Diffstat (limited to 'Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/TMP_TextEventHandler.cs')
| -rw-r--r-- | Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/TMP_TextEventHandler.cs | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/TMP_TextEventHandler.cs b/Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/TMP_TextEventHandler.cs new file mode 100644 index 0000000..505bf64 --- /dev/null +++ b/Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/TMP_TextEventHandler.cs @@ -0,0 +1,254 @@ +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.EventSystems; +using System; + + +namespace TMPro +{ + + public class TMP_TextEventHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler + { + [Serializable] + public class CharacterSelectionEvent : UnityEvent<char, int> { } + + [Serializable] + public class SpriteSelectionEvent : 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> { } + + + /// <summary> + /// Event delegate triggered when pointer is over a character. + /// </summary> + public CharacterSelectionEvent onCharacterSelection + { + get { return m_OnCharacterSelection; } + set { m_OnCharacterSelection = value; } + } + [SerializeField] + private CharacterSelectionEvent m_OnCharacterSelection = new CharacterSelectionEvent(); + + + /// <summary> + /// Event delegate triggered when pointer is over a sprite. + /// </summary> + public SpriteSelectionEvent onSpriteSelection + { + get { return m_OnSpriteSelection; } + set { m_OnSpriteSelection = value; } + } + [SerializeField] + private SpriteSelectionEvent m_OnSpriteSelection = new SpriteSelectionEvent(); + + + /// <summary> + /// Event delegate triggered when pointer is over a word. + /// </summary> + public WordSelectionEvent onWordSelection + { + get { return m_OnWordSelection; } + set { m_OnWordSelection = value; } + } + [SerializeField] + private WordSelectionEvent m_OnWordSelection = new WordSelectionEvent(); + + + /// <summary> + /// Event delegate triggered when pointer is over a line. + /// </summary> + public LineSelectionEvent onLineSelection + { + get { return m_OnLineSelection; } + set { m_OnLineSelection = value; } + } + [SerializeField] + private LineSelectionEvent m_OnLineSelection = new LineSelectionEvent(); + + + /// <summary> + /// Event delegate triggered when pointer is over a link. + /// </summary> + public LinkSelectionEvent onLinkSelection + { + get { return m_OnLinkSelection; } + set { m_OnLinkSelection = value; } + } + [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; + + void Awake() + { + // Get a reference to the text component. + m_TextComponent = gameObject.GetComponent<TMP_Text>(); + + // Get a reference to the camera rendering the text taking into consideration the text component type. + if (m_TextComponent.GetType() == typeof(TextMeshProUGUI)) + { + m_Canvas = 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; + } + } + + + void LateUpdate() + { + if (TMP_TextUtilities.IsIntersectingRectTransform(m_TextComponent.rectTransform, Input.mousePosition, m_Camera)) + { + #region Example of Character or Sprite Selection + int charIndex = TMP_TextUtilities.FindIntersectingCharacter(m_TextComponent, Input.mousePosition, m_Camera, true); + if (charIndex != -1 && charIndex != m_lastCharIndex) + { + m_lastCharIndex = charIndex; + + TMP_TextElementType elementType = m_TextComponent.textInfo.characterInfo[charIndex].elementType; + + // Send event to any event listeners depending on whether it is a character or sprite. + if (elementType == TMP_TextElementType.Character) + SendOnCharacterSelection(m_TextComponent.textInfo.characterInfo[charIndex].character, charIndex); + else if (elementType == TMP_TextElementType.Sprite) + SendOnSpriteSelection(m_TextComponent.textInfo.characterInfo[charIndex].character, charIndex); + } + #endregion + + + #region Example of Word Selection + // Check if Mouse intersects any words and if so assign a random color to that word. + int wordIndex = TMP_TextUtilities.FindIntersectingWord(m_TextComponent, Input.mousePosition, m_Camera); + if (wordIndex != -1 && wordIndex != m_lastWordIndex) + { + m_lastWordIndex = wordIndex; + + // Get the information about the selected word. + TMP_WordInfo wInfo = m_TextComponent.textInfo.wordInfo[wordIndex]; + + // Send the event to any listeners. + SendOnWordSelection(wInfo.GetWord(), wInfo.firstCharacterIndex, wInfo.characterCount); + } + #endregion + + + #region Example of Line Selection + // Check if Mouse intersects any words and if so assign a random color to that word. + int lineIndex = TMP_TextUtilities.FindIntersectingLine(m_TextComponent, Input.mousePosition, m_Camera); + if (lineIndex != -1 && lineIndex != m_lastLineIndex) + { + m_lastLineIndex = lineIndex; + + // Get the information about the selected word. + TMP_LineInfo lineInfo = m_TextComponent.textInfo.lineInfo[lineIndex]; + + // Send the event to any listeners. + char[] buffer = new char[lineInfo.characterCount]; + for (int i = 0; i < lineInfo.characterCount && i < m_TextComponent.textInfo.characterInfo.Length; i++) + { + buffer[i] = m_TextComponent.textInfo.characterInfo[i + lineInfo.firstCharacterIndex].character; + } + + string lineText = new string(buffer); + SendOnLineSelection(lineText, lineInfo.firstCharacterIndex, lineInfo.characterCount); + } + #endregion + + + #region Example of Link Handling + // Check if mouse intersects with any links. + int linkIndex = TMP_TextUtilities.FindIntersectingLink(m_TextComponent, Input.mousePosition, m_Camera); + + // Handle new Link selection. + if (linkIndex != -1 && linkIndex != m_selectedLink) + { + m_selectedLink = linkIndex; + + // Get information about the link. + TMP_LinkInfo linkInfo = m_TextComponent.textInfo.linkInfo[linkIndex]; + + // Send the event to any listeners. + SendOnLinkSelection(linkInfo.GetLinkID(), linkInfo.GetLinkText(), linkIndex); + } + #endregion + } + else + { + // Reset all selections given we are hovering outside the text container bounds. + m_selectedLink = -1; + m_lastCharIndex = -1; + m_lastWordIndex = -1; + m_lastLineIndex = -1; + } + } + + + public void OnPointerEnter(PointerEventData eventData) + { + //Debug.Log("OnPointerEnter()"); + } + + + public void OnPointerExit(PointerEventData eventData) + { + //Debug.Log("OnPointerExit()"); + } + + + private void SendOnCharacterSelection(char character, int characterIndex) + { + if (onCharacterSelection != null) + onCharacterSelection.Invoke(character, characterIndex); + } + + private void SendOnSpriteSelection(char character, int characterIndex) + { + if (onSpriteSelection != null) + onSpriteSelection.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); + } + + } +} |
