예제 #1
0
 private static EventDispatcher.PropagationPaths BuildPropagationPath(VisualElement elem)
 {
     EventDispatcher.PropagationPaths result;
     if (elem == null)
     {
         result = EventDispatcher.k_EmptyPropagationPaths;
     }
     else
     {
         EventDispatcher.PropagationPaths propagationPaths = EventDispatcher.PropagationPathsPool.Acquire();
         while (elem.shadow.parent != null)
         {
             if (elem.shadow.parent.enabledInHierarchy)
             {
                 if (elem.shadow.parent.HasCaptureHandlers())
                 {
                     propagationPaths.capturePath.Add(elem.shadow.parent);
                 }
                 if (elem.shadow.parent.HasBubbleHandlers())
                 {
                     propagationPaths.bubblePath.Add(elem.shadow.parent);
                 }
             }
             elem = elem.shadow.parent;
         }
         result = propagationPaths;
     }
     return(result);
 }
예제 #2
0
 public static EventDispatcher.PropagationPaths Acquire()
 {
     EventDispatcher.PropagationPaths result;
     if (EventDispatcher.PropagationPathsPool.s_Available.Count != 0)
     {
         EventDispatcher.PropagationPaths propagationPaths = EventDispatcher.PropagationPathsPool.s_Available[0];
         EventDispatcher.PropagationPathsPool.s_Available.RemoveAt(0);
         result = propagationPaths;
     }
     else
     {
         EventDispatcher.PropagationPaths propagationPaths2 = new EventDispatcher.PropagationPaths(16);
         result = propagationPaths2;
     }
     return(result);
 }
 private static void PropagateEvent(EventBase evt)
 {
     if (!evt.dispatch)
     {
         EventDispatcher.PropagationPaths propagationPaths = EventDispatcher.BuildPropagationPath(evt.target as VisualElement);
         evt.dispatch = true;
         if (evt.capturable && propagationPaths.capturePath.Count > 0)
         {
             evt.propagationPhase = PropagationPhase.Capture;
             for (int i = propagationPaths.capturePath.Count - 1; i >= 0; i--)
             {
                 if (evt.isPropagationStopped)
                 {
                     break;
                 }
                 evt.currentTarget = propagationPaths.capturePath[i];
                 evt.currentTarget.HandleEvent(evt);
             }
         }
         if (!evt.isPropagationStopped)
         {
             evt.propagationPhase = PropagationPhase.AtTarget;
             evt.currentTarget    = evt.target;
             evt.currentTarget.HandleEvent(evt);
         }
         if (evt.bubbles && propagationPaths.bubblePath.Count > 0)
         {
             evt.propagationPhase = PropagationPhase.BubbleUp;
             for (int j = 0; j < propagationPaths.bubblePath.Count; j++)
             {
                 if (evt.isPropagationStopped)
                 {
                     break;
                 }
                 evt.currentTarget = propagationPaths.bubblePath[j];
                 evt.currentTarget.HandleEvent(evt);
             }
         }
         evt.dispatch         = false;
         evt.propagationPhase = PropagationPhase.None;
         evt.currentTarget    = null;
     }
 }
예제 #4
0
 public static void Release(EventDispatcher.PropagationPaths po)
 {
     po.Clear();
     EventDispatcher.PropagationPathsPool.s_Available.Add(po);
 }