Browse Source

Merge pull request #8599 from jinek/fixes/scene-hittest-exclusive

Scene hittest now uses exclusive `Rect.Contains`. Fixes https://githu
pull/8699/head
Max Katz 4 years ago
committed by Steven Kirk
parent
commit
dfabf4df64
  1. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/ExperimentalAcrylicNode.cs
  2. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/GlyphRunNode.cs
  3. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs
  4. 4
      src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs
  5. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs
  6. 32
      tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs

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

@ -83,7 +83,7 @@ namespace Avalonia.Rendering.SceneGraph
if (Material != null)
{
var rect = Rect.Rect;
return rect.Contains(p);
return rect.ContainsExclusive(p);
}
}

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

@ -76,6 +76,6 @@ namespace Avalonia.Rendering.SceneGraph
}
/// <inheritdoc/>
public override bool HitTest(Point p) => Bounds.Contains(p);
public override bool HitTest(Point p) => Bounds.ContainsExclusive(p);
}
}

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

@ -109,7 +109,7 @@ namespace Avalonia.Rendering.SceneGraph
}
/// <inheritdoc/>
public override bool HitTest(Point p) => Bounds.Contains(p);
public override bool HitTest(Point p) => Bounds.ContainsExclusive(p);
public override void Dispose()
{

4
src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs

@ -106,13 +106,13 @@ namespace Avalonia.Rendering.SceneGraph
if (Brush != null)
{
var rect = Rect.Rect.Inflate((Pen?.Thickness / 2) ?? 0);
return rect.Contains(p);
return rect.ContainsExclusive(p);
}
else
{
var borderRect = Rect.Rect.Inflate((Pen?.Thickness / 2) ?? 0);
var emptyRect = Rect.Rect.Deflate((Pen?.Thickness / 2) ?? 0);
return borderRect.Contains(p) && !emptyRect.Contains(p);
return borderRect.ContainsExclusive(p) && !emptyRect.ContainsExclusive(p);
}
}

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

@ -301,7 +301,7 @@ namespace Avalonia.Rendering.SceneGraph
if (node.ClipToBounds)
{
clip = clip == null ? node.ClipBounds : clip.Value.Intersect(node.ClipBounds);
clipped = !clip.Value.Contains(_point);
clipped = !clip.Value.ContainsExclusive(_point);
}
if (node.GeometryClip != null)

32
tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs

@ -538,6 +538,38 @@ namespace Avalonia.Visuals.UnitTests.Rendering
}
}
[Fact]
public void HitTest_Should_Not_Hit_Controls_Next_Pixel()
{
using (TestApplication())
{
Border targetRectangle;
var root = new TestRoot
{
Width = 50,
Height = 200,
Child = new StackPanel
{
Orientation = Orientation.Vertical,
HorizontalAlignment = HorizontalAlignment.Left,
Children =
{
new Border { Width = 50, Height = 50, Background = Brushes.Red},
{ targetRectangle = new Border { Width = 50, Height = 50, Background = Brushes.Green} }
}
}
};
root.Renderer = new DeferredRenderer(root, null);
root.Measure(Size.Infinity);
root.Arrange(new Rect(root.DesiredSize));
var result = root.Renderer.HitTest(new Point(25, 50), root, null);
Assert.Equal(new[] { targetRectangle }, result);
}
}
private IDisposable TestApplication()
{
return UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);

Loading…
Cancel
Save