From b4b21e315072091ecdaa1a97c6a1a34f9a4cf549 Mon Sep 17 00:00:00 2001 From: darkleem Date: Mon, 21 Aug 2017 13:46:21 +0900 Subject: [PATCH] Add Canvas Point API & TC - Required for Xamarin.PanGesture modification. Change-Id: I13a28e53ab3c02c7c9faf0a1929a91d47791c68a Signed-off-by: darkleem --- src/ElmSharp/ElmSharp/EvasCanvas.cs | 14 ++++ src/ElmSharp/Interop/Interop.Evas.cs | 5 +- test/ElmSharp.Test/TC/GestureLayerTest2.cs | 126 +++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 test/ElmSharp.Test/TC/GestureLayerTest2.cs diff --git a/src/ElmSharp/ElmSharp/EvasCanvas.cs b/src/ElmSharp/ElmSharp/EvasCanvas.cs index 6f778c6..6355890 100644 --- a/src/ElmSharp/ElmSharp/EvasCanvas.cs +++ b/src/ElmSharp/ElmSharp/EvasCanvas.cs @@ -40,6 +40,20 @@ namespace ElmSharp } /// + /// Gets the current known default pointer coordinates. + /// This function returns the current known canvas unit coordinates of the mouse pointer. + /// + public Point Pointer + { + get + { + int mx, my; + Interop.Evas.evas_pointer_canvas_xy_get(_handle, out mx, out my); + return new Point { X = mx, Y = my }; + } + } + + /// /// Gets or sets the image cache. /// This function returns the image cache size of canvas in bytes. /// diff --git a/src/ElmSharp/Interop/Interop.Evas.cs b/src/ElmSharp/Interop/Interop.Evas.cs index 60e3d16..3dfd188 100644 --- a/src/ElmSharp/Interop/Interop.Evas.cs +++ b/src/ElmSharp/Interop/Interop.Evas.cs @@ -465,6 +465,9 @@ internal static partial class Interop [DllImport(Libraries.Evas)] internal static extern void evas_image_cache_set(IntPtr obj, int size); + [DllImport(Libraries.Evas)] + internal static extern void evas_pointer_canvas_xy_get(IntPtr obj, out int mx, out int my); + [DllImport(Libraries.Evas, EntryPoint = "evas_load_error_str")] internal static extern IntPtr _evas_load_error_str(LoadError error); @@ -815,4 +818,4 @@ internal static partial class Interop evas_object_color_set(obj, r * a / 255, g * a / 255, b * a / 255, a); } } -} +} \ No newline at end of file diff --git a/test/ElmSharp.Test/TC/GestureLayerTest2.cs b/test/ElmSharp.Test/TC/GestureLayerTest2.cs new file mode 100644 index 0000000..37190b3 --- /dev/null +++ b/test/ElmSharp.Test/TC/GestureLayerTest2.cs @@ -0,0 +1,126 @@ +using System.Collections.Generic; + +namespace ElmSharp.Test +{ + class GestureLayerTest2 : TestCaseBase + { + public override string TestName => "GestureLayerTest2"; + public override string TestDescription => "GestureLayer feature : Momentum & Rotate Test."; + + private GestureLayer _glayer; + private Label _log; + private List _logEntries; + private Background _background; + private Rectangle _box1; + + int _angle = 0; + int _prevAngle = 0; + int _totalX = 0; + int _totalY = 0; + + public override void Run(Window window) + { + _background = new Background(window); + var windowSize = window.ScreenSize; + _background.Color = Color.White; + _background.Resize(windowSize.Width, windowSize.Height); + _background.Show(); + + _box1 = new Rectangle(window) + { + Color = Color.Yellow + }; + _box1.Resize(400, 600); + _box1.Move(160, 160); + _box1.Show(); + + _log = new Label(window); + _log.Resize(700, 1280 - 780); + _log.Move(10, 770); + _log.Show(); + _logEntries = new List(); + Log("Momentum & Roate Gesture Test."); + + _glayer = new GestureLayer(_box1); + _glayer.Attach(_box1); + + _glayer.RotateStep = 3; + _glayer.SetRotateCallback(GestureLayer.GestureState.Start, (rotate) => + { + _prevAngle = (int)rotate.BaseAngle; + }); + + _glayer.SetRotateCallback(GestureLayer.GestureState.Move, (rotate) => + { + if (_box1.IsMapEnabled) + { + _angle += (int)rotate.Angle - _prevAngle; + _prevAngle = (int)rotate.Angle; + Log($"@@ Rotation XY:({rotate.X},{rotate.Y}) a:{rotate.Angle:F2} ba:{rotate.BaseAngle:F2} total:{_angle}"); + ApplyTransformation(); + } + }); + + int prevX = 0, prevY = 0; + _glayer.SetMomentumCallback(GestureLayer.GestureState.Start, (data) => + { + if (data.FingersCount == 1) + { + prevX = _glayer.EvasCanvas.Pointer.X; + prevY = _glayer.EvasCanvas.Pointer.Y; + } + }); + _glayer.SetMomentumCallback(GestureLayer.GestureState.Move, (data) => + { + if (data.FingersCount == 1) + { + data.X2 = _glayer.EvasCanvas.Pointer.X; + data.Y2 = _glayer.EvasCanvas.Pointer.Y; + _totalX += (data.X2 - prevX); + _totalY += (data.Y2 - prevY); + prevX = data.X2; + prevY = data.Y2; + Log($"@@ Momentum X:({prevX},{data.X2}), Y({prevY},{data.Y2}) = Total:({(data.X2 - prevX)}, {(data.Y2 - prevY)})"); + ApplyTransformation(); + } + }); + _glayer.SetMomentumCallback(GestureLayer.GestureState.Abort, (data) => + { + Log($"@@ Momentum Abort"); + }); + _glayer.SetMomentumCallback(GestureLayer.GestureState.End, (data) => + { + Log($"@@ Momentum End"); + }); + } + + void ApplyTransformation() + { + EvasMap map = new EvasMap(4); + Rect geometry = _box1.Geometry; + map.PopulatePoints(geometry, 0); + + map.Rotate3D(0, 0, _angle, (int)(geometry.X + geometry.Width * 0.5), (int)(geometry.Y + geometry.Height * 0.5), 0); + + Point3D p; + for (int i = 0; i < 4; i++) + { + p = map.GetPointCoordinate(i); + p.X += _totalX; + p.Y += _totalY; + map.SetPointCoordinate(i, p); + } + _box1.EvasMap = map; + _box1.IsMapEnabled = true; + } + + private void Log(string format, params object[] args) + { + var entry = string.Format(format, args); + if (_logEntries.Count > 15) + _logEntries.RemoveRange(0, _logEntries.Count - 15); + _logEntries.Add(entry); + _log.Text = string.Join("
", _logEntries); + } + } +} \ No newline at end of file -- 2.7.4