using System.Collections.Generic; using Microsoft.Xna.Framework.Input; namespace StardewModdingAPI.Framework.Input { /// Manages mouse state. internal class MouseStateBuilder : IInputStateBuilder { /********* ** Fields *********/ /// The underlying mouse state. private MouseState? State; /// The current button states. private readonly IDictionary ButtonStates; /// The mouse wheel scroll value. private readonly int ScrollWheelValue; /********* ** Accessors *********/ /// The X cursor position. public int X { get; } /// The Y cursor position. public int Y { get; } /********* ** Public methods *********/ /// Construct an instance. /// The initial state. public MouseStateBuilder(MouseState state) { this.State = state; this.ButtonStates = new Dictionary { [SButton.MouseLeft] = state.LeftButton, [SButton.MouseMiddle] = state.MiddleButton, [SButton.MouseRight] = state.RightButton, [SButton.MouseX1] = state.XButton1, [SButton.MouseX2] = state.XButton2 }; this.X = state.X; this.Y = state.Y; this.ScrollWheelValue = state.ScrollWheelValue; } /// Override the states for a set of buttons. /// The button state overrides. public MouseStateBuilder OverrideButtons(IDictionary overrides) { foreach (var pair in overrides) { if (this.ButtonStates.ContainsKey(pair.Key)) { this.State = null; this.ButtonStates[pair.Key] = pair.Value.IsDown() ? ButtonState.Pressed : ButtonState.Released; } } return this; } /// Get the currently pressed buttons. public IEnumerable GetPressedButtons() { foreach (var pair in this.ButtonStates) { if (pair.Value == ButtonState.Pressed) yield return pair.Key; } } /// Get the equivalent state. public MouseState GetState() { this.State ??= new MouseState( x: this.X, y: this.Y, scrollWheel: this.ScrollWheelValue, leftButton: this.ButtonStates[SButton.MouseLeft], middleButton: this.ButtonStates[SButton.MouseMiddle], rightButton: this.ButtonStates[SButton.MouseRight], xButton1: this.ButtonStates[SButton.MouseX1], xButton2: this.ButtonStates[SButton.MouseX2] ); return this.State.Value; } } }