From 60b52b009c2f74cea7d5ffb0ad62cbbc55c41729 Mon Sep 17 00:00:00 2001 From: Ian C Date: Sun, 27 May 2012 22:18:17 +0000 Subject: Updated keyboard to chain itself to InputManager. --- .../Keyboard/KeyboardDriver.cs | 151 +++++++++++---------- 1 file changed, 82 insertions(+), 69 deletions(-) (limited to 'src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs') diff --git a/src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs b/src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs index cfab190..4fa265a 100644 --- a/src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs +++ b/src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs @@ -50,17 +50,6 @@ namespace Noddybox.Emulation.Xna.Input.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 @@ -73,6 +62,7 @@ namespace Noddybox.Emulation.Xna.Input.Keyboard public int TouchId {get; set;} } + private InputManager manager; private Rectangle[] keymapPos; private KeyState[] keymapState; private int keymapSize; @@ -80,90 +70,109 @@ namespace Noddybox.Emulation.Xna.Input.Keyboard private Texture2D image; private Vector2 position; private Texture2D overlay; + private bool subscribed; #endregion #region Private members - #endregion - - #region Public members - /// - /// Updates the keyboard. Note that this will consume all the key press events. + /// Updates the keyboard. /// - public void Update() + public void TouchScreenHandler(object sender, InputManager.TouchLocationEventArgs e) { - foreach (TouchLocation t in TouchPanel.GetState()) - { - int x = (int)t.Position.X; - int y = (int)t.Position.Y; - int f = 0; - KeyState key = null; + int x = (int)e.Location.Position.X; + int y = (int)e.Location.Position.Y; + int f = 0; + KeyState key = null; - if (t.State == TouchLocationState.Pressed) + if (e.Location.State == TouchLocationState.Pressed) + { + for(f = 0; f < keymapSize && key == null; f++) { - for(f = 0; f < keymapSize && key == null; f++) + if (keymapPos[f].Contains(x, y)) { - if (keymapPos[f].Contains(x, y)) - { - key = keymapState[f]; - } + key = keymapState[f]; } + } - if (key != null) - { - key.TouchId = t.Id; + if (key != null) + { + key.TouchId = e.Location.Id; - if (key.IsSticky) - { - key.IsPressed = !key.IsPressed; - } - else - { - key.IsPressed = true; - } + if (key.IsSticky) + { + key.IsPressed = !key.IsPressed; + } + else + { + key.IsPressed = true; + } - if (KeyEvent != null) - { - KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); - } + if (KeyEvent != null) + { + KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); } } - else if (t.State == TouchLocationState.Released) + } + else if (e.Location.State == TouchLocationState.Released) + { + for(f = 0; f < keymapSize && key == null; f++) { - for(f = 0; f < keymapSize && key == null; f++) + if (keymapState[f].TouchId == e.Location.Id) { - if (keymapState[f].TouchId == t.Id) - { - key = keymapState[f]; - } + key = keymapState[f]; } + } - if (key != null) + if (key != null) + { + if (!key.IsSticky) { - if (!key.IsSticky) - { - key.IsPressed = false; + key.IsPressed = false; - if (KeyEvent != null) - { - KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); - } + 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}); - } - } + // Check if input was used. + // + if (key != null || keymapState.Where(r => r.TouchId == e.Location.Id).Count() > 0) + { + e.Handled = true; + } + } + + #endregion + + #region Public members + + /// + /// Stops consuming inputs. + /// + public void StopKeyboardUpdates() + { + if (subscribed) + { + manager.TouchEvent -= TouchScreenHandler; + subscribed = false; + } + } + + /// + /// Starts consuming inputs. + /// + public void StartKeyboardUpdates() + { + if (!subscribed) + { + manager.TouchEvent += TouchScreenHandler; + subscribed = true; } } @@ -189,7 +198,6 @@ namespace Noddybox.Emulation.Xna.Input.Keyboard #region Events public EventHandler KeyEvent; - public EventHandler TouchEvent; #endregion @@ -198,15 +206,18 @@ namespace Noddybox.Emulation.Xna.Input.Keyboard /// /// Constructor. /// + /// The input manager to attached to. /// The graphics device to associate textures with. /// The image for the keyboard. /// Where to draw and offset the keyboard to. /// The keyboard to drive this from. - public KeyboardDriver(GraphicsDevice graphics, Texture2D image, Vector2 position, KeyboardDefinition keyboard) + public KeyboardDriver(InputManager manager, GraphicsDevice graphics, Texture2D image, Vector2 position, KeyboardDefinition keyboard) { + this.manager = manager; this.keyboard = keyboard; this.image = image; this.position = position; + this.subscribed = false; keymapSize = keyboard.Definitions.Count; keymapPos = new Rectangle[keymapSize]; @@ -229,6 +240,8 @@ namespace Noddybox.Emulation.Xna.Input.Keyboard Color c = Color.White; overlay = new Texture2D(graphics, 2, 2, false, SurfaceFormat.Color); overlay.SetData(new Color[] {c, c, c, c}); + + StartKeyboardUpdates(); } #endregion -- cgit v1.2.3