Add Canvas Point API & TC 81/145081/1
authordarkleem <cdark.lim@samsung.com>
Mon, 21 Aug 2017 04:46:21 +0000 (13:46 +0900)
committerdarkleem <cdark.lim@samsung.com>
Mon, 21 Aug 2017 07:22:42 +0000 (16:22 +0900)
  - Required for Xamarin.PanGesture modification.

Change-Id: I13a28e53ab3c02c7c9faf0a1929a91d47791c68a
Signed-off-by: darkleem <cdark.lim@samsung.com>
src/ElmSharp/ElmSharp/EvasCanvas.cs
src/ElmSharp/Interop/Interop.Evas.cs
test/ElmSharp.Test/TC/GestureLayerTest2.cs [new file with mode: 0644]

index 6f778c6..6355890 100644 (file)
@@ -40,6 +40,20 @@ namespace ElmSharp
         }
 
         /// <summary>
+        /// Gets the current known default pointer coordinates.
+        /// This function returns the current known canvas unit coordinates of the mouse pointer.
+        /// </summary>
+        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 };
+            }
+        }
+
+        /// <summary>
         /// Gets or sets the image cache.
         /// This function returns the image cache size of canvas in bytes.
         /// </summary>
index 60e3d16..3dfd188 100644 (file)
@@ -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 (file)
index 0000000..37190b3
--- /dev/null
@@ -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<string> _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<string>();
+            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("<br>", _logEntries);
+        }
+    }
+}
\ No newline at end of file