Browse Source

Make Window.IsVisible track window visibility.

Steven Kirk 9 years ago
parent
commit
b5e93b67fe

+ 1 - 0
src/Avalonia.Controls/Primitives/Popup.cs

@@ -205,6 +205,7 @@ namespace Avalonia.Controls.Primitives
             }
 
             _popupRoot.Position = GetPosition();
+            IsVisible = true;
 
             if (_topLevel == null && PlacementTarget != null)
             {

+ 2 - 0
src/Avalonia.Controls/TopLevel.cs

@@ -59,6 +59,7 @@ namespace Avalonia.Controls
         static TopLevel()
         {
             AffectsMeasure(ClientSizeProperty);
+            IsVisibleProperty.OverrideDefaultValue<TopLevel>(false);
         }
 
         /// <summary>
@@ -383,6 +384,7 @@ namespace Avalonia.Controls
         /// </summary>
         private void HandleClosed()
         {
+            IsVisible = false;
             Closed?.Invoke(this, EventArgs.Empty);
             _applicationLifecycle.OnExit -= OnApplicationExiting;
         }

+ 6 - 0
src/Avalonia.Controls/Window.cs

@@ -188,6 +188,7 @@ namespace Avalonia.Controls
         {
             s_windows.Remove(this);
             PlatformImpl.Dispose();
+            IsVisible = false;
         }
 
         protected override void HandleApplicationExiting()
@@ -220,6 +221,8 @@ namespace Avalonia.Controls
             {
                 PlatformImpl.Hide();
             }
+
+            IsVisible = false;
         }
 
         /// <summary>
@@ -236,6 +239,8 @@ namespace Avalonia.Controls
             {
                 PlatformImpl.Show();
             }
+
+            IsVisible = true;
         }
 
         /// <summary>
@@ -278,6 +283,7 @@ namespace Avalonia.Controls
                         result.SetResult((TResult)_dialogResult);
                     });
 
+                IsVisible = true;
                 return result.Task;
             }
         }

+ 1 - 0
tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj

@@ -151,6 +151,7 @@
     <Compile Include="Utils\AncestorFinderTests.cs" />
     <Compile Include="Utils\HotKeyManagerTests.cs" />
     <Compile Include="VirtualizingStackPanelTests.cs" />
+    <Compile Include="WindowTests.cs" />
     <Compile Include="WrapPanelTests.cs" />
   </ItemGroup>
   <ItemGroup>

+ 97 - 19
tests/Avalonia.Controls.UnitTests/WindowTests.cs

@@ -4,33 +4,26 @@
 // </copyright>
 // -----------------------------------------------------------------------
 
+using Avalonia.Layout;
+using Avalonia.Platform;
+using Avalonia.UnitTests;
+using Moq;
+using Xunit;
+
 namespace Avalonia.Controls.UnitTests
 {
-    using System.Reactive;
-    using System.Reactive.Subjects;
-    using Moq;
-    using Avalonia.Controls.Presenters;
-    using Avalonia.Controls.Templates;
-    using Avalonia.Input;
-    using Avalonia.Input.Raw;
-    using Avalonia.Layout;
-    using Avalonia.Platform;
-    using Avalonia.Rendering;
-    using Avalonia.Styling;
-    using Ploeh.AutoFixture;
-    using Ploeh.AutoFixture.AutoMoq;
-    using Splat;
-    using Xunit;
-
     public class WindowTests
     {
         [Fact]
         public void Setting_Title_Should_Set_Impl_Title()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            var windowImpl = new Mock<IWindowImpl>();
+            var services = new TestServices(
+                windowingPlatform: new MockWindowingPlatform(() => windowImpl.Object));
+
+            using (UnitTestApplication.Start(services))
             {
-                var windowImpl = new Mock<IWindowImpl>();
-                Locator.CurrentMutable.RegisterConstant(windowImpl.Object, typeof(IWindowImpl));
+                AvaloniaLocator.CurrentMutable.BindToSelf(windowImpl.Object);
 
                 var target = new Window();
 
@@ -39,5 +32,90 @@ namespace Avalonia.Controls.UnitTests
                 windowImpl.Verify(x => x.SetTitle("Hello World"));
             }
         }
+
+        [Fact]
+        public void IsVisible_Should_Initially_Be_False()
+        {
+            using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
+            {
+                var window = new Window();
+
+                Assert.False(window.IsVisible);
+            }
+        }
+
+        [Fact]
+        public void IsVisible_Should_Be_True_After_Show()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var window = new Window();
+
+                window.Show();
+
+                Assert.True(window.IsVisible);
+            }
+        }
+
+        [Fact]
+        public void IsVisible_Should_Be_True_After_ShowDialog()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var window = new Window();
+
+                var task = window.ShowDialog();
+
+                Assert.True(window.IsVisible);
+            }
+        }
+
+        [Fact]
+        public void IsVisible_Should_Be_False_Atfer_Hide()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var window = new Window();
+
+                window.Show();
+                window.Hide();
+
+                Assert.False(window.IsVisible);
+            }
+        }
+
+        [Fact]
+        public void IsVisible_Should_Be_False_Atfer_Close()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var window = new Window();
+
+                window.Show();
+                window.Close();
+
+                Assert.False(window.IsVisible);
+            }
+        }
+
+        [Fact]
+        public void IsVisible_Should_Be_False_Atfer_Impl_Signals_Close()
+        {
+            var windowImpl = new Mock<IWindowImpl>();
+            windowImpl.SetupProperty(x => x.Closed);
+
+            var services = TestServices.StyledWindow.With(
+                windowingPlatform: new MockWindowingPlatform(() => windowImpl.Object));
+
+            using (UnitTestApplication.Start(services))
+            {
+                var window = new Window();
+
+                window.Show();
+                windowImpl.Object.Closed();
+
+                Assert.False(window.IsVisible);
+            }
+        }
     }
 }

+ 2 - 0
tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs

@@ -56,6 +56,7 @@ namespace Avalonia.Layout.UnitTests
                     }
                 };
 
+                window.Show();
                 LayoutManager.Instance.ExecuteInitialLayoutPass(window);
 
                 Assert.Equal(new Size(400, 400), border.Bounds.Size);
@@ -97,6 +98,7 @@ namespace Avalonia.Layout.UnitTests
                     }
                 };
 
+                window.Show();
                 LayoutManager.Instance.ExecuteInitialLayoutPass(window);
 
                 Assert.Equal(new Size(800, 600), window.Bounds.Size);

+ 14 - 0
tests/Avalonia.LeakTests/ControlTests.cs

@@ -41,6 +41,8 @@ namespace Avalonia.LeakTests
                         Content = new Canvas()
                     };
 
+                    window.Show();
+
                     // Do a layout and make sure that Canvas gets added to visual tree.
                     LayoutManager.Instance.ExecuteInitialLayoutPass(window);
                     Assert.IsType<Canvas>(window.Presenter.Child);
@@ -75,6 +77,8 @@ namespace Avalonia.LeakTests
                         }
                     };
 
+                    window.Show();
+
                     // Do a layout and make sure that Canvas gets added to visual tree.
                     LayoutManager.Instance.ExecuteInitialLayoutPass(window);
                     Assert.IsType<Canvas>(window.Find<Canvas>("foo"));
@@ -110,6 +114,8 @@ namespace Avalonia.LeakTests
                         }
                     };
 
+                    window.Show();
+
                     // Do a layout and make sure that ScrollViewer gets added to visual tree and its 
                     // template applied.
                     LayoutManager.Instance.ExecuteInitialLayoutPass(window);
@@ -145,6 +151,8 @@ namespace Avalonia.LeakTests
                         Content = new TextBox()
                     };
 
+                    window.Show();
+
                     // Do a layout and make sure that TextBox gets added to visual tree and its 
                     // template applied.
                     LayoutManager.Instance.ExecuteInitialLayoutPass(window);
@@ -187,6 +195,8 @@ namespace Avalonia.LeakTests
                     var textBox = (TextBox)window.Content;
                     textBox.Bind(TextBox.TextProperty, binding);
 
+                    window.Show();
+
                     // Do a layout and make sure that TextBox gets added to visual tree and its 
                     // Text property set.
                     LayoutManager.Instance.ExecuteInitialLayoutPass(window);
@@ -223,6 +233,8 @@ namespace Avalonia.LeakTests
                     Content = textBox = new TextBox()
                 };
 
+                window.Show();
+
                 // Do a layout and make sure that TextBox gets added to visual tree and its 
                 // template applied.
                 LayoutManager.Instance.ExecuteInitialLayoutPass(window);
@@ -276,6 +288,8 @@ namespace Avalonia.LeakTests
                         }
                     };
 
+                    window.Show();
+
                     // Do a layout and make sure that TreeViewItems get realized.
                     LayoutManager.Instance.ExecuteInitialLayoutPass(window);
                     Assert.Equal(1, target.ItemContainerGenerator.Containers.Count());

+ 3 - 0
tests/Avalonia.UnitTests/TestServices.cs

@@ -42,6 +42,9 @@ namespace Avalonia.UnitTests
         public static readonly TestServices MockThreadingInterface = new TestServices(
             threadingInterface: Mock.Of<IPlatformThreadingInterface>(x => x.CurrentThreadIsLoopThread == true));
 
+        public static readonly TestServices MockWindowingPlatform = new TestServices(
+            windowingPlatform: new MockWindowingPlatform());
+
         public static readonly TestServices RealDeferredRenderer = new TestServices(
             renderer: (root, loop) => new DeferredRenderer(root, loop));