Browse Source

Moved pointer over state to MouseDevice.

pull/39/head
Steven Kirk 11 years ago
parent
commit
535f8c38f1
  1. 4
      Perspex.Input/IInputManager.cs
  2. 64
      Perspex.Input/InputManager.cs
  3. 59
      Perspex.Input/MouseDevice.cs

4
Perspex.Input/IInputManager.cs

@ -14,10 +14,6 @@ namespace Perspex.Input
{
IObservable<RawInputEventArgs> RawEventReceived { get; }
void ClearPointerOver(IPointerDevice device);
void Process(RawInputEventArgs e);
void SetPointerOver(IPointerDevice device, IInputElement element, Point p);
}
}

64
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<IInputElement> pointerOvers = new List<IInputElement>();
private Subject<RawInputEventArgs> rawEventReceived = new Subject<RawInputEventArgs>();
public IObservable<RawInputEventArgs> 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<IInputElement> 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<IInputManager>();
foreach (var control in hits.Except(this.pointerOvers))
{
PointerEventArgs e = new PointerEventArgs
{
RoutedEvent = InputElement.PointerEnterEvent,
Device = device,
OriginalSource = control,
Source = control,
};
public IObservable<RawInputEventArgs> RawEventReceived => this.rawEventReceived;
this.pointerOvers.Add(control);
control.RaiseEvent(e);
}
}
public void Process(RawInputEventArgs e) => this.rawEventReceived.OnNext(e);
}
}

59
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<IInputElement> pointerOvers = new List<IInputElement>();
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<IInputElement> 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);
}
}
}
}

Loading…
Cancel
Save