Browse Source

Added IInputRoot.PointerOverElement.

To track element currently under pointer on a window.
pull/120/head
Steven Kirk 11 years ago
parent
commit
f455d51520
  1. 15
      src/Perspex.Controls/TopLevel.cs
  2. 14
      src/Perspex.Diagnostics/DevTools.cs
  3. 16
      src/Perspex.Diagnostics/ViewModels/DevToolsViewModel.cs
  4. 5
      src/Perspex.Input/IInputRoot.cs
  5. 24
      src/Perspex.Input/MouseDevice.cs
  6. 4
      src/Perspex.Input/Raw/RawMouseEventArgs.cs
  7. 2
      src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs

15
src/Perspex.Controls/TopLevel.cs

@ -41,6 +41,12 @@ namespace Perspex.Controls
public static readonly PerspexProperty<bool> IsActiveProperty =
PerspexProperty.Register<TopLevel, bool>("IsActive");
/// <summary>
/// Defines the <see cref="IInputRoot.PointerOverElement"/> property.
/// </summary>
public static readonly PerspexProperty<IInputElement> PointerOverElementProperty =
PerspexProperty.Register<TopLevel, IInputElement>(nameof(IInputRoot.PointerOverElement));
/// <summary>
/// The dispatcher for the window.
/// </summary>
@ -240,6 +246,15 @@ namespace Perspex.Controls
get { return this.keyboardNavigationHandler; }
}
/// <summary>
/// Gets or sets the input element that the pointer is currently over.
/// </summary>
IInputElement IInputRoot.PointerOverElement
{
get { return this.GetValue(PointerOverElementProperty); }
set { this.SetValue(PointerOverElementProperty, value); }
}
/// <summary>
/// Gets or sets a value indicating whether access keys are shown in the window.
/// </summary>

14
src/Perspex.Diagnostics/DevTools.cs

@ -98,7 +98,19 @@ namespace Perspex.Diagnostics
},
new TextBlock
{
[!TextBlock.TextProperty] = this.viewModel.WhenAnyValue(x => x.FocusedControl).Select(x => x?.GetType().Name)
[!TextBlock.TextProperty] = this.viewModel
.WhenAnyValue(x => x.FocusedControl)
.Select(x => x?.GetType().Name ?? "(null)")
},
new TextBlock
{
Text = "Pointer Over: "
},
new TextBlock
{
[!TextBlock.TextProperty] = this.viewModel
.WhenAnyValue(x => x.PointerOverElement)
.Select(x => x?.GetType().Name ?? "(null)")
}
}
}

16
src/Perspex.Diagnostics/ViewModels/DevToolsViewModel.cs

@ -7,6 +7,7 @@
namespace Perspex.Diagnostics.ViewModels
{
using System;
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Input;
using ReactiveUI;
@ -21,6 +22,8 @@ namespace Perspex.Diagnostics.ViewModels
private ObservableAsPropertyHelper<IInputElement> focusedControl;
private ObservableAsPropertyHelper<IInputElement> pointerOverElement;
public DevToolsViewModel()
{
this.WhenAnyValue(x => x.Root).Subscribe(x =>
@ -29,8 +32,14 @@ namespace Perspex.Diagnostics.ViewModels
this.VisualTree = new VisualTreeViewModel(this.root);
});
this.focusedControl = KeyboardDevice.Instance.WhenAnyValue(x => x.FocusedElement)
this.focusedControl = KeyboardDevice.Instance
.WhenAnyValue(x => x.FocusedElement)
.ToProperty(this, x => x.FocusedControl);
this.pointerOverElement = this.WhenAnyValue(x => x.Root, x => x as TopLevel)
.Select(x => x != null ? x.GetObservable(TopLevel.PointerOverElementProperty) : Observable.Empty<IInputElement>())
.Switch()
.ToProperty(this, x => x.PointerOverElement);
}
public Control Root
@ -55,5 +64,10 @@ namespace Perspex.Diagnostics.ViewModels
{
get { return this.focusedControl.Value; }
}
public IInputElement PointerOverElement
{
get { return this.pointerOverElement.Value; }
}
}
}

5
src/Perspex.Input/IInputRoot.cs

@ -21,6 +21,11 @@ namespace Perspex.Input
/// </summary>
IKeyboardNavigationHandler KeyboardNavigationHandler { get; }
/// <summary>
/// Gets or sets the input element that the pointer is currently over.
/// </summary>
IInputElement PointerOverElement { get; set; }
/// <summary>
/// Gets or sets a value indicating whether access keys are shown in the window.
/// </summary>

24
src/Perspex.Input/MouseDevice.cs

@ -101,9 +101,9 @@ namespace Perspex.Input
}
}
private void LeaveWindow(IMouseDevice device, IInputElement root)
private void LeaveWindow(IMouseDevice device, IInputRoot root)
{
this.ClearPointerOver(this);
this.ClearPointerOver(this, root);
}
private void MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p)
@ -142,13 +142,13 @@ namespace Perspex.Input
}
}
private void MouseMove(IMouseDevice device, IInputElement root, Point p)
private void MouseMove(IMouseDevice device, IInputRoot root, Point p)
{
IInteractive source;
if (this.Captured == null)
{
this.SetPointerOver(this, root, p);
this.SetPointerOver(this, root, root, p);
source = root as IInteractive;
}
else
@ -160,7 +160,7 @@ namespace Perspex.Input
offset += ancestor.Bounds.Position;
}
this.SetPointerOver(this, this.Captured, p - offset);
this.SetPointerOver(this, root, this.Captured, p - offset);
source = this.Captured as IInteractive;
}
@ -175,7 +175,7 @@ namespace Perspex.Input
}
}
private void MouseUp(IMouseDevice device, IInputElement root, Point p)
private void MouseUp(IMouseDevice device, IInputRoot root, Point p)
{
var hit = this.HitTest(root, p);
@ -195,7 +195,7 @@ namespace Perspex.Input
}
}
private void MouseWheel(IMouseDevice device, IInputElement root, Point p, Vector delta)
private void MouseWheel(IMouseDevice device, IInputRoot root, Point p, Vector delta)
{
var hit = this.HitTest(root, p);
@ -228,7 +228,7 @@ namespace Perspex.Input
return this.Captured ?? root.InputHitTest(p);
}
private void ClearPointerOver(IPointerDevice device)
private void ClearPointerOver(IPointerDevice device, IInputRoot root)
{
foreach (var control in this.pointerOvers.ToList())
{
@ -242,9 +242,11 @@ namespace Perspex.Input
this.pointerOvers.Remove(control);
control.RaiseEvent(e);
}
root.PointerOverElement = null;
}
private void SetPointerOver(IPointerDevice device, IInputElement element, Point p)
private void SetPointerOver(IPointerDevice device, IInputRoot root, IInputElement element, Point p)
{
IEnumerable<IInputElement> hits = element.GetInputElementsAt(p);
@ -273,6 +275,10 @@ namespace Perspex.Input
this.pointerOvers.Add(control);
control.RaiseEvent(e);
}
System.Diagnostics.Debug.WriteLine(hits.FirstOrDefault());
root.PointerOverElement = hits.FirstOrDefault();
}
}
}

4
src/Perspex.Input/Raw/RawMouseEventArgs.cs

@ -22,7 +22,7 @@ namespace Perspex.Input.Raw
public RawMouseEventArgs(
IInputDevice device,
uint timestamp,
IInputElement root,
IInputRoot root,
RawMouseEventType type,
Point position)
: base(device, timestamp)
@ -35,7 +35,7 @@ namespace Perspex.Input.Raw
this.Type = type;
}
public IInputElement Root { get; private set; }
public IInputRoot Root { get; private set; }
public Point Position { get; private set; }

2
src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs

@ -14,7 +14,7 @@ namespace Perspex.Input.Raw
public RawMouseWheelEventArgs(
IInputDevice device,
uint timestamp,
IInputElement root,
IInputRoot root,
Point position,
Vector delta)
: base(device, timestamp, root, RawMouseEventType.Wheel, position)

Loading…
Cancel
Save