Browse Source

Started adding mouse capture.

Not yet released properly.
pull/4/head
Steven Kirk 12 years ago
parent
commit
162f918059
  1. 5
      Perspex.Windows/Input/MouseDevice.cs
  2. 5
      Perspex/Classes.cs
  3. 10
      Perspex/Controls/Button.cs
  4. 1
      Perspex/Input/IInputManager.cs
  5. 4
      Perspex/Input/IPointerDevice.cs
  6. 55
      Perspex/Input/InputManager.cs

5
Perspex.Windows/Input/MouseDevice.cs

@ -12,16 +12,15 @@ namespace Perspex.Windows.Input
public class MouseDevice : IMouseDevice
{
public IVisual Captured
public Interactive Captured
{
get;
private set;
}
public IDisposable Capture(IVisual visual)
public void Capture(Interactive visual)
{
this.Captured = visual;
return Disposable.Create(() => this.Captured = null);
}
}
}

5
Perspex/Classes.cs

@ -128,6 +128,11 @@ namespace Perspex
return inner.GetEnumerator();
}
public override string ToString()
{
return string.Join(" ", this);
}
IEnumerator IEnumerable.GetEnumerator()
{
return inner.GetEnumerator();

10
Perspex/Controls/Button.cs

@ -12,15 +12,17 @@ namespace Perspex.Controls
{
public Button()
{
this.GetObservable(PointerPressedEvent).Subscribe(e =>
this.PointerPressed += (s, e) =>
{
this.Classes.Add(":pressed");
});
e.Device.Capture(this);
};
this.GetObservable(PointerReleasedEvent).Subscribe(e =>
this.PointerReleased += (s, e) =>
{
e.Device.Capture(null);
this.Classes.Remove(":pressed");
});
};
}
}
}

1
Perspex/Input/IInputManager.cs

@ -7,6 +7,7 @@
namespace Perspex.Input
{
using Perspex.Input.Raw;
using Perspex.Layout;
public interface IInputManager
{

4
Perspex/Input/IPointerDevice.cs

@ -10,8 +10,8 @@ namespace Perspex.Input
public interface IPointerDevice : IInputDevice
{
IVisual Captured { get; }
Interactive Captured { get; }
IDisposable Capture(IVisual visual);
void Capture(Interactive visual);
}
}

55
Perspex/Input/InputManager.cs

@ -43,34 +43,37 @@ namespace Perspex.Input
private void MouseMove(IMouseDevice device, IVisual visual, Point p)
{
IEnumerable<IVisual> hits = visual.GetVisualsAt(p);
foreach (var control in this.pointerOvers.ToList().Except(hits).Cast<Control>())
if (device.Captured == null)
{
PointerEventArgs e = new PointerEventArgs
IEnumerable<IVisual> hits = visual.GetVisualsAt(p);
foreach (var control in this.pointerOvers.ToList().Except(hits).Cast<Control>())
{
RoutedEvent = Control.PointerLeaveEvent,
Device = device,
OriginalSource = control,
Source = control,
};
this.pointerOvers.Remove(control);
control.RaiseEvent(e);
}
PointerEventArgs e = new PointerEventArgs
{
RoutedEvent = Control.PointerLeaveEvent,
Device = device,
OriginalSource = control,
Source = control,
};
foreach (var control in hits.Except(this.pointerOvers).Cast<Control>())
{
PointerEventArgs e = new PointerEventArgs
this.pointerOvers.Remove(control);
control.RaiseEvent(e);
}
foreach (var control in hits.Except(this.pointerOvers).Cast<Control>())
{
RoutedEvent = Control.PointerEnterEvent,
Device = device,
OriginalSource = control,
Source = control,
};
this.pointerOvers.Add(control);
control.RaiseEvent(e);
PointerEventArgs e = new PointerEventArgs
{
RoutedEvent = Control.PointerEnterEvent,
Device = device,
OriginalSource = control,
Source = control,
};
this.pointerOvers.Add(control);
control.RaiseEvent(e);
}
}
}
@ -80,7 +83,7 @@ namespace Perspex.Input
if (hit != null)
{
Interactive source = (hit as Interactive) ?? hit.GetVisualAncestor<Interactive>();
Interactive source = device.Captured ?? (hit as Interactive) ?? hit.GetVisualAncestor<Interactive>();
if (source != null)
{
@ -101,7 +104,7 @@ namespace Perspex.Input
if (hit != null)
{
Interactive source = (hit as Interactive) ?? hit.GetVisualAncestor<Interactive>();
Interactive source = device.Captured ?? (hit as Interactive) ?? hit.GetVisualAncestor<Interactive>();
if (source != null)
{

Loading…
Cancel
Save