summaryrefslogtreecommitdiff
path: root/Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs
blob: 0ec6943f5592563e7435a459cfc6edd62b277d3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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;
        }

        /// <summary>
        /// Get the just-down state for the mouse on this state-change: true if the mouse button has just been pressed.
        /// </summary>
        /// <param name="button"></param>
        /// <remarks>Deprecated because of inconsistency with <see cref="KeyboardStateExtended"/></remarks>
        /// <returns>The just-down state for the mouse on this state-change.</returns>
        [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;
        }

        /// <summary>
        /// Get the just-up state for the mouse on this state-change: true if the mouse button has just been released.
        /// </summary>
        /// <param name="button"></param>
        /// <remarks>Deprecated because of inconsistency with <see cref="KeyboardStateExtended"/></remarks>
        /// <returns>The just-up state for the mouse on this state-change.</returns>
        [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;
        }

        /// <summary>
        /// Get the pressed state of a mouse button, for this state-change.
        /// </summary>
        /// <param name="button">The button to check.</param>
        /// <returns>true if the given mouse button was pressed this state-change, otherwise false</returns>
        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,
        };

        /// <summary>
        /// Get the released state of a mouse button, for this state-change.
        /// </summary>
        /// <param name="button">The button to check.</param>
        /// <returns>true if the given mouse button was released this state-change, otherwise false</returns>
        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<MouseState, ButtonState> button)
            => button(_currentMouseState) == ButtonState.Pressed;
        private readonly bool IsReleased(Func<MouseState, ButtonState> button)
            => button(_currentMouseState) == ButtonState.Released;
        private readonly bool WasJustPressed(Func<MouseState, ButtonState> button)
            => button(_previousMouseState) == ButtonState.Released && button(_currentMouseState) == ButtonState.Pressed;
        private readonly bool WasJustReleased(Func<MouseState, ButtonState> button)
            => button(_previousMouseState) == ButtonState.Pressed && button(_currentMouseState) == ButtonState.Released;
    }
}