From 3c4b8cdf908629a52c1fa7f18264c3bdd42ada7d Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 8 Jul 2016 19:09:54 +0200 Subject: [PATCH] Implement input hit testing on top of visual layer. --- src/Avalonia.Input/InputExtensions.cs | 60 ++++----------------------- 1 file changed, 7 insertions(+), 53 deletions(-) diff --git a/src/Avalonia.Input/InputExtensions.cs b/src/Avalonia.Input/InputExtensions.cs index 35ffeca7bb..01098e754e 100644 --- a/src/Avalonia.Input/InputExtensions.cs +++ b/src/Avalonia.Input/InputExtensions.cs @@ -25,28 +25,7 @@ namespace Avalonia.Input { Contract.Requires(element != null); - if (element.IsVisible && - element.IsHitTestVisible && - element.IsEnabledCore) - { - bool containsPoint = BoundsTracker.GetTransformedBounds((Visual)element).Contains(p); - - if ((containsPoint || !element.ClipToBounds) && element.VisualChildren.Any()) - { - foreach (var child in ZSort(element.VisualChildren.OfType())) - { - foreach (var result in child.GetInputElementsAt(p)) - { - yield return result; - } - } - } - - if (containsPoint) - { - yield return element; - } - } + return element.GetVisualsAt(p, IsHitTestVisible).Cast(); } /// @@ -60,38 +39,13 @@ namespace Avalonia.Input return element.GetInputElementsAt(p).FirstOrDefault(); } - private static IEnumerable ZSort(IEnumerable elements) + private static bool IsHitTestVisible(IVisual visual) { - return elements - .Select((element, index) => new ZOrderElement - { - Element = element, - Index = index, - ZIndex = element.ZIndex, - }) - .OrderBy(x => x, null) - .Select(x => x.Element); - } - - private class ZOrderElement : IComparable - { - public IInputElement Element { get; set; } - public int Index { get; set; } - public int ZIndex { get; set; } - - public int CompareTo(ZOrderElement other) - { - var z = other.ZIndex - ZIndex; - - if (z != 0) - { - return z; - } - else - { - return other.Index - Index; - } - } + var element = visual as IInputElement; + return element != null && + element.IsVisible && + element.IsHitTestVisible && + element.IsEnabledCore; } } } \ No newline at end of file