From a4cb1430b5286f2dd8a1fd1dc15d7c12fd0382fd Mon Sep 17 00:00:00 2001 From: Ian C Date: Wed, 2 May 2012 22:19:34 +0000 Subject: Improved event handling and added event to propagate touches the keyboard is not interested in. --- .../KeyboardDriver.cs | 76 ++++++++++++++++------ 1 file changed, 56 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs b/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs index b0671b8..1b6f61c 100644 --- a/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs +++ b/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs @@ -37,7 +37,7 @@ namespace Noddybox.Emulation.Xna.Keyboard /// /// Event data when a key is pressed or released. /// - public class KeyPress : EventArgs + public class KeyPressEventArgs : EventArgs { /// /// The key that was pressed. @@ -50,6 +50,17 @@ namespace Noddybox.Emulation.Xna.Keyboard public bool Pressed {get; set;} } + /// + /// Event data when the screen is touched away from a key. + /// + public class TouchLocationEventArgs : EventArgs + { + /// + /// The touch. + /// + public TouchLocation Location {get; set;} + } + #endregion #region Private data @@ -59,6 +70,7 @@ namespace Noddybox.Emulation.Xna.Keyboard public T Symbol {get;set;} public bool IsPressed {get; set;} public bool IsSticky {get; set;} + public int TouchId {get; set;} } private Rectangle[] keymapPos; @@ -73,14 +85,6 @@ namespace Noddybox.Emulation.Xna.Keyboard #region Private members - private void RaiseKeyChange(KeyState state) - { - if (KeyEvent != null) - { - KeyEvent(this, new KeyPress() {Key = state.Symbol, Pressed = state.IsPressed}); - } - } - #endregion #region Public members @@ -97,18 +101,21 @@ namespace Noddybox.Emulation.Xna.Keyboard int f = 0; KeyState key = null; - for(f = 0; f < keymapSize && key == null; f++) + + if (t.State == TouchLocationState.Pressed) { - if (keymapPos[f].Contains(x, y)) + for(f = 0; f < keymapSize && key == null; f++) { - key = keymapState[f]; + if (keymapPos[f].Contains(x, y)) + { + key = keymapState[f]; + } } - } - if (key != null) - { - if (t.State == TouchLocationState.Pressed) + if (key != null) { + key.TouchId = t.Id; + if (key.IsSticky) { key.IsPressed = !key.IsPressed; @@ -118,17 +125,45 @@ namespace Noddybox.Emulation.Xna.Keyboard key.IsPressed = true; } - RaiseKeyChange(key); + if (KeyEvent != null) + { + KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); + } + } + } + else if (t.State == TouchLocationState.Released) + { + for(f = 0; f < keymapSize && key == null; f++) + { + if (keymapState[f].TouchId == t.Id) + { + key = keymapState[f]; + } } - else if (t.State == TouchLocationState.Released) + + if (key != null) { if (!key.IsSticky) { key.IsPressed = false; - RaiseKeyChange(key); + + if (KeyEvent != null) + { + KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); + } } } } + + // If no key handled, pass on the event + // + if (key == null && keymapState.Where(r => r.TouchId == t.Id).Count() == 0) + { + if (TouchEvent != null) + { + TouchEvent(this, new TouchLocationEventArgs() {Location = t}); + } + } } } @@ -153,7 +188,8 @@ namespace Noddybox.Emulation.Xna.Keyboard #region Events - public EventHandler KeyEvent; + public EventHandler KeyEvent; + public EventHandler TouchEvent; #endregion -- cgit v1.2.3