void LocalInit() { timestamp = (long)(Time.realtimeSinceStartup * 1000.0f); triggerEventId = 0; eventId = s_NextEventId++; propagation = EventPropagation.None; m_Path?.Release(); m_Path = null; leafTarget = null; target = null; skipElements.Clear(); isPropagationStopped = false; isImmediatePropagationStopped = false; isDefaultPrevented = false; propagationPhase = PropagationPhase.None; originalMousePosition = Vector2.zero; m_CurrentTarget = null; dispatch = false; stopDispatch = false; propagateToIMGUI = true; dispatched = false; imguiEventIsValid = false; pooled = false; eventLogger = null; }
void LocalInit() { timestamp = Panel.TimeSinceStartupMs(); triggerEventId = 0; eventId = s_NextEventId++; propagation = EventPropagation.None; m_Path?.Release(); m_Path = null; leafTarget = null; target = null; skipElements.Clear(); isPropagationStopped = false; isImmediatePropagationStopped = false; isDefaultPrevented = false; propagationPhase = PropagationPhase.None; originalMousePosition = Vector2.zero; m_CurrentTarget = null; dispatch = false; stopDispatch = false; propagateToIMGUI = true; dispatched = false; processed = false; processedByFocusController = false; imguiEventIsValid = false; pooled = false; #if UNITY_EDITOR eventLogger = null; #endif }
void ProcessEvent(EventBase evt, [NotNull] IPanel panel) { Event e = evt.imguiEvent; // Sometimes (in tests only?) we receive Used events. Protect our verification from this case. bool imguiEventIsInitiallyUsed = e != null && e.rawType == EventType.Used; using (new EventDispatcherGate(this)) { evt.PreDispatch(panel); if (!evt.stopDispatch && !evt.isPropagationStopped) { ApplyDispatchingStrategies(evt, panel, imguiEventIsInitiallyUsed); } // Last chance to build a path. Some dispatching strategies (e.g. PointerCaptureDispatchingStrategy) // don't call PropagateEvents but still need to call ExecuteDefaultActions on composite roots. var path = evt.path; if (path == null && evt.bubblesOrTricklesDown && evt.leafTarget is VisualElement leafTarget) { path = PropagationPaths.Build(leafTarget, evt); evt.path = path; EventDebugger.LogPropagationPaths(evt, path); } if (path != null) { foreach (var element in path.targetElements) { if (element.panel == panel) { evt.target = element; EventDispatchUtilities.ExecuteDefaultAction(evt); } } // Reset target to leaf target evt.target = evt.leafTarget; } else { // If no propagation path, make sure EventDispatchUtilities.ExecuteDefaultAction has a target if (!(evt.target is VisualElement target)) { evt.target = target = panel.visualTree; } if (target.panel == panel) { EventDispatchUtilities.ExecuteDefaultAction(evt); } } m_DebuggerEventDispatchingStrategy.PostDispatch(evt, panel); evt.PostDispatch(panel); m_ClickDetector.ProcessEvent(evt); Debug.Assert(imguiEventIsInitiallyUsed || evt.isPropagationStopped || e == null || e.rawType != EventType.Used, "Event is used but not stopped."); } }
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; }
void Init(EventBase evt) { var type = evt.GetType(); eventBaseName = EventDebugger.GetTypeDisplayName(type); eventTypeId = evt.eventTypeId; eventId = evt.eventId; triggerEventId = evt.triggerEventId; timestamp = evt.timestamp; target = evt.target; skipElements = evt.skipElements; isPropagationStopped = evt.isPropagationStopped; isImmediatePropagationStopped = evt.isImmediatePropagationStopped; isDefaultPrevented = evt.isDefaultPrevented; var mouseEvent = evt as IMouseEvent; var mouseEventInternal = evt as IMouseEventInternal; hasUnderlyingPhysicalEvent = mouseEvent != null && mouseEventInternal != null && mouseEventInternal.triggeredByOS; propagationPhase = evt.propagationPhase; originalMousePosition = evt.originalMousePosition; currentTarget = evt.currentTarget; dispatch = evt.dispatch; if (mouseEvent != null) { modifiers = mouseEvent.modifiers; mousePosition = mouseEvent.mousePosition; button = mouseEvent.button; pressedButtons = mouseEvent.pressedButtons; clickCount = mouseEvent.clickCount; var wheelEvent = mouseEvent as WheelEvent; if (wheelEvent != null) { delta = wheelEvent.delta; } } var pointerEvent = evt as IPointerEvent; if (pointerEvent != null) { var pointerEventInternal = evt as IPointerEventInternal; hasUnderlyingPhysicalEvent = pointerEvent != null && pointerEventInternal != null && pointerEventInternal.triggeredByOS; modifiers = pointerEvent.modifiers; mousePosition = pointerEvent.position; button = pointerEvent.button; pressedButtons = pointerEvent.pressedButtons; clickCount = pointerEvent.clickCount; } IKeyboardEvent keyboardEvent = evt as IKeyboardEvent; if (keyboardEvent != null) { character = keyboardEvent.character; keyCode = keyboardEvent.keyCode; } ICommandEvent commandEvent = evt as ICommandEvent; if (commandEvent != null) { commandName = commandEvent.commandName; } INavigationEvent navigationEvent = evt as INavigationEvent; if (navigationEvent != null) { deviceType = navigationEvent.deviceType; if (evt is NavigationMoveEvent nme) { navigationDirection = nme.direction; } } }