Files
2025-07-14 12:03:59 +02:00

279 lines
8.1 KiB
C#

#region The MIT License (MIT)
//
// Copyright (c) 2011 Robert Prouse http://www.alteridem.net
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
// Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
#endregion
#region Using Directives
using System;
using System.Drawing;
#endregion
namespace MaterialSkin.Gesture
{
#region GestureEventArgs Class
/// <summary>
/// Base class for all the gesture based events
/// </summary>
public abstract class GestureEventArgs : EventArgs
{
internal GestureEventArgs( GestureInfo info )
{
Location = new Point( info.location.x, info.location.y );
Info = info;
Handled = true;
}
#region Helper Methods
protected static int LoDWord( IntPtr lParam )
{
return LoDWord( lParam.ToInt64() );
}
protected static int HiDWord( IntPtr lParam )
{
return HiDWord( lParam.ToInt64() );
}
protected static int LoDWord( long l )
{
return (int)(l & 0xFFFFFFFF);
}
protected static int HiDWord( long l )
{
return (int)((l >> 32) & 0xFFFFFFFF);
}
protected static short LoWord( int i )
{
return (short)(i & 0xFFFF);
}
protected static short HiWord( int i )
{
return (short)((i >> 16) & 0xFFFF);
}
#endregion
#region Properties
protected GestureInfo Info { get; set; }
/// <summary>
/// Gets the location of the gesture in Screen (not client) coordinates.
/// </summary>
public Point Location { get; private set; }
/// <summary>
/// Gets a value indicating whether this <see cref="GestureEventArgs"/> is beginning.
/// </summary>
public bool Begin
{
get { return Info.Begin; }
}
/// <summary>
/// Gets a value indicating whether this <see cref="GestureEventArgs"/> is ending
/// </summary>
public bool End
{
get { return Info.End; }
}
/// <summary>
/// Gets or sets a value indicating whether the window message was handled. Set this to false if you don't handle the message.
/// </summary>
public bool Handled { get; set; }
#endregion
}
#endregion
#region PanEventArgs Class
/// <summary>
/// Event for the Pan gesture
/// </summary>
public class PanEventArgs : GestureEventArgs
{
internal PanEventArgs( GestureInfo info, Point lastPanPoint )
: base( info )
{
int hiword = HiDWord( info.arguments );
InertiaVector = new Point( LoWord( hiword ), HiWord( hiword ) );
PanOffset = new Point( Location.X - lastPanPoint.X, Location.Y - lastPanPoint.Y );
}
/// <summary>
/// Gets a value indicating whether this <see cref="GestureEventArgs"/> has triggered inertia.
/// </summary>
public bool Inertia
{
get { return Info.Inertia; }
}
public Point InertiaVector { get; private set; }
/// <summary>
/// Gets the pan offset since the last pan message.
/// </summary>
public Point PanOffset { get; private set; }
}
#endregion
#region ZoomEventArgs Class
/// <summary>
/// Event for the Zoom gesture
/// </summary>
public class ZoomEventArgs : GestureEventArgs
{
internal ZoomEventArgs( GestureInfo info, long lastZoomDistance )
: base( info )
{
Distance = info.arguments;
PercentChange = (double)Distance / lastZoomDistance;
}
/// <summary>
/// Gets the distance between the two points as they are being zoomed.
/// </summary>
public long Distance { get; private set; }
/// <summary>
/// Gets the percent changed since the last zoom message
/// </summary>
public double PercentChange { get; private set; }
}
#endregion
#region PressAndTapEventArgs Class
/// <summary>
/// Event for the Press and Tap gesture
/// </summary>
public class PressAndTapEventArgs : GestureEventArgs
{
internal PressAndTapEventArgs( GestureInfo info )
: base( info )
{
int pointsStruct = LoDWord( info.arguments );
Distance = new Point( LoWord( pointsStruct ), HiWord( pointsStruct ) );
}
/// <summary>
/// Gets the distance between the two points.
/// </summary>
public Point Distance { get; private set; }
}
#endregion
#region RotateEventArgs Class
/// <summary>
/// Event for the Rotate gesture
/// </summary>
public class RotateEventArgs : GestureEventArgs
{
internal RotateEventArgs( GestureInfo info, double lastRotation )
: base( info )
{
int loword = LoDWord( info.arguments );
TotalAngle = RotateAngleFromArgument( loword );
Angle = TotalAngle - lastRotation;
string msg = string.Format("Total:{0} Angle:{1} Last:{2}", TotalAngle, Angle, lastRotation );
System.Diagnostics.Debug.WriteLine( msg );
}
/// <summary>
/// Gesture argument helper that converts an argument to a rotation angle.
/// </summary>
/// <param name="arg">The argument to convert. Should be an unsigned 16-bit value.</param>
/// <returns></returns>
private static double RotateAngleFromArgument( int arg )
{
return ((arg / 65535.0) * 4.0 * Math.PI) - 2.0 * Math.PI;
}
/// <summary>
/// Gets the angle of rotation in Radians since the beginning of the gesture
/// </summary>
public double TotalAngle { get; private set; }
/// <summary>
/// Gets the angle of rotation in Degrees since the beginning of the gesture
/// </summary>
public double TotalDegrees
{
get { return RadiandsToDegrees( TotalAngle ); }
}
/// <summary>
/// Gets the angle of rotation in Radians since the last rotation message
/// </summary>
public double Angle { get; private set; }
/// <summary>
/// Gets the angle of rotation in Degrees since the last rotation message
/// </summary>
public double Degrees
{
get { return RadiandsToDegrees( Angle ); }
}
private double RadiandsToDegrees( double radians )
{
return radians * 180.0 / Math.PI;
}
}
#endregion
#region TwoFingerTapEventArgs Class
/// <summary>
/// Base class for the Two Finger Tap gesture
/// </summary>
public class TwoFingerTapEventArgs : GestureEventArgs
{
internal TwoFingerTapEventArgs( GestureInfo info )
: base( info )
{
Distance = info.arguments;
}
/// <summary>
/// Gets the distance between the two points.
/// </summary>
public long Distance { get; private set; }
}
#endregion
}