// ----------------------------------------------------------------------- // // Copyright 2013 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Input { using Perspex.Controls; using Perspex.Input.Raw; public class InputManager : IInputManager { public void Process(RawInputEventArgs e) { RawMouseEventArgs mouse = e as RawMouseEventArgs; if (mouse != null) { this.ProcessMouse(mouse); } } private void ProcessMouse(RawMouseEventArgs e) { switch (e.Type) { case RawMouseEventType.Move: this.MouseMove((IVisual)e.Root, e.Position); break; case RawMouseEventType.LeftButtonDown: this.MouseDown((IMouseDevice)e.Device, (IVisual)e.Root, e.Position); break; case RawMouseEventType.LeftButtonUp: this.MouseUp((IMouseDevice)e.Device, (IVisual)e.Root, e.Position); break; } } private void MouseMove(IVisual visual, Point p) { Control control = visual as Control; if (control != null) { control.IsPointerOver = visual.Bounds.Contains(p); } foreach (IVisual child in visual.VisualChildren) { this.MouseMove(child, p - visual.Bounds.Position); } } private void MouseDown(IMouseDevice device, IVisual visual, Point p) { IVisual hit = visual.GetVisualAt(p); if (hit != null) { Interactive source = (hit as Interactive) ?? hit.GetVisualAncestor(); if (source != null) { source.RaiseEvent(new PointerEventArgs { Device = device, RoutedEvent = Control.PointerPressedEvent, OriginalSource = source, Source = source, }); } } } private void MouseUp(IMouseDevice device, IVisual visual, Point p) { IVisual hit = visual.GetVisualAt(p); if (hit != null) { Interactive source = (hit as Interactive) ?? hit.GetVisualAncestor(); if (source != null) { source.RaiseEvent(new PointerEventArgs { Device = device, RoutedEvent = Control.PointerReleasedEvent, OriginalSource = source, Source = source, }); } } } } }