Browse Source

Fixes #3682. CanFocus true for Label works only for keyboard and not mouse. (#3683)

* Fixes #3682. CanFocus true for Label works only for keyboard and not mouse.

* Simplifying code.

---------

Co-authored-by: Tig <[email protected]>
BDisp 11 months ago
parent
commit
c1d82947aa
2 changed files with 49 additions and 1 deletions
  1. 4 1
      Terminal.Gui/Views/Label.cs
  2. 45 0
      UnitTests/Views/LabelTests.cs

+ 4 - 1
Terminal.Gui/Views/Label.cs

@@ -28,7 +28,10 @@ public class Label : View
 
     private void Label_MouseClick (object sender, MouseEventEventArgs e)
     {
-        e.Handled = InvokeCommand (Command.HotKey) == true;
+        if (!CanFocus)
+        {
+            e.Handled = InvokeCommand (Command.HotKey) == true;
+        }
     }
 
     private void Label_TitleChanged (object sender, EventArgs<string> e)

+ 45 - 0
UnitTests/Views/LabelTests.cs

@@ -1315,4 +1315,49 @@ e
         Assert.Equal (expectedLabelBounds, label.Viewport);
         super.Dispose ();
     }
+
+    [Fact]
+    [AutoInitShutdown]
+    public void Label_CanFocus_True_Get_Focus_By_Keyboard_And_Mouse ()
+    {
+        Label label = new () { Text = "label" };
+        View view = new () { Y = 2, Width = 10, Height = 1, Text = "view", CanFocus = true };
+        Toplevel top = new ();
+        top.Add (label, view);
+        Application.Begin (top);
+
+        Assert.Equal (new (0, 0, 5, 1), label.Frame);
+        Assert.Equal (new (0, 2, 10, 1), view.Frame);
+        Assert.Equal (view, top.MostFocused);
+        Assert.False (label.CanFocus);
+        Assert.False (label.HasFocus);
+        Assert.True (view.CanFocus);
+        Assert.True (view.HasFocus);
+
+        Assert.True (Application.OnKeyDown (Key.Tab));
+        Assert.False (label.HasFocus);
+        Assert.True (view.HasFocus);
+
+        Application.OnMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked });
+        Assert.False (label.HasFocus);
+        Assert.True (view.HasFocus);
+
+        // Set label CanFocus to true
+        label.CanFocus = true;
+        Assert.True (Application.OnKeyDown (Key.Tab));
+        Assert.True (label.HasFocus);
+        Assert.False (view.HasFocus);
+
+        Assert.True (Application.OnKeyDown (Key.Tab));
+        Assert.False (label.HasFocus);
+        Assert.True (view.HasFocus);
+
+        Application.OnMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked });
+        Assert.True (label.HasFocus);
+        Assert.False (view.HasFocus);
+
+        Application.OnMouseEvent (new () { Position = new (0, 2), Flags = MouseFlags.Button1Clicked });
+        Assert.False (label.HasFocus);
+        Assert.True (view.HasFocus);
+    }
 }