Example #1
0
        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;
        }
Example #2
0
        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;
                }
            }
        }