diff --git a/Terminal.Gui/View/View.cs b/Terminal.Gui/View/View.cs index 654a4d915..50fbfb507 100644 --- a/Terminal.Gui/View/View.cs +++ b/Terminal.Gui/View/View.cs @@ -261,7 +261,7 @@ public partial class View : Responder, ISupportInitializeNotification var args = new CancelEventArgs (); Accept?.Invoke (this, args); - return args.Cancel; + return Accept is null ? null : args.Cancel; } #region Visibility diff --git a/Terminal.Gui/Views/TextField.cs b/Terminal.Gui/Views/TextField.cs index 7b808d1ea..083e47c94 100644 --- a/Terminal.Gui/Views/TextField.cs +++ b/Terminal.Gui/Views/TextField.cs @@ -336,7 +336,7 @@ public class TextField : View // OnAccept returns true if the event is canceled. // By Default pressing ENTER should be ignored (Invoke(Command.Accept) should return false). - AddCommand (Command.Accept, () => OnAccept () != true); + AddCommand (Command.Accept, () => OnAccept () == false); // Default keybindings for this view // We follow this as closely as possible: https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts diff --git a/UnitTests/Views/TextFieldTests.cs b/UnitTests/Views/TextFieldTests.cs index cf453b4f7..41756ed69 100644 --- a/UnitTests/Views/TextFieldTests.cs +++ b/UnitTests/Views/TextFieldTests.cs @@ -789,6 +789,85 @@ public class TextFieldTests (ITestOutputHelper output) void Accept (object sender, CancelEventArgs e) { accepted = true; } } + [Theory] + [InlineData (false, 0)] + [InlineData (true, 1)] + public void Accept_Handler_Cancel_Prevents_Default_Button_Accept (bool cancelAccept, int expectedButtonAccepts) + { + var superView = new Window (); + var tf = new TextField (); + var button = new Button () + { + IsDefault = true, + }; + + superView.Add (tf, button); + + var buttonAccept = 0; + button.Accept += ButtonAccept; + + var textFieldAccept = 0; + tf.Accept += TextFieldAccept; + + tf.SetFocus (); + Assert.True (tf.HasFocus); + + superView.NewKeyDownEvent (Key.Enter); + Assert.Equal (1, textFieldAccept); + Assert.Equal (expectedButtonAccepts, buttonAccept); + + button.SetFocus (); + superView.NewKeyDownEvent (Key.Enter); + Assert.Equal (1, textFieldAccept); + Assert.Equal (expectedButtonAccepts + 1, buttonAccept); + + return; + + void TextFieldAccept (object sender, CancelEventArgs e) + { + textFieldAccept++; + e.Cancel = cancelAccept; + } + + void ButtonAccept (object sender, CancelEventArgs e) + { + buttonAccept++; + } + } + + [Fact] + public void Accept_No_Handler_Enables_Default_Button_Accept () + { + var superView = new Window (); + var tf = new TextField (); + var button = new Button () + { + IsDefault = true, + }; + + superView.Add (tf, button); + + var buttonAccept = 0; + button.Accept += ButtonAccept; + + tf.SetFocus (); + Assert.True (tf.HasFocus); + + superView.NewKeyDownEvent (Key.Enter); + Assert.Equal (1, buttonAccept); + + button.SetFocus (); + superView.NewKeyDownEvent (Key.Enter); + Assert.Equal (2, buttonAccept); + + return; + + void ButtonAccept (object sender, CancelEventArgs e) + { + buttonAccept++; + } + } + [Fact] public void Accept_Cancel_Event_HandlesCommand () { @@ -1823,8 +1902,8 @@ public class TextFieldTests (ITestOutputHelper output) public void Words_With_Accents_Incorrect_Order_Will_Result_With_Wrong_Accent_Place () { var tf = new TextField { Width = 30, Text = "Les Misérables" }; - tf.SetRelativeLayout(new Size(100,100)); - tf.Draw(); + tf.SetRelativeLayout (new Size (100, 100)); + tf.Draw (); TestHelpers.AssertDriverContentsWithFrameAre ( @"