src/FingersDance.GestureControl/GestureControl.cs
author PAMPHILE Jonathan <pamphile@efrei.fr>
Mon, 26 Oct 2009 09:27:23 +0100
changeset 174 45c9e55fcf23
child 176 0896f36b9d57
permissions -rw-r--r--
Gesture Control
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
174
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     1
using System;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     2
using System.Collections.Generic;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     3
using System.Linq;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     4
using System.Diagnostics;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     5
using System.Text;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     6
using System.Windows;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     7
using System.Windows.Controls;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     8
using System.Windows.Data;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
     9
using System.Windows.Documents;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    10
using System.Windows.Input;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    11
using System.Windows.Media;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    12
using System.Windows.Media.Imaging;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    13
using System.Windows.Media.Animation;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    14
using System.Windows.Navigation;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    15
using System.Windows.Shapes;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    16
using Microsoft.Surface;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    17
using Microsoft.Surface.Presentation;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    18
using Microsoft.Surface.Presentation.Controls;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    19
using System.Windows.Ink;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    20
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    21
namespace GestureControl
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    22
{
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    23
    public class GestureControl : ContentControl
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    24
    {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    25
        private double angle = 0;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    26
        public static readonly DependencyProperty GestureProperty;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    27
        public String Gesture
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    28
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    29
            get { return (String)GetValue(GestureControl.GestureProperty); }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    30
            set { SetValue(GestureControl.GestureProperty, value); }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    31
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    32
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    33
        #region GestureEvent
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    34
        public delegate void GestureRoutedEventHandler(object sender, GestureRoutedEventArgs e);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    35
        public static readonly RoutedEvent gestureEvent = EventManager.RegisterRoutedEvent(
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    36
            "GestureEvent", RoutingStrategy.Bubble, typeof(GestureRoutedEventHandler), typeof(GestureControl));
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    37
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    38
        public event GestureRoutedEventHandler GestureEvent
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    39
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    40
            add { AddHandler(gestureEvent, value); }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    41
            remove { RemoveHandler(gestureEvent, value); }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    42
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    43
        protected virtual void RaiseGestureEvent(String gesture)
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    44
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    45
            try
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    46
            {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    47
                GestureRoutedEventArgs newEventArgs = new GestureRoutedEventArgs(GestureControl.gestureEvent, gesture);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    48
                RaiseEvent(newEventArgs);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    49
            }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    50
            catch (Exception e) { }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    51
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    52
        #endregion
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    53
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    54
        static GestureControl()
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    55
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    56
            DefaultStyleKeyProperty.OverrideMetadata(typeof(GestureControl), new FrameworkPropertyMetadata(typeof(GestureControl)));
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    57
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    58
            GestureControl.GestureProperty = DependencyProperty.Register("Gesture", typeof(String), typeof(GestureControl),
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    59
                    new FrameworkPropertyMetadata("None", new PropertyChangedCallback(OnGestureChanged)));
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    60
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    61
        private static void OnGestureChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    62
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    63
            //Debug.WriteLine("changed", "Gesture");
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    64
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    65
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    66
        protected override void OnInitialized(EventArgs e)
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    67
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    68
            base.OnInitialized(e);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    69
            this.InitializeControl();
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    70
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    71
        protected void InitializeControl()
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    72
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    73
           base.AddHandler(SurfaceControl.PreviewContactDownEvent, new RoutedEventHandler(AreaDown));
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    74
           base.AddHandler(SurfaceInkCanvas.StrokeCollectedEvent, new RoutedEventHandler(AreaStrokeCollected));
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    75
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    76
        // get angle from the first contact of the stroke
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    77
        protected void AreaDown(object source, RoutedEventArgs e)
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    78
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    79
            ContactEventArgs c = (ContactEventArgs)e;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    80
            this.angle = c.Contact.GetOrientation(this) - 270;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    81
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    82
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    83
        protected void AreaStrokeCollected(object source, RoutedEventArgs e)
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    84
        {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    85
            Debug.WriteLine("collected", "Stroke");
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    86
            System.Windows.Controls.InkCanvasStrokeCollectedEventArgs tmp = e as System.Windows.Controls.InkCanvasStrokeCollectedEventArgs;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    87
            // Apply a rotation with the angle of the first contact
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    88
            Matrix rot = Matrix.Identity;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    89
            rot.Rotate(-this.angle);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    90
            Stroke s = tmp.Stroke;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    91
            s.Transform(rot, true);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    92
            // Get a list of point from a Bezier curve
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    93
            StylusPointCollection tmp2 = s.GetBezierStylusPoints();
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    94
            // Generate a list of SurfaceGesturePoint, just X and Y but can be improve
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    95
            List<SurfaceGesturePoint> pointList = new List<SurfaceGesturePoint>();
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    96
            foreach (StylusPoint p in tmp2)
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    97
                pointList.Add(new SurfaceGesturePoint { X = p.X, Y = p.Y });
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    98
            // create the gesture analyser and set the list
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
    99
            SurfaceGesture gesture = new SurfaceGesture(pointList, 1);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   100
            // try to get a pattern from the list, if one, raise a event
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   101
            this.Gesture = gesture.GetPattern();
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   102
            if (this.Gesture != "None")
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   103
            {
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   104
                this.RaiseGestureEvent(this.Gesture);
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   105
            }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   106
            // clear the stroke
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   107
            SurfaceInkCanvas ink = e.OriginalSource as SurfaceInkCanvas;
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   108
            ink.Strokes.Clear();
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   109
        }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   110
    }
45c9e55fcf23 Gesture Control
PAMPHILE Jonathan <pamphile@efrei.fr>
parents:
diff changeset
   111
}