Explorar o código

Fix v2 not raising closing events (#3961)

Thomas Nind hai 4 meses
pai
achega
7162ed850c

+ 20 - 0
Terminal.Gui/ConsoleDrivers/V2/ApplicationV2.cs

@@ -194,6 +194,23 @@ public class ApplicationV2 : ApplicationImpl
     {
         Logging.Logger.LogInformation ($"RequestStop '{top}'");
 
+        top ??= Application.Top;
+
+        if (top == null)
+        {
+            return;
+        }
+
+        var ev = new ToplevelClosingEventArgs (top);
+        top.OnClosing (ev);
+
+        if (ev.Cancel)
+        {
+            return;
+        }
+
+        top.Running = false;
+
         // TODO: This definition of stop seems sketchy
         Application.TopLevels.TryPop (out _);
 
@@ -205,6 +222,9 @@ public class ApplicationV2 : ApplicationImpl
         {
             Application.Top = null;
         }
+
+        // Notify that it is closed
+        top.OnClosed (top);
     }
 
     /// <inheritdoc/>

+ 47 - 0
Tests/UnitTests/ConsoleDrivers/V2/ApplicationV2Tests.cs

@@ -221,6 +221,53 @@ public class ApplicationV2Tests
 
         ApplicationImpl.ChangeInstance (orig);
     }
+
+    [Fact]
+    public void Test_V2_ClosingRaised ()
+    {
+        var orig = ApplicationImpl.Instance;
+
+        var v2 = NewApplicationV2 ();
+        ApplicationImpl.ChangeInstance (v2);
+
+        v2.Init ();
+
+        int closing=0;
+        int closed = 0;
+        var t=new Toplevel ();
+        t.Closing
+            += (_, a) =>
+               {
+                   // Cancel the first time
+                   if (closing==0)
+                   {
+                       a.Cancel = true;
+                   }
+                   closing++;
+                   Assert.Same(t,a.RequestingTop);
+               };
+
+        t.Closed
+            += (_, a) =>
+               {
+                   closed++;
+                   Assert.Same (t, a.Toplevel);
+               };
+
+        v2.AddIdle (IdleExit);
+
+        // Blocks until the timeout call is hit
+
+        v2.Run (t);
+
+        Assert.Null (Application.Top);
+        v2.Shutdown ();
+
+        ApplicationImpl.ChangeInstance (orig);
+
+        Assert.Equal (2,closing);
+        Assert.Equal (1, closed);
+    }
     private bool IdleExit ()
     {
         if (Application.Top != null)