diff options
author | Kangho Hur <kangho.hur@samsung.com> | 2016-12-16 11:00:07 +0900 |
---|---|---|
committer | Kangho Hur <kangho.hur@samsung.com> | 2017-10-23 13:34:24 +0900 |
commit | a2e67107402bc5a49d73cee9062bcd7dbe4069e7 (patch) | |
tree | ea6c6606567e8440397de192d47195194c0266dd /Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs | |
parent | 509954d0a013acdf7508644c1fb394bea626e587 (diff) | |
download | xamarin-forms-a2e67107402bc5a49d73cee9062bcd7dbe4069e7.tar.gz xamarin-forms-a2e67107402bc5a49d73cee9062bcd7dbe4069e7.tar.bz2 xamarin-forms-a2e67107402bc5a49d73cee9062bcd7dbe4069e7.zip |
Add Tizen backend renderer
- Xamarin.Forms.Platform.Tizen has been added
- Xamarin.Forms.Maps.Tizen has been added
- RPM build spec has been added
Change-Id: I0021e0f040d97345affc87512ee0f6ce437f4e6d
Diffstat (limited to 'Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs b/Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs new file mode 100644 index 00000000..0684c4ac --- /dev/null +++ b/Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs @@ -0,0 +1,124 @@ +using ElmSharp; +using EColor = ElmSharp.Color; + +namespace Xamarin.Forms.Platform.Tizen +{ + public class FrameRenderer : ViewRenderer<Frame, Native.Canvas> + { + const int _thickness = 2; + const int _shadow_shift = 2; + const int _shadow_thickness = _thickness + 2; + + static readonly EColor s_DefaultColor = EColor.Black; + static readonly EColor s_ShadowColor = EColor.FromRgba(80, 80, 80, 50); + + Polygon _shadow = null; + Polygon _frame = null; + + public FrameRenderer() + { + RegisterPropertyHandler(Frame.OutlineColorProperty, UpdateColor); + RegisterPropertyHandler(Frame.HasShadowProperty, UpdateShadowVisibility); + } + + protected override void OnElementChanged(ElementChangedEventArgs<Frame> e) + { + if (Control == null) + { + SetNativeControl(new Native.Canvas(Forms.Context.MainWindow)); + + _shadow = new Polygon(NativeView); + _shadow.Color = s_ShadowColor; + Control.Children.Add(_shadow); + + _frame = new Polygon(NativeView); + _frame.Show(); + Control.Children.Add(_frame); + } + + if (e.OldElement != null) + { + Control.LayoutUpdated -= OnLayoutUpdated; + } + + if (e.NewElement != null) + { + Control.LayoutUpdated += OnLayoutUpdated; + } + + base.OnElementChanged(e); + } + + void OnLayoutUpdated(object sender, Native.LayoutEventArgs e) + { + UpdateGeometry(); + // TODO: why is this DoLayout() required? + if (Element.Content != null) + base.DoLayout(e); + } + + void UpdateGeometry() + { + var geometry = NativeView.Geometry; + DrawFrame(_frame, + geometry.X, + geometry.Y, + geometry.Right, + geometry.Bottom, + _thickness + ); + DrawFrame(_shadow, + geometry.X + _shadow_shift, + geometry.Y + _shadow_shift, + geometry.Right - _thickness + _shadow_shift + _shadow_thickness, + geometry.Bottom - _thickness + _shadow_shift + _shadow_thickness, + _shadow_thickness + ); + } + + void DrawFrame(Polygon frame, int left, int top, int right, int bottom, int thickness) + { + frame.ClearPoints(); + if (left + thickness >= right || top + thickness >= bottom) + { + if (left >= right || top >= bottom) + return; + // shape reduces to a rectangle + frame.AddPoint(left, top); + frame.AddPoint(right, top); + frame.AddPoint(right, bottom); + frame.AddPoint(left, bottom); + return; + } + // outside edge + frame.AddPoint(left, top); + frame.AddPoint(right, top); + frame.AddPoint(right, bottom); + frame.AddPoint(left, bottom); + frame.AddPoint(left, top + thickness); + // and inside edge + frame.AddPoint(left + thickness, top + thickness); + frame.AddPoint(left + thickness, bottom - thickness); + frame.AddPoint(right - thickness, bottom - thickness); + frame.AddPoint(right - thickness, top + thickness); + frame.AddPoint(left, top + thickness); + } + + void UpdateColor() + { + if (Element.OutlineColor.IsDefault) + _frame.Color = s_DefaultColor; + else + _frame.Color = Element.OutlineColor.ToNative(); + } + + void UpdateShadowVisibility() + { + if (Element.HasShadow) + _shadow.Show(); + else + _shadow.Hide(); + } + + } +} |