GUIBrowserUI.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. using UnityEngine.UI;
  7. namespace ZenFulcrum.EmbeddedBrowser {
  8. /** Attach this script to a GUI Image to use a browser on it. */
  9. [RequireComponent(typeof(RawImage))]
  10. [RequireComponent(typeof(Browser))]
  11. [Obsolete("Use PointerUIGUI and CursorRendererOS instead.")]
  12. public class GUIBrowserUI :
  13. MonoBehaviour,
  14. IBrowserUI,
  15. ISelectHandler, IDeselectHandler,
  16. IPointerEnterHandler, IPointerExitHandler,
  17. IPointerDownHandler
  18. {
  19. protected RawImage myImage;
  20. protected Browser browser;
  21. public bool enableInput = true, autoResize = true;
  22. protected void Awake() {
  23. BrowserCursor = new BrowserCursor();
  24. InputSettings = new BrowserInputSettings();
  25. browser = GetComponent<Browser>();
  26. myImage = GetComponent<RawImage>();
  27. browser.afterResize += UpdateTexture;
  28. browser.UIHandler = this;
  29. BrowserCursor.cursorChange += () => {
  30. SetCursor(BrowserCursor);
  31. };
  32. rTransform = GetComponent<RectTransform>();
  33. }
  34. protected void OnEnable() {
  35. if (autoResize) StartCoroutine(WatchResize());
  36. }
  37. /** Automatically resizes the browser to match the size of this object. */
  38. private IEnumerator WatchResize() {
  39. Rect currentSize = new Rect();
  40. while (enabled) {
  41. var rect = rTransform.rect;
  42. if (rect.size.x <= 0 || rect.size.y <= 0) rect.size = new Vector2(512, 512);
  43. if (rect.size != currentSize.size) {
  44. browser.Resize((int)rect.size.x, (int)rect.size.y);
  45. currentSize = rect;
  46. }
  47. //yield return new WaitForSeconds(.5f); won't work if you pause the game, which, BTW, is a great time to resize the screen ;-)
  48. yield return null;
  49. }
  50. }
  51. protected void UpdateTexture(Texture2D texture) {
  52. myImage.texture = texture;
  53. myImage.uvRect = new Rect(0, 0, 1, 1);
  54. }
  55. protected List<Event> keyEvents = new List<Event>();
  56. protected List<Event> keyEventsLast = new List<Event>();
  57. protected BaseRaycaster raycaster;
  58. protected RectTransform rTransform;
  59. // protected List<RaycastResult> raycastResults = new List<RaycastResult>();
  60. public virtual void InputUpdate() {
  61. var tmp = keyEvents;
  62. keyEvents = keyEventsLast;
  63. keyEventsLast = tmp;
  64. keyEvents.Clear();
  65. if (MouseHasFocus) {
  66. if (!raycaster) raycaster = GetComponentInParent<BaseRaycaster>();
  67. // raycastResults.Clear();
  68. // raycaster.Raycast(data, raycastResults);
  69. // if (raycastResults.Count != 0) {
  70. // Vector2 pos = raycastResults[0].stuff
  71. Vector2 pos;
  72. RectTransformUtility.ScreenPointToLocalPointInRectangle(
  73. (RectTransform)transform, Input.mousePosition, raycaster.eventCamera, out pos
  74. );
  75. pos.x = pos.x / rTransform.rect.width + rTransform.pivot.x;
  76. pos.y = pos.y / rTransform.rect.height + rTransform.pivot.y;
  77. MousePosition = pos;
  78. var buttons = (MouseButton)0;
  79. if (Input.GetMouseButton(0)) buttons |= MouseButton.Left;
  80. if (Input.GetMouseButton(1)) buttons |= MouseButton.Right;
  81. if (Input.GetMouseButton(2)) buttons |= MouseButton.Middle;
  82. MouseButtons = buttons;
  83. MouseScroll = Input.mouseScrollDelta;
  84. } else {
  85. MouseButtons = 0;
  86. }
  87. //Unity doesn't include events for some keys, so fake it.
  88. if (Input.GetKeyDown(KeyCode.LeftShift) || Input.GetKeyDown(KeyCode.RightShift)) {
  89. //Note: doesn't matter if left or right shift, the browser can't tell.
  90. //(Prepend event. We don't know what happened first, but pressing shift usually precedes other key presses)
  91. keyEventsLast.Insert(0, new Event() { type = EventType.KeyDown, keyCode = KeyCode.LeftShift });
  92. }
  93. if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift)) {
  94. //Note: doesn't matter if left or right shift, the browser can't tell.
  95. keyEventsLast.Add(new Event() { type = EventType.KeyUp, keyCode = KeyCode.LeftShift });
  96. }
  97. }
  98. public void OnGUI() {
  99. var ev = Event.current;
  100. if (ev.type != EventType.KeyDown && ev.type != EventType.KeyUp) return;
  101. keyEvents.Add(new Event(ev));
  102. }
  103. protected virtual void SetCursor(BrowserCursor newCursor) {
  104. if (!_mouseHasFocus && newCursor != null) return;
  105. if (newCursor == null) {
  106. Cursor.visible = true;
  107. Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
  108. } else {
  109. if (newCursor.Texture != null) {
  110. Cursor.visible = true;
  111. Cursor.SetCursor(newCursor.Texture, newCursor.Hotspot, CursorMode.Auto);
  112. } else {
  113. Cursor.visible = false;
  114. Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
  115. }
  116. }
  117. }
  118. protected bool _mouseHasFocus;
  119. public bool MouseHasFocus { get { return _mouseHasFocus && enableInput; } }
  120. public Vector2 MousePosition { get; private set; }
  121. public MouseButton MouseButtons { get; private set; }
  122. public Vector2 MouseScroll { get; private set; }
  123. protected bool _keyboardHasFocus;
  124. public bool KeyboardHasFocus { get { return _keyboardHasFocus && enableInput; } }
  125. public List<Event> KeyEvents { get { return keyEventsLast; } }
  126. public BrowserCursor BrowserCursor { get; private set; }
  127. public BrowserInputSettings InputSettings { get; private set; }
  128. public void OnSelect(BaseEventData eventData) {
  129. _keyboardHasFocus = true;
  130. }
  131. public void OnDeselect(BaseEventData eventData) {
  132. _keyboardHasFocus = false;
  133. }
  134. public void OnPointerEnter(PointerEventData eventData) {
  135. _mouseHasFocus = true;
  136. SetCursor(BrowserCursor);
  137. }
  138. public void OnPointerExit(PointerEventData eventData) {
  139. _mouseHasFocus = false;
  140. SetCursor(null);
  141. }
  142. public void OnPointerDown(PointerEventData eventData) {
  143. EventSystem.current.SetSelectedGameObject(gameObject);
  144. }
  145. }
  146. }