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;
}
}