From e5d01bfdb1a52e6a183c5249ffa22207e824800a Mon Sep 17 00:00:00 2001 From: Tig Date: Wed, 10 Apr 2024 00:30:11 -0400 Subject: [PATCH] Fixed Button with WantContinuousPressed = true not responding to single clicks --- Terminal.Gui/View/ViewMouse.cs | 4 +- Terminal.Gui/Views/Button.cs | 7 ++-- UnitTests/View/MouseTests.cs | 59 +++++++++++++++++++++++++++++ UnitTests/Views/ButtonTests.cs | 69 ++++++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+), 6 deletions(-) diff --git a/Terminal.Gui/View/ViewMouse.cs b/Terminal.Gui/View/ViewMouse.cs index 531818176..00684a3cf 100644 --- a/Terminal.Gui/View/ViewMouse.cs +++ b/Terminal.Gui/View/ViewMouse.cs @@ -495,9 +495,9 @@ public partial class View }; ColorScheme = cs; } - - return true; } + // Return false since we don't want to eat the event + return false; } diff --git a/Terminal.Gui/Views/Button.cs b/Terminal.Gui/Views/Button.cs index c5188e87e..53916fa17 100644 --- a/Terminal.Gui/Views/Button.cs +++ b/Terminal.Gui/Views/Button.cs @@ -33,9 +33,6 @@ public class Button : View private readonly Rune _rightDefault; private bool _isDefault; - /// - private bool _wantContinuousButtonPressed; - /// Initializes a new instance of using layout. /// The width of the is computed based on the text length. The height will always be 1. public Button () @@ -71,6 +68,8 @@ public class Button : View MouseClick += Button_MouseClick; } + private bool _wantContinuousButtonPressed; + /// public override bool WantContinuousButtonPressed { @@ -97,7 +96,7 @@ public class Button : View private void Button_MouseClick (object sender, MouseEventEventArgs e) { - e.Handled = InvokeCommand (Command.HotKey) == true; + e.Handled = InvokeCommand (Command.HotKey) == true; } private void Button_TitleChanged (object sender, StateEventArgs e) diff --git a/UnitTests/View/MouseTests.cs b/UnitTests/View/MouseTests.cs index 9fcfd3515..6c2345eb2 100644 --- a/UnitTests/View/MouseTests.cs +++ b/UnitTests/View/MouseTests.cs @@ -382,6 +382,65 @@ public class MouseTests (ITestOutputHelper output) view.Dispose (); } + + [Theory] + [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)] + [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released, MouseFlags.Button2Clicked)] + [InlineData (MouseFlags.Button3Pressed, MouseFlags.Button3Released, MouseFlags.Button3Clicked)] + [InlineData (MouseFlags.Button4Pressed, MouseFlags.Button4Released, MouseFlags.Button4Clicked)] + public void WantContinuousButtonPressed_True_Button_Clicked_Clicks (MouseFlags pressed, MouseFlags released, MouseFlags clicked) + { + var me = new MouseEvent (); + + var view = new View () + { + Width = 1, + Height = 1, + WantContinuousButtonPressed = true + }; + + var clickedCount = 0; + + view.MouseClick += (s, e) => clickedCount++; + + me.Flags = clicked; + view.NewMouseEvent (me); + Assert.Equal (1, clickedCount); + + view.Dispose (); + } + + [Theory] + [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)] + [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released, MouseFlags.Button2Clicked)] + [InlineData (MouseFlags.Button3Pressed, MouseFlags.Button3Released, MouseFlags.Button3Clicked)] + [InlineData (MouseFlags.Button4Pressed, MouseFlags.Button4Released, MouseFlags.Button4Clicked)] + public void WantContinuousButtonPressed_True_Button_Press_Release_Clicks (MouseFlags pressed, MouseFlags released, MouseFlags clicked) + { + var me = new MouseEvent (); + + var view = new View () + { + Width = 1, + Height = 1, + WantContinuousButtonPressed = true + }; + + var clickedCount = 0; + + view.MouseClick += (s, e) => clickedCount++; + + me.Flags = pressed; + view.NewMouseEvent (me); + Assert.Equal (1, clickedCount); + + me.Flags = released; + view.NewMouseEvent (me); + Assert.Equal (1, clickedCount); + + view.Dispose (); + } + [Theory] [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)] [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released, MouseFlags.Button2Clicked)] diff --git a/UnitTests/Views/ButtonTests.cs b/UnitTests/Views/ButtonTests.cs index 606fd1826..313df7ce6 100644 --- a/UnitTests/Views/ButtonTests.cs +++ b/UnitTests/Views/ButtonTests.cs @@ -757,4 +757,73 @@ public class ButtonTests (ITestOutputHelper output) Assert.Equal (new (0, 0, 30, 5), pos); top.Dispose (); } + + [Theory] + [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)] + [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released, MouseFlags.Button2Clicked)] + [InlineData (MouseFlags.Button3Pressed, MouseFlags.Button3Released, MouseFlags.Button3Clicked)] + [InlineData (MouseFlags.Button4Pressed, MouseFlags.Button4Released, MouseFlags.Button4Clicked)] + public void WantContinuousButtonPressed_True_ButtonClick_Accepts (MouseFlags pressed, MouseFlags released, MouseFlags clicked) + { + var me = new MouseEvent (); + + var button = new Button () + { + AutoSize = false, + Width = 1, + Height = 1, + WantContinuousButtonPressed = true + }; + + var acceptCount = 0; + + button.Accept += (s, e) => acceptCount++; + + me.Flags = pressed; + button.NewMouseEvent (me); + Assert.Equal (1, acceptCount); + + me.Flags = released; + button.NewMouseEvent (me); + Assert.Equal (1, acceptCount); + + me.Flags = clicked; + button.NewMouseEvent (me); + Assert.Equal (1, acceptCount); + + button.Dispose (); + } + + [Theory] + [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)] + [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released, MouseFlags.Button2Clicked)] + [InlineData (MouseFlags.Button3Pressed, MouseFlags.Button3Released, MouseFlags.Button3Clicked)] + [InlineData (MouseFlags.Button4Pressed, MouseFlags.Button4Released, MouseFlags.Button4Clicked)] + public void WantContinuousButtonPressed_True_ButtonPressRelease_Accepts (MouseFlags pressed, MouseFlags released, MouseFlags clicked) + { + var me = new MouseEvent (); + + var button = new Button () + { + AutoSize = false, + Width = 1, + Height = 1, + WantContinuousButtonPressed = true + }; + + var acceptCount = 0; + + button.Accept += (s, e) => acceptCount++; + + me.Flags = pressed; + button.NewMouseEvent (me); + Assert.Equal (1, acceptCount); + + me.Flags = released; + button.NewMouseEvent (me); + Assert.Equal (1, acceptCount); + + button.Dispose (); + } + } \ No newline at end of file