diff --git a/src/Avalonia.Controls/Platform/IWindowImpl.cs b/src/Avalonia.Controls/Platform/IWindowImpl.cs index 609e9834cb..08899d5c14 100644 --- a/src/Avalonia.Controls/Platform/IWindowImpl.cs +++ b/src/Avalonia.Controls/Platform/IWindowImpl.cs @@ -28,6 +28,7 @@ namespace Avalonia.Platform /// /// An that should be used to close the window. /// + [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")] IDisposable ShowDialog(); /// diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 40c52a748d..0a1fb55ced 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/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 /// public class Window : TopLevel, IStyleable, IFocusScope, ILayoutRoot, INameScope { - private static IList s_windows = new List(); + private static IList s_windows = new List(); /// /// Retrieves an enumeration of all Windows in the currently running application. @@ -89,7 +91,7 @@ namespace Avalonia.Controls TitleProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl.SetTitle((string)e.NewValue)); HasSystemDecorationsProperty.Changed.AddClassHandler( (s, e) => s.PlatformImpl.SetSystemDecorations((bool) e.NewValue)); - + IconProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl.SetIcon(((WindowIcon)e.NewValue).PlatformImpl)); } @@ -180,7 +182,7 @@ namespace Avalonia.Controls Size ILayoutRoot.MaxClientSize => _maxPlatformClientSize; /// - Type IStyleable.StyleKey => typeof(Window); + Type IStyleable.StyleKey => typeof(Window); /// /// Closes the window. @@ -238,7 +240,7 @@ namespace Avalonia.Controls PlatformImpl.Show(); } } - + /// /// Shows the window as a dialog. /// @@ -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(); - + 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(); + }); + } /// 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(); } - } + } } } diff --git a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs index a5a34cd47b..5ef1788073 100644 --- a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs +++ b/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) diff --git a/src/Gtk/Avalonia.Gtk/WindowImpl.cs b/src/Gtk/Avalonia.Gtk/WindowImpl.cs index eca7c24136..c82ded1263 100644 --- a/src/Gtk/Avalonia.Gtk/WindowImpl.cs +++ b/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; diff --git a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs b/src/Gtk/Avalonia.Gtk/WindowImplBase.cs index db4b5e9dde..97641ed22c 100644 --- a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs +++ b/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); diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 9680f31973..c3cbb0e449 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/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();