public static PropagationPaths Acquire() { if (s_Available.Count != 0) { PropagationPaths po = s_Available[0]; s_Available.RemoveAt(0); return(po); } else { PropagationPaths po = new PropagationPaths(k_DefaultPropagationDepth); return(po); } }
public EventDebuggerPathTrace(IPanel panel, EventBase evt, PropagationPaths paths) : base(panel, evt, -1, null) { this.paths = paths; }
public static void Release(PropagationPaths po) { po.Clear(); s_Available.Add(po); }
private static void HandleEventAcrossPropagationPath(EventBase evt) { // Build and store propagation path var leafTarget = (VisualElement)evt.leafTarget; var path = PropagationPaths.Build(leafTarget, evt); evt.path = path; EventDebugger.LogPropagationPaths(evt, path); var panel = leafTarget.panel; // Phase 1: TrickleDown phase // Propagate event from root to target.parent if (evt.tricklesDown) { evt.propagationPhase = PropagationPhase.TrickleDown; for (int i = path.trickleDownPath.Count - 1; i >= 0; i--) { if (evt.isPropagationStopped) { break; } var element = path.trickleDownPath[i]; if (evt.Skip(element) || element.panel != panel) { continue; } evt.currentTarget = element; evt.currentTarget.HandleEvent(evt); } } // Phase 2: Target / DefaultActionAtTarget // Propagate event from target parent up to root for the target phase // Call HandleEvent() even if propagation is stopped, for the default actions at target. evt.propagationPhase = PropagationPhase.AtTarget; foreach (var element in path.targetElements) { if (evt.Skip(element) || element.panel != panel) { continue; } evt.target = element; evt.currentTarget = evt.target; evt.currentTarget.HandleEvent(evt); } // Call ExecuteDefaultActionAtTarget evt.propagationPhase = PropagationPhase.DefaultActionAtTarget; foreach (var element in path.targetElements) { if (evt.Skip(element) || element.panel != panel) { continue; } evt.target = element; evt.currentTarget = evt.target; evt.currentTarget.HandleEvent(evt); } // Reset target to original target evt.target = evt.leafTarget; // Phase 3: bubble up phase // Propagate event from target parent up to root if (evt.bubbles) { evt.propagationPhase = PropagationPhase.BubbleUp; foreach (var element in path.bubbleUpPath) { if (evt.Skip(element) || element.panel != panel) { continue; } evt.currentTarget = element; evt.currentTarget.HandleEvent(evt); } } evt.propagationPhase = PropagationPhase.None; evt.currentTarget = null; }