示例#1
0
        private void Element_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs args)
        {
            var position = GetPosition(args);
            var buttons  = GetMouseButtons(args);
            var delta    = args.Delta;

            MouseWheel?.Invoke(this, new MouseWheelEventArgs(CurrentTime, position, PointerId.FromMouse(PointerId.MouseNoButton), buttons, delta));
        }
示例#2
0
        private void Element_MouseMove(object sender, MouseEventArgs args)
        {
            var buttons  = GetMouseButtons(args);
            var id       = buttons & FirstMouseButton;
            var position = GetPosition(args);

            PointerMove?.Invoke(this, new PointerEventArgs(CurrentTime, position, PointerId.FromMouse(id), buttons));
        }
示例#3
0
 internal void Init(PointerId pointerId, Vector2 origin, Vector2 position, TimeSpan time)
 {
     PointerId         = PointerId;
     Origin            = origin;
     Position          = position;
     Time              = time;
     Offset            = Vector2.Zero;
     PointerCapturedBy = null;
     Handled           = false;
 }
示例#4
0
        private void AnalizeMovement(PointerId pointerId, PointerDownElement pointer, Vector2 move, TimeSpan time)
        {
            Vector2 drag = pointer.Position - pointer.Origin;

            if ((pointer.LockedGesture & (GestureType.HorizontalDrag | GestureType.VerticalDrag | GestureType.Hold | GestureType.HoldStart | GestureType.Down)) == GestureType.None)
            {
                if (Math.Abs(drag.X) > MinDragSize && Math.Abs(drag.X) > Math.Abs(drag.Y))
                {
                    pointer.LockedGesture = GestureType.HorizontalDrag;
                    move = drag;
                }
                else if (Math.Abs(drag.Y) > MinDragSize && Math.Abs(drag.Y) > Math.Abs(drag.X))
                {
                    pointer.LockedGesture = GestureType.VerticalDrag;
                    move = drag;
                }
                else if (drag.Length() > MinDragSize)
                {
                    pointer.LockedGesture = GestureType.FreeDrag;
                    move = drag;
                }
            }

            if ((pointer.LockedGesture & GestureType.DragGestures) != GestureType.None)
            {
                var offset = move;

                if (pointer.LockedGesture.HasFlag(GestureType.HorizontalDrag))
                {
                    offset.Y = 0;
                }
                if (pointer.LockedGesture.HasFlag(GestureType.VerticalDrag))
                {
                    offset.X = 0;
                }

                var gesture = gesturesPool.Get();
                gesture.Init(pointerId, pointer.Origin, pointer.Position, time);
                gesture.GestureType = pointer.LockedGesture & GestureType.DragGestures;
                gesture.Offset      = offset;
                Publish(gesture);

                if (!pointer.LockedGesture.HasFlag(GestureType.FreeDrag))
                {
                    gesture = gesturesPool.Get();
                    gesture.Init(pointerId, pointer.Origin, pointer.Position, time);
                    gesture.GestureType = GestureType.FreeDrag;
                    gesture.Offset      = move;
                    Publish(gesture);
                }
            }
        }
示例#5
0
        private void Element_MouseDown(object sender, MouseButtonEventArgs args)
        {
            var id       = GetMouseButton(args);
            var buttons  = GetMouseButtons(args);
            var position = GetPosition(args);

            if (FirstMouseButton == 0)
            {
                FirstMouseButton = id;
            }

            PointerDown?.Invoke(this, new PointerEventArgs(CurrentTime, position, PointerId.FromMouse(id), buttons));
        }
示例#6
0
        private void AnalizeHolds(PointerId pointerId, PointerDownElement pointer, TimeSpan time)
        {
            Vector2 drag = pointer.Position - pointer.Origin;

            if (pointer.LockedGesture == GestureType.None && drag.Length() < MinDragSize)
            {
                TimeSpan elapsed = time - pointer.DownTime;

                if (elapsed > HoldStartTime)
                {
                    pointer.LockedGesture = GestureType.HoldStart;

                    var gesture = gesturesPool.Get();
                    gesture.Init(pointerId, pointer.Origin, pointer.Position, time);
                    gesture.GestureType = GestureType.HoldStart;

                    Publish(gesture);
                }
            }
            else if (pointer.LockedGesture == GestureType.HoldStart)
            {
                TimeSpan elapsed = time - pointer.DownTime;

                if (drag.Length() > MinDragSize)
                {
                    pointer.LockedGesture &= ~GestureType.HoldGestures;

                    var gesture = gesturesPool.Get();
                    gesture.Init(pointerId, pointer.Origin, pointer.Position, time);
                    gesture.GestureType = GestureType.HoldCancel;
                    Publish(gesture);
                    return;
                }

                if (elapsed > HoldTime)
                {
                    pointer.LockedGesture = GestureType.Hold;

                    var gesture = gesturesPool.Get();
                    gesture.Init(pointerId, pointer.Origin, pointer.Position, time);
                    gesture.GestureType = GestureType.Hold;

                    Publish(gesture);
                }
            }
        }
示例#7
0
        private void Element_MouseLeave(object sender, MouseEventArgs args)
        {
            var position = GetPosition(args);
            var buttons  = GetMouseButtons(args);

            if ((buttons & PointerId.MouseLeftButton) != 0)
            {
                PointerLost?.Invoke(this, new PointerEventArgs(CurrentTime, position, PointerId.FromMouse(PointerId.MouseLeftButton), buttons));
            }

            if ((buttons & PointerId.MouseRightButton) != 0)
            {
                PointerLost?.Invoke(this, new PointerEventArgs(CurrentTime, position, PointerId.FromMouse(PointerId.MouseRightButton), buttons));
            }

            if ((buttons & PointerId.MouseMiddleButton) != 0)
            {
                PointerLost?.Invoke(this, new PointerEventArgs(CurrentTime, position, PointerId.FromMouse(PointerId.MouseMiddleButton), buttons));
            }

            PointerLost?.Invoke(this, new PointerEventArgs(CurrentTime, position, PointerId.FromMouse(PointerId.MouseNoButton), buttons));
        }