From 1a8f2f7f354084f130bcad5d7e393b4434e34fc4 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 18 Dec 2020 20:56:58 -0500 Subject: [PATCH 1/5] Add tapped event args --- src/Avalonia.Input/Gestures.cs | 20 +++++---- src/Avalonia.Input/InputElement.cs | 8 ++-- src/Avalonia.Input/TappedGestureEventArgs.cs | 44 ++++++++++++++++++++ 3 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 src/Avalonia.Input/TappedGestureEventArgs.cs diff --git a/src/Avalonia.Input/Gestures.cs b/src/Avalonia.Input/Gestures.cs index 1be2595ebe..8d7a02f12e 100644 --- a/src/Avalonia.Input/Gestures.cs +++ b/src/Avalonia.Input/Gestures.cs @@ -6,17 +6,17 @@ namespace Avalonia.Input { public static class Gestures { - public static readonly RoutedEvent TappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent TappedEvent = RoutedEvent.Register( "Tapped", RoutingStrategies.Bubble, typeof(Gestures)); - public static readonly RoutedEvent DoubleTappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent DoubleTappedEvent = RoutedEvent.Register( "DoubleTapped", RoutingStrategies.Bubble, typeof(Gestures)); - public static readonly RoutedEvent RightTappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent RightTappedEvent = RoutedEvent.Register( "RightTapped", RoutingStrategies.Bubble, typeof(Gestures)); @@ -24,7 +24,7 @@ namespace Avalonia.Input public static readonly RoutedEvent ScrollGestureEvent = RoutedEvent.Register( "ScrollGesture", RoutingStrategies.Bubble, typeof(Gestures)); - + public static readonly RoutedEvent ScrollGestureEndedEvent = RoutedEvent.Register( "ScrollGestureEnded", RoutingStrategies.Bubble, typeof(Gestures)); @@ -89,7 +89,7 @@ namespace Avalonia.Input { if (s_lastPress.TryGetTarget(out var target) && target == e.Source) { - e.Source.RaiseEvent(new RoutedEventArgs(DoubleTappedEvent)); + e.Source.RaiseEvent(new DoubleTappedEventArgs(e)); } } } @@ -105,8 +105,14 @@ namespace Avalonia.Input { if (e.InitialPressMouseButton == MouseButton.Left || e.InitialPressMouseButton == MouseButton.Right) { - var et = e.InitialPressMouseButton != MouseButton.Right ? TappedEvent : RightTappedEvent; - e.Source.RaiseEvent(new RoutedEventArgs(et)); + if (e.InitialPressMouseButton != MouseButton.Right) + { + e.Source.RaiseEvent(new RightTappedEventArgs(e)); + } + else + { + e.Source.RaiseEvent(new TappedEventArgs(e)); + } } } } diff --git a/src/Avalonia.Input/InputElement.cs b/src/Avalonia.Input/InputElement.cs index f3996cea76..e0594b5ce6 100644 --- a/src/Avalonia.Input/InputElement.cs +++ b/src/Avalonia.Input/InputElement.cs @@ -176,12 +176,12 @@ namespace Avalonia.Input /// /// Defines the event. /// - public static readonly RoutedEvent TappedEvent = Gestures.TappedEvent; + public static readonly RoutedEvent TappedEvent = Gestures.TappedEvent; /// /// Defines the event. /// - public static readonly RoutedEvent DoubleTappedEvent = Gestures.DoubleTappedEvent; + public static readonly RoutedEvent DoubleTappedEvent = Gestures.DoubleTappedEvent; private bool _isEffectivelyEnabled = true; private bool _isFocused; @@ -346,7 +346,7 @@ namespace Avalonia.Input /// /// Occurs when a tap gesture occurs on the control. /// - public event EventHandler Tapped + public event EventHandler Tapped { add { AddHandler(TappedEvent, value); } remove { RemoveHandler(TappedEvent, value); } @@ -355,7 +355,7 @@ namespace Avalonia.Input /// /// Occurs when a double-tap gesture occurs on the control. /// - public event EventHandler DoubleTapped + public event EventHandler DoubleTapped { add { AddHandler(DoubleTappedEvent, value); } remove { RemoveHandler(DoubleTappedEvent, value); } diff --git a/src/Avalonia.Input/TappedGestureEventArgs.cs b/src/Avalonia.Input/TappedGestureEventArgs.cs new file mode 100644 index 0000000000..bed76f5abd --- /dev/null +++ b/src/Avalonia.Input/TappedGestureEventArgs.cs @@ -0,0 +1,44 @@ +using Avalonia.Interactivity; +using Avalonia.VisualTree; + +namespace Avalonia.Input +{ + public class DoubleTappedEventArgs : RoutedEventArgs + { + private readonly PointerEventArgs lastPointerEventArgs; + + public DoubleTappedEventArgs(PointerEventArgs lastPointerEventArgs) + : base(Gestures.DoubleTappedEvent) + { + this.lastPointerEventArgs = lastPointerEventArgs; + } + + public Point GetPosition(IVisual? relativeTo) => lastPointerEventArgs.GetPosition(relativeTo); + } + + public class TappedEventArgs : RoutedEventArgs + { + private readonly PointerEventArgs lastPointerEventArgs; + + public TappedEventArgs(PointerEventArgs lastPointerEventArgs) + : base(Gestures.DoubleTappedEvent) + { + this.lastPointerEventArgs = lastPointerEventArgs; + } + + public Point GetPosition(IVisual? relativeTo) => lastPointerEventArgs.GetPosition(relativeTo); + } + + public class RightTappedEventArgs : RoutedEventArgs + { + private readonly PointerEventArgs lastPointerEventArgs; + + public RightTappedEventArgs(PointerEventArgs lastPointerEventArgs) + : base(Gestures.DoubleTappedEvent) + { + this.lastPointerEventArgs = lastPointerEventArgs; + } + + public Point GetPosition(IVisual? relativeTo) => lastPointerEventArgs.GetPosition(relativeTo); + } +} From f7a41c079333afdbb37e24ad8572b23873751e04 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sat, 23 Jan 2021 19:18:36 -0500 Subject: [PATCH 2/5] Use single TappedEventArgs for all tapped events --- src/Avalonia.Input/Gestures.cs | 10 ++--- src/Avalonia.Input/InputElement.cs | 4 +- src/Avalonia.Input/TappedEventArgs.cs | 18 ++++++++ src/Avalonia.Input/TappedGestureEventArgs.cs | 44 -------------------- 4 files changed, 25 insertions(+), 51 deletions(-) create mode 100644 src/Avalonia.Input/TappedEventArgs.cs delete mode 100644 src/Avalonia.Input/TappedGestureEventArgs.cs diff --git a/src/Avalonia.Input/Gestures.cs b/src/Avalonia.Input/Gestures.cs index 8d7a02f12e..f5499c12f3 100644 --- a/src/Avalonia.Input/Gestures.cs +++ b/src/Avalonia.Input/Gestures.cs @@ -11,12 +11,12 @@ namespace Avalonia.Input RoutingStrategies.Bubble, typeof(Gestures)); - public static readonly RoutedEvent DoubleTappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent DoubleTappedEvent = RoutedEvent.Register( "DoubleTapped", RoutingStrategies.Bubble, typeof(Gestures)); - public static readonly RoutedEvent RightTappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent RightTappedEvent = RoutedEvent.Register( "RightTapped", RoutingStrategies.Bubble, typeof(Gestures)); @@ -89,7 +89,7 @@ namespace Avalonia.Input { if (s_lastPress.TryGetTarget(out var target) && target == e.Source) { - e.Source.RaiseEvent(new DoubleTappedEventArgs(e)); + e.Source.RaiseEvent(new TappedEventArgs(DoubleTappedEvent, e)); } } } @@ -107,11 +107,11 @@ namespace Avalonia.Input { if (e.InitialPressMouseButton != MouseButton.Right) { - e.Source.RaiseEvent(new RightTappedEventArgs(e)); + e.Source.RaiseEvent(new TappedEventArgs(RightTappedEvent, e)); } else { - e.Source.RaiseEvent(new TappedEventArgs(e)); + e.Source.RaiseEvent(new TappedEventArgs(TappedEvent, e)); } } } diff --git a/src/Avalonia.Input/InputElement.cs b/src/Avalonia.Input/InputElement.cs index e0594b5ce6..8f99770b3b 100644 --- a/src/Avalonia.Input/InputElement.cs +++ b/src/Avalonia.Input/InputElement.cs @@ -181,7 +181,7 @@ namespace Avalonia.Input /// /// Defines the event. /// - public static readonly RoutedEvent DoubleTappedEvent = Gestures.DoubleTappedEvent; + public static readonly RoutedEvent DoubleTappedEvent = Gestures.DoubleTappedEvent; private bool _isEffectivelyEnabled = true; private bool _isFocused; @@ -355,7 +355,7 @@ namespace Avalonia.Input /// /// Occurs when a double-tap gesture occurs on the control. /// - public event EventHandler DoubleTapped + public event EventHandler DoubleTapped { add { AddHandler(DoubleTappedEvent, value); } remove { RemoveHandler(DoubleTappedEvent, value); } diff --git a/src/Avalonia.Input/TappedEventArgs.cs b/src/Avalonia.Input/TappedEventArgs.cs new file mode 100644 index 0000000000..02add509cd --- /dev/null +++ b/src/Avalonia.Input/TappedEventArgs.cs @@ -0,0 +1,18 @@ +using Avalonia.Interactivity; +using Avalonia.VisualTree; + +namespace Avalonia.Input +{ + public class TappedEventArgs : RoutedEventArgs + { + private readonly PointerEventArgs lastPointerEventArgs; + + public TappedEventArgs(RoutedEvent routedEvent, PointerEventArgs lastPointerEventArgs) + : base(routedEvent) + { + this.lastPointerEventArgs = lastPointerEventArgs; + } + + public Point GetPosition(IVisual? relativeTo) => lastPointerEventArgs.GetPosition(relativeTo); + } +} diff --git a/src/Avalonia.Input/TappedGestureEventArgs.cs b/src/Avalonia.Input/TappedGestureEventArgs.cs deleted file mode 100644 index bed76f5abd..0000000000 --- a/src/Avalonia.Input/TappedGestureEventArgs.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Avalonia.Interactivity; -using Avalonia.VisualTree; - -namespace Avalonia.Input -{ - public class DoubleTappedEventArgs : RoutedEventArgs - { - private readonly PointerEventArgs lastPointerEventArgs; - - public DoubleTappedEventArgs(PointerEventArgs lastPointerEventArgs) - : base(Gestures.DoubleTappedEvent) - { - this.lastPointerEventArgs = lastPointerEventArgs; - } - - public Point GetPosition(IVisual? relativeTo) => lastPointerEventArgs.GetPosition(relativeTo); - } - - public class TappedEventArgs : RoutedEventArgs - { - private readonly PointerEventArgs lastPointerEventArgs; - - public TappedEventArgs(PointerEventArgs lastPointerEventArgs) - : base(Gestures.DoubleTappedEvent) - { - this.lastPointerEventArgs = lastPointerEventArgs; - } - - public Point GetPosition(IVisual? relativeTo) => lastPointerEventArgs.GetPosition(relativeTo); - } - - public class RightTappedEventArgs : RoutedEventArgs - { - private readonly PointerEventArgs lastPointerEventArgs; - - public RightTappedEventArgs(PointerEventArgs lastPointerEventArgs) - : base(Gestures.DoubleTappedEvent) - { - this.lastPointerEventArgs = lastPointerEventArgs; - } - - public Point GetPosition(IVisual? relativeTo) => lastPointerEventArgs.GetPosition(relativeTo); - } -} From e0d7841b58483b9e43fc175ce9b39ce13a77135e Mon Sep 17 00:00:00 2001 From: Max Katz Date: Tue, 26 Jan 2021 00:36:22 -0500 Subject: [PATCH 3/5] Fix right/left tapped raise event --- src/Avalonia.Input/Gestures.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Input/Gestures.cs b/src/Avalonia.Input/Gestures.cs index f5499c12f3..f2cc9e9072 100644 --- a/src/Avalonia.Input/Gestures.cs +++ b/src/Avalonia.Input/Gestures.cs @@ -105,7 +105,7 @@ namespace Avalonia.Input { if (e.InitialPressMouseButton == MouseButton.Left || e.InitialPressMouseButton == MouseButton.Right) { - if (e.InitialPressMouseButton != MouseButton.Right) + if (e.InitialPressMouseButton == MouseButton.Right) { e.Source.RaiseEvent(new TappedEventArgs(RightTappedEvent, e)); } From e750512a4ba9dc07b5e020747dbd3fab163e6c3f Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sun, 28 Mar 2021 19:21:02 -0400 Subject: [PATCH 4/5] Update API contract --- src/Avalonia.Input/ApiCompatBaseline.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Input/ApiCompatBaseline.txt b/src/Avalonia.Input/ApiCompatBaseline.txt index fff2fb2806..98eb8598d8 100644 --- a/src/Avalonia.Input/ApiCompatBaseline.txt +++ b/src/Avalonia.Input/ApiCompatBaseline.txt @@ -1,4 +1,13 @@ Compat issues with assembly Avalonia.Input: MembersMustExist : Member 'public Avalonia.Platform.IPlatformHandle Avalonia.Input.Cursor.PlatformCursor.get()' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.Gestures.DoubleTappedEvent' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.Gestures.RightTappedEvent' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.Gestures.TappedEvent' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.InputElement.DoubleTappedEvent' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.InputElement.TappedEvent' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public void Avalonia.Input.InputElement.add_DoubleTapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public void Avalonia.Input.InputElement.add_Tapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public void Avalonia.Input.InputElement.remove_DoubleTapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. +MembersMustExist : Member 'public void Avalonia.Input.InputElement.remove_Tapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. TypesMustExist : Type 'Avalonia.Platform.IStandardCursorFactory' does not exist in the implementation but it does exist in the contract. -Total Issues: 2 +Total Issues: 11 From 6c608c6d0d67a8da67b030c7b2fe25992811e940 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 29 Mar 2021 22:33:56 -0400 Subject: [PATCH 5/5] Avoid breaking changes for next release --- src/Avalonia.Input/ApiCompatBaseline.txt | 11 +---------- src/Avalonia.Input/Gestures.cs | 6 +++--- src/Avalonia.Input/InputElement.cs | 8 ++++---- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/Avalonia.Input/ApiCompatBaseline.txt b/src/Avalonia.Input/ApiCompatBaseline.txt index 98eb8598d8..fff2fb2806 100644 --- a/src/Avalonia.Input/ApiCompatBaseline.txt +++ b/src/Avalonia.Input/ApiCompatBaseline.txt @@ -1,13 +1,4 @@ Compat issues with assembly Avalonia.Input: MembersMustExist : Member 'public Avalonia.Platform.IPlatformHandle Avalonia.Input.Cursor.PlatformCursor.get()' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.Gestures.DoubleTappedEvent' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.Gestures.RightTappedEvent' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.Gestures.TappedEvent' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.InputElement.DoubleTappedEvent' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public Avalonia.Interactivity.RoutedEvent Avalonia.Interactivity.RoutedEvent Avalonia.Input.InputElement.TappedEvent' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public void Avalonia.Input.InputElement.add_DoubleTapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public void Avalonia.Input.InputElement.add_Tapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public void Avalonia.Input.InputElement.remove_DoubleTapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. -MembersMustExist : Member 'public void Avalonia.Input.InputElement.remove_Tapped(System.EventHandler)' does not exist in the implementation but it does exist in the contract. TypesMustExist : Type 'Avalonia.Platform.IStandardCursorFactory' does not exist in the implementation but it does exist in the contract. -Total Issues: 11 +Total Issues: 2 diff --git a/src/Avalonia.Input/Gestures.cs b/src/Avalonia.Input/Gestures.cs index f2cc9e9072..60b6b9e947 100644 --- a/src/Avalonia.Input/Gestures.cs +++ b/src/Avalonia.Input/Gestures.cs @@ -6,17 +6,17 @@ namespace Avalonia.Input { public static class Gestures { - public static readonly RoutedEvent TappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent TappedEvent = RoutedEvent.Register( "Tapped", RoutingStrategies.Bubble, typeof(Gestures)); - public static readonly RoutedEvent DoubleTappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent DoubleTappedEvent = RoutedEvent.Register( "DoubleTapped", RoutingStrategies.Bubble, typeof(Gestures)); - public static readonly RoutedEvent RightTappedEvent = RoutedEvent.Register( + public static readonly RoutedEvent RightTappedEvent = RoutedEvent.Register( "RightTapped", RoutingStrategies.Bubble, typeof(Gestures)); diff --git a/src/Avalonia.Input/InputElement.cs b/src/Avalonia.Input/InputElement.cs index 8f99770b3b..f3996cea76 100644 --- a/src/Avalonia.Input/InputElement.cs +++ b/src/Avalonia.Input/InputElement.cs @@ -176,12 +176,12 @@ namespace Avalonia.Input /// /// Defines the event. /// - public static readonly RoutedEvent TappedEvent = Gestures.TappedEvent; + public static readonly RoutedEvent TappedEvent = Gestures.TappedEvent; /// /// Defines the event. /// - public static readonly RoutedEvent DoubleTappedEvent = Gestures.DoubleTappedEvent; + public static readonly RoutedEvent DoubleTappedEvent = Gestures.DoubleTappedEvent; private bool _isEffectivelyEnabled = true; private bool _isFocused; @@ -346,7 +346,7 @@ namespace Avalonia.Input /// /// Occurs when a tap gesture occurs on the control. /// - public event EventHandler Tapped + public event EventHandler Tapped { add { AddHandler(TappedEvent, value); } remove { RemoveHandler(TappedEvent, value); } @@ -355,7 +355,7 @@ namespace Avalonia.Input /// /// Occurs when a double-tap gesture occurs on the control. /// - public event EventHandler DoubleTapped + public event EventHandler DoubleTapped { add { AddHandler(DoubleTappedEvent, value); } remove { RemoveHandler(DoubleTappedEvent, value); }