From 7d84e81ebdc0bf89b5aa89cef2375c4acae7b37e Mon Sep 17 00:00:00 2001 From: jp Date: Tue, 15 Mar 2016 14:10:54 +0100 Subject: [PATCH] keypress event --- Crow.csproj | 1 + OTKCrow/OpenTKGameWindow.cs | 14 ++++++ src/GraphicObjects/GraphicObject.cs | 4 ++ src/GraphicObjects/TextBox.cs | 73 +++++++---------------------- src/Input/KeyPressEventArgs.cs | 58 +++++++++++++++++++++++ src/Interface.cs | 8 ++++ 6 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 src/Input/KeyPressEventArgs.cs diff --git a/Crow.csproj b/Crow.csproj index baa5b7a9..740f8558 100644 --- a/Crow.csproj +++ b/Crow.csproj @@ -147,6 +147,7 @@ + diff --git a/OTKCrow/OpenTKGameWindow.cs b/OTKCrow/OpenTKGameWindow.cs index 94a52a0c..b11c2ce0 100644 --- a/OTKCrow/OpenTKGameWindow.cs +++ b/OTKCrow/OpenTKGameWindow.cs @@ -153,6 +153,8 @@ namespace Crow public event EventHandler MouseClick; public event EventHandler MouseMove; public event EventHandler KeyboardKeyDown; + public event EventHandler KeyboardKeyUp; + #endregion #region graphic context @@ -230,7 +232,9 @@ namespace Crow { base.OnLoad(e); + this.KeyPress += new EventHandler(OpenTKGameWindow_KeyPress); Keyboard.KeyDown += new EventHandler(Keyboard_KeyDown); + Keyboard.KeyUp += new EventHandler(Keyboard_KeyUp); Mouse.WheelChanged += new EventHandler(Mouse_WheelChanged); Mouse.ButtonDown += new EventHandler(Mouse_ButtonDown); Mouse.ButtonUp += new EventHandler(Mouse_ButtonUp); @@ -246,6 +250,7 @@ namespace Crow shader = new Crow.TexturedShader (); } + protected override void OnUpdateFrame(FrameEventArgs e) { base.OnUpdateFrame(e); @@ -322,6 +327,15 @@ namespace Crow if (!CrowInterface.ProcessKeyDown((int)otk_e.Key)) KeyboardKeyDown.Raise (this, otk_e); } + void Keyboard_KeyUp(object sender, OpenTK.Input.KeyboardKeyEventArgs otk_e) + { + if (!CrowInterface.ProcessKeyUp((int)otk_e.Key)) + KeyboardKeyUp.Raise (this, otk_e); + } + void OpenTKGameWindow_KeyPress (object sender, OpenTK.KeyPressEventArgs e) + { + CrowInterface.ProcessKeyPress (e.KeyChar); + } #endregion } } diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index b61ecb32..c526e909 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -156,6 +156,7 @@ namespace Crow public event EventHandler MouseLeave; public event EventHandler KeyDown; public event EventHandler KeyUp; + public event EventHandler KeyPress; public event EventHandler Focused; public event EventHandler Unfocused; public event EventHandler LayoutChanged; @@ -939,6 +940,9 @@ namespace Crow public virtual void onKeyDown(object sender, KeyboardKeyEventArgs e){ KeyDown.Raise (sender, e); } + public virtual void onKeyPress(object sender, KeyPressEventArgs e){ + KeyPress.Raise (sender, e); + } #endregion #region Mouse handling diff --git a/src/GraphicObjects/TextBox.cs b/src/GraphicObjects/TextBox.cs index 14cc1830..d3b8319c 100644 --- a/src/GraphicObjects/TextBox.cs +++ b/src/GraphicObjects/TextBox.cs @@ -72,7 +72,6 @@ namespace Crow public override void onKeyDown (object sender, KeyboardKeyEventArgs e) { base.onKeyDown (sender, e); - Key key = e.Key; switch (key) @@ -80,9 +79,9 @@ namespace Crow case Key.Back: if (!selectionIsEmpty) { -// Text = Text.Remove(selectionStart, selectionEnd - selectionStart); -// selReleasePos = -1; -// currentCol = selBeginPos; + // Text = Text.Remove(selectionStart, selectionEnd - selectionStart); + // selReleasePos = -1; + // currentCol = selBeginPos; } else this.DeleteChar(); @@ -141,62 +140,24 @@ namespace Crow break; case Key.RWin: break; - case Key.Tab: - this.Insert("\t"); - break; - case Key.KeypadDecimal: - this.Insert ("."); - break; - case Key.Space: - this.Insert(" "); - break; - case Key.KeypadDivide: - case Key.Slash: - this.Insert("/"); - break; - case Key.KeypadMultiply: - this.Insert("*"); - break; - case Key.KeypadMinus: - case Key.Minus: - this.Insert("-"); - break; - case Key.KeypadPlus: - case Key.Plus: - this.Insert("+"); - break; - case Key.ShiftLeft: - case Key.ShiftRight: - case Key.AltLeft: - case Key.AltRight: - break; - case Key.Semicolon: - this.Insert(";"); - break; default: - if (!selectionIsEmpty) - { -// Text = Text.Remove(selectionStart, selectionEnd - selectionStart); -// currentCol = selBeginPos; - } - - string k = "?"; - if ((char)key >= 67 && (char)key <= 76) - k = ((int)key - 67).ToString(); - else if ((char)key >= 109 && (char)key <= 118) - k = ((int)key - 109).ToString(); - else if (e.Shift) - k = key.ToString(); - else - k = key.ToString().ToLower(); + break; + } + if (Width < 0) + RegisterForLayouting (LayoutingType.Width); + if (Height < 0) + RegisterForLayouting (LayoutingType.Height); + RegisterForGraphicUpdate(); + } + public override void onKeyPress (object sender, KeyPressEventArgs e) + { + base.onKeyPress (sender, e); - this.Insert (k); + this.Insert (e.KeyChar.ToString()); - SelRelease = -1; - SelBegin = new Point(CurrentColumn, SelBegin.Y); + SelRelease = -1; + SelBegin = new Point(CurrentColumn, SelBegin.Y); - break; - } if (Width < 0) RegisterForLayouting (LayoutingType.Width); if (Height < 0) diff --git a/src/Input/KeyPressEventArgs.cs b/src/Input/KeyPressEventArgs.cs new file mode 100644 index 00000000..73990613 --- /dev/null +++ b/src/Input/KeyPressEventArgs.cs @@ -0,0 +1,58 @@ +// #region License +// // +// // The Open Toolkit Library License +// // +// // Copyright (c) 2006 - 2009 the Open Toolkit library. +// // +// // Permission is hereby granted, free of charge, to any person obtaining a copy +// // of this software and associated documentation files (the "Software"), to deal +// // in the Software without restriction, including without limitation the rights to +// // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// // the Software, and to permit persons to whom the Software is furnished to do +// // so, subject to the following conditions: +// // +// // The above copyright notice and this permission notice shall be included in all +// // copies or substantial portions of the Software. +// // +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// // OTHER DEALINGS IN THE SOFTWARE. +// // +// #endregion + +using System; + +namespace Crow +{ + /// + /// Defines the event arguments for KeyPress events. Instances of this class are cached: + /// KeyPressEventArgs should only be used inside the relevant event, unless manually cloned. + /// + public class KeyPressEventArgs : EventArgs + { + char key_char; + + /// + /// Constructs a new instance. + /// + /// The ASCII character that was typed. + public KeyPressEventArgs(char keyChar) + { + KeyChar = keyChar; + } + + /// + /// Gets a that defines the ASCII character that was typed. + /// + public char KeyChar + { + get { return key_char; } + internal set { key_char = value; } + } + } +} diff --git a/src/Interface.cs b/src/Interface.cs index 75310918..86f30088 100644 --- a/src/Interface.cs +++ b/src/Interface.cs @@ -663,6 +663,14 @@ namespace Crow return true; } + public bool ProcessKeyPress(char Key){ + if (_focusedWidget == null) + return false; + KeyPressEventArgs e = new KeyPressEventArgs(Key); + _focusedWidget.onKeyPress (this, e); + return true; + } + volatile bool mouseRepeatOn; volatile int mouseRepeatCount; Thread mouseRepeatThread; -- 2.47.3