using System; using System.Collections.Generic; namespace Assistance { public class InputState { public long ticks; public KeyHistory keyHistory = new KeyHistory(); public readonly Dictionary> buttonHistories = new Dictionary>(); public void touch(long ticks) { if (this.ticks < ticks) this.ticks = ticks; else ++this.ticks; } public KeyState keyState { get { return keyHistory.current; } } public void keyEvent(bool press, Gdk.Key key, long ticks) { touch(ticks); keyHistory.change(press, key, this.ticks); } public void keyPress(Gdk.Key key, long ticks) { keyEvent(true, key, ticks); } public void keyRelease(Gdk.Key key, long ticks) { keyEvent(false, key, ticks); } public KeyState keyFind(Gdk.Key key) { return keyState.find(key); } public bool isKeyPressed(Gdk.Key key) { return keyFind(key) != null; } public double howLongKeyPressed(Gdk.Key key, long ticks, double timeOffset = 0.0) { return KeyState.Holder.howLongPressed(keyFind(key), ticks, timeOffset); } public double howLongKeyPressed(Gdk.Key key) { return howLongKeyPressed(key, ticks); } public KeyHistory buttonHistory(Gdk.Device device) { KeyHistory history; if (!buttonHistories.TryGetValue(device, out history)) history = new KeyHistory(); buttonHistories[device] = history; return history; } public KeyState buttonState(Gdk.Device device) { return buttonHistory(device).current; } public void buttonEvent(bool press, Gdk.Device device, uint button, long ticks) { touch(ticks); buttonHistory(device).change(press, button, this.ticks); } public void buttonPress(Gdk.Device device, uint button, long ticks) { buttonEvent(true, device, button, ticks); } public void buttonRelease(Gdk.Device device, uint button, long ticks) { buttonEvent(false, device, button, ticks); } public void buttonEvent(bool press, uint button, long ticks) { buttonEvent(press, null, button, ticks); } public void buttonPress(uint button, long ticks) { buttonEvent(true, button, ticks); } public void buttonRelease(uint button, long ticks) { buttonEvent(false, button, ticks); } public KeyState buttonFind(Gdk.Device device, uint button) { return buttonState(device).find(button); } public bool isButtonPressed(Gdk.Device device, uint button) { return buttonFind(device, button) != null; } public double howLongButtonPressed(Gdk.Device device, uint button, long ticks, double timeOffset = 0.0) { return KeyState.Holder.howLongPressed(buttonFind(device, button), ticks, timeOffset); } public double howLongButtonPressed(Gdk.Device device, uint button) { return howLongButtonPressed(device, button, ticks); } public KeyState buttonFindDefault(uint button) { return buttonFind(null, button); } public bool isButtonPressedDefault(uint button) { return isButtonPressed(null, button); } public double howLongButtonPressedDefault(uint button, long ticks, double timeOffset = 0.0) { return howLongButtonPressed(null, button, ticks, timeOffset); } public double howLongButtonPressedDefault(uint button) { return howLongButtonPressedDefault(button, ticks); } public KeyState buttonFindAny(uint button, out Gdk.Device device) { device = null; KeyState state = null; foreach(KeyValuePair> pair in buttonHistories) { KeyState s = pair.Value == null ? null : pair.Value.current.find(button); if (s != null && (state == null || s.ticks < state.ticks)) { state = s; device = pair.Key; } } return state; } public KeyState buttonFindAny(uint button) { Gdk.Device device; return buttonFindAny(button, out device); } public bool isButtonPressedAny(uint button) { return buttonFindAny(button) != null; } public double howLongButtonPressedAny(uint button, long ticks, double timeOffset = 0.0) { return KeyState.Holder.howLongPressed(buttonFindAny(button), ticks, timeOffset); } public double howLongButtonPressedAny(uint button) { return howLongButtonPressedAny(button, ticks); } public KeyState.Holder keyStateHolder(long ticks, double timeOffset = 0.0) { return new KeyState.Holder(keyState, ticks, timeOffset); } public KeyState.Holder keyStateHolder() { return keyStateHolder(ticks); } public KeyHistory.Holder keyHistoryHolder(long ticks, double timeOffset = 0.0) { return new KeyHistory.Holder(keyHistory, ticks, timeOffset); } public KeyHistory.Holder keyHistoryHolder() { return keyHistoryHolder(ticks); } public KeyState.Holder buttonStateHolder(Gdk.Device device, long ticks, double timeOffset = 0.0) { return new KeyState.Holder(buttonState(device), ticks, timeOffset); } public KeyState.Holder buttonStateHolder(Gdk.Device device) { return buttonStateHolder(device, ticks); } public KeyHistory.Holder buttonHistoryHolder(Gdk.Device device, long ticks, double timeOffset = 0.0) { return new KeyHistory.Holder(buttonHistory(device), ticks, timeOffset); } public KeyHistory.Holder buttonHistoryHolder(Gdk.Device device) { return buttonHistoryHolder(device, ticks); } } }