Esempio n. 1
0
 protected internal virtual void     OnMouseWheel(Point _hitPoint, int _iDelta)
 {
     if (Parent != null)
     {
         Parent.OnMouseWheel(_hitPoint, _iDelta);
     }
 }
Esempio n. 2
0
        //----------------------------------------------------------------------
        public void HandleInput()
        {
            //------------------------------------------------------------------
            // Make sure we don't hold references to orphaned widgets
            if (FocusedWidget != null && FocusedWidget.IsOrphan)
            {
                FocusedWidget = null;
                mbHasActivatedFocusedWidget = false;
            }

            if (HoveredWidget != null && HoveredWidget.IsOrphan)
            {
                Game.SetCursor(MouseCursor.Default);
                HoveredWidget = null;
            }

            if (mClickedWidget != null && mClickedWidget.IsOrphan)
            {
                mClickedWidget = null;
            }

            //------------------------------------------------------------------
            Point mouseHitPoint = new Point(
                (int)(Game.InputMgr.MouseState.X / Resolution.ScaleFactor),
                (int)((Game.InputMgr.MouseState.Y - Game.GraphicsDevice.Viewport.Y) / Resolution.ScaleFactor)
                );

            if (!IsActive)
            {
                if (HoveredWidget != null)
                {
                    HoveredWidget.OnMouseOut(mouseHitPoint);
                    HoveredWidget = null;
                }

                if (mClickedWidget != null)
                {
                    mClickedWidget.OnMouseUp(mouseHitPoint, miClickedWidgetMouseButton);
                    mClickedWidget = null;
                }

                return;
            }

            //------------------------------------------------------------------
            // Mouse buttons
            bool bHasMouseEvent = false;

            if (miIgnoreClickFrames == 0)
            {
                for (int iButton = 0; iButton < 3; iButton++)
                {
                    if (Game.InputMgr.WasMouseButtonJustPressed(iButton))
                    {
                        bHasMouseEvent = true;

                        if (mClickedWidget == null)
                        {
                            miClickedWidgetMouseButton = iButton;

                            Widget hitWidget = null;

                            if (FocusedWidget != null)
                            {
                                hitWidget = FocusedWidget.HitTest(mouseHitPoint);
                            }

                            if (hitWidget == null)
                            {
                                hitWidget = Root.HitTest(mouseHitPoint);
                            }

                            while (hitWidget != null && !hitWidget.OnMouseDown(mouseHitPoint, iButton))
                            {
                                hitWidget = hitWidget.Parent;
                            }

                            mClickedWidget = hitWidget;
                        }
                    }
                }

                if (Game.InputMgr.WasMouseJustDoubleClicked())
                {
                    bHasMouseEvent = true;

                    Widget widget = FocusedWidget == null ? null : FocusedWidget.HitTest(mouseHitPoint);
                    if (widget != null)
                    {
                        bool bPressed;

                        switch (Game.InputMgr.PrimaryMouseButton)
                        {
                        case 0:
                            bPressed = Game.InputMgr.MouseState.LeftButton == ButtonState.Pressed;
                            break;

                        case 2:
                            bPressed = Game.InputMgr.MouseState.RightButton == ButtonState.Pressed;
                            break;

                        default:
                            throw new NotSupportedException();
                        }

                        if (bPressed)
                        {
                            mClickedWidget             = widget;
                            miClickedWidgetMouseButton = Game.InputMgr.PrimaryMouseButton;
                        }

                        if (widget.OnMouseDoubleClick(mouseHitPoint))
                        {
                            miIgnoreClickFrames = 3;
                        }
                    }
                }
            }
            else
            {
                miIgnoreClickFrames--;
            }

            for (int iButton = 0; iButton < 3; iButton++)
            {
                if (Game.InputMgr.WasMouseButtonJustReleased(iButton))
                {
                    bHasMouseEvent = true;

                    if (mClickedWidget != null && iButton == miClickedWidgetMouseButton)
                    {
                        mClickedWidget.OnMouseUp(mouseHitPoint, iButton);
                        mClickedWidget = null;
                    }
                }
            }

            if (!bHasMouseEvent)
            {
                Widget hoveredWidget = (FocusedWidget == null ? null : FocusedWidget.HitTest(mouseHitPoint)) ?? Root.HitTest(mouseHitPoint);

                if (mouseHitPoint != mPreviousMouseHitPoint)
                {
                    if (mClickedWidget == null)
                    {
                        if (hoveredWidget != null && hoveredWidget == HoveredWidget)
                        {
                            HoveredWidget.OnMouseMove(mouseHitPoint);
                        }
                        else
                        {
                            if (HoveredWidget != null)
                            {
                                HoveredWidget.OnMouseOut(mouseHitPoint);
                            }

                            HoveredWidget = hoveredWidget;
                            if (HoveredWidget != null)
                            {
                                HoveredWidget.OnMouseEnter(mouseHitPoint);
                            }
                        }
                    }
                    else
                    {
                        mClickedWidget.OnMouseMove(mouseHitPoint);
                    }
                }
            }

            // Mouse wheel
            int iWheelDelta = Game.InputMgr.GetMouseWheelDelta();

            if (iWheelDelta != 0)
            {
                Widget hoveredWidget = (FocusedWidget == null ? null : FocusedWidget.HitTest(mouseHitPoint)) ?? Root.HitTest(mouseHitPoint);

                if (hoveredWidget != null)
                {
                    hoveredWidget.OnMouseWheel(mouseHitPoint, iWheelDelta);
                }
            }

            mPreviousMouseHitPoint = mouseHitPoint;

            //------------------------------------------------------------------
            // Keyboard
            if (FocusedWidget != null)
            {
                foreach (char character in Game.InputMgr.EnteredText)
                {
                    FocusedWidget.OnTextEntered(character);
                }

                if (Game.InputMgr.JustPressedOSKeys.Contains(OSKey.Enter) || Game.InputMgr.JustPressedOSKeys.Contains(OSKey.Return) || Game.InputMgr.JustPressedOSKeys.Contains(OSKey.Space))
                {
                    if (FocusedWidget.OnActivateDown())
                    {
                        mbHasActivatedFocusedWidget = true;
                    }
                }
                else
                if (Game.InputMgr.JustReleasedOSKeys.Contains(OSKey.Enter) || Game.InputMgr.JustReleasedOSKeys.Contains(OSKey.Return) || Game.InputMgr.JustReleasedOSKeys.Contains(OSKey.Space))
                {
                    if (mbHasActivatedFocusedWidget)
                    {
                        FocusedWidget.OnActivateUp();
                        mbHasActivatedFocusedWidget = false;
                    }
                }

                if (Game.InputMgr.WasKeyJustPressed(Keys.Left))
                {
                    FocusedWidget.OnPadMove(UI.Direction.Left);
                }
                if (Game.InputMgr.WasKeyJustPressed(Keys.Right))
                {
                    FocusedWidget.OnPadMove(UI.Direction.Right);
                }
                if (Game.InputMgr.WasKeyJustPressed(Keys.Up))
                {
                    FocusedWidget.OnPadMove(UI.Direction.Up);
                }
                if (Game.InputMgr.WasKeyJustPressed(Keys.Down))
                {
                    FocusedWidget.OnPadMove(UI.Direction.Down);
                }

                foreach (Keys key in Game.InputMgr.JustPressedKeys)
                {
                    FocusedWidget.OnKeyPress(key);
                }

                foreach (var key in Game.InputMgr.JustPressedOSKeys)
                {
                    FocusedWidget.OnOSKeyPress(key);
                }
            }
        }