From 98efd72b61e991f4498b9fcdc5d77f8d921d45da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Su=C3=A1rez=20Ruiz?= Date: Sun, 26 Nov 2017 18:28:47 +0100 Subject: [PATCH] Added Forms EditorRenderer --- Ooui.Forms/Exports.cs | 1 + Ooui.Forms/Renderers/EditorRenderer.cs | 124 +++++++++++++++++++++++++ Samples/EditorSample.cs | 44 +++++++++ Samples/Program.cs | 1 + 4 files changed, 170 insertions(+) create mode 100644 Ooui.Forms/Renderers/EditorRenderer.cs create mode 100644 Samples/EditorSample.cs diff --git a/Ooui.Forms/Exports.cs b/Ooui.Forms/Exports.cs index c8f3f60..49e6edc 100644 --- a/Ooui.Forms/Exports.cs +++ b/Ooui.Forms/Exports.cs @@ -7,6 +7,7 @@ using Xamarin.Forms.Internals; [assembly: Dependency (typeof (ResourcesProvider))] [assembly: ExportRenderer (typeof (BoxView), typeof (BoxRenderer))] [assembly: ExportRenderer (typeof (Button), typeof (ButtonRenderer))] +[assembly: ExportRenderer(typeof(Editor), typeof(EditorRenderer))] [assembly: ExportRenderer (typeof (Entry), typeof (EntryRenderer))] [assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))] diff --git a/Ooui.Forms/Renderers/EditorRenderer.cs b/Ooui.Forms/Renderers/EditorRenderer.cs new file mode 100644 index 0000000..d5b9137 --- /dev/null +++ b/Ooui.Forms/Renderers/EditorRenderer.cs @@ -0,0 +1,124 @@ +using Ooui.Forms.Extensions; +using System.ComponentModel; +using System.Diagnostics; +using Xamarin.Forms; + +namespace Ooui.Forms.Renderers +{ + public class EditorRenderer : ViewRenderer + { + private bool _disposed; + private Ooui.Color _defaultTextColor; + + static Size initialSize = Size.Zero; + + protected IElementController ElementController => Element as IElementController; + + public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint) + { + var size = Element.Text.MeasureSize(Element.FontFamily, Element.FontSize, Element.FontAttributes); + size = new Size(size.Width, size.Height * 1.428 + 14); + + return new SizeRequest(size, size); + } + + protected override void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) + { + if (Control != null) + { + Control.Inputted -= OnEditingChanged; + Control.Changed -= OnEditingEnded; + } + } + + base.Dispose(disposing); + } + + protected override void OnElementChanged(ElementChangedEventArgs e) + { + if (e.NewElement == null) + return; + + if (Control == null) + { + SetNativeControl(new Ooui.TextArea()); + + _defaultTextColor = Colors.Black; + + Debug.Assert(Control != null, "Control != null"); + + Control.Inputted += OnEditingChanged; + Control.Changed += OnEditingEnded; + } + + UpdateText(); + UpdateTextColor(); + UpdateFont(); + + base.OnElementChanged(e); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == Editor.TextProperty.PropertyName) + UpdateText(); + else if (e.PropertyName == Editor.TextColorProperty.PropertyName) + UpdateTextColor(); + else if (e.PropertyName == Editor.FontAttributesProperty.PropertyName) + UpdateFont(); + else if (e.PropertyName == Editor.FontFamilyProperty.PropertyName) + UpdateFont(); + else if (e.PropertyName == Editor.FontSizeProperty.PropertyName) + UpdateFont(); + } + + void UpdateText() + { + if (Control.Value != Element.Text) + Control.Value = Element.Text; + } + + void UpdateTextColor() + { + var textColor = Element.TextColor; + + if (textColor.IsDefault || !Element.IsEnabled) + Control.Style.Color = _defaultTextColor; + else + Control.Style.Color = textColor.ToOouiColor(); + } + + void UpdateFont() + { + if (initialSize == Size.Zero) + { + var testString = "Tj"; + initialSize = testString.MeasureSize(Control.Style); + } + + Element.SetStyleFont(Element.FontFamily, Element.FontSize, Element.FontAttributes, Control.Style); + } + + private void OnEditingChanged(object sender, TargetEventArgs e) + { + ElementController.SetValueFromRenderer(Editor.TextProperty, Control.Value); + } + + private void OnEditingEnded(object sender, TargetEventArgs e) + { + if (Control.Text != Element.Text) + { + ElementController.SetValueFromRenderer(Editor.TextProperty, Control.Text); + } + } + } +} diff --git a/Samples/EditorSample.cs b/Samples/EditorSample.cs new file mode 100644 index 0000000..494b9dc --- /dev/null +++ b/Samples/EditorSample.cs @@ -0,0 +1,44 @@ +using Ooui; +using Xamarin.Forms; + +namespace Samples +{ + public class EditorSample : ISample + { + public string Title => "Editor Sample"; + + public Ooui.Element CreateElement() + { + var panel = new StackLayout(); + + var titleLabel = new Xamarin.Forms.Label + { + Text = "Editor" + }; + panel.Children.Add(titleLabel); + + var editor = new Editor(); + panel.Children.Add(editor); + + var labelEditor = new Xamarin.Forms.Label(); + panel.Children.Add(labelEditor); + + editor.TextChanged += (sender, args) => + { + labelEditor.Text = args.NewTextValue; + }; + + var page = new ContentPage + { + Content = panel + }; + + return page.GetOouiElement(); + } + + public void Publish() + { + UI.Publish("/editor", CreateElement); + } + } +} diff --git a/Samples/Program.cs b/Samples/Program.cs index afff463..7a3f706 100644 --- a/Samples/Program.cs +++ b/Samples/Program.cs @@ -30,6 +30,7 @@ namespace Samples new DrawSample ().Publish (); new FilesSample ().Publish (); new DisplayAlertSample ().Publish (); + new EditorSample().Publish(); UI.Present ("/display-alert");