diff --git a/Perspex.Input/IInputManager.cs b/Perspex.Input/IInputManager.cs index c0af275865..53b6c0d96a 100644 --- a/Perspex.Input/IInputManager.cs +++ b/Perspex.Input/IInputManager.cs @@ -14,10 +14,6 @@ namespace Perspex.Input { IObservable RawEventReceived { get; } - void ClearPointerOver(IPointerDevice device); - void Process(RawInputEventArgs e); - - void SetPointerOver(IPointerDevice device, IInputElement element, Point p); } } diff --git a/Perspex.Input/InputManager.cs b/Perspex.Input/InputManager.cs index 4644eb75af..c565735fdc 100644 --- a/Perspex.Input/InputManager.cs +++ b/Perspex.Input/InputManager.cs @@ -11,72 +11,16 @@ namespace Perspex.Input using System.Linq; using System.Reactive.Subjects; using Perspex.Input.Raw; - using Perspex.VisualTree; + using Splat; public class InputManager : IInputManager { - private List pointerOvers = new List(); - private Subject rawEventReceived = new Subject(); - public IObservable RawEventReceived - { - get { return this.rawEventReceived; } - } - - public void ClearPointerOver(IPointerDevice device) - { - foreach (var control in this.pointerOvers.ToList()) - { - PointerEventArgs e = new PointerEventArgs - { - RoutedEvent = InputElement.PointerLeaveEvent, - Device = device, - OriginalSource = control, - Source = control, - }; - - this.pointerOvers.Remove(control); - control.RaiseEvent(e); - } - } - - public void Process(RawInputEventArgs e) - { - this.rawEventReceived.OnNext(e); - } - - public void SetPointerOver(IPointerDevice device, IInputElement element, Point p) - { - IEnumerable hits = element.GetInputElementsAt(p); - - foreach (var control in this.pointerOvers.Except(hits).ToList()) - { - PointerEventArgs e = new PointerEventArgs - { - RoutedEvent = InputElement.PointerLeaveEvent, - Device = device, - OriginalSource = control, - Source = control, - }; - - this.pointerOvers.Remove(control); - control.RaiseEvent(e); - } + public static IInputManager Instance => Locator.Current.GetService(); - foreach (var control in hits.Except(this.pointerOvers)) - { - PointerEventArgs e = new PointerEventArgs - { - RoutedEvent = InputElement.PointerEnterEvent, - Device = device, - OriginalSource = control, - Source = control, - }; + public IObservable RawEventReceived => this.rawEventReceived; - this.pointerOvers.Add(control); - control.RaiseEvent(e); - } - } + public void Process(RawInputEventArgs e) => this.rawEventReceived.OnNext(e); } } diff --git a/Perspex.Input/MouseDevice.cs b/Perspex.Input/MouseDevice.cs index 0b4b53f9e7..2be4ad6796 100644 --- a/Perspex.Input/MouseDevice.cs +++ b/Perspex.Input/MouseDevice.cs @@ -7,6 +7,7 @@ namespace Perspex.Input { using System; + using System.Collections.Generic; using System.Linq; using System.Reactive.Linq; using Perspex.Input.Raw; @@ -23,6 +24,8 @@ namespace Perspex.Input private uint lastClickTime; + private List pointerOvers = new List(); + public MouseDevice() { this.InputManager.RawEventReceived @@ -102,7 +105,7 @@ namespace Perspex.Input private void LeaveWindow(IMouseDevice device, IInputElement root) { - this.InputManager.ClearPointerOver(this); + this.ClearPointerOver(this); } private void MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p) @@ -155,7 +158,7 @@ namespace Perspex.Input if (this.Captured == null) { - this.InputManager.SetPointerOver(this, root, p); + this.SetPointerOver(this, root, p); source = root as IInteractive; } else @@ -167,7 +170,7 @@ namespace Perspex.Input offset += ancestor.Bounds.Position; } - this.InputManager.SetPointerOver(this, this.Captured, p - offset); + this.SetPointerOver(this, this.Captured, p - offset); source = this.Captured as IInteractive; } @@ -253,5 +256,55 @@ namespace Perspex.Input { return this.Captured ?? root.InputHitTest(p); } + + private void ClearPointerOver(IPointerDevice device) + { + foreach (var control in this.pointerOvers.ToList()) + { + PointerEventArgs e = new PointerEventArgs + { + RoutedEvent = InputElement.PointerLeaveEvent, + Device = device, + OriginalSource = control, + Source = control, + }; + + this.pointerOvers.Remove(control); + control.RaiseEvent(e); + } + } + + private void SetPointerOver(IPointerDevice device, IInputElement element, Point p) + { + IEnumerable hits = element.GetInputElementsAt(p); + + foreach (var control in this.pointerOvers.Except(hits).ToList()) + { + PointerEventArgs e = new PointerEventArgs + { + RoutedEvent = InputElement.PointerLeaveEvent, + Device = device, + OriginalSource = control, + Source = control, + }; + + this.pointerOvers.Remove(control); + control.RaiseEvent(e); + } + + foreach (var control in hits.Except(this.pointerOvers)) + { + PointerEventArgs e = new PointerEventArgs + { + RoutedEvent = InputElement.PointerEnterEvent, + Device = device, + OriginalSource = control, + Source = control, + }; + + this.pointerOvers.Add(control); + control.RaiseEvent(e); + } + } } }