diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2016-02-13 18:10:23 +0100 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2016-03-01 05:01:44 +0100 |
| commit | fa6dd3d807f7c7c9292b5f4d5cc10406d10e173d (patch) | |
| tree | 27146a232022554983c8fa92f7be757554774e78 /src/Input/MouseEventArgs.cs | |
| parent | c7a9d36bd679f827b649e2b792465b127fd577d1 (diff) | |
base changed done, need mouse state to be updated
Diffstat (limited to 'src/Input/MouseEventArgs.cs')
| -rw-r--r-- | src/Input/MouseEventArgs.cs | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/src/Input/MouseEventArgs.cs b/src/Input/MouseEventArgs.cs new file mode 100644 index 00000000..758a5a69 --- /dev/null +++ b/src/Input/MouseEventArgs.cs @@ -0,0 +1,369 @@ +#region License +// +// MouseEventArgs.cs +// +// Author: +// Stefanos A. <stapostol@gmail.com> +// +// Copyright (c) 2006-2014 Stefanos Apostolopoulos +// +// 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 + +using System; +#if !MINIMAL +using System.Drawing; +#endif + +namespace Crow +{ + /// <summary> + /// Defines the event data for <see cref="MouseDevice"/> events. + /// </summary> + /// <remarks> + /// <para> + /// Do not cache instances of this type outside their event handler. + /// If necessary, you can clone an instance using the + /// <see cref="MouseEventArgs(MouseEventArgs)"/> constructor. + /// </para> + /// </remarks> + public class MouseEventArgs : EventArgs + { + #region Fields + + MouseState state; + + #endregion + + #region Constructors + + /// <summary> + /// Constructs a new instance. + /// </summary> + public MouseEventArgs() + { + state.SetIsConnected(true); + } + + /// <summary> + /// Constructs a new instance. + /// </summary> + /// <param name="x">The X position.</param> + /// <param name="y">The Y position.</param> + public MouseEventArgs(int x, int y) + : this() + { + state.X = x; + state.Y = y; + } + + /// <summary> + /// Constructs a new instance. + /// </summary> + /// <param name="args">The <see cref="MouseEventArgs"/> instance to clone.</param> + public MouseEventArgs(MouseEventArgs args) + : this(args.X, args.Y) + { + } + + #endregion + + #region Protected Members + + internal void SetButton(MouseButton button, ButtonState state) + { + if (button < 0 || button > MouseButton.LastButton) + throw new ArgumentOutOfRangeException(); + + switch (state) + { + case ButtonState.Pressed: + this.state.EnableBit((int)button); + break; + + case ButtonState.Released: + this.state.DisableBit((int)button); + break; + } + } + + internal ButtonState GetButton(MouseButton button) + { + if (button < 0 || button > MouseButton.LastButton) + throw new ArgumentOutOfRangeException(); + + return + state.ReadBit((int)button) ? + ButtonState.Pressed : ButtonState.Released; + } + + #endregion + + #region Public Members + + /// <summary> + /// Gets the X position of the mouse for the event. + /// </summary> + public int X { get { return state.X; } internal set { state.X = value; } } + + /// <summary> + /// Gets the Y position of the mouse for the event. + /// </summary> + public int Y { get { return state.Y; } internal set { state.Y = value; } } + + /// <summary> + /// Gets a <see cref="System.Drawing.Point"/> representing the location of the mouse for the event. + /// </summary> + public Point Position + { + get { return new Point(state.X, state.Y); } + set + { + X = value.X; + Y = value.Y; + } + } + + /// <summary> + /// Gets the current <see cref="OpenTK.Input.MouseState"/>. + /// </summary> + public MouseState Mouse + { + get { return state; } + internal set { state = value; } + } + + #endregion + } + + /// <summary> + /// Defines the event data for <see cref="MouseDevice.Move"/> events. + /// </summary> + /// <remarks> + /// <para> + /// Do not cache instances of this type outside their event handler. + /// If necessary, you can clone an instance using the + /// <see cref="MouseMoveEventArgs(MouseMoveEventArgs)"/> constructor. + /// </para> + /// </remarks> + public class MouseMoveEventArgs : MouseEventArgs + { + #region Fields + + int x_delta, y_delta; + + #endregion + + #region Constructors + + /// <summary> + /// Constructs a new <see cref="MouseMoveEventArgs"/> instance. + /// </summary> + public MouseMoveEventArgs() { } + + /// <summary> + /// Constructs a new <see cref="MouseMoveEventArgs"/> instance. + /// </summary> + /// <param name="x">The X position.</param> + /// <param name="y">The Y position.</param> + /// <param name="xDelta">The change in X position produced by this event.</param> + /// <param name="yDelta">The change in Y position produced by this event.</param> + public MouseMoveEventArgs(int x, int y, int xDelta, int yDelta) + : base(x, y) + { + XDelta = xDelta; + YDelta = yDelta; + } + + /// <summary> + /// Constructs a new <see cref="MouseMoveEventArgs"/> instance. + /// </summary> + /// <param name="args">The <see cref="MouseMoveEventArgs"/> instance to clone.</param> + public MouseMoveEventArgs(MouseMoveEventArgs args) + : this(args.X, args.Y, args.XDelta, args.YDelta) + { + } + + #endregion + + #region Public Members + + /// <summary> + /// Gets the change in X position produced by this event. + /// </summary> + public int XDelta { get { return x_delta; } internal set { x_delta = value; } } + + /// <summary> + /// Gets the change in Y position produced by this event. + /// </summary> + public int YDelta { get { return y_delta; } internal set { y_delta = value; } } + + #endregion + } + + /// <summary> + /// Defines the event data for <see cref="MouseDevice.ButtonDown"/> and <see cref="MouseDevice.ButtonUp"/> events. + /// </summary> + /// <remarks> + /// <para> + /// Do not cache instances of this type outside their event handler. + /// If necessary, you can clone an instance using the + /// <see cref="MouseButtonEventArgs(MouseButtonEventArgs)"/> constructor. + /// </para> + /// </remarks> + public class MouseButtonEventArgs : MouseEventArgs + { + #region Fields + + MouseButton button; + + #endregion + + #region Constructors + + /// <summary> + /// Constructs a new <see cref="MouseButtonEventArgs"/> instance. + /// </summary> + public MouseButtonEventArgs() { } + + /// <summary> + /// Constructs a new <see cref="MouseButtonEventArgs"/> instance. + /// </summary> + /// <param name="x">The X position.</param> + /// <param name="y">The Y position.</param> + /// <param name="button">The mouse button for the event.</param> + /// <param name="pressed">The current state of the button.</param> + public MouseButtonEventArgs(int x, int y, MouseButton button, bool pressed) + : base(x, y) + { + this.button = button; + this.IsPressed = pressed; + } + + /// <summary> + /// Constructs a new <see cref="MouseButtonEventArgs"/> instance. + /// </summary> + /// <param name="args">The <see cref="MouseButtonEventArgs"/> instance to clone.</param> + public MouseButtonEventArgs(MouseButtonEventArgs args) + : this(args.X, args.Y, args.Button, args.IsPressed) + { + } + + #endregion + + #region Public Members + + /// <summary> + /// Gets the <see cref="MouseButton"/> that triggered this event. + /// </summary> + public MouseButton Button { get { return button; } internal set { button = value; } } + + /// <summary> + /// Gets a System.Boolean representing the state of the mouse button for the event. + /// </summary> + public bool IsPressed + { + get { return GetButton(Button) == ButtonState.Pressed; } + internal set { SetButton(Button, value ? ButtonState.Pressed : ButtonState.Released); } + } + + #endregion + } + + /// <summary> + /// Defines the event data for <see cref="MouseDevice.WheelChanged"/> events. + /// </summary> + /// <remarks> + /// <para> + /// Do not cache instances of this type outside their event handler. + /// If necessary, you can clone an instance using the + /// <see cref="MouseWheelEventArgs(MouseWheelEventArgs)"/> constructor. + /// </para> + /// </remarks> + public class MouseWheelEventArgs : MouseEventArgs + { + #region Fields + + float delta; + + #endregion + + #region Constructors + + /// <summary> + /// Constructs a new <see cref="MouseWheelEventArgs"/> instance. + /// </summary> + public MouseWheelEventArgs() { } + + /// <summary> + /// Constructs a new <see cref="MouseWheelEventArgs"/> instance. + /// </summary> + /// <param name="x">The X position.</param> + /// <param name="y">The Y position.</param> + /// <param name="value">The value of the wheel.</param> + /// <param name="delta">The change in value of the wheel for this event.</param> + public MouseWheelEventArgs(int x, int y, int value, int delta) + : base(x, y) + { + Mouse.SetScrollAbsolute(Mouse.Scroll.X, value); + this.delta = delta; + } + + /// <summary> + /// Constructs a new <see cref="MouseWheelEventArgs"/> instance. + /// </summary> + /// <param name="args">The <see cref="MouseWheelEventArgs"/> instance to clone.</param> + public MouseWheelEventArgs(MouseWheelEventArgs args) + : this(args.X, args.Y, args.Value, args.Delta) + { + } + + #endregion + + #region Public Members + + /// <summary> + /// Gets the value of the wheel in integer units. + /// To support high-precision mice, it is recommended to use <see cref="ValuePrecise"/> instead. + /// </summary> + public int Value { get { return (int)Math.Round(Mouse.Scroll.Y, MidpointRounding.AwayFromZero); } } + + /// <summary> + /// Gets the change in value of the wheel for this event in integer units. + /// To support high-precision mice, it is recommended to use <see cref="DeltaPrecise"/> instead. + /// </summary> + public int Delta { get { return (int)Math.Round(delta, MidpointRounding.AwayFromZero); } } + + /// <summary> + /// Gets the precise value of the wheel in floating-point units. + /// </summary> + public float ValuePrecise + { + get { return Mouse.Scroll.Y; } + } + + /// <summary> + /// Gets the precise change in value of the wheel for this event in floating-point units. + /// </summary> + public float DeltaPrecise { get { return delta; } internal set { delta = value; } } + + #endregion + } +} |