diff options
Diffstat (limited to 'Xamarin.Forms.Platform.MacOS/ModalPageTracker.cs')
-rw-r--r-- | Xamarin.Forms.Platform.MacOS/ModalPageTracker.cs | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/Xamarin.Forms.Platform.MacOS/ModalPageTracker.cs b/Xamarin.Forms.Platform.MacOS/ModalPageTracker.cs deleted file mode 100644 index c492f4cd..00000000 --- a/Xamarin.Forms.Platform.MacOS/ModalPageTracker.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System; -using System.Threading.Tasks; -using System.Linq; -using AppKit; -using System.Collections.Generic; - -namespace Xamarin.Forms.Platform.MacOS -{ - internal class ModalPageTracker : IDisposable - { - NSViewController _renderer; - List<Page> _modals; - bool _disposed; - - public ModalPageTracker(NSViewController mainRenderer) - { - if (mainRenderer == null) - throw new ArgumentNullException(nameof(mainRenderer)); - _renderer = mainRenderer; - _renderer.View.WantsLayer = true; - _modals = new List<Page>(); - } - - public List<Page> ModalStack => _modals; - - public Task PushAsync(Page modal, bool animated) - { - _modals.Add(modal); - modal.DescendantRemoved += HandleChildRemoved; - Platform.NativeToolbarTracker.TryHide(modal as NavigationPage); - return PresentModalAsync(modal, animated); - } - - public Task<Page> PopAsync(bool animated) - { - var modal = _modals.LastOrDefault(); - if (modal == null) - throw new InvalidOperationException("No Modal pages found in the stack, make sure you pushed a modal page"); - _modals.Remove(modal); - modal.DescendantRemoved -= HandleChildRemoved; - return HideModalAsync(modal, animated); - } - - public void Dispose() - { - Dispose(true); - } - - protected virtual void Dispose(bool disposing) - { - if (!_disposed) - { - if (disposing) - { - foreach (var modal in _modals) - Platform.DisposeModelAndChildrenRenderers(modal); - _renderer = null; - } - _disposed = true; - } - } - - void HandleChildRemoved(object sender, ElementEventArgs e) - { - var view = e.Element; - Platform.DisposeModelAndChildrenRenderers(view); - } - - Task PresentModalAsync(Page modal, bool animated) - { - var modalRenderer = Platform.GetRenderer(modal); - if (modalRenderer == null) - { - modalRenderer = Platform.CreateRenderer(modal); - Platform.SetRenderer(modal, modalRenderer); - modalRenderer.SetElementSize(new Size(_renderer.View.Bounds.Width, _renderer.View.Bounds.Height)); - } - - var toViewController = modalRenderer as NSViewController; - - var i = Math.Max(0, _renderer.ChildViewControllers.Length - 1); - var fromViewController = _renderer.ChildViewControllers[i]; - - _renderer.AddChildViewController(toViewController); - - NSViewControllerTransitionOptions option = animated - ? NSViewControllerTransitionOptions.SlideUp - : NSViewControllerTransitionOptions.None; - - var task = _renderer.HandleAsyncAnimation(fromViewController, toViewController, option, - () => - { - //Hack: adjust if needed - toViewController.View.Frame = _renderer.View.Bounds; - fromViewController.View.Layer.Hidden = true; - }, true); - return task; - } - - Task<Page> HideModalAsync(Page modal, bool animated) - { - var controller = Platform.GetRenderer(modal) as NSViewController; - - var i = Math.Max(0, _renderer.ChildViewControllers.Length - 2); - var toViewController = _renderer.ChildViewControllers[i]; - - toViewController.View.Layer.Hidden = false; - - NSViewControllerTransitionOptions option = animated - ? NSViewControllerTransitionOptions.SlideDown - : NSViewControllerTransitionOptions.None; - - var task = _renderer.HandleAsyncAnimation(controller, toViewController, option, - () => Platform.DisposeModelAndChildrenRenderers(modal), modal); - return task; - } - } -}
\ No newline at end of file |