summaryrefslogtreecommitdiff
path: root/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/EventHandler/ExecuteEvents.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/EventHandler/ExecuteEvents.cs')
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/EventHandler/ExecuteEvents.cs368
1 files changed, 368 insertions, 0 deletions
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/EventHandler/ExecuteEvents.cs b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/EventHandler/ExecuteEvents.cs
new file mode 100644
index 0000000..a749ce8
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/EventHandler/ExecuteEvents.cs
@@ -0,0 +1,368 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine.UI;
+
+namespace UnityEngine.EventSystems
+{
+ // 最关键的类,调用gameobject对应的回调函数
+ 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<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<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;
+ }
+ }
+
+ //IEventSystemHandler是所有接口的基类
+ private static readonly ObjectPool<List<IEventSystemHandler>> s_HandlerListPool = new ObjectPool<List<IEventSystemHandler>>(null, l => l.Clear());
+
+ // 向target gameobject发送一个事件,对每个实现了T接口的类执行functor方法(就是接口中定义的回调)
+ public static bool Execute<T>(GameObject target, BaseEventData eventData, EventFunction<T> functor) where T : IEventSystemHandler
+ {
+ var internalHandlers = s_HandlerListPool.Get();
+ GetEventList<T>(target, internalHandlers);
+ // if (s_InternalHandlers.Count > 0)
+ // Debug.Log("Executinng " + typeof (T) + " on " + target);
+
+ // 拿到实现了T接口的组件,调用对应的方法
+
+ for (var i = 0; i < internalHandlers.Count; 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;
+ s_HandlerListPool.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);
+
+ for (var i = 0; i < s_InternalTransformList.Count; i++)
+ {
+ var transform = s_InternalTransformList[i];
+ if (Execute(transform.gameObject, eventData, callbackFunction))
+ return transform.gameObject;
+ }
+ return null;
+ }
+
+ //c component是否匹配类型T且是否被激活
+ 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);
+ // 遍历所有的组件,找到匹配类型T的
+ for (var i = 0; i < components.Count; i++)
+ {
+ // 如果不匹配类型T,跳过这个
+ 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 = s_HandlerListPool.Get();
+ GetEventList<T>(go, internalHandlers);
+ var handlerCount = internalHandlers.Count;
+ s_HandlerListPool.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;
+ }
+ }
+}