diff --git a/OpenRA.FileFormats/Graphics/IInputHandler.cs b/OpenRA.FileFormats/Graphics/IInputHandler.cs index d8703b4d1f..37ef56259b 100755 --- a/OpenRA.FileFormats/Graphics/IInputHandler.cs +++ b/OpenRA.FileFormats/Graphics/IInputHandler.cs @@ -19,6 +19,7 @@ namespace OpenRA void ModifierKeys(Modifiers mods); void OnKeyInput(KeyInput input); void OnMouseInput(MouseInput input); + void OnTextInput(string text); } public enum MouseInputEvent { Down, Move, Up } diff --git a/OpenRA.Game/InputHandler.cs b/OpenRA.Game/InputHandler.cs index fc76273f2c..a16b9a1c5f 100755 --- a/OpenRA.Game/InputHandler.cs +++ b/OpenRA.Game/InputHandler.cs @@ -17,6 +17,7 @@ namespace OpenRA // ignore all input public void ModifierKeys(Modifiers mods) { } public void OnKeyInput(KeyInput input) { } + public void OnTextInput(string text) { } public void OnMouseInput(MouseInput input) { } } @@ -38,6 +39,11 @@ namespace OpenRA Sync.CheckSyncUnchanged(world, () => Ui.HandleKeyPress(input)); } + public void OnTextInput(string text) + { + Sync.CheckSyncUnchanged(world, () => Ui.HandleTextInput(text)); + } + public void OnMouseInput(MouseInput input) { Sync.CheckSyncUnchanged(world, () => Ui.HandleInput(input)); diff --git a/OpenRA.Game/Widgets/TextFieldWidget.cs b/OpenRA.Game/Widgets/TextFieldWidget.cs index b4e8bb5d5e..b9dc51cd05 100644 --- a/OpenRA.Game/Widgets/TextFieldWidget.cs +++ b/OpenRA.Game/Widgets/TextFieldWidget.cs @@ -154,27 +154,24 @@ namespace OpenRA.Widgets return true; } - TypeChar(e); - return true; - } - - public void TypeChar(KeyInput key) - { - if (key.Key == Keycode.BACKSPACE && CursorPosition > 0) + if (e.Key == Keycode.BACKSPACE && CursorPosition > 0) { CursorPosition--; Text = Text.Remove(CursorPosition, 1); } - else if (key.IsValidInput()) - { - if (MaxLength > 0 && Text.Length >= MaxLength) - return; + return true; + } - Text = Text.Insert(CursorPosition, key.UnicodeChar.ToString()); + public override bool HandleTextInput(string text) + { + if (MaxLength > 0 && Text.Length >= MaxLength) + return true; - CursorPosition++; - } + Text = Text.Insert(CursorPosition, text); + CursorPosition++; + + return true; } protected int blinkCycle = 10; diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index beb4756679..2d662087f0 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -104,9 +104,15 @@ namespace OpenRA.Widgets if (KeyboardFocusWidget != null) return KeyboardFocusWidget.HandleKeyPressOuter(e); - if (Root.HandleKeyPressOuter(e)) - return true; - return false; + return Root.HandleKeyPressOuter(e); + } + + public static bool HandleTextInput(string text) + { + if (KeyboardFocusWidget != null) + return KeyboardFocusWidget.HandleTextInputOuter(text); + + return Root.HandleTextInputOuter(text); } public static void ResetAll() @@ -334,12 +340,30 @@ namespace OpenRA.Widgets if (child.HandleKeyPressOuter(e)) return true; - // Do any widgety behavior (enter text etc) + // Do any widgety behavior var handled = HandleKeyPress(e); return handled; } + public virtual bool HandleTextInput(string text) { return false; } + + public virtual bool HandleTextInputOuter(string text) + { + if (!IsVisible()) + return false; + + // Can any of our children handle this? + foreach (var child in Children.OfType().Reverse()) + if (child.HandleTextInputOuter(text)) + return true; + + // Do any widgety behavior (enter text etc) + var handled = HandleTextInput(text); + + return handled; + } + public virtual void Draw() {} public virtual void DrawOuter() diff --git a/OpenRA.Renderer.SdlCommon/SdlInput.cs b/OpenRA.Renderer.SdlCommon/SdlInput.cs index 80badd2568..2e652ca31d 100644 --- a/OpenRA.Renderer.SdlCommon/SdlInput.cs +++ b/OpenRA.Renderer.SdlCommon/SdlInput.cs @@ -130,6 +130,9 @@ namespace OpenRA.Renderer.SdlCommon else inputHandler.OnKeyInput(keyEvent); + if (keyEvent.IsValidInput()) + inputHandler.OnTextInput(keyEvent.UnicodeChar.ToString()); + break; } }