From 41e9999ae76d8a1245ace66abc93fd53decb2eb6 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 27 Jul 2019 15:27:31 +0200 Subject: [PATCH 1/6] Move MouseTestHelper to Avalonia.UnitTests. --- tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs | 2 +- .../Primitives/SelectingItemsControlTests_Multiple.cs | 2 +- .../Avalonia.Interactivity.UnitTests.csproj | 2 +- tests/Avalonia.Interactivity.UnitTests/GestureTests.cs | 2 +- .../MouseTestHelper.cs | 3 +-- 5 files changed, 5 insertions(+), 6 deletions(-) rename tests/{Avalonia.Controls.UnitTests => Avalonia.UnitTests}/MouseTestHelper.cs (98%) diff --git a/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs b/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs index 2a61ff1566..27ddd95d20 100644 --- a/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs +++ b/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs @@ -9,8 +9,8 @@ using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Input; using Avalonia.LogicalTree; -using Avalonia.Markup.Data; using Avalonia.Styling; +using Avalonia.UnitTests; using Avalonia.VisualTree; using Xunit; diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs index 4bcfeb6d03..be0f4272a5 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs @@ -13,7 +13,7 @@ using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Input; using Avalonia.Interactivity; -using Avalonia.Markup.Data; +using Avalonia.UnitTests; using Xunit; namespace Avalonia.Controls.UnitTests.Primitives diff --git a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj index 7316b1de3d..2bde78ad63 100644 --- a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj +++ b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj @@ -20,7 +20,7 @@ - + diff --git a/tests/Avalonia.Interactivity.UnitTests/GestureTests.cs b/tests/Avalonia.Interactivity.UnitTests/GestureTests.cs index 69bdf58f9d..a37a2450d1 100644 --- a/tests/Avalonia.Interactivity.UnitTests/GestureTests.cs +++ b/tests/Avalonia.Interactivity.UnitTests/GestureTests.cs @@ -3,8 +3,8 @@ using System.Collections.Generic; using Avalonia.Controls; -using Avalonia.Controls.UnitTests; using Avalonia.Input; +using Avalonia.UnitTests; using Xunit; namespace Avalonia.Interactivity.UnitTests diff --git a/tests/Avalonia.Controls.UnitTests/MouseTestHelper.cs b/tests/Avalonia.UnitTests/MouseTestHelper.cs similarity index 98% rename from tests/Avalonia.Controls.UnitTests/MouseTestHelper.cs rename to tests/Avalonia.UnitTests/MouseTestHelper.cs index 373bbaed75..00ad850cf8 100644 --- a/tests/Avalonia.Controls.UnitTests/MouseTestHelper.cs +++ b/tests/Avalonia.UnitTests/MouseTestHelper.cs @@ -1,9 +1,8 @@ -using System.Reactive; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.VisualTree; -namespace Avalonia.Controls.UnitTests +namespace Avalonia.UnitTests { public class MouseTestHelper { From 2c9114d2a2b5fac6ef046588ff4aefea319e0f56 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 27 Jul 2019 15:37:13 +0200 Subject: [PATCH 2/6] Moved gesture tests to Avalonia.Input. As `Gestures` is defined here, not in Avalonia.Interactivity. --- .../GesturesTests.cs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tests/{Avalonia.Interactivity.UnitTests/GestureTests.cs => Avalonia.Input.UnitTests/GesturesTests.cs} (99%) diff --git a/tests/Avalonia.Interactivity.UnitTests/GestureTests.cs b/tests/Avalonia.Input.UnitTests/GesturesTests.cs similarity index 99% rename from tests/Avalonia.Interactivity.UnitTests/GestureTests.cs rename to tests/Avalonia.Input.UnitTests/GesturesTests.cs index a37a2450d1..fdd6487c53 100644 --- a/tests/Avalonia.Interactivity.UnitTests/GestureTests.cs +++ b/tests/Avalonia.Input.UnitTests/GesturesTests.cs @@ -9,7 +9,7 @@ using Xunit; namespace Avalonia.Interactivity.UnitTests { - public class GestureTests + public class GesturesTests { private MouseTestHelper _mouse = new MouseTestHelper(); From 5e2b3c56e6001b7afba4bbfcc61d712773423bf7 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 27 Jul 2019 16:01:18 +0200 Subject: [PATCH 3/6] Update tests for #2730. --- .../Avalonia.Input.UnitTests/GesturesTests.cs | 137 ++++++++++++++---- 1 file changed, 108 insertions(+), 29 deletions(-) diff --git a/tests/Avalonia.Input.UnitTests/GesturesTests.cs b/tests/Avalonia.Input.UnitTests/GesturesTests.cs index fdd6487c53..97940423a7 100644 --- a/tests/Avalonia.Input.UnitTests/GesturesTests.cs +++ b/tests/Avalonia.Input.UnitTests/GesturesTests.cs @@ -23,12 +23,7 @@ namespace Avalonia.Interactivity.UnitTests }; var result = new List(); - decorator.AddHandler(Border.PointerPressedEvent, (s, e) => result.Add("dp")); - decorator.AddHandler(Border.PointerReleasedEvent, (s, e) => result.Add("dr")); - decorator.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("dt")); - border.AddHandler(Border.PointerPressedEvent, (s, e) => result.Add("bp")); - border.AddHandler(Border.PointerReleasedEvent, (s, e) => result.Add("br")); - border.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("bt")); + AddHandlers(decorator, border, result, false); _mouse.Click(border); @@ -36,7 +31,7 @@ namespace Avalonia.Interactivity.UnitTests } [Fact] - public void Tapped_Should_Be_Raised_Even_When_PointerPressed_Handled() + public void Tapped_Should_Be_Raised_Even_When_Pressed_Released_Handled() { Border border = new Border(); var decorator = new Decorator @@ -45,13 +40,45 @@ namespace Avalonia.Interactivity.UnitTests }; var result = new List(); - border.AddHandler(Border.PointerPressedEvent, (s, e) => e.Handled = true); - decorator.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("dt")); - border.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("bt")); + AddHandlers(decorator, border, result, true); _mouse.Click(border); - Assert.Equal(new[] { "bt", "dt" }, result); + Assert.Equal(new[] { "bp", "dp", "br", "dr", "bt", "dt" }, result); + } + + [Fact] + public void Tapped_Should_Be_Raised_For_Middle_Button() + { + Border border = new Border(); + var decorator = new Decorator + { + Child = border + }; + var raised = false; + + decorator.AddHandler(Gestures.TappedEvent, (s, e) => raised = true); + + _mouse.Click(border, MouseButton.Middle); + + Assert.True(raised); + } + + [Fact] + public void Tapped_Should_Not_Be_Raised_For_Right_Button() + { + Border border = new Border(); + var decorator = new Decorator + { + Child = border + }; + var raised = false; + + decorator.AddHandler(Gestures.TappedEvent, (s, e) => raised = true); + + _mouse.Click(border, MouseButton.Right); + + Assert.False(raised); } [Fact] @@ -64,14 +91,7 @@ namespace Avalonia.Interactivity.UnitTests }; var result = new List(); - decorator.AddHandler(Border.PointerPressedEvent, (s, e) => result.Add("dp")); - decorator.AddHandler(Border.PointerReleasedEvent, (s, e) => result.Add("dr")); - decorator.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("dt")); - decorator.AddHandler(Gestures.DoubleTappedEvent, (s, e) => result.Add("ddt")); - border.AddHandler(Border.PointerPressedEvent, (s, e) => result.Add("bp")); - border.AddHandler(Border.PointerReleasedEvent, (s, e) => result.Add("br")); - border.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("bt")); - border.AddHandler(Gestures.DoubleTappedEvent, (s, e) => result.Add("bdt")); + AddHandlers(decorator, border, result, false); _mouse.Click(border); _mouse.Down(border, clickCount: 2); @@ -80,7 +100,7 @@ namespace Avalonia.Interactivity.UnitTests } [Fact] - public void DoubleTapped_Should_Not_Be_Rasied_if_Pressed_is_Handled() + public void DoubleTapped_Should_Be_Raised_Even_When_Pressed_Released_Handled() { Border border = new Border(); var decorator = new Decorator @@ -89,24 +109,83 @@ namespace Avalonia.Interactivity.UnitTests }; var result = new List(); + AddHandlers(decorator, border, result, true); + + _mouse.Click(border); + _mouse.Down(border, clickCount: 2); + + Assert.Equal(new[] { "bp", "dp", "br", "dr", "bt", "dt", "bp", "dp", "bdt", "ddt" }, result); + } + + [Fact] + public void DoubleTapped_Should_Be_Raised_For_Middle_Button() + { + Border border = new Border(); + var decorator = new Decorator + { + Child = border + }; + var raised = false; + + decorator.AddHandler(Gestures.DoubleTappedEvent, (s, e) => raised = true); + + _mouse.Click(border, MouseButton.Middle); + _mouse.Down(border, MouseButton.Middle, clickCount: 2); + + Assert.True(raised); + } + + [Fact] + public void DoubleTapped_Should_Not_Be_Raised_For_Right_Button() + { + Border border = new Border(); + var decorator = new Decorator + { + Child = border + }; + var raised = false; + + decorator.AddHandler(Gestures.DoubleTappedEvent, (s, e) => raised = true); + + _mouse.Click(border, MouseButton.Right); + _mouse.Down(border, MouseButton.Right, clickCount: 2); + + Assert.False(raised); + } + + private void AddHandlers( + Decorator decorator, + Border border, + IList result, + bool markHandled) + { decorator.AddHandler(Border.PointerPressedEvent, (s, e) => { result.Add("dp"); - e.Handled = true; + + if (markHandled) + { + e.Handled = true; + } + }); + + decorator.AddHandler(Border.PointerReleasedEvent, (s, e) => + { + result.Add("dr"); + + if (markHandled) + { + e.Handled = true; + } }); - decorator.AddHandler(Border.PointerReleasedEvent, (s, e) => result.Add("dr")); - decorator.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("dt")); - decorator.AddHandler(Gestures.DoubleTappedEvent, (s, e) => result.Add("ddt")); border.AddHandler(Border.PointerPressedEvent, (s, e) => result.Add("bp")); border.AddHandler(Border.PointerReleasedEvent, (s, e) => result.Add("br")); + + decorator.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("dt")); + decorator.AddHandler(Gestures.DoubleTappedEvent, (s, e) => result.Add("ddt")); border.AddHandler(Gestures.TappedEvent, (s, e) => result.Add("bt")); border.AddHandler(Gestures.DoubleTappedEvent, (s, e) => result.Add("bdt")); - - _mouse.Click(border); - _mouse.Down(border, clickCount: 2); - - Assert.Equal(new[] { "bp", "dp", "br", "dr", "bt", "dt", "bp", "dp" }, result); } } } From 6809fe11d23fe904eb43065b79d3ade16805028b Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 27 Jul 2019 16:04:57 +0200 Subject: [PATCH 4/6] Raise tap gestures even if press/release were handled. Also don't raised tapped events for right button clicks. Fixes #2730. --- src/Avalonia.Input/Gestures.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Input/Gestures.cs b/src/Avalonia.Input/Gestures.cs index 65195394ab..fa8fb8af31 100644 --- a/src/Avalonia.Input/Gestures.cs +++ b/src/Avalonia.Input/Gestures.cs @@ -46,7 +46,7 @@ namespace Avalonia.Input } else if (s_lastPress?.IsAlive == true && e.ClickCount == 2 && s_lastPress.Target == e.Source) { - if (!ev.Handled) + if (e.MouseButton != MouseButton.Right) { e.Source.RaiseEvent(new RoutedEventArgs(DoubleTappedEvent)); } @@ -62,7 +62,7 @@ namespace Avalonia.Input if (s_lastPress?.IsAlive == true && s_lastPress.Target == e.Source) { - if (!ev.Handled) + if (e.MouseButton != MouseButton.Right) { ((IInteractive)s_lastPress.Target).RaiseEvent(new RoutedEventArgs(TappedEvent)); } From d0a6f48015b97c9f8c86e1a43f4fb18a052aa4a0 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 27 Jul 2019 16:08:16 +0200 Subject: [PATCH 5/6] Added `Gestures.RightTapped`. --- src/Avalonia.Input/Gestures.cs | 11 +++++++---- tests/Avalonia.Input.UnitTests/GesturesTests.cs | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Input/Gestures.cs b/src/Avalonia.Input/Gestures.cs index fa8fb8af31..02dda45e99 100644 --- a/src/Avalonia.Input/Gestures.cs +++ b/src/Avalonia.Input/Gestures.cs @@ -18,6 +18,11 @@ namespace Avalonia.Input RoutingStrategies.Bubble, typeof(Gestures)); + public static readonly RoutedEvent RightTappedEvent = RoutedEvent.Register( + "RightTapped", + RoutingStrategies.Bubble, + typeof(Gestures)); + public static readonly RoutedEvent ScrollGestureEvent = RoutedEvent.Register( "ScrollGesture", RoutingStrategies.Bubble, typeof(Gestures)); @@ -62,10 +67,8 @@ namespace Avalonia.Input if (s_lastPress?.IsAlive == true && s_lastPress.Target == e.Source) { - if (e.MouseButton != MouseButton.Right) - { - ((IInteractive)s_lastPress.Target).RaiseEvent(new RoutedEventArgs(TappedEvent)); - } + var et = e.MouseButton != MouseButton.Right ? TappedEvent : RightTappedEvent; + ((IInteractive)s_lastPress.Target).RaiseEvent(new RoutedEventArgs(et)); } } } diff --git a/tests/Avalonia.Input.UnitTests/GesturesTests.cs b/tests/Avalonia.Input.UnitTests/GesturesTests.cs index 97940423a7..39c219a773 100644 --- a/tests/Avalonia.Input.UnitTests/GesturesTests.cs +++ b/tests/Avalonia.Input.UnitTests/GesturesTests.cs @@ -81,6 +81,23 @@ namespace Avalonia.Interactivity.UnitTests Assert.False(raised); } + [Fact] + public void RightTapped_Should_Be_Raised_For_Right_Button() + { + Border border = new Border(); + var decorator = new Decorator + { + Child = border + }; + var raised = false; + + decorator.AddHandler(Gestures.RightTappedEvent, (s, e) => raised = true); + + _mouse.Click(border, MouseButton.Right); + + Assert.True(raised); + } + [Fact] public void DoubleTapped_Should_Follow_Pointer_Pressed_Released_Pressed() { From 142ead4d39e553ccd77dd422215bd6e6b65416a1 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sun, 28 Jul 2019 22:25:23 +0200 Subject: [PATCH 6/6] Make tests compile on CI. --- tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj index f065fcb63d..ae901ca2f2 100644 --- a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj +++ b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj @@ -1,6 +1,7 @@  netstandard2.0 + latest false Library false