Browse Source

Merge branch 'master' into fixes/1169-toggle-dropdown-open

pull/1217/head
danwalmsley 9 years ago
committed by GitHub
parent
commit
236bc4f1f6
  1. 4
      src/Avalonia.Controls/Control.cs
  2. 22
      src/Avalonia.Input/MouseDevice.cs
  3. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs
  4. 4
      src/Avalonia.Visuals/Visual.cs
  5. 19
      tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs

4
src/Avalonia.Controls/Control.cs

@ -656,7 +656,6 @@ namespace Avalonia.Controls
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
protected virtual void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) protected virtual void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
{ {
AttachedToLogicalTree?.Invoke(this, e);
} }
/// <summary> /// <summary>
@ -665,7 +664,6 @@ namespace Avalonia.Controls
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
protected virtual void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) protected virtual void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
{ {
DetachedFromLogicalTree?.Invoke(this, e);
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -842,6 +840,7 @@ namespace Avalonia.Controls
InitializeStylesIfNeeded(true); InitializeStylesIfNeeded(true);
OnAttachedToLogicalTree(e); OnAttachedToLogicalTree(e);
AttachedToLogicalTree?.Invoke(this, e);
} }
foreach (var child in LogicalChildren.OfType<Control>()) foreach (var child in LogicalChildren.OfType<Control>())
@ -862,6 +861,7 @@ namespace Avalonia.Controls
_isAttachedToLogicalTree = false; _isAttachedToLogicalTree = false;
_styleDetach.OnNext(this); _styleDetach.OnNext(this);
OnDetachedFromLogicalTree(e); OnDetachedFromLogicalTree(e);
DetachedFromLogicalTree?.Invoke(this, e);
foreach (var child in LogicalChildren.OfType<Control>()) foreach (var child in LogicalChildren.OfType<Control>())
{ {

22
src/Avalonia.Input/MouseDevice.cs

@ -20,6 +20,8 @@ namespace Avalonia.Input
private int _clickCount; private int _clickCount;
private Rect _lastClickRect; private Rect _lastClickRect;
private uint _lastClickTime; private uint _lastClickTime;
private IInputElement _captured;
private IDisposable _capturedSubscription;
/// <summary> /// <summary>
/// Gets the control that is currently capturing by the mouse, if any. /// Gets the control that is currently capturing by the mouse, if any.
@ -31,8 +33,23 @@ namespace Avalonia.Input
/// </remarks> /// </remarks>
public IInputElement Captured public IInputElement Captured
{ {
get; get => _captured;
protected set; protected set
{
_capturedSubscription?.Dispose();
_capturedSubscription = null;
if (value != null)
{
_capturedSubscription = Observable.FromEventPattern<VisualTreeAttachmentEventArgs>(
x => value.DetachedFromVisualTree += x,
x => value.DetachedFromVisualTree -= x)
.Take(1)
.Subscribe(_ => Captured = null);
}
_captured = value;
}
} }
/// <summary> /// <summary>
@ -55,6 +72,7 @@ namespace Avalonia.Input
/// </remarks> /// </remarks>
public virtual void Capture(IInputElement control) public virtual void Capture(IInputElement control)
{ {
// TODO: Check visibility and enabled state before setting capture.
Captured = control; Captured = control;
} }

2
src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs

@ -173,7 +173,7 @@ namespace Avalonia.Rendering.SceneGraph
} }
} }
if (node.HitTest(p)) if (node.HitTest(p) && node.Visual.IsAttachedToVisualTree)
{ {
yield return node.Visual; yield return node.Visual;
} }

4
src/Avalonia.Visuals/Visual.cs

@ -329,6 +329,7 @@ namespace Avalonia
} }
OnAttachedToVisualTree(e); OnAttachedToVisualTree(e);
AttachedToVisualTree?.Invoke(this, e);
InvalidateVisual(); InvalidateVisual();
if (VisualChildren != null) if (VisualChildren != null)
@ -357,6 +358,7 @@ namespace Avalonia
} }
OnDetachedFromVisualTree(e); OnDetachedFromVisualTree(e);
DetachedFromVisualTree?.Invoke(this, e);
e.Root?.Renderer?.AddDirty(this); e.Root?.Renderer?.AddDirty(this);
if (VisualChildren != null) if (VisualChildren != null)
@ -374,7 +376,6 @@ namespace Avalonia
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
protected virtual void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) protected virtual void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{ {
AttachedToVisualTree?.Invoke(this, e);
} }
/// <summary> /// <summary>
@ -383,7 +384,6 @@ namespace Avalonia
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
protected virtual void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) protected virtual void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{ {
DetachedFromVisualTree?.Invoke(this, e);
} }
/// <summary> /// <summary>

19
tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs

@ -1,6 +1,5 @@
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input.Raw; using Avalonia.Input.Raw;
using Avalonia.Layout;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Avalonia.VisualTree; using Avalonia.VisualTree;
@ -12,6 +11,24 @@ namespace Avalonia.Input.UnitTests
{ {
public class MouseDeviceTests public class MouseDeviceTests
{ {
[Fact]
public void Capture_Is_Cleared_When_Control_Removed()
{
Canvas control;
var root = new TestRoot
{
Child = control = new Canvas(),
};
var target = new MouseDevice();
target.Capture(control);
Assert.Same(control, target.Captured);
root.Child = null;
Assert.Null(target.Captured);
}
[Fact] [Fact]
public void MouseMove_Should_Update_PointerOver() public void MouseMove_Should_Update_PointerOver()
{ {

Loading…
Cancel
Save