No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ExecuteEvents.cs 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.Pool;
  4. namespace UnityEngine.EventSystems
  5. {
  6. public static class ExecuteEvents
  7. {
  8. public delegate void EventFunction<T1>(T1 handler, BaseEventData eventData);
  9. public static T ValidateEventData<T>(BaseEventData data) where T : class
  10. {
  11. if ((data as T) == null)
  12. throw new ArgumentException(String.Format("Invalid type: {0} passed to event expecting {1}", data.GetType(), typeof(T)));
  13. return data as T;
  14. }
  15. private static readonly EventFunction<IPointerMoveHandler> s_PointerMoveHandler = Execute;
  16. private static void Execute(IPointerMoveHandler handler, BaseEventData eventData)
  17. {
  18. handler.OnPointerMove(ValidateEventData<PointerEventData>(eventData));
  19. }
  20. private static readonly EventFunction<IPointerEnterHandler> s_PointerEnterHandler = Execute;
  21. private static void Execute(IPointerEnterHandler handler, BaseEventData eventData)
  22. {
  23. handler.OnPointerEnter(ValidateEventData<PointerEventData>(eventData));
  24. }
  25. private static readonly EventFunction<IPointerExitHandler> s_PointerExitHandler = Execute;
  26. private static void Execute(IPointerExitHandler handler, BaseEventData eventData)
  27. {
  28. handler.OnPointerExit(ValidateEventData<PointerEventData>(eventData));
  29. }
  30. private static readonly EventFunction<IPointerDownHandler> s_PointerDownHandler = Execute;
  31. private static void Execute(IPointerDownHandler handler, BaseEventData eventData)
  32. {
  33. handler.OnPointerDown(ValidateEventData<PointerEventData>(eventData));
  34. }
  35. private static readonly EventFunction<IPointerUpHandler> s_PointerUpHandler = Execute;
  36. private static void Execute(IPointerUpHandler handler, BaseEventData eventData)
  37. {
  38. handler.OnPointerUp(ValidateEventData<PointerEventData>(eventData));
  39. }
  40. private static readonly EventFunction<IPointerClickHandler> s_PointerClickHandler = Execute;
  41. private static void Execute(IPointerClickHandler handler, BaseEventData eventData)
  42. {
  43. handler.OnPointerClick(ValidateEventData<PointerEventData>(eventData));
  44. }
  45. private static readonly EventFunction<IInitializePotentialDragHandler> s_InitializePotentialDragHandler = Execute;
  46. private static void Execute(IInitializePotentialDragHandler handler, BaseEventData eventData)
  47. {
  48. handler.OnInitializePotentialDrag(ValidateEventData<PointerEventData>(eventData));
  49. }
  50. private static readonly EventFunction<IBeginDragHandler> s_BeginDragHandler = Execute;
  51. private static void Execute(IBeginDragHandler handler, BaseEventData eventData)
  52. {
  53. handler.OnBeginDrag(ValidateEventData<PointerEventData>(eventData));
  54. }
  55. private static readonly EventFunction<IDragHandler> s_DragHandler = Execute;
  56. private static void Execute(IDragHandler handler, BaseEventData eventData)
  57. {
  58. handler.OnDrag(ValidateEventData<PointerEventData>(eventData));
  59. }
  60. private static readonly EventFunction<IEndDragHandler> s_EndDragHandler = Execute;
  61. private static void Execute(IEndDragHandler handler, BaseEventData eventData)
  62. {
  63. handler.OnEndDrag(ValidateEventData<PointerEventData>(eventData));
  64. }
  65. private static readonly EventFunction<IDropHandler> s_DropHandler = Execute;
  66. private static void Execute(IDropHandler handler, BaseEventData eventData)
  67. {
  68. handler.OnDrop(ValidateEventData<PointerEventData>(eventData));
  69. }
  70. private static readonly EventFunction<IScrollHandler> s_ScrollHandler = Execute;
  71. private static void Execute(IScrollHandler handler, BaseEventData eventData)
  72. {
  73. handler.OnScroll(ValidateEventData<PointerEventData>(eventData));
  74. }
  75. private static readonly EventFunction<IUpdateSelectedHandler> s_UpdateSelectedHandler = Execute;
  76. private static void Execute(IUpdateSelectedHandler handler, BaseEventData eventData)
  77. {
  78. handler.OnUpdateSelected(eventData);
  79. }
  80. private static readonly EventFunction<ISelectHandler> s_SelectHandler = Execute;
  81. private static void Execute(ISelectHandler handler, BaseEventData eventData)
  82. {
  83. handler.OnSelect(eventData);
  84. }
  85. private static readonly EventFunction<IDeselectHandler> s_DeselectHandler = Execute;
  86. private static void Execute(IDeselectHandler handler, BaseEventData eventData)
  87. {
  88. handler.OnDeselect(eventData);
  89. }
  90. private static readonly EventFunction<IMoveHandler> s_MoveHandler = Execute;
  91. private static void Execute(IMoveHandler handler, BaseEventData eventData)
  92. {
  93. handler.OnMove(ValidateEventData<AxisEventData>(eventData));
  94. }
  95. private static readonly EventFunction<ISubmitHandler> s_SubmitHandler = Execute;
  96. private static void Execute(ISubmitHandler handler, BaseEventData eventData)
  97. {
  98. handler.OnSubmit(eventData);
  99. }
  100. private static readonly EventFunction<ICancelHandler> s_CancelHandler = Execute;
  101. private static void Execute(ICancelHandler handler, BaseEventData eventData)
  102. {
  103. handler.OnCancel(eventData);
  104. }
  105. public static EventFunction<IPointerMoveHandler> pointerMoveHandler
  106. {
  107. get { return s_PointerMoveHandler; }
  108. }
  109. public static EventFunction<IPointerEnterHandler> pointerEnterHandler
  110. {
  111. get { return s_PointerEnterHandler; }
  112. }
  113. public static EventFunction<IPointerExitHandler> pointerExitHandler
  114. {
  115. get { return s_PointerExitHandler; }
  116. }
  117. public static EventFunction<IPointerDownHandler> pointerDownHandler
  118. {
  119. get { return s_PointerDownHandler; }
  120. }
  121. public static EventFunction<IPointerUpHandler> pointerUpHandler
  122. {
  123. get { return s_PointerUpHandler; }
  124. }
  125. public static EventFunction<IPointerClickHandler> pointerClickHandler
  126. {
  127. get { return s_PointerClickHandler; }
  128. }
  129. public static EventFunction<IInitializePotentialDragHandler> initializePotentialDrag
  130. {
  131. get { return s_InitializePotentialDragHandler; }
  132. }
  133. public static EventFunction<IBeginDragHandler> beginDragHandler
  134. {
  135. get { return s_BeginDragHandler; }
  136. }
  137. public static EventFunction<IDragHandler> dragHandler
  138. {
  139. get { return s_DragHandler; }
  140. }
  141. public static EventFunction<IEndDragHandler> endDragHandler
  142. {
  143. get { return s_EndDragHandler; }
  144. }
  145. public static EventFunction<IDropHandler> dropHandler
  146. {
  147. get { return s_DropHandler; }
  148. }
  149. public static EventFunction<IScrollHandler> scrollHandler
  150. {
  151. get { return s_ScrollHandler; }
  152. }
  153. public static EventFunction<IUpdateSelectedHandler> updateSelectedHandler
  154. {
  155. get { return s_UpdateSelectedHandler; }
  156. }
  157. public static EventFunction<ISelectHandler> selectHandler
  158. {
  159. get { return s_SelectHandler; }
  160. }
  161. public static EventFunction<IDeselectHandler> deselectHandler
  162. {
  163. get { return s_DeselectHandler; }
  164. }
  165. public static EventFunction<IMoveHandler> moveHandler
  166. {
  167. get { return s_MoveHandler; }
  168. }
  169. public static EventFunction<ISubmitHandler> submitHandler
  170. {
  171. get { return s_SubmitHandler; }
  172. }
  173. public static EventFunction<ICancelHandler> cancelHandler
  174. {
  175. get { return s_CancelHandler; }
  176. }
  177. private static void GetEventChain(GameObject root, IList<Transform> eventChain)
  178. {
  179. eventChain.Clear();
  180. if (root == null)
  181. return;
  182. var t = root.transform;
  183. while (t != null)
  184. {
  185. eventChain.Add(t);
  186. t = t.parent;
  187. }
  188. }
  189. public static bool Execute<T>(GameObject target, BaseEventData eventData, EventFunction<T> functor) where T : IEventSystemHandler
  190. {
  191. var internalHandlers = ListPool<IEventSystemHandler>.Get();
  192. GetEventList<T>(target, internalHandlers);
  193. // if (s_InternalHandlers.Count > 0)
  194. // Debug.Log("Executinng " + typeof (T) + " on " + target);
  195. var internalHandlersCount = internalHandlers.Count;
  196. for (var i = 0; i < internalHandlersCount; i++)
  197. {
  198. T arg;
  199. try
  200. {
  201. arg = (T)internalHandlers[i];
  202. }
  203. catch (Exception e)
  204. {
  205. var temp = internalHandlers[i];
  206. Debug.LogException(new Exception(string.Format("Type {0} expected {1} received.", typeof(T).Name, temp.GetType().Name), e));
  207. continue;
  208. }
  209. try
  210. {
  211. functor(arg, eventData);
  212. }
  213. catch (Exception e)
  214. {
  215. Debug.LogException(e);
  216. }
  217. }
  218. var handlerCount = internalHandlers.Count;
  219. ListPool<IEventSystemHandler>.Release(internalHandlers);
  220. return handlerCount > 0;
  221. }
  222. /// <summary>
  223. /// Execute the specified event on the first game object underneath the current touch.
  224. /// </summary>
  225. private static readonly List<Transform> s_InternalTransformList = new List<Transform>(30);
  226. public static GameObject ExecuteHierarchy<T>(GameObject root, BaseEventData eventData, EventFunction<T> callbackFunction) where T : IEventSystemHandler
  227. {
  228. GetEventChain(root, s_InternalTransformList);
  229. var internalTransformListCount = s_InternalTransformList.Count;
  230. for (var i = 0; i < internalTransformListCount; i++)
  231. {
  232. var transform = s_InternalTransformList[i];
  233. if (Execute(transform.gameObject, eventData, callbackFunction))
  234. return transform.gameObject;
  235. }
  236. return null;
  237. }
  238. private static bool ShouldSendToComponent<T>(Component component) where T : IEventSystemHandler
  239. {
  240. var valid = component is T;
  241. if (!valid)
  242. return false;
  243. var behaviour = component as Behaviour;
  244. if (behaviour != null)
  245. return behaviour.isActiveAndEnabled;
  246. return true;
  247. }
  248. /// <summary>
  249. /// Get the specified object's event event.
  250. /// </summary>
  251. private static void GetEventList<T>(GameObject go, IList<IEventSystemHandler> results) where T : IEventSystemHandler
  252. {
  253. // Debug.LogWarning("GetEventList<" + typeof(T).Name + ">");
  254. if (results == null)
  255. throw new ArgumentException("Results array is null", "results");
  256. if (go == null || !go.activeInHierarchy)
  257. return;
  258. var components = ListPool<Component>.Get();
  259. go.GetComponents(components);
  260. var componentsCount = components.Count;
  261. for (var i = 0; i < componentsCount; i++)
  262. {
  263. if (!ShouldSendToComponent<T>(components[i]))
  264. continue;
  265. // Debug.Log(string.Format("{2} found! On {0}.{1}", go, s_GetComponentsScratch[i].GetType(), typeof(T)));
  266. results.Add(components[i] as IEventSystemHandler);
  267. }
  268. ListPool<Component>.Release(components);
  269. // Debug.LogWarning("end GetEventList<" + typeof(T).Name + ">");
  270. }
  271. /// <summary>
  272. /// Whether the specified game object will be able to handle the specified event.
  273. /// </summary>
  274. public static bool CanHandleEvent<T>(GameObject go) where T : IEventSystemHandler
  275. {
  276. var internalHandlers = ListPool<IEventSystemHandler>.Get();
  277. GetEventList<T>(go, internalHandlers);
  278. var handlerCount = internalHandlers.Count;
  279. ListPool<IEventSystemHandler>.Release(internalHandlers);
  280. return handlerCount != 0;
  281. }
  282. /// <summary>
  283. /// Bubble the specified event on the game object, figuring out which object will actually receive the event.
  284. /// </summary>
  285. public static GameObject GetEventHandler<T>(GameObject root) where T : IEventSystemHandler
  286. {
  287. if (root == null)
  288. return null;
  289. Transform t = root.transform;
  290. while (t != null)
  291. {
  292. if (CanHandleEvent<T>(t.gameObject))
  293. return t.gameObject;
  294. t = t.parent;
  295. }
  296. return null;
  297. }
  298. }
  299. }