diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a83984..f416d60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ Additions - Added UiAnimation system - Added AddCustomStyle and ApplyCustomStyle to UiStyle to allow for easy custom styling of elements - Added UiControls.PressElement +- Added TextField.EnterReceiver Improvements - Increased Element area calculation recursion limit to 64 diff --git a/MLEM.Ui/Elements/TextField.cs b/MLEM.Ui/Elements/TextField.cs index 40fb0f7..e7cbb46 100644 --- a/MLEM.Ui/Elements/TextField.cs +++ b/MLEM.Ui/Elements/TextField.cs @@ -1,6 +1,7 @@ using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; using MLEM.Font; using MLEM.Graphics; using MLEM.Input; @@ -139,6 +140,12 @@ namespace MLEM.Ui.Elements { /// The description of the KeyboardInput field on mobile devices and consoles /// public string MobileDescription; + /// + /// An element that should be pressed (using ) if is pressed while this text field is active. + /// Note that, for text fields that are , this is ignored. + /// This also occurs once the text input window is successfully closed on a mobile device. + /// + public Element EnterReceiver; private readonly TextInput textInput; private StyleProp font; @@ -188,12 +195,14 @@ namespace MLEM.Ui.Elements { this.OnPressed += async e => { var title = this.MobileTitle ?? this.PlaceholderText; var result = await MlemPlatform.Current.OpenOnScreenKeyboard(title, this.MobileDescription, this.Text, false); - if (result != null) + if (result != null) { this.SetText(this.Multiline ? result : result.Replace('\n', ' '), true); + this.EnterReceiver?.Controls?.PressElement(this.EnterReceiver); + } }; this.OnTextInput += (element, key, character) => { - if (this.IsSelectedActive && !this.IsHidden) - this.textInput.OnTextInput(key, character); + if (this.IsSelectedActive && !this.IsHidden && !this.textInput.OnTextInput(key, character) && key == Keys.Enter && !this.Multiline) + this.EnterReceiver?.Controls?.PressElement(this.EnterReceiver); }; this.OnDeselected += e => this.CaretPos = 0; this.OnSelected += e => this.CaretPos = this.textInput.Length; @@ -209,8 +218,14 @@ namespace MLEM.Ui.Elements { /// public override void Update(GameTime time) { base.Update(time); - if (this.IsSelectedActive && !this.IsHidden) + if (this.IsSelectedActive && !this.IsHidden) { this.textInput.Update(time, this.Input); +#if FNA + // this occurs in OnTextInput outside FNA, where special keys are also counted as text input + if (this.EnterReceiver != null && !this.Multiline && this.Input.TryConsumePressed(Keys.Enter)) + this.EnterReceiver.Controls?.PressElement(this.EnterReceiver); +#endif + } } ///