Added Forms EditorRenderer
This commit is contained in:
		
							parent
							
								
									7c36801d5e
								
							
						
					
					
						commit
						98efd72b61
					
				| 
						 | 
					@ -7,6 +7,7 @@ using Xamarin.Forms.Internals;
 | 
				
			||||||
[assembly: Dependency (typeof (ResourcesProvider))]
 | 
					[assembly: Dependency (typeof (ResourcesProvider))]
 | 
				
			||||||
[assembly: ExportRenderer (typeof (BoxView), typeof (BoxRenderer))]
 | 
					[assembly: ExportRenderer (typeof (BoxView), typeof (BoxRenderer))]
 | 
				
			||||||
[assembly: ExportRenderer (typeof (Button), typeof (ButtonRenderer))]
 | 
					[assembly: ExportRenderer (typeof (Button), typeof (ButtonRenderer))]
 | 
				
			||||||
 | 
					[assembly: ExportRenderer(typeof(Editor), typeof(EditorRenderer))]
 | 
				
			||||||
[assembly: ExportRenderer (typeof (Entry), typeof (EntryRenderer))]
 | 
					[assembly: ExportRenderer (typeof (Entry), typeof (EntryRenderer))]
 | 
				
			||||||
[assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))]
 | 
					[assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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<Editor, Ooui.TextArea>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        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<Editor> 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);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@ namespace Samples
 | 
				
			||||||
            new DrawSample ().Publish ();
 | 
					            new DrawSample ().Publish ();
 | 
				
			||||||
            new FilesSample ().Publish ();
 | 
					            new FilesSample ().Publish ();
 | 
				
			||||||
            new DisplayAlertSample ().Publish ();
 | 
					            new DisplayAlertSample ().Publish ();
 | 
				
			||||||
 | 
					            new EditorSample().Publish();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            UI.Present ("/display-alert");
 | 
					            UI.Present ("/display-alert");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue