Browse Source

Moved ShowDialog implementation from platform-specific interface to portable Window class.

MrDaedra 8 years ago
parent
commit
c98b57a525

+ 1 - 0
src/Avalonia.Controls/Platform/IWindowImpl.cs

@@ -28,6 +28,7 @@ namespace Avalonia.Platform
         /// <returns>
         /// An <see cref="IDisposable"/> that should be used to close the window.
         /// </returns>
+        [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
         IDisposable ShowDialog();
 
         /// <summary>

+ 38 - 10
src/Avalonia.Controls/Window.cs

@@ -11,6 +11,8 @@ using Avalonia.Media;
 using Avalonia.Platform;
 using Avalonia.Styling;
 using System.Collections.Generic;
+using System.Linq;
+using System.Reactive.Disposables;
 
 namespace Avalonia.Controls
 {
@@ -45,7 +47,7 @@ namespace Avalonia.Controls
     /// </summary>
     public class Window : TopLevel, IStyleable, IFocusScope, ILayoutRoot, INameScope
     {
-        private static IList<Window> s_windows = new List<Window>();
+        private static IList<Window> s_windows = new List<Window>();        
 
         /// <summary>
         /// Retrieves an enumeration of all Windows in the currently running application.
@@ -89,7 +91,7 @@ namespace Avalonia.Controls
             TitleProperty.Changed.AddClassHandler<Window>((s, e) => s.PlatformImpl.SetTitle((string)e.NewValue));
             HasSystemDecorationsProperty.Changed.AddClassHandler<Window>(
                 (s, e) => s.PlatformImpl.SetSystemDecorations((bool) e.NewValue));
-
+            
             IconProperty.Changed.AddClassHandler<Window>((s, e) => s.PlatformImpl.SetIcon(((WindowIcon)e.NewValue).PlatformImpl));
         }
 
@@ -180,7 +182,7 @@ namespace Avalonia.Controls
         Size ILayoutRoot.MaxClientSize => _maxPlatformClientSize;
 
         /// <inheritdoc/>
-        Type IStyleable.StyleKey => typeof(Window);
+        Type IStyleable.StyleKey => typeof(Window);        
 
         /// <summary>
         /// Closes the window.
@@ -238,7 +240,7 @@ namespace Avalonia.Controls
                 PlatformImpl.Show();
             }
         }
-
+        
         /// <summary>
         /// Shows the window as a dialog.
         /// </summary>
@@ -263,14 +265,14 @@ namespace Avalonia.Controls
         {
             s_windows.Add(this);
 
-            EnsureInitialized();
-            LayoutManager.Instance.ExecuteInitialLayoutPass(this);
+            EnsureInitialized();            
+            LayoutManager.Instance.ExecuteInitialLayoutPass(this);                        
 
             using (BeginAutoSizing())
             {
-                var modal = PlatformImpl.ShowDialog();
+                var modal = GetModal();
                 var result = new TaskCompletionSource<TResult>();
-
+                
                 Observable.FromEventPattern(this, nameof(Closed))
                     .Take(1)
                     .Subscribe(_ =>
@@ -282,6 +284,32 @@ namespace Avalonia.Controls
                 return result.Task;
             }
         }
+        
+        private IDisposable GetModal()
+        {
+            var disabled = s_windows.Where(w => w.IsEnabled && w != this);
+            Window activated = null;
+            foreach (var window in disabled)
+            {
+                if (window.IsActive)
+                {
+                    activated = window;
+                }
+
+                window.IsEnabled = false;
+            }
+
+            PlatformImpl.Show();
+
+            return Disposable.Create(() =>
+            {
+                foreach (var window in disabled)
+                {
+                    window.IsEnabled = true;
+                }
+                activated?.Activate();
+            });
+        }
 
         /// <inheritdoc/>
         void INameScope.Register(string name, object element)
@@ -307,7 +335,7 @@ namespace Avalonia.Controls
             var sizeToContent = SizeToContent;
             var size = ClientSize;
             var desired = base.MeasureOverride(availableSize.Constrain(_maxPlatformClientSize));
-
+            
             switch (sizeToContent)
             {
                 case SizeToContent.Width:
@@ -348,7 +376,7 @@ namespace Avalonia.Controls
                 init.BeginInit();
                 init.EndInit();
             }
-        }
+        }        
     }
 }
 

+ 1 - 0
src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs

@@ -45,6 +45,7 @@ namespace Avalonia.Gtk
         {
         }
 
+        [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
         public override IDisposable ShowDialog() => Disposable.Create(() => { });
 
         public override void SetSystemDecorations(bool enabled)

+ 1 - 0
src/Gtk/Avalonia.Gtk/WindowImpl.cs

@@ -108,6 +108,7 @@ namespace Avalonia.Gtk
             }
         }
 
+        [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
         public override IDisposable ShowDialog()
         {
             Window.Modal = true;

+ 1 - 0
src/Gtk/Avalonia.Gtk/WindowImplBase.cs

@@ -167,6 +167,7 @@ namespace Avalonia.Gtk
         }
 
         public abstract void SetTitle(string title);
+        [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
         public abstract IDisposable ShowDialog();
         public abstract void SetSystemDecorations(bool enabled);
         public abstract void SetIcon(IWindowIconImpl icon);

+ 3 - 2
src/Windows/Avalonia.Win32/WindowImpl.cs

@@ -136,7 +136,7 @@ namespace Avalonia.Win32
         public WindowState WindowState
         {
             get
-            {
+            {                
                 var placement = default(UnmanagedMethods.WINDOWPLACEMENT);
                 UnmanagedMethods.GetWindowPlacement(_hwnd, ref placement);
 
@@ -175,7 +175,7 @@ namespace Avalonia.Win32
         }
 
         public IPopupImpl CreatePopup()
-        {
+        {            
             return new PopupImpl();
         }
 
@@ -332,6 +332,7 @@ namespace Avalonia.Win32
             }
         }
 
+        [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
         public virtual IDisposable ShowDialog()
         {
             var disabled = s_instances.Where(x => x != this && x.IsEnabled).ToList();