From 091180ceeba8c2300898b2fab95293ae5fff320e Mon Sep 17 00:00:00 2001 From: Eric Sink Date: Thu, 15 Mar 2018 15:37:09 -0500 Subject: [PATCH 1/4] progress on XF picker. --- Ooui.Forms/Exports.cs | 1 + Ooui.Forms/PickerRenderer.cs | 87 ++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 Ooui.Forms/PickerRenderer.cs diff --git a/Ooui.Forms/Exports.cs b/Ooui.Forms/Exports.cs index e9c192f..e6e445e 100644 --- a/Ooui.Forms/Exports.cs +++ b/Ooui.Forms/Exports.cs @@ -16,6 +16,7 @@ using Xamarin.Forms; [assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))] [assembly: ExportRenderer (typeof (LinkLabel), typeof (LinkLabelRenderer))] [assembly: ExportRenderer (typeof (LinkView), typeof (LinkViewRenderer))] +[assembly: ExportRenderer(typeof(Picker), typeof(PickerRenderer))] [assembly: ExportRenderer(typeof(ListView), typeof(ListViewRenderer))] [assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))] [assembly: ExportRenderer (typeof (SearchBar), typeof (SearchBarRenderer))] diff --git a/Ooui.Forms/PickerRenderer.cs b/Ooui.Forms/PickerRenderer.cs new file mode 100644 index 0000000..dd4e242 --- /dev/null +++ b/Ooui.Forms/PickerRenderer.cs @@ -0,0 +1,87 @@ +using Ooui.Forms.Extensions; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using Xamarin.Forms; +using Xamarin.Forms.Internals; + +namespace Ooui.Forms.Renderers +{ + public class PickerRenderer : ViewRenderer + { + private bool _disposed; + private Select _select; + + public PickerRenderer() + { + } + + protected override void OnElementChanged(ElementChangedEventArgs e) + { + if (e.NewElement != null) + { + if (Control == null) + { + _select = new Select(); + _select.Change += _select_Change; + + SetNativeControl(_select); + } + + UpdateItems(); + UpdateBackgroundColor(); + } + + base.OnElementChanged(e); + } + + private void _select_Change(object sender, TargetEventArgs e) + { + Element.SetValueFromRenderer(Picker.SelectedIndexProperty, Element.ItemsSource.IndexOf(_select.Value)); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == Picker.ItemsSourceProperty.PropertyName) + { + UpdateItems(); + } + + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing && !_disposed) + { + _disposed = true; + } + } + + private void UpdateBackgroundColor() + { + var backgroundColor = Element.BackgroundColor.ToOouiColor(); + + _select.Style.BackgroundColor = backgroundColor; + } + + private void UpdateItems() + { + var items = Element.ItemsSource; + + if (items != null) + { + foreach (var item in items) + { + var s = item.ToString(); + _select.AddOption(s, s); + } + } + } + + } + +} From e60756be83573673bfbbb09a3e7a05723cb99467 Mon Sep 17 00:00:00 2001 From: Eric Sink Date: Sun, 18 Mar 2018 21:35:41 -0500 Subject: [PATCH 2/4] unsubscribe the change even in picker renderer dispose --- Ooui.Forms/PickerRenderer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Ooui.Forms/PickerRenderer.cs b/Ooui.Forms/PickerRenderer.cs index dd4e242..9f14b06 100644 --- a/Ooui.Forms/PickerRenderer.cs +++ b/Ooui.Forms/PickerRenderer.cs @@ -57,6 +57,7 @@ namespace Ooui.Forms.Renderers if (disposing && !_disposed) { + _select.Change -= _select_Change; _disposed = true; } } From 219aad7f00f321c5df09634109e33b2f435ce106 Mon Sep 17 00:00:00 2001 From: Eric Sink Date: Sun, 18 Mar 2018 21:36:16 -0500 Subject: [PATCH 3/4] mv PickerRenderer.cs into Renderers folder --- Ooui.Forms/{ => Renderers}/PickerRenderer.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ooui.Forms/{ => Renderers}/PickerRenderer.cs (100%) diff --git a/Ooui.Forms/PickerRenderer.cs b/Ooui.Forms/Renderers/PickerRenderer.cs similarity index 100% rename from Ooui.Forms/PickerRenderer.cs rename to Ooui.Forms/Renderers/PickerRenderer.cs From 79740a94b8edfebe9f2956aa09413812178b2d9c Mon Sep 17 00:00:00 2001 From: Eric Sink Date: Mon, 19 Mar 2018 22:01:51 -0500 Subject: [PATCH 4/4] progress on a sample for the XF Picker --- Samples/PickerSample.cs | 75 +++++++++++++++++++++++++++++++++++++++++ Samples/Program.cs | 1 + 2 files changed, 76 insertions(+) create mode 100644 Samples/PickerSample.cs diff --git a/Samples/PickerSample.cs b/Samples/PickerSample.cs new file mode 100644 index 0000000..d804d68 --- /dev/null +++ b/Samples/PickerSample.cs @@ -0,0 +1,75 @@ +using Ooui; +using System; +using System.Collections.Generic; +using Xamarin.Forms; + +namespace Samples +{ + public class PickerSample : ISample + { + private Xamarin.Forms.Label _label; + private Xamarin.Forms.Picker _picker; + + public string Title => "Xamarin.Forms Picker Sample"; + + List myItems = new List + { + "red", + "green", + "yellow", + "blue", + "white", + "black", + "purple", + "orange", + }; + + public Ooui.Element CreateElement() + { + var panel = new StackLayout(); + + var titleLabel = new Xamarin.Forms.Label + { + Text = "Picker", + FontSize = 24, + FontAttributes = FontAttributes.Bold + }; + panel.Children.Add(titleLabel); + + _picker = new Picker + { + Title = "Hello", + //VerticalOptions = LayoutOptions.CenterAndExpand, + ItemsSource = myItems, + }; + + panel.Children.Add(_picker); + + _picker.SelectedIndexChanged += OnPickerValueChanged; + + _label = new Xamarin.Forms.Label + { + Text = "Picker value is", + HorizontalOptions = LayoutOptions.Center + }; + panel.Children.Add(_label); + + var page = new ContentPage + { + Content = panel + }; + + return page.GetOouiElement(); + } + + void OnPickerValueChanged(object sender, EventArgs e) + { + _label.Text = String.Format("Picker value is {0} ({1})", _picker.SelectedIndex, myItems[_picker.SelectedIndex]); + } + + public void Publish() + { + UI.Publish("/picker", CreateElement); + } + } +} diff --git a/Samples/Program.cs b/Samples/Program.cs index 4478211..70e87a0 100644 --- a/Samples/Program.cs +++ b/Samples/Program.cs @@ -42,6 +42,7 @@ namespace Samples new WeatherAppSample().Publish(); new XuzzleSample().Publish(); new WebViewSample().Publish(); + new PickerSample().Publish(); UI.Present ("/display-alert");