Skip to content
This repository was archived by the owner on Sep 25, 2024. It is now read-only.

Commit 82cc1d7

Browse files
author
Eric Maupin
committed
[mac] Make type requests reusable
1 parent 28eb6e1 commit 82cc1d7

File tree

3 files changed

+66
-48
lines changed

3 files changed

+66
-48
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using AppKit;
6+
using Foundation;
7+
using Xamarin.PropertyEditing.ViewModels;
8+
9+
namespace Xamarin.PropertyEditing.Mac
10+
{
11+
internal static class ControlExtensions
12+
{
13+
public static Task<ITypeInfo> RequestAt (this TypeRequestedEventArgs self, IHostResourceProvider hostResources, NSView source, AsyncValue<IReadOnlyDictionary<IAssemblyInfo, ILookup<string, ITypeInfo>>> assignableTypes)
14+
{
15+
var tcs = new TaskCompletionSource<ITypeInfo> ();
16+
17+
var vm = new TypeSelectorViewModel (assignableTypes);
18+
var selector = new TypeSelectorControl {
19+
ViewModel = vm,
20+
Appearance = source.EffectiveAppearance
21+
};
22+
23+
vm.PropertyChanged += (vms, ve) => {
24+
if (ve.PropertyName == nameof (TypeSelectorViewModel.SelectedType)) {
25+
tcs.TrySetResult (vm.SelectedType);
26+
}
27+
};
28+
29+
var popover = new NSPopover {
30+
Behavior = NSPopoverBehavior.Transient,
31+
Delegate = new PopoverDelegate<ITypeInfo> (tcs),
32+
ContentViewController = new NSViewController {
33+
View = selector,
34+
PreferredContentSize = new CoreGraphics.CGSize (360, 335)
35+
},
36+
};
37+
popover.SetAppearance (hostResources.GetVibrantAppearance (source.EffectiveAppearance));
38+
39+
tcs.Task.ContinueWith (t => {
40+
popover.PerformClose (popover);
41+
popover.Dispose ();
42+
}, TaskScheduler.FromCurrentSynchronizationContext ());
43+
44+
popover.Show (source.Frame, source.Superview, NSRectEdge.MinYEdge);
45+
return tcs.Task;
46+
}
47+
48+
private class PopoverDelegate<T>
49+
: NSPopoverDelegate
50+
{
51+
public PopoverDelegate (TaskCompletionSource<T> tcs)
52+
{
53+
this.tcs = tcs;
54+
}
55+
56+
public override void WillClose (NSNotification notification)
57+
{
58+
this.tcs.TrySetCanceled ();
59+
}
60+
61+
private readonly TaskCompletionSource<T> tcs;
62+
}
63+
}
64+
}

Xamarin.PropertyEditing.Mac/Controls/ObjectEditorControl.cs

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -110,38 +110,7 @@ private void OnCreateInstanceExecutableChanged (object sender, EventArgs e)
110110

111111
private void OnTypeRequested (object sender, TypeRequestedEventArgs e)
112112
{
113-
var tcs = new TaskCompletionSource<ITypeInfo> ();
114-
e.SelectedType = tcs.Task;
115-
116-
var vm = new TypeSelectorViewModel (ViewModel.AssignableTypes);
117-
var selector = new TypeSelectorControl {
118-
ViewModel = vm,
119-
Appearance = EffectiveAppearance
120-
};
121-
122-
vm.PropertyChanged += (vms, ve) => {
123-
if (ve.PropertyName == nameof (TypeSelectorViewModel.SelectedType)) {
124-
tcs.TrySetResult (vm.SelectedType);
125-
}
126-
};
127-
128-
var popover = new NSPopover {
129-
Behavior = NSPopoverBehavior.Transient,
130-
Delegate = new PopoverDelegate<ITypeInfo> (tcs),
131-
ContentViewController = new NSViewController {
132-
View = selector,
133-
PreferredContentSize = new CoreGraphics.CGSize (360, 335)
134-
},
135-
};
136-
137-
popover.SetAppearance (HostResources.GetVibrantAppearance (EffectiveAppearance));
138-
139-
tcs.Task.ContinueWith (t => {
140-
popover.PerformClose (popover);
141-
popover.Dispose ();
142-
}, TaskScheduler.FromCurrentSynchronizationContext());
143-
144-
popover.Show (this.createObject.Frame, this, NSRectEdge.MinYEdge);
113+
e.SelectedType = e.RequestAt (HostResources, this.createObject, ViewModel.AssignableTypes);
145114
}
146115

147116
private void UpdateTypeLabel ()
@@ -164,21 +133,5 @@ private void OnNewPressed (object sender, EventArgs e)
164133
{
165134
ViewModel.CreateInstanceCommand.Execute (null);
166135
}
167-
168-
private class PopoverDelegate<T>
169-
: NSPopoverDelegate
170-
{
171-
public PopoverDelegate (TaskCompletionSource<T> tcs)
172-
{
173-
this.tcs = tcs;
174-
}
175-
176-
public override void WillClose (NSNotification notification)
177-
{
178-
this.tcs.TrySetCanceled ();
179-
}
180-
181-
private readonly TaskCompletionSource<T> tcs;
182-
}
183136
}
184137
}

Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@
149149
<Compile Include="Controls\TypeSelectorControl.cs" />
150150
<Compile Include="Controls\TypeSelectorWindow.cs" />
151151
<Compile Include="Controls\Custom\PropertyTextField.cs" />
152+
<Compile Include="Controls\ControlExtensions.cs" />
152153
</ItemGroup>
153154
<ItemGroup>
154155
<Folder Include="Controls\" />

0 commit comments

Comments
 (0)