Browse Source

Invoke Activate and Deactivate on Begin method and fix ContextMenu to use it.

BDisp 1 year ago
parent
commit
a551b977bb

+ 4 - 0
Terminal.Gui/Application.cs

@@ -491,7 +491,11 @@ public static partial class Application
         {
             if (Toplevel.Visible)
             {
+                Current?.OnDeactivate (Toplevel);
+                var previousCurrent = Current;
                 Current = Toplevel;
+                Current.OnActivate (previousCurrent);
+
                 SetCurrentOverlappedAsTop ();
             }
             else

+ 3 - 0
Terminal.Gui/Views/Menu/ContextMenu.cs

@@ -116,6 +116,7 @@ public sealed class ContextMenu : IDisposable
         if (_container is { })
         {
             _container.Closing -= Container_Closing;
+            _container.Deactivate -= Container_Deactivate;
         }
     }
 
@@ -142,6 +143,7 @@ public sealed class ContextMenu : IDisposable
 
         _container = Application.Current;
         _container.Closing += Container_Closing;
+        _container.Deactivate += Container_Deactivate;
         Rectangle frame = Application.Driver.Bounds;
         Point position = Position;
 
@@ -217,6 +219,7 @@ public sealed class ContextMenu : IDisposable
         _menuBar.OpenMenu ();
     }
 
+    private void Container_Deactivate (object sender, ToplevelEventArgs e) { Hide (); }
     private void Container_Closing (object sender, ToplevelClosingEventArgs obj) { Hide (); }
     private void MenuBar_MenuAllClosed (object sender, EventArgs e) { Dispose (); }
 }

+ 4 - 2
UnitTests/Views/ContextMenuTests.cs

@@ -938,7 +938,7 @@ public class ContextMenuTests
     public void RequestStop_While_ContextMenu_Is_Open_Does_Not_Throws ()
     {
         ContextMenu cm = Create_ContextMenu_With_Two_MenuItem (10, 5);
-        Toplevel top = Application.Top;
+        Toplevel top = new ();
         var isMenuAllClosed = false;
         MenuBarItem mi = null;
         int iterations = -1;
@@ -957,6 +957,7 @@ public class ContextMenuTests
                                                      {
                                                          var dialog1 = new Dialog ();
                                                          Application.Run (dialog1);
+                                                         dialog1.Dispose ();
                                                          Assert.False (ContextMenu.IsShow);
                                                          Assert.True (isMenuAllClosed);
                                                      };
@@ -994,12 +995,13 @@ public class ContextMenuTests
                        {
                            var dialog2 = new Dialog ();
                            Application.Run (dialog2);
+                           dialog2.Dispose ();
                            Assert.False (ContextMenu.IsShow);
                            Assert.True (isMenuAllClosed);
                            isTopClosed = true;
                        };
 
-        Application.Run ();
+        Application.Run (top);
 
         Assert.True (isTopClosed);
         Assert.False (ContextMenu.IsShow);