summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs')
-rw-r--r--Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs124
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();
+ }
+
+ }
+}