Browse Source

Improved (?) IsPointerOver calculation.

pull/4/head
Steven Kirk 12 years ago
parent
commit
4d480e3aa2
  1. 16
      Perspex/Input/InputManager.cs
  2. 21
      Perspex/VisualExtensions.cs

16
Perspex/Input/InputManager.cs

@ -6,11 +6,15 @@
namespace Perspex.Input
{
using System.Collections.Generic;
using System.Linq;
using Perspex.Controls;
using Perspex.Input.Raw;
public class InputManager : IInputManager
{
List<Control> pointerOvers = new List<Control>();
public void Process(RawInputEventArgs e)
{
RawMouseEventArgs mouse = e as RawMouseEventArgs;
@ -39,16 +43,18 @@ namespace Perspex.Input
private void MouseMove(IVisual visual, Point p)
{
Control control = visual as Control;
IEnumerable<IVisual> hits = visual.GetVisualsAt(p);
if (control != null)
foreach (var control in this.pointerOvers.ToList().Except(hits).Cast<Control>())
{
control.IsPointerOver = visual.Bounds.Contains(p);
this.pointerOvers.Remove(control);
control.IsPointerOver = false;
}
foreach (IVisual child in visual.VisualChildren)
foreach (var control in hits.Except(this.pointerOvers).Cast<Control>())
{
this.MouseMove(child, p - visual.Bounds.Position);
this.pointerOvers.Add(control);
control.IsPointerOver = true;
}
}

21
Perspex/VisualExtensions.cs

@ -62,29 +62,30 @@ namespace Perspex
{
Contract.Requires<NullReferenceException>(visual != null);
return visual.GetVisualsAt(p).LastOrDefault();
}
public static IEnumerable<IVisual> GetVisualsAt(this IVisual visual, Point p)
{
Contract.Requires<NullReferenceException>(visual != null);
if (visual.Bounds.Contains(p))
{
yield return visual;
p -= visual.Bounds.Position;
if (visual.VisualChildren.Any())
{
foreach (IVisual child in visual.VisualChildren)
{
IVisual hit = child.GetVisualAt(p);
if (hit != null)
foreach (IVisual v in child.GetVisualsAt(p))
{
return hit;
yield return v;
}
}
}
else
{
return visual;
}
}
return null;
}
public static IEnumerable<IVisual> GetVisualDescendents(this IVisual visual)

Loading…
Cancel
Save