diff options
author | Ian C <ianc@noddybox.co.uk> | 2012-05-02 22:19:34 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2012-05-02 22:19:34 +0000 |
commit | a4cb1430b5286f2dd8a1fd1dc15d7c12fd0382fd (patch) | |
tree | 7fd84da31dcacf82a22ca4514ac8e37b428f97aa /src | |
parent | 78adb7aa6ccd4bfe8924d08ac655b325f32d7562 (diff) |
Improved event handling and added event to propagate touches the keyboard is not interested in.
Diffstat (limited to 'src')
-rw-r--r-- | src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs | 76 |
1 files changed, 56 insertions, 20 deletions
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 /// <summary>
/// Event data when a key is pressed or released.
/// </summary>
- public class KeyPress : EventArgs
+ public class KeyPressEventArgs : EventArgs
{
/// <summary>
/// The key that was pressed.
@@ -50,6 +50,17 @@ namespace Noddybox.Emulation.Xna.Keyboard public bool Pressed {get; set;}
}
+ /// <summary>
+ /// Event data when the screen is touched away from a key.
+ /// </summary>
+ public class TouchLocationEventArgs : EventArgs
+ {
+ /// <summary>
+ /// The touch.
+ /// </summary>
+ 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<KeyPress> KeyEvent;
+ public EventHandler<KeyPressEventArgs> KeyEvent;
+ public EventHandler<TouchLocationEventArgs> TouchEvent;
#endregion
|