Exemplo n.º 1
0
        private void OnMouseMove(Event e)
        {
#if DEBUG
            if (DebugMode)
            {
                Debug.Log("MouseEventDispatcher.OnMouseMove");
            }
#endif
            _mouseEvent = (MouseEvent)e;

            _pos  = _mouseEvent.GlobalPosition;
            _size = SystemManager.Instance.ScreenSize;

            if (_pos.X < 0 || _pos.Y < 0 || _pos.X > _size.X || _pos.Y > _size.Y)
            {
                if (!_isMouseLeave)
                {
                    /**
                     * 1) InvalidateDrawingList the event
                     * */
                    _mouseLeaveEvent = new MouseEvent(MouseEvent.MOUSE_LEAVE)
                    {
                        Target         = this,
                        GlobalPosition = _pos
                    };
                }
                _isMouseLeave = true;
            }
            else
            {
                _isMouseLeave = false;
            }

            //Debug.Log("..... will recalculate ..... ");

            /**
             * 1) Find (any) component under under mouse
             * */
            RecalculateMouseTarget();

            //RecalculateMouseWheelTargets();

            //Debug.Log("InspectMode: " + InspectMode);

            /**
             * 2) Handle inspector target under mouse
             * */
            if (PlayModeInspect || InspectMode)
            {
                RecalculateInspectorTarget();
            }

            if (null != MouseTarget)
            {
#if DEBUG
                if (DebugMode)
                {
                    Debug.Log("OnMouseMove component: " + MouseTarget);
                }
#endif
                MouseEventHelper.BuildAndDispatchMouseEvent(this, MouseTarget, MouseEvent.MOUSE_MOVE,
                                                            _mouseEvent.GlobalPosition, _mouseEvent.CurrentEvent);
            }

            if (MouseTarget != _previousMouseOveredComponent || _isMouseLeave)
            {
                if (null != _previousMouseOveredComponent)
                {
                    MouseEventHelper.BuildAndDispatchMouseEvent(this, _previousMouseOveredComponent,
                                                                MouseEvent.MOUSE_OUT, _mouseEvent.GlobalPosition, _mouseEvent.CurrentEvent);
                    //Debug.Log("MOUSE_OUT: " + _previousMouseOveredComponent);
                    _hasBeenMouseOut = true;

                    string cursorStyle = (string)_previousMouseOveredComponent.GetStyle("cursor");
                    if (!string.IsNullOrEmpty(cursorStyle))
                    {
                        CursorManager.Instance.RemoveCursor(_currentCursorId);
                    }
                }

                if (MouseTarget != null)
                {
                    /**
                     * MOUSE OVER
                     * */

                    if (!_hasBeenMouseDown && 0 != MouseTarget.HotControlId)
                    {
                        //GUIUtility.hotControl = MouseTarget.HotControlId;
                        //Debug.Log("GUIUtility.hotControl: " + GUIUtility.hotControl);
                    }

                    MouseEventHelper.BuildAndDispatchMouseEvent(this, MouseTarget, MouseEvent.MOUSE_OVER,
                                                                _mouseEvent.GlobalPosition, _mouseEvent.CurrentEvent);

                    string cursorStyle = (string)MouseTarget.GetStyle("cursor");
                    if (!string.IsNullOrEmpty(cursorStyle))
                    {
                        _currentCursorId = CursorManager.Instance.SetCursor(cursorStyle, CursorPriority.Low);
                    }

                    //Debug.Log("_previousMouseOveredComponent: " + _previousMouseOveredComponent);
                    //Debug.Log("_rollOveredComponents.Count: " + _rollOveredComponents.Count);

                    foreach (Component comp in _rollOveredComponents.Keys)
                    {
                        // this is the component subscribed to rollover events

                        _shouldDispatchRollOver = false;
                        _shouldDispatchRollOut  = false;

                        /**
                         * 1) Both components are the child of this parent
                         * From parent's point of view, there has been no rollover nor rollout
                         * */
                        if (comp.Contains(MouseTarget, true) &&
                            null != _previousMouseOveredComponent &&
                            comp.Contains(_previousMouseOveredComponent, true))
                        {
                            // do nothing
                            continue;
                        }

                        /**
                         * 2) Component child has been mouseovered.
                         * The component has not been in rollovered state.
                         * Dispatch ROLL_OVER.
                         * */
                        if (comp.Contains(MouseTarget, true) && !_rollOveredComponents[comp])
                        {
                            _shouldDispatchRollOver = true;
                            _rollOveredComponentsToChangeState.Add(comp);
                        }

                        /**
                         * 3) Component child has been mouseouted.
                         * New mouseovered component is not a child of this component, and component has been in rollovered state.
                         * Dispatch ROLL_OUT.
                         * */
                        else if (null != _previousMouseOveredComponent &&
                                 comp.Contains(_previousMouseOveredComponent, true) && _rollOveredComponents[comp])
                        {
                            _shouldDispatchRollOut = true;
                            _rollOveredComponentsToChangeState.Add(comp);
                        }

                        // rethink once again
                        // check if there has been a mouse out and no mouse in (blank Stage example)
                        //else if (_hasBeenMouseOut)// && !_shouldDispatchRollOut)
                        //{
                        //    Debug.Log("_hasBeenMouseOut");
                        //    _shouldDispatchRollOut = true;
                        //    _rollOveredComponentsToChangeState.Add(comp);
                        //}

                        if (_shouldDispatchRollOut)
                        {
#if DEBUG
                            if (DebugMode)
                            {
                                Debug.Log("Dispatching ROLL_OUT: " + comp);
                            }
#endif
                            MouseEventHelper.BuildAndDispatchMouseEvent(this, comp, MouseEvent.ROLL_OUT,
                                                                        _mouseEvent.GlobalPosition, _mouseEvent.CurrentEvent);
                        }
                        else if (_shouldDispatchRollOver)
                        {
#if DEBUG
                            if (DebugMode)
                            {
                                Debug.Log("Dispatching ROLL_OVER: " + comp);
                            }
#endif
                            MouseEventHelper.BuildAndDispatchMouseEvent(this, comp, MouseEvent.ROLL_OVER,
                                                                        _mouseEvent.GlobalPosition, _mouseEvent.CurrentEvent);
                        }
                    }
                }

                // new mouse target is null
                else if (_hasBeenMouseOut || _isMouseLeave)
                {
                    foreach (Component comp in _rollOveredComponents.Keys)
                    {
                        /**
                         *
                         * */
                        if (null != _previousMouseOveredComponent &&
                            comp.Contains(_previousMouseOveredComponent, true) &&
                            _rollOveredComponents[comp])
                        {
#if DEBUG
                            if (DebugMode)
                            {
                                Debug.Log("Dispatching ROLL_OUT (special): " + comp);
                            }
#endif
                            _rollOveredComponentsToChangeState.Add(comp);
                            MouseEventHelper.BuildAndDispatchMouseEvent(this, comp, MouseEvent.ROLL_OUT,
                                                                        _mouseEvent.GlobalPosition, _mouseEvent.CurrentEvent);
                        }
                    }
                }
            }

            _rollOveredComponentsToChangeState.ForEach(delegate(Component changing)
            {
                _rollOveredComponents[changing] =
                    !_rollOveredComponents[changing];
            });
            _rollOveredComponentsToChangeState.Clear();

            _previousMouseOveredComponent = MouseTarget;
            _hasBeenMouseOut = false;

            if (null != _mouseLeaveEvent)
            {
                /**
                 * 2) Dispatch from manager
                 * */
                DispatchEvent(_mouseLeaveEvent);
            }
        }