From 82cc1d7043a0bcdcd2fc41df66a4bf880a4568ae Mon Sep 17 00:00:00 2001 From: Eric Maupin Date: Tue, 12 Feb 2019 12:57:17 -0500 Subject: [mac] Make type requests reusable --- .../Controls/ControlExtensions.cs | 64 ++++++++++++++++++++++ .../Controls/ObjectEditorControl.cs | 49 +---------------- .../Xamarin.PropertyEditing.Mac.csproj | 1 + 3 files changed, 66 insertions(+), 48 deletions(-) create mode 100644 Xamarin.PropertyEditing.Mac/Controls/ControlExtensions.cs (limited to 'Xamarin.PropertyEditing.Mac') diff --git a/Xamarin.PropertyEditing.Mac/Controls/ControlExtensions.cs b/Xamarin.PropertyEditing.Mac/Controls/ControlExtensions.cs new file mode 100644 index 0000000..3e94781 --- /dev/null +++ b/Xamarin.PropertyEditing.Mac/Controls/ControlExtensions.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AppKit; +using Foundation; +using Xamarin.PropertyEditing.ViewModels; + +namespace Xamarin.PropertyEditing.Mac +{ + internal static class ControlExtensions + { + public static Task RequestAt (this TypeRequestedEventArgs self, IHostResourceProvider hostResources, NSView source, AsyncValue>> assignableTypes) + { + var tcs = new TaskCompletionSource (); + + var vm = new TypeSelectorViewModel (assignableTypes); + var selector = new TypeSelectorControl { + ViewModel = vm, + Appearance = source.EffectiveAppearance + }; + + vm.PropertyChanged += (vms, ve) => { + if (ve.PropertyName == nameof (TypeSelectorViewModel.SelectedType)) { + tcs.TrySetResult (vm.SelectedType); + } + }; + + var popover = new NSPopover { + Behavior = NSPopoverBehavior.Transient, + Delegate = new PopoverDelegate (tcs), + ContentViewController = new NSViewController { + View = selector, + PreferredContentSize = new CoreGraphics.CGSize (360, 335) + }, + }; + popover.SetAppearance (hostResources.GetVibrantAppearance (source.EffectiveAppearance)); + + tcs.Task.ContinueWith (t => { + popover.PerformClose (popover); + popover.Dispose (); + }, TaskScheduler.FromCurrentSynchronizationContext ()); + + popover.Show (source.Frame, source.Superview, NSRectEdge.MinYEdge); + return tcs.Task; + } + + private class PopoverDelegate + : NSPopoverDelegate + { + public PopoverDelegate (TaskCompletionSource tcs) + { + this.tcs = tcs; + } + + public override void WillClose (NSNotification notification) + { + this.tcs.TrySetCanceled (); + } + + private readonly TaskCompletionSource tcs; + } + } +} diff --git a/Xamarin.PropertyEditing.Mac/Controls/ObjectEditorControl.cs b/Xamarin.PropertyEditing.Mac/Controls/ObjectEditorControl.cs index ab9749b..9e71316 100644 --- a/Xamarin.PropertyEditing.Mac/Controls/ObjectEditorControl.cs +++ b/Xamarin.PropertyEditing.Mac/Controls/ObjectEditorControl.cs @@ -110,38 +110,7 @@ namespace Xamarin.PropertyEditing.Mac private void OnTypeRequested (object sender, TypeRequestedEventArgs e) { - var tcs = new TaskCompletionSource (); - e.SelectedType = tcs.Task; - - var vm = new TypeSelectorViewModel (ViewModel.AssignableTypes); - var selector = new TypeSelectorControl { - ViewModel = vm, - Appearance = EffectiveAppearance - }; - - vm.PropertyChanged += (vms, ve) => { - if (ve.PropertyName == nameof (TypeSelectorViewModel.SelectedType)) { - tcs.TrySetResult (vm.SelectedType); - } - }; - - var popover = new NSPopover { - Behavior = NSPopoverBehavior.Transient, - Delegate = new PopoverDelegate (tcs), - ContentViewController = new NSViewController { - View = selector, - PreferredContentSize = new CoreGraphics.CGSize (360, 335) - }, - }; - - popover.SetAppearance (HostResources.GetVibrantAppearance (EffectiveAppearance)); - - tcs.Task.ContinueWith (t => { - popover.PerformClose (popover); - popover.Dispose (); - }, TaskScheduler.FromCurrentSynchronizationContext()); - - popover.Show (this.createObject.Frame, this, NSRectEdge.MinYEdge); + e.SelectedType = e.RequestAt (HostResources, this.createObject, ViewModel.AssignableTypes); } private void UpdateTypeLabel () @@ -164,21 +133,5 @@ namespace Xamarin.PropertyEditing.Mac { ViewModel.CreateInstanceCommand.Execute (null); } - - private class PopoverDelegate - : NSPopoverDelegate - { - public PopoverDelegate (TaskCompletionSource tcs) - { - this.tcs = tcs; - } - - public override void WillClose (NSNotification notification) - { - this.tcs.TrySetCanceled (); - } - - private readonly TaskCompletionSource tcs; - } } } diff --git a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj index b3c9134..15e8123 100644 --- a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj +++ b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj @@ -149,6 +149,7 @@ + -- cgit v1.2.3