From 6dc869b9e5b35c1ac129e4543c7fc6ee7395143c Mon Sep 17 00:00:00 2001 From: "Frank A. Krueger" Date: Sun, 26 Nov 2017 10:32:55 -0800 Subject: [PATCH] Add DatePickerRenderer --- Ooui.Forms/Exports.cs | 1 + Ooui.Forms/Renderers/DatePickerRenderer.cs | 111 +++++++++++++++++++++ Samples/DisplayAlertPage.xaml | 5 +- Samples/DisplayAlertPage.xaml.cs | 2 +- 4 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 Ooui.Forms/Renderers/DatePickerRenderer.cs diff --git a/Ooui.Forms/Exports.cs b/Ooui.Forms/Exports.cs index bc179cd..c231e3d 100644 --- a/Ooui.Forms/Exports.cs +++ b/Ooui.Forms/Exports.cs @@ -8,6 +8,7 @@ using Xamarin.Forms.Internals; [assembly: ExportRenderer (typeof (ActivityIndicator), typeof (ActivityIndicatorRenderer))] [assembly: ExportRenderer (typeof (BoxView), typeof (BoxRenderer))] [assembly: ExportRenderer (typeof (Button), typeof (ButtonRenderer))] +[assembly: ExportRenderer (typeof (DatePicker), typeof (DatePickerRenderer))] [assembly: ExportRenderer (typeof (Entry), typeof (EntryRenderer))] [assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))] [assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))] diff --git a/Ooui.Forms/Renderers/DatePickerRenderer.cs b/Ooui.Forms/Renderers/DatePickerRenderer.cs new file mode 100644 index 0000000..79bb422 --- /dev/null +++ b/Ooui.Forms/Renderers/DatePickerRenderer.cs @@ -0,0 +1,111 @@ +using System; +using System.ComponentModel; +using Xamarin.Forms; +using Ooui.Forms.Extensions; + +namespace Ooui.Forms.Renderers +{ + public class DatePickerRenderer : ViewRenderer + { + bool _disposed; + + IElementController ElementController => Element as IElementController; + + public override SizeRequest GetDesiredSize (double widthConstraint, double heightConstraint) + { + var size = "00/00/0000".MeasureSize ("", 16.0, FontAttributes.None); + size = new Size (size.Width, size.Height * 1.428 + 14); + return new SizeRequest (size, size); + } + + protected override void OnElementChanged (ElementChangedEventArgs e) + { + base.OnElementChanged (e); + + if (e.NewElement == null) + return; + + if (Control == null) { + var entry = new Input { + ClassName = "form-control", + Type = InputType.Date, + }; + + entry.Inputted += OnStarted; + entry.Changed += OnEnded; + + SetNativeControl (entry); + } + + UpdateDateFromModel (false); + UpdateMaximumDate (); + UpdateMinimumDate (); + UpdateTextColor (); + UpdateFlowDirection (); + } + + protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged (sender, e); + + if (e.PropertyName == DatePicker.DateProperty.PropertyName || e.PropertyName == DatePicker.FormatProperty.PropertyName) + UpdateDateFromModel (true); + else if (e.PropertyName == DatePicker.MinimumDateProperty.PropertyName) + UpdateMinimumDate (); + else if (e.PropertyName == DatePicker.MaximumDateProperty.PropertyName) + UpdateMaximumDate (); + else if (e.PropertyName == DatePicker.TextColorProperty.PropertyName || e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + UpdateTextColor (); + } + + void OnEnded (object sender, EventArgs eventArgs) + { + DateTime.TryParseExact (Control.Value, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal, out var date); + ElementController?.SetValueFromRenderer (DatePicker.DateProperty, date); + ElementController?.SetValueFromRenderer (VisualElement.IsFocusedPropertyKey, false); + } + + void OnStarted (object sender, EventArgs eventArgs) + { + ElementController?.SetValueFromRenderer (VisualElement.IsFocusedPropertyKey, true); + } + + void UpdateDateFromModel (bool animate) + { + Control.Value = Element.Date.ToString ("yyyy-MM-dd"); + } + + void UpdateFlowDirection () + { + } + + void UpdateMaximumDate () + { + } + + void UpdateMinimumDate () + { + } + + void UpdateTextColor () + { + } + + protected override void Dispose (bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) { + if (Control != null) { + Control.Inputted -= OnStarted; + Control.Changed -= OnEnded; + } + } + + base.Dispose (disposing); + } + } +} diff --git a/Samples/DisplayAlertPage.xaml b/Samples/DisplayAlertPage.xaml index b5deb93..fd29d53 100644 --- a/Samples/DisplayAlertPage.xaml +++ b/Samples/DisplayAlertPage.xaml @@ -4,10 +4,11 @@ x:Class="Samples.DisplayAlertPage"> -