diff --git a/example/Thewissen.PancakeViewSample.Tizen/Thewissen.PancakeViewSample.Tizen.cs b/example/Thewissen.PancakeViewSample.Tizen/Thewissen.PancakeViewSample.Tizen.cs new file mode 100644 index 0000000..cfc5f47 --- /dev/null +++ b/example/Thewissen.PancakeViewSample.Tizen/Thewissen.PancakeViewSample.Tizen.cs @@ -0,0 +1,25 @@ +using System; +using Xamarin.Forms; + +namespace Thewissen.PancakeViewSample.Tizen +{ + class Program : global::Xamarin.Forms.Platform.Tizen.FormsApplication + { + protected override void OnCreate() + { + base.OnCreate(); + ElmSharp.Utility.AppendGlobalFontPath(this.DirectoryInfo.Resource); + MainWindow.IndicatorMode = ElmSharp.IndicatorMode.Hide; + var app = new App(); + app.MainPage.BackgroundColor = Color.White; + LoadApplication(app); + } + + static void Main(string[] args) + { + var app = new Program(); + Forms.Init(app, true); + app.Run(args); + } + } +} diff --git a/example/Thewissen.PancakeViewSample.Tizen/Thewissen.PancakeViewSample.Tizen.csproj b/example/Thewissen.PancakeViewSample.Tizen/Thewissen.PancakeViewSample.Tizen.csproj new file mode 100644 index 0000000..5f842c4 --- /dev/null +++ b/example/Thewissen.PancakeViewSample.Tizen/Thewissen.PancakeViewSample.Tizen.csproj @@ -0,0 +1,25 @@ + + + + Exe + tizen40 + true + + + + portable + + + None + + + + + + + + + + + + diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/Lato-Bold.ttf b/example/Thewissen.PancakeViewSample.Tizen/res/Lato-Bold.ttf new file mode 100644 index 0000000..7434369 Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/Lato-Bold.ttf differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/Lato-Regular.ttf b/example/Thewissen.PancakeViewSample.Tizen/res/Lato-Regular.ttf new file mode 100644 index 0000000..04ea8ef Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/Lato-Regular.ttf differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/monkey.png b/example/Thewissen.PancakeViewSample.Tizen/res/monkey.png new file mode 100644 index 0000000..55faebf Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/monkey.png differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/pancake.png b/example/Thewissen.PancakeViewSample.Tizen/res/pancake.png new file mode 100644 index 0000000..55a19e2 Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/pancake.png differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/pancakes1.jpg b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes1.jpg new file mode 100644 index 0000000..13c88d7 Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes1.jpg differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/pancakes2.jpg b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes2.jpg new file mode 100644 index 0000000..b5742a1 Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes2.jpg differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/pancakes3.jpg b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes3.jpg new file mode 100644 index 0000000..70988aa Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes3.jpg differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/pancakes4.jpg b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes4.jpg new file mode 100644 index 0000000..0a837fa Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/pancakes4.jpg differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/res/xamalogo.png b/example/Thewissen.PancakeViewSample.Tizen/res/xamalogo.png new file mode 100644 index 0000000..7ca86c6 Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/res/xamalogo.png differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/shared/res/Thewissen.PancakeViewSample.Tizen.png b/example/Thewissen.PancakeViewSample.Tizen/shared/res/Thewissen.PancakeViewSample.Tizen.png new file mode 100644 index 0000000..9f3cb98 Binary files /dev/null and b/example/Thewissen.PancakeViewSample.Tizen/shared/res/Thewissen.PancakeViewSample.Tizen.png differ diff --git a/example/Thewissen.PancakeViewSample.Tizen/tizen-manifest.xml b/example/Thewissen.PancakeViewSample.Tizen/tizen-manifest.xml new file mode 100644 index 0000000..f84f490 --- /dev/null +++ b/example/Thewissen.PancakeViewSample.Tizen/tizen-manifest.xml @@ -0,0 +1,13 @@ + + + + + + Thewissen.PancakeViewSample.Tizen.png + + + + + + + diff --git a/example/Thewissen.PancakeViewSample/Thewissen.PancakeViewSample.csproj b/example/Thewissen.PancakeViewSample/Thewissen.PancakeViewSample.csproj index cae05e9..cf56e3c 100644 --- a/example/Thewissen.PancakeViewSample/Thewissen.PancakeViewSample.csproj +++ b/example/Thewissen.PancakeViewSample/Thewissen.PancakeViewSample.csproj @@ -10,7 +10,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/DrawingExtensions.cs b/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/DrawingExtensions.cs new file mode 100644 index 0000000..1682c3f --- /dev/null +++ b/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/DrawingExtensions.cs @@ -0,0 +1,56 @@ +using System; +using SkiaSharp; + +namespace Xamarin.Forms.PancakeView.Tizen +{ + public static class DrawingExtensions + { + static public SKPath CreateRoundedRectPath(int left, int top, int width, int height, CornerRadius cornerRadius) + { + var path = new SKPath(); + var skRoundRect = new SKRoundRect(new SKRect(left, top, width, height)); + SKPoint[] radii = new SKPoint[4] + { + new SKPoint((float)cornerRadius.TopLeft, (float)cornerRadius.TopLeft), + new SKPoint((float)cornerRadius.TopRight, (float)cornerRadius.TopRight), + new SKPoint((float)cornerRadius.BottomRight, (float)cornerRadius.BottomRight), + new SKPoint((float)cornerRadius.BottomLeft, (float)cornerRadius.BottomLeft) + }; + skRoundRect.SetRectRadii(skRoundRect.Rect, radii); + path.AddRoundRect(skRoundRect); + path.Close(); + return path; + } + + public static SKPath CreatePolygonPath(float rectWidth, float rectHeight, int sides, double cornerRadius = 0.0, double rotationOffset = 0.0) + { + var offsetRadians = rotationOffset * Math.PI / 180; + var path = new SKPath(); + var theta = 2 * Math.PI / sides; + + var width = (-cornerRadius + Math.Min(rectWidth, rectHeight)) / 2; + var center = new Point(rectWidth / 2, rectHeight / 2); + + var radius = width + cornerRadius - (Math.Cos(theta) * cornerRadius) / 2; + + var angle = offsetRadians; + var corner = new Point(center.X + (radius - cornerRadius) * Math.Cos(angle), center.Y + (radius - cornerRadius) * Math.Sin(angle)); + path.MoveTo((float)(corner.X + cornerRadius * Math.Cos(angle + theta)), (float)(corner.Y + cornerRadius * Math.Sin(angle + theta))); + + for (var i = 0; i < sides; i++) + { + angle += theta; + corner = new Point(center.X + (radius - cornerRadius) * Math.Cos(angle), center.Y + (radius - cornerRadius) * Math.Sin(angle)); + var tip = new Point(center.X + radius * Math.Cos(angle), center.Y + radius * Math.Sin(angle)); + var start = new Point(corner.X + cornerRadius * Math.Cos(angle - theta), corner.Y + cornerRadius * Math.Sin(angle - theta)); + var end = new Point(corner.X + cornerRadius * Math.Cos(angle + theta), corner.Y + cornerRadius * Math.Sin(angle + theta)); + + path.LineTo((float)start.X, (float)start.Y); + path.QuadTo((float)tip.X, (float)tip.Y, (float)end.X, (float)end.Y); + } + + path.Close(); + return path; + } + } +} diff --git a/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/Interop.cs b/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/Interop.cs new file mode 100644 index 0000000..f9781fd --- /dev/null +++ b/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/Interop.cs @@ -0,0 +1,13 @@ +using System; +using System.Runtime.InteropServices; + +namespace Xamarin.Forms.PancakeView.Tizen +{ + internal static class Interop + { + const string Evas = "libevas.so.1"; + + [DllImport(Evas)] + internal static extern void evas_object_clip_unset(IntPtr obj); + } +} diff --git a/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/PancakeViewRenderer.cs b/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/PancakeViewRenderer.cs new file mode 100644 index 0000000..54ca2c2 --- /dev/null +++ b/src/Xamarin.Forms.PancakeView.Multi/Platforms/Tizen/PancakeViewRenderer.cs @@ -0,0 +1,283 @@ +using System; +using System.ComponentModel; +using System.Linq; +using Xamarin.Forms; +using Xamarin.Forms.Platform.Tizen; +using Xamarin.Forms.Platform.Tizen.Native; +using Xamarin.Forms.PancakeView.Tizen; +using Controls = Xamarin.Forms.PancakeView; +using SkiaSharp; +using SkiaSharp.Views.Tizen; + +[assembly: ExportRenderer(typeof(Controls.PancakeView), typeof(PancakeViewRenderer))] +namespace Xamarin.Forms.PancakeView.Tizen +{ + public class PancakeViewRenderer : LayoutRenderer + { + SKCanvasView _skCanvasView; + + public PancakeViewRenderer() : base() + { + } + + /// + /// This method ensures that we don't get stripped out by the linker. + /// + public static void Init() + { +#pragma warning disable 0219 + var ignore1 = typeof(PancakeViewRenderer); + var ignore2 = typeof(PancakeView); +#pragma warning restore 0219 + } + + protected override void OnElementChanged(ElementChangedEventArgs e) + { + if (Control == null) + { + SetNativeControl(new Canvas(Forms.NativeParent)); + _skCanvasView = new SKCanvasView(Forms.NativeParent); + _skCanvasView.PaintSurface += OnPaintSurface; + _skCanvasView.Show(); + Control.Children.Add(_skCanvasView); + Interop.evas_object_clip_unset(_skCanvasView); + Control.LayoutUpdated += OnLayoutUpdated; + } + base.OnElementChanged(e); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + { + if (Control != null) + { + Control.LayoutUpdated -= OnLayoutUpdated; + } + if (_skCanvasView != null) + { + _skCanvasView.PaintSurface -= OnPaintSurface; + _skCanvasView.Unrealize(); + _skCanvasView = null; + } + } + } + + protected override void UpdateBackgroundColor(bool initialize) + { + if(!initialize) + { + Invalidate(); + } + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == PancakeView.BorderProperty.PropertyName || + e.PropertyName == PancakeView.CornerRadiusProperty.PropertyName || + e.PropertyName == PancakeView.OffsetAngleProperty.PropertyName || + e.PropertyName == PancakeView.SidesProperty.PropertyName || + e.PropertyName == PancakeView.BackgroundGradientStopsProperty.PropertyName || + e.PropertyName == PancakeView.BackgroundGradientStartPointProperty.PropertyName || + e.PropertyName == PancakeView.BackgroundGradientEndPointProperty.PropertyName) + { + Invalidate(); + } + else if (e.PropertyName == PancakeView.ShadowProperty.PropertyName) + { + UpdateCanvasGeometry(); + Invalidate(); + } + } + + private void OnLayoutUpdated(object sender, LayoutEventArgs e) + { + UpdateCanvasGeometry(); + } + + private void UpdateCanvasGeometry() + { + var pancake = Element as PancakeView; + if (pancake.Shadow != null) + { + double left = 0; + double top = 0; + double right = 0; + double bottom = 0; + var scaledOffsetX = Forms.ConvertToScaledPixel(pancake.Shadow.Offset.X); + var scaledOffsetY = Forms.ConvertToScaledPixel(pancake.Shadow.Offset.Y); + var scaledBlurRadius = Forms.ConvertToScaledPixel(pancake.Shadow.BlurRadius); + var spreadSize = scaledBlurRadius * 2 + scaledBlurRadius; + var sl = scaledOffsetX - spreadSize; + var sr = scaledOffsetX + spreadSize; + var st = scaledOffsetY - spreadSize; + var sb = scaledOffsetY + spreadSize; + if (left > sl) left = sl; + if (top > st) top = st; + if (right < sr) right = sr; + if (bottom < sb) bottom = sb; + + var geometry = Control.Geometry; + _skCanvasView.Geometry = new ElmSharp.Rect(geometry.X + (int)left, geometry.Y + (int)top, geometry.Width + (int)right - (int)left, geometry.Height + (int)bottom - (int)top); + } + else + { + _skCanvasView.Geometry = Control.Geometry; + } + } + + private void OnPaintSurface(object sender, SKPaintSurfaceEventArgs e) + { + var surface = e.Surface; + var canvas = surface.Canvas; + canvas.Clear(); + DrawShadow(canvas); + DrawBackground(canvas); + DrawBorder(canvas); + } + + private void DrawShadow(SKCanvas canvas) + { + var pancake = Element as PancakeView; + if (pancake.Shadow != null) + { + SKPath path; + if (pancake.Sides != 4) + { + path = DrawingExtensions.CreatePolygonPath(Control.Geometry.Width, Control.Geometry.Height, + pancake.Sides, pancake.CornerRadius.TopLeft, pancake.OffsetAngle); + } + else + { + var left = Control.Geometry.Left - _skCanvasView.Geometry.Left; + var top = Control.Geometry.Top - _skCanvasView.Geometry.Top; + path = DrawingExtensions.CreateRoundedRectPath(left, top, left + Control.Geometry.Width, top + Control.Geometry.Height, pancake.CornerRadius); + } + + using (var paint = new SKPaint()) + { + paint.IsAntialias = true; + paint.Style = SKPaintStyle.StrokeAndFill; + + var shadow = pancake.Shadow; + var scaledOffsetX = Forms.ConvertToScaledPixel(shadow.Offset.X); + var scaledOffsetY = Forms.ConvertToScaledPixel(shadow.Offset.Y); + var scaledBlurRadius = Forms.ConvertToScaledPixel(shadow.BlurRadius); + + canvas.Save(); + canvas.ClipPath(path, SKClipOperation.Difference, true); + paint.ImageFilter = SKImageFilter.CreateDropShadow( + scaledOffsetX, + scaledOffsetY, + scaledBlurRadius, + scaledBlurRadius, + shadow.Color.MultiplyAlpha(shadow.Opacity).ToNative().ToSKColor(), + SKDropShadowImageFilterShadowMode.DrawShadowOnly); + canvas.DrawPath(path, paint); + canvas.Restore(); + + canvas.Save(); + canvas.ClipPath(path, SKClipOperation.Intersect, true); + canvas.DrawPath(path, paint); + canvas.Restore(); + } + } + } + + private void DrawBackground(SKCanvas canvas) + { + using (var paint = new SKPaint()) + { + paint.Style = SKPaintStyle.Fill; + paint.IsAntialias = true; + + var pancake = Element as PancakeView; + SKPath path; + if (pancake.Sides != 4) + { + path = DrawingExtensions.CreatePolygonPath(Control.Geometry.Width, Control.Geometry.Height, + pancake.Sides, pancake.CornerRadius.TopLeft, pancake.OffsetAngle); + } + else + { + var left = Control.Geometry.Left - _skCanvasView.Geometry.Left; + var top = Control.Geometry.Top - _skCanvasView.Geometry.Top; + path = DrawingExtensions.CreateRoundedRectPath(left, top, left + Control.Geometry.Width, top + Control.Geometry.Height, pancake.CornerRadius); + } + + if (pancake.BackgroundGradientStops != null && pancake.BackgroundGradientStops.Any()) + { + var orderedStops = pancake.BackgroundGradientStops.OrderBy(x => x.Offset).ToList(); + var gradientColors = orderedStops.Select(x => x.Color.ToNative().ToSKColor()).ToArray(); + var gradientColorPos = orderedStops.Select(x => x.Offset).ToArray(); + var startPoint = new SKPoint((float)(pancake.BackgroundGradientStartPoint.X * Control.Geometry.Width), (float)(pancake.BackgroundGradientStartPoint.Y * Control.Geometry.Height)); + var endPoint = new SKPoint((float)(pancake.BackgroundGradientEndPoint.X * Control.Geometry.Width), (float)(pancake.BackgroundGradientEndPoint.Y * Control.Geometry.Height)); + paint.Shader = SKShader.CreateLinearGradient(startPoint, endPoint, gradientColors, gradientColorPos, SKShaderTileMode.Clamp); + } + else + { + paint.Color = pancake.BackgroundColor.ToNative().ToSKColor(); + } + canvas.ClipPath(path, SKClipOperation.Intersect, true); + canvas.DrawPath(path, paint); + } + } + + private void DrawBorder(SKCanvas canvas) + { + var pancake = Element as PancakeView; + if (pancake.Border != null && pancake.Border.Thickness != default) + { + using (var paint = new SKPaint()) + { + var border = pancake.Border; + paint.Style = SKPaintStyle.Stroke; + paint.Color = border.Color.ToNative().ToSKColor(); + paint.StrokeWidth = Forms.ConvertToScaledPixel(border.Thickness); + paint.IsAntialias = true; + + SKPath path; + if (pancake.Sides != 4) + { + path = DrawingExtensions.CreatePolygonPath(Control.Geometry.Width, Control.Geometry.Height, + pancake.Sides, pancake.CornerRadius.TopLeft, pancake.OffsetAngle); + } + else + { + var left = Control.Geometry.Left - _skCanvasView.Geometry.Left; + var top = Control.Geometry.Top - _skCanvasView.Geometry.Top; + path = DrawingExtensions.CreateRoundedRectPath(left, top, left + Control.Geometry.Width, top + Control.Geometry.Height, pancake.CornerRadius); + } + + if (border.DashPattern.Pattern != null && border.DashPattern.Pattern.Length > 0) + { + var dashPattern = border.DashPattern.Pattern; + float[] patternInFloat = new float[dashPattern.Length]; + patternInFloat = Array.ConvertAll(dashPattern, item => (float)item); + paint.PathEffect = SKPathEffect.CreateDash(patternInFloat, 0); + } + + if (border.GradientStops != null && border.GradientStops.Any()) + { + var startPoint = new SKPoint((float)(border.GradientStartPoint.X * Control.Geometry.Width), (float)(border.GradientStartPoint.Y * Control.Geometry.Height)); + var endPoint = new SKPoint((float)(border.GradientEndPoint.X * Control.Geometry.Width), (float)(border.GradientEndPoint.Y * Control.Geometry.Height)); + var orderedStops = border.GradientStops.OrderBy(x => x.Offset).ToList(); + var gradientColors = orderedStops.Select(x => x.Color.ToNative().ToSKColor()).ToArray(); + var gradientColorPos = orderedStops.Select(x => x.Offset).ToArray(); + paint.Shader = SKShader.CreateLinearGradient(startPoint, endPoint, gradientColors, gradientColorPos, SKShaderTileMode.Clamp); + } + canvas.ClipPath(path, SKClipOperation.Intersect, true); + canvas.DrawPath(path, paint); + } + } + } + + private void Invalidate() + { + _skCanvasView.Invalidate(); + } + } +} diff --git a/src/Xamarin.Forms.PancakeView.Multi/Xamarin.Forms.PancakeView.Multi.csproj b/src/Xamarin.Forms.PancakeView.Multi/Xamarin.Forms.PancakeView.Multi.csproj index dff30a3..8a665cc 100644 --- a/src/Xamarin.Forms.PancakeView.Multi/Xamarin.Forms.PancakeView.Multi.csproj +++ b/src/Xamarin.Forms.PancakeView.Multi/Xamarin.Forms.PancakeView.Multi.csproj @@ -1,8 +1,9 @@  - netstandard1.0;netstandard2.0;Xamarin.iOS10;xamarin.mac20;MonoAndroid90 - netstandard1.0;netstandard2.0;Xamarin.iOS10;MonoAndroid90;uap10.0.16299;NET461 + netstandard1.0;netstandard2.0;Xamarin.iOS10;xamarin.mac20;MonoAndroid90;tizen40 + netstandard1.0;netstandard2.0;Xamarin.iOS10;MonoAndroid90;uap10.0.16299;NET461;tizen40 + Xamarin.Forms.PancakeView Xamarin.Forms.PancakeView @@ -53,7 +54,8 @@ - + + @@ -94,5 +96,9 @@ --> + + + + \ No newline at end of file diff --git a/src/Xamarin.Forms.PancakeView.sln b/src/Xamarin.Forms.PancakeView.sln index 2521689..7bca4c1 100644 --- a/src/Xamarin.Forms.PancakeView.sln +++ b/src/Xamarin.Forms.PancakeView.sln @@ -8,7 +8,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{DB2232 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thewissen.PancakeViewSample.Android", "..\example\Thewissen.PancakeViewSample.Android\Thewissen.PancakeViewSample.Android.csproj", "{03BBFF5A-C44F-4BD6-A3DA-82E075C1FAEA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thewissen.PancakeViewSample", "..\example\Thewissen.PancakeViewSample\Thewissen.PancakeViewSample.csproj", "{ABE29A80-FFA3-40E7-B8C4-87D5D6B1C8C1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thewissen.PancakeViewSample", "..\example\Thewissen.PancakeViewSample\Thewissen.PancakeViewSample.csproj", "{ABE29A80-FFA3-40E7-B8C4-87D5D6B1C8C1}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thewissen.PancakeViewSample.iOS", "..\example\Thewissen.PancakeViewSample.iOS\Thewissen.PancakeViewSample.iOS.csproj", "{E5784030-B7B9-4567-BC71-9086B9FA3FDE}" EndProject @@ -18,7 +18,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thewissen.PancakeViewSample EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thewissen.PancakeViewSample.macOS", "..\example\Thewissen.PancakeViewSample.macOS\Thewissen.PancakeViewSample.macOS.csproj", "{0C515BB1-FBC2-42E0-97D0-3726F952FE0A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Forms.PancakeView.Multi", "Xamarin.Forms.PancakeView.Multi\Xamarin.Forms.PancakeView.Multi.csproj", "{B178CFA1-03F5-45F0-ACDC-33149B2D4631}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Forms.PancakeView.Multi", "Xamarin.Forms.PancakeView.Multi\Xamarin.Forms.PancakeView.Multi.csproj", "{B178CFA1-03F5-45F0-ACDC-33149B2D4631}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thewissen.PancakeViewSample.Tizen", "..\example\Thewissen.PancakeViewSample.Tizen\Thewissen.PancakeViewSample.Tizen.csproj", "{7A4B7977-1B25-419A-8650-8585FD905704}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -398,6 +400,54 @@ Global {B178CFA1-03F5-45F0-ACDC-33149B2D4631}.Release|x64.Build.0 = Release|Any CPU {B178CFA1-03F5-45F0-ACDC-33149B2D4631}.Release|x86.ActiveCfg = Release|Any CPU {B178CFA1-03F5-45F0-ACDC-33149B2D4631}.Release|x86.Build.0 = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|ARM.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|iPhone.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|x64.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|x64.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|x86.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.AppStore|x86.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|ARM.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|ARM.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|iPhone.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|x64.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|x64.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Debug|x86.Build.0 = Debug|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|Any CPU.Build.0 = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|ARM.ActiveCfg = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|ARM.Build.0 = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|iPhone.ActiveCfg = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|iPhone.Build.0 = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|x64.ActiveCfg = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|x64.Build.0 = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|x86.ActiveCfg = Release|Any CPU + {7A4B7977-1B25-419A-8650-8585FD905704}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -410,6 +460,7 @@ Global {D9038F52-052B-4BA4-996B-5E1A073E3D6E} = {BA8C912C-D3EF-4D6A-BC69-16F090E4B883} {0C515BB1-FBC2-42E0-97D0-3726F952FE0A} = {BA8C912C-D3EF-4D6A-BC69-16F090E4B883} {B178CFA1-03F5-45F0-ACDC-33149B2D4631} = {DB2232B2-90AB-47FF-93B1-1E2BF0BCF26C} + {7A4B7977-1B25-419A-8650-8585FD905704} = {BA8C912C-D3EF-4D6A-BC69-16F090E4B883} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {561CF308-A484-4BB3-8BF9-89B0BF76F460}