123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- using System;
- using System.Collections.Generic;
- using UnityEngine.Pool;
-
- namespace UnityEngine.EventSystems
- {
- public static class ExecuteEvents
- {
- public delegate void EventFunction<T1>(T1 handler, BaseEventData eventData);
-
- public static T ValidateEventData<T>(BaseEventData data) where T : class
- {
- if ((data as T) == null)
- throw new ArgumentException(String.Format("Invalid type: {0} passed to event expecting {1}", data.GetType(), typeof(T)));
- return data as T;
- }
-
- private static readonly EventFunction<IPointerMoveHandler> s_PointerMoveHandler = Execute;
-
- private static void Execute(IPointerMoveHandler handler, BaseEventData eventData)
- {
- handler.OnPointerMove(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IPointerEnterHandler> s_PointerEnterHandler = Execute;
-
- private static void Execute(IPointerEnterHandler handler, BaseEventData eventData)
- {
- handler.OnPointerEnter(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IPointerExitHandler> s_PointerExitHandler = Execute;
-
- private static void Execute(IPointerExitHandler handler, BaseEventData eventData)
- {
- handler.OnPointerExit(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IPointerDownHandler> s_PointerDownHandler = Execute;
-
- private static void Execute(IPointerDownHandler handler, BaseEventData eventData)
- {
- handler.OnPointerDown(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IPointerUpHandler> s_PointerUpHandler = Execute;
-
- private static void Execute(IPointerUpHandler handler, BaseEventData eventData)
- {
- handler.OnPointerUp(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IPointerClickHandler> s_PointerClickHandler = Execute;
-
- private static void Execute(IPointerClickHandler handler, BaseEventData eventData)
- {
- handler.OnPointerClick(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IInitializePotentialDragHandler> s_InitializePotentialDragHandler = Execute;
-
- private static void Execute(IInitializePotentialDragHandler handler, BaseEventData eventData)
- {
- handler.OnInitializePotentialDrag(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IBeginDragHandler> s_BeginDragHandler = Execute;
-
- private static void Execute(IBeginDragHandler handler, BaseEventData eventData)
- {
- handler.OnBeginDrag(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IDragHandler> s_DragHandler = Execute;
-
- private static void Execute(IDragHandler handler, BaseEventData eventData)
- {
- handler.OnDrag(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IEndDragHandler> s_EndDragHandler = Execute;
-
- private static void Execute(IEndDragHandler handler, BaseEventData eventData)
- {
- handler.OnEndDrag(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IDropHandler> s_DropHandler = Execute;
-
- private static void Execute(IDropHandler handler, BaseEventData eventData)
- {
- handler.OnDrop(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IScrollHandler> s_ScrollHandler = Execute;
-
- private static void Execute(IScrollHandler handler, BaseEventData eventData)
- {
- handler.OnScroll(ValidateEventData<PointerEventData>(eventData));
- }
-
- private static readonly EventFunction<IUpdateSelectedHandler> s_UpdateSelectedHandler = Execute;
-
- private static void Execute(IUpdateSelectedHandler handler, BaseEventData eventData)
- {
- handler.OnUpdateSelected(eventData);
- }
-
- private static readonly EventFunction<ISelectHandler> s_SelectHandler = Execute;
-
- private static void Execute(ISelectHandler handler, BaseEventData eventData)
- {
- handler.OnSelect(eventData);
- }
-
- private static readonly EventFunction<IDeselectHandler> s_DeselectHandler = Execute;
-
- private static void Execute(IDeselectHandler handler, BaseEventData eventData)
- {
- handler.OnDeselect(eventData);
- }
-
- private static readonly EventFunction<IMoveHandler> s_MoveHandler = Execute;
-
- private static void Execute(IMoveHandler handler, BaseEventData eventData)
- {
- handler.OnMove(ValidateEventData<AxisEventData>(eventData));
- }
-
- private static readonly EventFunction<ISubmitHandler> s_SubmitHandler = Execute;
-
- private static void Execute(ISubmitHandler handler, BaseEventData eventData)
- {
- handler.OnSubmit(eventData);
- }
-
- private static readonly EventFunction<ICancelHandler> s_CancelHandler = Execute;
-
- private static void Execute(ICancelHandler handler, BaseEventData eventData)
- {
- handler.OnCancel(eventData);
- }
-
- public static EventFunction<IPointerMoveHandler> pointerMoveHandler
- {
- get { return s_PointerMoveHandler; }
- }
-
- public static EventFunction<IPointerEnterHandler> pointerEnterHandler
- {
- get { return s_PointerEnterHandler; }
- }
-
- public static EventFunction<IPointerExitHandler> pointerExitHandler
- {
- get { return s_PointerExitHandler; }
- }
-
- public static EventFunction<IPointerDownHandler> pointerDownHandler
- {
- get { return s_PointerDownHandler; }
- }
-
- public static EventFunction<IPointerUpHandler> pointerUpHandler
- {
- get { return s_PointerUpHandler; }
- }
-
- public static EventFunction<IPointerClickHandler> pointerClickHandler
- {
- get { return s_PointerClickHandler; }
- }
-
- public static EventFunction<IInitializePotentialDragHandler> initializePotentialDrag
- {
- get { return s_InitializePotentialDragHandler; }
- }
-
- public static EventFunction<IBeginDragHandler> beginDragHandler
- {
- get { return s_BeginDragHandler; }
- }
-
- public static EventFunction<IDragHandler> dragHandler
- {
- get { return s_DragHandler; }
- }
-
- public static EventFunction<IEndDragHandler> endDragHandler
- {
- get { return s_EndDragHandler; }
- }
-
- public static EventFunction<IDropHandler> dropHandler
- {
- get { return s_DropHandler; }
- }
-
- public static EventFunction<IScrollHandler> scrollHandler
- {
- get { return s_ScrollHandler; }
- }
-
- public static EventFunction<IUpdateSelectedHandler> updateSelectedHandler
- {
- get { return s_UpdateSelectedHandler; }
- }
-
- public static EventFunction<ISelectHandler> selectHandler
- {
- get { return s_SelectHandler; }
- }
-
- public static EventFunction<IDeselectHandler> deselectHandler
- {
- get { return s_DeselectHandler; }
- }
-
- public static EventFunction<IMoveHandler> moveHandler
- {
- get { return s_MoveHandler; }
- }
-
- public static EventFunction<ISubmitHandler> submitHandler
- {
- get { return s_SubmitHandler; }
- }
-
- public static EventFunction<ICancelHandler> cancelHandler
- {
- get { return s_CancelHandler; }
- }
-
- private static void GetEventChain(GameObject root, IList<Transform> eventChain)
- {
- eventChain.Clear();
- if (root == null)
- return;
-
- var t = root.transform;
- while (t != null)
- {
- eventChain.Add(t);
- t = t.parent;
- }
- }
-
- public static bool Execute<T>(GameObject target, BaseEventData eventData, EventFunction<T> functor) where T : IEventSystemHandler
- {
- var internalHandlers = ListPool<IEventSystemHandler>.Get();
- GetEventList<T>(target, internalHandlers);
- // if (s_InternalHandlers.Count > 0)
- // Debug.Log("Executinng " + typeof (T) + " on " + target);
-
- var internalHandlersCount = internalHandlers.Count;
- for (var i = 0; i < internalHandlersCount; i++)
- {
- T arg;
- try
- {
- arg = (T)internalHandlers[i];
- }
- catch (Exception e)
- {
- var temp = internalHandlers[i];
- Debug.LogException(new Exception(string.Format("Type {0} expected {1} received.", typeof(T).Name, temp.GetType().Name), e));
- continue;
- }
-
- try
- {
- functor(arg, eventData);
- }
- catch (Exception e)
- {
- Debug.LogException(e);
- }
- }
-
- var handlerCount = internalHandlers.Count;
- ListPool<IEventSystemHandler>.Release(internalHandlers);
- return handlerCount > 0;
- }
-
- /// <summary>
- /// Execute the specified event on the first game object underneath the current touch.
- /// </summary>
- private static readonly List<Transform> s_InternalTransformList = new List<Transform>(30);
-
- public static GameObject ExecuteHierarchy<T>(GameObject root, BaseEventData eventData, EventFunction<T> callbackFunction) where T : IEventSystemHandler
- {
- GetEventChain(root, s_InternalTransformList);
-
- var internalTransformListCount = s_InternalTransformList.Count;
- for (var i = 0; i < internalTransformListCount; i++)
- {
- var transform = s_InternalTransformList[i];
- if (Execute(transform.gameObject, eventData, callbackFunction))
- return transform.gameObject;
- }
- return null;
- }
-
- private static bool ShouldSendToComponent<T>(Component component) where T : IEventSystemHandler
- {
- var valid = component is T;
- if (!valid)
- return false;
-
- var behaviour = component as Behaviour;
- if (behaviour != null)
- return behaviour.isActiveAndEnabled;
- return true;
- }
-
- /// <summary>
- /// Get the specified object's event event.
- /// </summary>
- private static void GetEventList<T>(GameObject go, IList<IEventSystemHandler> results) where T : IEventSystemHandler
- {
- // Debug.LogWarning("GetEventList<" + typeof(T).Name + ">");
- if (results == null)
- throw new ArgumentException("Results array is null", "results");
-
- if (go == null || !go.activeInHierarchy)
- return;
-
- var components = ListPool<Component>.Get();
- go.GetComponents(components);
-
- var componentsCount = components.Count;
- for (var i = 0; i < componentsCount; i++)
- {
- if (!ShouldSendToComponent<T>(components[i]))
- continue;
-
- // Debug.Log(string.Format("{2} found! On {0}.{1}", go, s_GetComponentsScratch[i].GetType(), typeof(T)));
- results.Add(components[i] as IEventSystemHandler);
- }
- ListPool<Component>.Release(components);
- // Debug.LogWarning("end GetEventList<" + typeof(T).Name + ">");
- }
-
- /// <summary>
- /// Whether the specified game object will be able to handle the specified event.
- /// </summary>
- public static bool CanHandleEvent<T>(GameObject go) where T : IEventSystemHandler
- {
- var internalHandlers = ListPool<IEventSystemHandler>.Get();
- GetEventList<T>(go, internalHandlers);
- var handlerCount = internalHandlers.Count;
- ListPool<IEventSystemHandler>.Release(internalHandlers);
- return handlerCount != 0;
- }
-
- /// <summary>
- /// Bubble the specified event on the game object, figuring out which object will actually receive the event.
- /// </summary>
- public static GameObject GetEventHandler<T>(GameObject root) where T : IEventSystemHandler
- {
- if (root == null)
- return null;
-
- Transform t = root.transform;
- while (t != null)
- {
- if (CanHandleEvent<T>(t.gameObject))
- return t.gameObject;
- t = t.parent;
- }
- return null;
- }
- }
- }
|