using System;
using System.Collections.Generic;
using System.Linq;
using StardewModdingAPI.Framework.Input;
namespace StardewModdingAPI.Events
{
/// Event arguments when any buttons were pressed or released.
public class ButtonsChangedEventArgs : EventArgs
{
/*********
** Fields
*********/
/// The buttons that were pressed, held, or released since the previous tick.
private readonly Lazy> ButtonsByState;
/*********
** Accessors
*********/
/// The current cursor position.
public ICursorPosition Cursor { get; }
/// The buttons which were pressed since the previous tick.
public IEnumerable Pressed => this.ButtonsByState.Value[SButtonState.Pressed];
/// The buttons which were held since the previous tick.
public IEnumerable Held => this.ButtonsByState.Value[SButtonState.Held];
/// The buttons which were released since the previous tick.
public IEnumerable Released => this.ButtonsByState.Value[SButtonState.Released];
/*********
** Public methods
*********/
/// Construct an instance.
/// The cursor position.
/// The game's current input state.
internal ButtonsChangedEventArgs(ICursorPosition cursor, SInputState inputState)
{
this.Cursor = cursor;
this.ButtonsByState = new Lazy>(() => this.GetButtonsByState(inputState));
}
/*********
** Private methods
*********/
/// Get the buttons that were pressed, held, or released since the previous tick.
/// The game's current input state.
private Dictionary GetButtonsByState(SInputState inputState)
{
Dictionary lookup = inputState.ButtonStates
.GroupBy(p => p.Value)
.ToDictionary(p => p.Key, p => p.Select(p => p.Key).ToArray());
foreach (var state in new[] { SButtonState.Pressed, SButtonState.Held, SButtonState.Released })
{
if (!lookup.ContainsKey(state))
lookup[state] = new SButton[0];
}
return lookup;
}
}
}