Browse Source

Started adding mouse capture.

Not yet released properly.
pull/4/head
Steven Kirk 13 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 class MouseDevice : IMouseDevice
{ {
public IVisual Captured public Interactive Captured
{ {
get; get;
private set; private set;
} }
public IDisposable Capture(IVisual visual) public void Capture(Interactive visual)
{ {
this.Captured = visual; this.Captured = visual;
return Disposable.Create(() => this.Captured = null);
} }
} }
} }

5
Perspex/Classes.cs

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

10
Perspex/Controls/Button.cs

@ -12,15 +12,17 @@ namespace Perspex.Controls
{ {
public Button() public Button()
{ {
this.GetObservable(PointerPressedEvent).Subscribe(e => this.PointerPressed += (s, e) =>
{ {
this.Classes.Add(":pressed"); 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"); this.Classes.Remove(":pressed");
}); };
} }
} }
} }

1
Perspex/Input/IInputManager.cs

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

4
Perspex/Input/IPointerDevice.cs

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

Loading…
Cancel
Save