summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.ControlGallery.MacOS/AppDelegate.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.ControlGallery.MacOS/AppDelegate.cs')
-rw-r--r--Xamarin.Forms.ControlGallery.MacOS/AppDelegate.cs246
1 files changed, 246 insertions, 0 deletions
diff --git a/Xamarin.Forms.ControlGallery.MacOS/AppDelegate.cs b/Xamarin.Forms.ControlGallery.MacOS/AppDelegate.cs
new file mode 100644
index 0000000..ac4940d
--- /dev/null
+++ b/Xamarin.Forms.ControlGallery.MacOS/AppDelegate.cs
@@ -0,0 +1,246 @@
+´╗┐using System;
+using System.Globalization;
+using AppKit;
+using CoreGraphics;
+using Foundation;
+using Xamarin.Forms.Controls;
+using Xamarin.Forms.Controls.Issues;
+using Xamarin.Forms.Platform.MacOS;
+
+namespace Xamarin.Forms.ControlGallery.MacOS
+{
+ [Register("AppDelegate")]
+ public class AppDelegate : FormsApplicationDelegate
+ {
+
+ NSWindow _window;
+ public AppDelegate()
+ {
+ ObjCRuntime.Runtime.MarshalManagedException += (sender, args) =>
+ {
+ Console.WriteLine(args.Exception.ToString());
+ };
+
+ var style = NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Titled;
+
+ var rect = new CoreGraphics.CGRect(200, 1000, 1024, 768);
+ //var rect = NSWindow.FrameRectFor(NSScreen.MainScreen.Frame, style);
+ _window = new NSWindow(rect, style, NSBackingStore.Buffered, false);
+ _window.Title = "Twitter XF Mac";
+ _window.TitleVisibility = NSWindowTitleVisibility.Hidden;
+ }
+
+ public override NSWindow MainWindow
+ {
+ get { return _window; }
+ }
+
+ public override void DidFinishLaunching(NSNotification notification)
+ {
+ Forms.Init();
+ FormsMaps.Init();
+
+ var app = new App();
+ // When the native control gallery loads up, it'll let us know so we can add the nested native controls
+ MessagingCenter.Subscribe<NestedNativeControlGalleryPage>(this, NestedNativeControlGalleryPage.ReadyForNativeControlsMessage, AddNativeControls);
+ MessagingCenter.Subscribe<Bugzilla40911>(this, Bugzilla40911.ReadyToSetUp40911Test, SetUp40911Test);
+
+ // When the native binding gallery loads up, it'll let us know so we can set up the native bindings
+ MessagingCenter.Subscribe<NativeBindingGalleryPage>(this, NativeBindingGalleryPage.ReadyForNativeBindingsMessage, AddNativeBindings);
+
+ LoadApplication(app);
+ base.DidFinishLaunching(notification);
+ }
+
+ void AddNativeControls(NestedNativeControlGalleryPage page)
+ {
+ if (page.NativeControlsAdded)
+ {
+ return;
+ }
+
+ StackLayout sl = page.Layout;
+
+ // Create and add a native UILabel
+ var originalText = "I am a native UILabel";
+ var longerText =
+ "I am a native UILabel with considerably more text. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
+
+ var uilabel = new NSTextField
+ {
+ StringValue = originalText,
+ MaximumNumberOfLines = 0,
+ LineBreakMode = NSLineBreakMode.ByWordWrapping,
+ Font = NSFont.FromFontName("Helvetica", 24f)
+ };
+
+ sl?.Children.Add(uilabel);
+
+ // Create and add a native Button
+ var uibutton = NSButtonExtensions.CreateButton("Toggle Text Amount", () =>
+ {
+ uilabel.StringValue = uilabel.StringValue == originalText ? longerText : originalText;
+ uilabel.SizeToFit();
+ });
+ uibutton.Font = NSFont.FromFontName("Helvetica", 14f);
+
+
+ sl?.Children.Add(uibutton.ToView());
+
+ // Create some control which we know don't behave correctly with regard to measurement
+ var difficultControl0 = new BrokenNativeControl
+ {
+ Font = NSFont.FromFontName("Helvetica", 14f),
+ MaximumNumberOfLines = 0,
+ LineBreakMode = NSLineBreakMode.ByWordWrapping,
+ StringValue = "Doesn't play nice with sizing. That's why there's a big gap around it."
+ };
+
+ var difficultControl1 = new BrokenNativeControl
+ {
+ Font = NSFont.FromFontName("Helvetica", 14f),
+ MaximumNumberOfLines = 0,
+ LineBreakMode = NSLineBreakMode.ByWordWrapping,
+ StringValue = "Custom size fix specified. No gaps."
+ };
+
+ var explanation0 = new NSTextField
+ {
+ StringValue = "The next control is a customized label with a bad SizeThatFits implementation.",
+ MaximumNumberOfLines = 0,
+ LineBreakMode = NSLineBreakMode.ByWordWrapping,
+ Font = NSFont.FromFontName("Helvetica", 14f),
+ };
+
+ var explanation1 = new NSTextField
+ {
+ StringValue = "The next control is the same broken class as above, but we pass in an override to the GetDesiredSize method.",
+ MaximumNumberOfLines = 0,
+ LineBreakMode = NSLineBreakMode.ByWordWrapping,
+ Font = NSFont.FromFontName("Helvetica", 14f),
+ };
+
+ // Add a misbehaving control
+ sl?.Children.Add(explanation0);
+ sl?.Children.Add(difficultControl0);
+
+ // Add the misbehaving control with a custom delegate for FixSize
+ sl?.Children.Add(explanation1);
+ sl?.Children.Add(difficultControl1, FixSize);
+
+ page.NativeControlsAdded = true;
+ }
+
+ SizeRequest? FixSize(NativeViewWrapperRenderer renderer, double width, double height)
+ {
+ var uiView = renderer.Control;
+ var view = renderer.Element;
+
+ if (uiView == null || view == null)
+ {
+ return null;
+ }
+
+ var constraint = new CGSize(width, height);
+
+ // Let the BrokenNativeControl determine its size (which we know will be wrong)
+ var badRect = uiView.FittingSize;
+
+ // And we'll use the width (which is fine) and substitute our own height
+ return new SizeRequest(new Size(badRect.Width, 20));
+ }
+
+ void AddNativeBindings(NativeBindingGalleryPage page)
+ {
+ if (page.NativeControlsAdded)
+ return;
+
+ StackLayout sl = page.Layout;
+
+ int width = 200;
+ int heightCustomLabelView = 100;
+
+ var uilabel = new NSTextField(new CGRect(0, 0, width, heightCustomLabelView))
+ {
+ BackgroundColor = NSColor.Clear,
+ Editable = false,
+ Bezeled = false,
+ DrawsBackground = false,
+ MaximumNumberOfLines = 0,
+ LineBreakMode = NSLineBreakMode.ByWordWrapping,
+ Font = NSFont.FromFontName("Helvetica", 24f),
+ StringValue = "DefaultText"
+ };
+
+ var uibuttonColor = NSButtonExtensions.CreateButton("Toggle Text Color Binding", () => uilabel.TextColor = NSColor.Blue);
+ uibuttonColor.Font = NSFont.FromFontName("Helvetica", 14f);
+
+ uilabel.SetBinding("StringValue", new Binding("NativeLabel"));
+ uilabel.SetBinding(nameof(uilabel.TextColor), new Binding("NativeLabelColor", converter: new ColorConverter()));
+
+ sl?.Children.Add(uilabel);
+ sl?.Children.Add(uibuttonColor.ToView());
+ //var colorPicker = new NSColorWell();
+ //colorPicker.SetBinding("SelectedColor", new Binding("NativeLabelColor", BindingMode.TwoWay, new ColorConverter()), "ColorPicked");
+ //sl?.Children.Add(colorPicker);
+ page.NativeControlsAdded = true;
+ }
+
+ #region Stuff for repro of Bugzilla case 40911
+
+ void SetUp40911Test(Bugzilla40911 page)
+ {
+ var button = new Button { Text = "Start" };
+
+ button.Clicked += (s, e) =>
+ {
+ StartPressed40911();
+ };
+
+ page.Layout.Children.Add(button);
+ }
+
+ public void StartPressed40911()
+ {
+ var loginViewController = new NSViewController { View = { } };
+ var button = NSButtonExtensions.CreateButton("Login", () =>
+ {
+ Xamarin.Forms.Application.Current.MainPage = new ContentPage { Content = new Label { Text = "40911 Success" } };
+ //loginViewController.DismissViewController()true, null);
+
+ });
+
+ button.Frame = new CGRect(20, 100, 200, 44);
+ loginViewController.View.AddSubview(button);
+
+ var window = NSApplication.SharedApplication.KeyWindow;
+ var vc = window.ContentViewController;
+ while (vc.PresentedViewControllers.Length > 0)
+ {
+ vc = vc.PresentedViewControllers[0];
+ }
+
+ //vc.PresentViewController(loginViewController, new NSViewControllerPresentationAnimator();
+ }
+
+ #endregion
+
+ public class ColorConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is Color)
+ return ((Color)value).ToNSColor();
+ return value;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is NSColor)
+ return ((NSColor)value).ToColor();
+ return value;
+ }
+ }
+ }
+}
+