소스 검색

Fixed Button with WantContinuousPressed = true not responding to single clicks

Tig 1 년 전
부모
커밋
e5d01bfdb1
4개의 변경된 파일133개의 추가작업 그리고 6개의 파일을 삭제
  1. 2 2
      Terminal.Gui/View/ViewMouse.cs
  2. 3 4
      Terminal.Gui/Views/Button.cs
  3. 59 0
      UnitTests/View/MouseTests.cs
  4. 69 0
      UnitTests/Views/ButtonTests.cs

+ 2 - 2
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;
         }
 
 

+ 3 - 4
Terminal.Gui/Views/Button.cs

@@ -33,9 +33,6 @@ public class Button : View
     private readonly Rune _rightDefault;
     private bool _isDefault;
 
-    /// <inheritdoc />
-    private bool _wantContinuousButtonPressed;
-
     /// <summary>Initializes a new instance of <see cref="Button"/> using <see cref="LayoutStyle.Computed"/> layout.</summary>
     /// <remarks>The width of the <see cref="Button"/> is computed based on the text length. The height will always be 1.</remarks>
     public Button ()
@@ -71,6 +68,8 @@ public class Button : View
         MouseClick += Button_MouseClick;
     }
 
+    private bool _wantContinuousButtonPressed;
+
     /// <inheritdoc />
     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<string> e)

+ 59 - 0
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)]

+ 69 - 0
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 ();
+    }
+
 }