diff --git a/Stubs/Xamarin.Forms.Platform.cs b/Stubs/Xamarin.Forms.Platform.cs index 49cadd18835..3e8331b88c5 100644 --- a/Stubs/Xamarin.Forms.Platform.cs +++ b/Stubs/Xamarin.Forms.Platform.cs @@ -54,11 +54,7 @@ internal class _ButtonRenderer { } [RenderWith(typeof(ImageButtonRenderer))] internal class _ImageButtonRenderer { } -#if __ANDROID__ - [RenderWith(typeof(RadioButtonRenderer))] -#elif !TIZEN4_0 [RenderWith(typeof(RadioButtonRenderer))] -#endif internal class _RadioButtonRenderer { } [RenderWith (typeof (TableViewRenderer))] diff --git a/Xamarin.Forms.Platform.Tizen/Properties/AssemblyInfo.cs b/Xamarin.Forms.Platform.Tizen/Properties/AssemblyInfo.cs index fc87328336a..1cfb0f995b4 100644 --- a/Xamarin.Forms.Platform.Tizen/Properties/AssemblyInfo.cs +++ b/Xamarin.Forms.Platform.Tizen/Properties/AssemblyInfo.cs @@ -44,6 +44,7 @@ [assembly: ExportRenderer(typeof(RefreshView), typeof(RefreshViewRenderer))] [assembly: ExportRenderer(typeof(MediaElement), typeof(MediaElementRenderer))] [assembly: ExportRenderer(typeof(IndicatorView), typeof(IndicatorViewRenderer))] +[assembly: ExportRenderer(typeof(RadioButton), typeof(RadioButtonRenderer))] [assembly: ExportImageSourceHandler(typeof(FileImageSource), typeof(FileImageSourceHandler))] [assembly: ExportImageSourceHandler(typeof(StreamImageSource), typeof(StreamImageSourceHandler))] diff --git a/Xamarin.Forms.Platform.Tizen/Renderers/RadioButtonRenderer.cs b/Xamarin.Forms.Platform.Tizen/Renderers/RadioButtonRenderer.cs new file mode 100644 index 00000000000..81c6524be9b --- /dev/null +++ b/Xamarin.Forms.Platform.Tizen/Renderers/RadioButtonRenderer.cs @@ -0,0 +1,117 @@ +using System; +using ElmSharp; +using ESize = ElmSharp.Size; +using TSpan = Xamarin.Forms.Platform.Tizen.Native.Span; + +namespace Xamarin.Forms.Platform.Tizen +{ + public class RadioButtonRenderer : ViewRenderer + { + readonly TSpan _span = new TSpan(); + public RadioButtonRenderer() + { + RegisterPropertyHandler(RadioButton.IsCheckedProperty, UpdateIsChecked); + RegisterPropertyHandler(RadioButton.TextProperty, UpdateText); + RegisterPropertyHandler(RadioButton.TextColorProperty, UpdateTextColor); + RegisterPropertyHandler(RadioButton.FontProperty, UpdateFont); + } + + protected override void OnElementChanged(ElementChangedEventArgs e) + { + if (Control == null) + { + SetNativeControl(new Radio(Forms.NativeParent) { StateValue = 1 }); + Control.ValueChanged += OnValueChanged; + } + base.OnElementChanged(e); + ApplyTextAndStyle(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (Control != null) + { + Control.ValueChanged -= OnValueChanged; + } + } + base.Dispose(disposing); + } + + protected override Size MinimumSize() + { + return Measure(Control.MinimumWidth, Control.MinimumHeight).ToDP(); + } + + protected override ESize Measure(int availableWidth, int availableHeight) + { + var size = Control.Geometry; + Control.Resize(availableWidth, size.Height); + var formattedSize = Control.EdjeObject["elm.text"].TextBlockFormattedSize; + Control.Resize(size.Width, size.Height); + return new ESize() + { + Width = Control.MinimumWidth + formattedSize.Width, + Height = Math.Max(Control.MinimumHeight, formattedSize.Height), + }; + } + + void OnValueChanged(object sender, EventArgs e) + { + Element.SetValueFromRenderer(RadioButton.IsCheckedProperty, Control.GroupValue == 1 ? true : false); + } + + void UpdateIsChecked() + { + Control.GroupValue = Element.IsChecked ? 1 : 0; + } + + void UpdateText(bool isInitialized) + { + _span.Text = Element.Text; + if (!isInitialized) + ApplyTextAndStyle(); + } + + void UpdateTextColor(bool isInitialized) + { + _span.ForegroundColor = Element.TextColor.ToNative(); + if (!isInitialized) + ApplyTextAndStyle(); + } + + void UpdateFont(bool isInitialized) + { + _span.FontSize = Element.FontSize; + _span.FontAttributes = Element.FontAttributes; + _span.FontFamily = Element.FontFamily; + if (!isInitialized) + ApplyTextAndStyle(); + } + + void ApplyTextAndStyle() + { + SetInternalTextAndStyle(_span.GetDecoratedText(), _span.GetStyle()); + } + + void SetInternalTextAndStyle(string formattedText, string textStyle) + { + string emission = "elm,state,text,visible"; + if (string.IsNullOrEmpty(formattedText)) + { + formattedText = null; + textStyle = null; + emission = "elm,state,text,hidden"; + } + Control.Text = formattedText; + + var textblock = Control.EdjeObject["elm.text"]; + if (textblock != null) + { + textblock.TextStyle = textStyle; + } + Control.EdjeObject.EmitSignal(emission, "elm"); + } + } +} diff --git a/Xamarin.Forms.Platform.Tizen/StaticRegistrar.cs b/Xamarin.Forms.Platform.Tizen/StaticRegistrar.cs index 30f972e9022..6075e342bb5 100644 --- a/Xamarin.Forms.Platform.Tizen/StaticRegistrar.cs +++ b/Xamarin.Forms.Platform.Tizen/StaticRegistrar.cs @@ -105,6 +105,7 @@ public static void RegisterHandlers(Dictionary> custom Registered.Register(typeof(RefreshView), () => new RefreshViewRenderer()); Registered.Register(typeof(MediaElement), () => new MediaElementRenderer()); Registered.Register(typeof(IndicatorView), () => new IndicatorViewRenderer()); + Registered.Register(typeof(RadioButton), () => new RadioButtonRenderer()); //ImageSourceHandlers Registered.Register(typeof(FileImageSource), () => new FileImageSourceHandler());