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); }
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; } }
public static void Release(EventDispatcher.PropagationPaths po) { po.Clear(); EventDispatcher.PropagationPathsPool.s_Available.Add(po); }