Protogame.ScrollableContainer.HandleEvent C# (CSharp) Méthode

HandleEvent() public méthode

public HandleEvent ( ISkinLayout skinLayout, Rectangle layout, IGameContext context, Event @event ) : bool
skinLayout ISkinLayout
layout Microsoft.Xna.Framework.Rectangle
context IGameContext
@event Event
Résultat bool
        public bool HandleEvent(ISkinLayout skinLayout, Rectangle layout, IGameContext context, Event @event)
        {
            if (_renderTarget == null)
            {
                return false;
            }

            var layoutWidth = layout.Width - skinLayout.HorizontalScrollBarHeight;
            var layoutHeight = layout.Height - skinLayout.VerticalScrollBarWidth;

            if (_isVerticalScrolling)
            {
                var mouseMoveEvent = @event as MouseMoveEvent;
                var mouseReleaseEvent = @event as MouseReleaseEvent;

                if (mouseMoveEvent != null)
                {
                    var newVerticalScrollbarPosition = mouseMoveEvent.Y - layout.Y - _verticalScrollOffset;
                    newVerticalScrollbarPosition = MathHelper.Clamp(
                        newVerticalScrollbarPosition,
                        0,
                        layoutHeight - (int)(layoutHeight / (float)_renderTarget.Height * layoutHeight));
                    ScrollY = newVerticalScrollbarPosition /
                        (layoutHeight - layoutHeight / (float)_renderTarget.Height * layoutHeight);
                    return true;
                }

                if (mouseReleaseEvent?.Button == MouseButton.Left)
                {
                    _isVerticalScrolling = false;
                }
            }
            else if (_isHorizontalScrolling)
            {
                var mouseMoveEvent = @event as MouseMoveEvent;
                var mouseReleaseEvent = @event as MouseReleaseEvent;

                if (mouseMoveEvent != null)
                {
                    var newHorizontalScrollbarPosition = mouseMoveEvent.X - layout.X - _horizontalScrollOffset;
                    newHorizontalScrollbarPosition = MathHelper.Clamp(
                        newHorizontalScrollbarPosition,
                        0,
                        layoutWidth - (int)(layoutWidth / (float)_renderTarget.Width * layoutWidth));
                    ScrollX = newHorizontalScrollbarPosition /
                        (layoutWidth - layoutWidth / (float)_renderTarget.Width * layoutWidth);
                    return true;
                }

                if (mouseReleaseEvent?.Button == MouseButton.Left)
                {
                    _isHorizontalScrolling = false;
                }
            }
            else if (!_isHorizontalScrolling && !_isVerticalScrolling)
            {
                var mousePressEvent = @event as MousePressEvent;

                var horizontalScrollBarRectangle = new Rectangle(
                    (int)(layout.X + ScrollX * (layoutWidth - layoutWidth / (float)_renderTarget.Width * layoutWidth)),
                    layout.Y + layout.Height - skinLayout.HorizontalScrollBarHeight,
                    (int)(layoutWidth / (float)_renderTarget.Width * layoutWidth),
                    skinLayout.HorizontalScrollBarHeight);
                var verticalScrollBarRectangle = new Rectangle(
                    layout.X + layout.Width - skinLayout.VerticalScrollBarWidth,
                    (int)(layout.Y + ScrollY * (layoutHeight - layoutHeight / (float)_renderTarget.Height * layoutHeight)),
                    skinLayout.VerticalScrollBarWidth,
                    (int)(layoutHeight / (float)_renderTarget.Height * layoutHeight));
               
                if (mousePressEvent != null && mousePressEvent.Button == MouseButton.Left)
                {
                    if (horizontalScrollBarRectangle.Contains(mousePressEvent.MouseState.Position))
                    {
                        if (_renderTarget.Width > layout.Width)
                        {
                            _isHorizontalScrolling = true;
                            _horizontalScrollOffset = mousePressEvent.MouseState.Position.X - horizontalScrollBarRectangle.X;
                            _horizontalScrollStart = mousePressEvent.MouseState.Position.X;
                        }

                        return true;
                    }

                    if (verticalScrollBarRectangle.Contains(mousePressEvent.MouseState.Position))
                    {
                        if (_renderTarget.Height > layout.Height)
                        {
                            _isVerticalScrolling = true;
                            _verticalScrollOffset = mousePressEvent.MouseState.Position.Y - verticalScrollBarRectangle.Y;
                            _verticalScrollStart = mousePressEvent.MouseState.Position.Y;
                        }

                        return true;
                    }
                }

                if (_child == null)
                {
                    return false;
                }

                var mouseEvent = @event as MouseEvent;

                var originalState = default(MouseState);
                int scrollXPixels = 0, scrollYPixels = 0;
                if (mouseEvent != null)
                {
                    scrollXPixels = (int)(ScrollX * (Math.Max(_renderTarget.Width, layoutWidth) - layoutWidth));
                    scrollYPixels = (int)(ScrollY * (Math.Max(_renderTarget.Height, layoutHeight) - layoutHeight));

                    originalState = mouseEvent.MouseState;
                    mouseEvent.MouseState = new MouseState(
                        mouseEvent.MouseState.X + scrollXPixels,
                        mouseEvent.MouseState.Y + scrollYPixels,
                        mouseEvent.MouseState.ScrollWheelValue,
                        mouseEvent.MouseState.LeftButton,
                        mouseEvent.MouseState.MiddleButton,
                        mouseEvent.MouseState.RightButton,
                        mouseEvent.MouseState.XButton1,
                        mouseEvent.MouseState.XButton2);

                    var mouseMoveEvent = @event as MouseMoveEvent;

                    if (mouseMoveEvent != null)
                    {
                        mouseMoveEvent.LastX += scrollXPixels;
                        mouseMoveEvent.LastY += scrollYPixels;
                        mouseMoveEvent.X += scrollXPixels;
                        mouseMoveEvent.Y += scrollYPixels;
                    }
                }

                _child.HandleEvent(skinLayout, layout, context, @event);

                // Restore event state.
                if (mouseEvent != null)
                {
                    mouseEvent.MouseState = originalState;

                    var mouseMoveEvent = @event as MouseMoveEvent;

                    if (mouseMoveEvent != null)
                    {
                        mouseMoveEvent.LastX -= scrollXPixels;
                        mouseMoveEvent.LastY -= scrollYPixels;
                        mouseMoveEvent.X -= scrollXPixels;
                        mouseMoveEvent.Y -= scrollYPixels;
                    }
                }
            }

            return false;
        }
    }