using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
namespace MonoGame.Extended.Input
{
public struct MouseStateExtended
{
private readonly MouseState _currentMouseState;
private readonly MouseState _previousMouseState;
public MouseStateExtended(MouseState currentMouseState, MouseState previousMouseState)
{
_currentMouseState = currentMouseState;
_previousMouseState = previousMouseState;
}
public int X => _currentMouseState.X;
public int Y => _currentMouseState.Y;
public Point Position => _currentMouseState.Position;
public bool PositionChanged => _currentMouseState.Position != _previousMouseState.Position;
public int DeltaX => _previousMouseState.X - _currentMouseState.X;
public int DeltaY => _previousMouseState.Y - _currentMouseState.Y;
public Point DeltaPosition => new Point(DeltaX, DeltaY);
public int ScrollWheelValue => _currentMouseState.ScrollWheelValue;
public int DeltaScrollWheelValue => _previousMouseState.ScrollWheelValue - _currentMouseState.ScrollWheelValue;
public ButtonState LeftButton => _currentMouseState.LeftButton;
public ButtonState MiddleButton => _currentMouseState.MiddleButton;
public ButtonState RightButton => _currentMouseState.RightButton;
public ButtonState XButton1 => _currentMouseState.XButton1;
public ButtonState XButton2 => _currentMouseState.XButton2;
public bool IsButtonDown(MouseButton button)
{
// ReSharper disable once SwitchStatementMissingSomeCases
switch (button)
{
case MouseButton.Left: return IsPressed(m => m.LeftButton);
case MouseButton.Middle: return IsPressed(m => m.MiddleButton);
case MouseButton.Right: return IsPressed(m => m.RightButton);
case MouseButton.XButton1: return IsPressed(m => m.XButton1);
case MouseButton.XButton2: return IsPressed(m => m.XButton2);
}
return false;
}
public bool IsButtonUp(MouseButton button)
{
// ReSharper disable once SwitchStatementMissingSomeCases
switch (button)
{
case MouseButton.Left: return IsReleased(m => m.LeftButton);
case MouseButton.Middle: return IsReleased(m => m.MiddleButton);
case MouseButton.Right: return IsReleased(m => m.RightButton);
case MouseButton.XButton1: return IsReleased(m => m.XButton1);
case MouseButton.XButton2: return IsReleased(m => m.XButton2);
}
return false;
}
///
/// Get the just-down state for the mouse on this state-change: true if the mouse button has just been pressed.
///
///
/// Deprecated because of inconsistency with
/// The just-down state for the mouse on this state-change.
[Obsolete($"Deprecated in favor of {nameof(IsButtonPressed)}")]
public bool WasButtonJustDown(MouseButton button)
{
// ReSharper disable once SwitchStatementMissingSomeCases
switch (button)
{
case MouseButton.Left: return WasJustPressed(m => m.LeftButton);
case MouseButton.Middle: return WasJustPressed(m => m.MiddleButton);
case MouseButton.Right: return WasJustPressed(m => m.RightButton);
case MouseButton.XButton1: return WasJustPressed(m => m.XButton1);
case MouseButton.XButton2: return WasJustPressed(m => m.XButton2);
}
return false;
}
///
/// Get the just-up state for the mouse on this state-change: true if the mouse button has just been released.
///
///
/// Deprecated because of inconsistency with
/// The just-up state for the mouse on this state-change.
[Obsolete($"Deprecated in favor of {nameof(IsButtonReleased)}")]
public bool WasButtonJustUp(MouseButton button)
{
// ReSharper disable once SwitchStatementMissingSomeCases
switch (button)
{
case MouseButton.Left: return WasJustReleased(m => m.LeftButton);
case MouseButton.Middle: return WasJustReleased(m => m.MiddleButton);
case MouseButton.Right: return WasJustReleased(m => m.RightButton);
case MouseButton.XButton1: return WasJustReleased(m => m.XButton1);
case MouseButton.XButton2: return WasJustReleased(m => m.XButton2);
}
return false;
}
///
/// Get the pressed state of a mouse button, for this state-change.
///
/// The button to check.
/// true if the given mouse button was pressed this state-change, otherwise false
public readonly bool IsButtonPressed(MouseButton button) => button switch
{
MouseButton.Left => WasJustPressed(m => m.LeftButton),
MouseButton.Middle => WasJustPressed(m => m.MiddleButton),
MouseButton.Right => WasJustPressed(m => m.RightButton),
MouseButton.XButton1 => WasJustPressed(m => m.XButton1),
MouseButton.XButton2 => WasJustPressed(m => m.XButton2),
_ => false,
};
///
/// Get the released state of a mouse button, for this state-change.
///
/// The button to check.
/// true if the given mouse button was released this state-change, otherwise false
public readonly bool IsButtonReleased(MouseButton button) => button switch
{
MouseButton.Left => WasJustReleased(m => m.LeftButton),
MouseButton.Middle => WasJustReleased(m => m.MiddleButton),
MouseButton.Right => WasJustReleased(m => m.RightButton),
MouseButton.XButton1 => WasJustReleased(m => m.XButton1),
MouseButton.XButton2 => WasJustReleased(m => m.XButton2),
_ => false,
};
private readonly bool IsPressed(Func button)
=> button(_currentMouseState) == ButtonState.Pressed;
private readonly bool IsReleased(Func button)
=> button(_currentMouseState) == ButtonState.Released;
private readonly bool WasJustPressed(Func button)
=> button(_previousMouseState) == ButtonState.Released && button(_currentMouseState) == ButtonState.Pressed;
private readonly bool WasJustReleased(Func button)
=> button(_previousMouseState) == ButtonState.Pressed && button(_currentMouseState) == ButtonState.Released;
}
}