فهرست منبع

Fixes #3635. Focus gets confused with ContextMenu. (#3663)

* Fixes #3635. Focus gets confused with ContextMenu.

* Improving unit test.

* Updated migration doc to include additional findings. (#3660)

* Updated migration doc to include additional findings.

* Updated per PR recommendations.

---------

Co-authored-by: Tig <[email protected]>

---------

Co-authored-by: Tig <[email protected]>
Co-authored-by: Brian Gentry <[email protected]>
BDisp 11 ماه پیش
والد
کامیت
a0c03b11b6
3فایلهای تغییر یافته به همراه52 افزوده شده و 4 حذف شده
  1. 2 2
      Terminal.Gui/Application/Application.Mouse.cs
  2. 1 2
      Terminal.Gui/Views/Menu/MenuBar.cs
  3. 49 0
      UnitTests/Views/ContextMenuTests.cs

+ 2 - 2
Terminal.Gui/Application/Application.Mouse.cs

@@ -160,13 +160,13 @@ public static partial class Application // Mouse handling
                 Position = frameLoc,
                 Flags = mouseEvent.Flags,
                 ScreenPosition = mouseEvent.Position,
-                View = MouseGrabView
+                View = view ?? MouseGrabView
             };
 
             if ((MouseGrabView.Viewport with { Location = Point.Empty }).Contains (viewRelativeMouseEvent.Position) is false)
             {
                 // The mouse has moved outside the bounds of the view that grabbed the mouse
-                MouseEnteredView?.NewMouseLeaveEvent (mouseEvent);
+                MouseGrabView?.NewMouseLeaveEvent (mouseEvent);
             }
 
             //System.Diagnostics.Debug.WriteLine ($"{nme.Flags};{nme.X};{nme.Y};{mouseGrabView}");

+ 1 - 2
Terminal.Gui/Views/Menu/MenuBar.cs

@@ -1504,8 +1504,7 @@ public class MenuBar : View, IDesignable
                     return false;
                 }
             }
-            else if (!_isContextMenuLoading
-                     && !(me.View is MenuBar || me.View is Menu)
+            else if (!(me.View is MenuBar || me.View is Menu)
                      && me.Flags != MouseFlags.ReportMousePosition
                      && me.Flags != 0)
             {

+ 49 - 0
UnitTests/Views/ContextMenuTests.cs

@@ -1359,4 +1359,53 @@ public class ContextMenuTests (ITestOutputHelper output)
                                         )
         };
     }
+
+    [Fact]
+    [AutoInitShutdown]
+    public void Handling_TextField_With_Opened_ContextMenu_By_Mouse_HasFocus ()
+    {
+        var tf1 = new TextField { Width = 10, Text = "TextField 1" };
+        var tf2 = new TextField { Y = 2, Width = 10, Text = "TextField 2" };
+        var win = new Window ();
+        win.Add (tf1, tf2);
+        var rs = Application.Begin (win);
+
+        Assert.True (tf1.HasFocus);
+        Assert.False (tf2.HasFocus);
+        Assert.Equal (2, win.Subviews.Count);
+        Assert.Null (Application.MouseEnteredView);
+
+        // Right click on tf2 to open context menu
+        Application.OnMouseEvent (new () { Position = new (1, 3), Flags = MouseFlags.Button3Clicked });
+        Assert.False (tf1.HasFocus);
+        Assert.False (tf2.HasFocus);
+        Assert.Equal (3, win.Subviews.Count);
+        Assert.True (tf2.ContextMenu.MenuBar.IsMenuOpen);
+        Assert.True (win.Focused is Menu);
+        Assert.True (Application.MouseGrabView is MenuBar);
+        Assert.Equal (tf2, Application.MouseEnteredView);
+
+        // Click on tf1 to focus it, which cause context menu being closed
+        Application.OnMouseEvent (new () { Position = new (1, 1), Flags = MouseFlags.Button1Clicked });
+        Assert.True (tf1.HasFocus);
+        Assert.False (tf2.HasFocus);
+        Assert.Equal (2, win.Subviews.Count);
+        Assert.Null (tf2.ContextMenu.MenuBar);
+        Assert.Equal (win.Focused, tf1);
+        Assert.Null (Application.MouseGrabView);
+        Assert.Equal (tf1, Application.MouseEnteredView);
+
+        // Click on tf2 to focus it
+        Application.OnMouseEvent (new () { Position = new (1, 3), Flags = MouseFlags.Button1Clicked });
+        Assert.False (tf1.HasFocus);
+        Assert.True (tf2.HasFocus);
+        Assert.Equal (2, win.Subviews.Count);
+        Assert.Null (tf2.ContextMenu.MenuBar);
+        Assert.Equal (win.Focused, tf2);
+        Assert.Null (Application.MouseGrabView);
+        Assert.Equal (tf2, Application.MouseEnteredView);
+
+        Application.End (rs);
+        win.Dispose ();
+    }
 }