Skip to content

Commit 228deef

Browse files
committed
Create MauiGestureRecognizerEventsBinder.cs
1 parent 7386f11 commit 228deef

File tree

1 file changed

+210
-0
lines changed

1 file changed

+210
-0
lines changed
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
namespace Sentry.Maui.Internal;
2+
3+
/// <summary>
4+
/// Binds to
5+
/// </summary>
6+
public class MauiGestureRecognizerEventsBinder : IMauiElementEventBinder
7+
{
8+
private Action<BreadcrumbEvent> _addBreadcrumb = null!;
9+
10+
/// <summary>
11+
/// Searches VisualElement for gesture recognizers to bind to
12+
/// </summary>
13+
public void Bind(VisualElement element, Action<BreadcrumbEvent> addBreadcrumb)
14+
{
15+
_addBreadcrumb ??= addBreadcrumb;
16+
if (element is IGestureRecognizers recognizers)
17+
{
18+
foreach (var recognizer in recognizers.GestureRecognizers)
19+
{
20+
SetHooks(recognizer, true);
21+
}
22+
}
23+
}
24+
25+
26+
/// <summary>
27+
/// Searches VisualElement for gesture recognizers to unbind from
28+
/// </summary>
29+
/// <param name="element"></param>
30+
public void UnBind(VisualElement element)
31+
{
32+
if (element is IGestureRecognizers recognizers)
33+
{
34+
foreach (var recognizer in recognizers.GestureRecognizers)
35+
{
36+
SetHooks(recognizer, false);
37+
}
38+
}
39+
}
40+
41+
42+
void SetHooks(IGestureRecognizer recognizer, bool add)
43+
{
44+
switch (recognizer)
45+
{
46+
case TapGestureRecognizer tap:
47+
if (add)
48+
{
49+
tap.Tapped += OnTapGesture;
50+
}
51+
else
52+
{
53+
tap.Tapped -= OnTapGesture;
54+
}
55+
break;
56+
57+
case SwipeGestureRecognizer swipe:
58+
if (add)
59+
{
60+
swipe.Swiped += OnSwipeGesture;
61+
}
62+
else
63+
{
64+
swipe.Swiped -= OnSwipeGesture;
65+
}
66+
break;
67+
68+
case PinchGestureRecognizer pinch:
69+
if (add)
70+
{
71+
pinch.PinchUpdated += OnPinchGesture;
72+
}
73+
else
74+
{
75+
pinch.PinchUpdated -= OnPinchGesture;
76+
}
77+
break;
78+
79+
case DragGestureRecognizer drag:
80+
if (add)
81+
{
82+
drag.DragStarting += OnDragStartingGesture;
83+
drag.DropCompleted += OnDropCompletedGesture;
84+
}
85+
else
86+
{
87+
drag.DragStarting -= OnDragStartingGesture;
88+
drag.DropCompleted -= OnDropCompletedGesture;
89+
}
90+
break;
91+
92+
case PanGestureRecognizer pan:
93+
if (add)
94+
{
95+
pan.PanUpdated += OnPanGesture;
96+
}
97+
else
98+
{
99+
pan.PanUpdated -= OnPanGesture;
100+
}
101+
break;
102+
103+
case PointerGestureRecognizer pointer:
104+
if (add)
105+
{
106+
pointer.PointerEntered += OnPointerEnteredGesture;
107+
pointer.PointerExited += OnPointerExitedGesture;
108+
pointer.PointerMoved += OnPointerMovedGesture;
109+
pointer.PointerPressed += OnPointerPressedGesture;
110+
pointer.PointerReleased += OnPointerReleasedGesture;
111+
}
112+
else
113+
{
114+
pointer.PointerEntered -= OnPointerEnteredGesture;
115+
pointer.PointerExited -= OnPointerExitedGesture;
116+
pointer.PointerMoved -= OnPointerMovedGesture;
117+
pointer.PointerPressed -= OnPointerPressedGesture;
118+
pointer.PointerReleased -= OnPointerReleasedGesture;
119+
}
120+
break;
121+
}
122+
}
123+
124+
private void OnPointerReleasedGesture(object? sender, PointerEventArgs e) => _addBreadcrumb.Invoke(new(
125+
sender,
126+
nameof(PointerGestureRecognizer.PointerReleased),
127+
ToPointerData(e)
128+
));
129+
130+
private void OnPointerPressedGesture(object? sender, PointerEventArgs e) => _addBreadcrumb.Invoke(new(
131+
sender,
132+
nameof(PointerGestureRecognizer.PointerPressed),
133+
ToPointerData(e)
134+
));
135+
136+
private void OnPointerMovedGesture(object? sender, PointerEventArgs e) => _addBreadcrumb.Invoke(new(
137+
sender,
138+
nameof(PointerGestureRecognizer.PointerMoved),
139+
ToPointerData(e)
140+
));
141+
142+
private void OnPointerExitedGesture(object? sender, PointerEventArgs e) => _addBreadcrumb.Invoke(new(
143+
sender,
144+
nameof(PointerGestureRecognizer.PointerExited),
145+
ToPointerData(e)
146+
));
147+
148+
private void OnPointerEnteredGesture(object? sender, PointerEventArgs e) => _addBreadcrumb.Invoke(new(
149+
sender,
150+
nameof(PointerGestureRecognizer.PointerEntered),
151+
ToPointerData(e)
152+
));
153+
154+
155+
static IEnumerable<(string Key, string Value)> ToPointerData(PointerEventArgs e) =>
156+
[
157+
// some of the data here may have some challenges being pulled out
158+
#if ANDROID
159+
("MotionEventAction", e.PlatformArgs?.MotionEvent.Action.ToString() ?? String.Empty)
160+
//("MotionEventActionButton", e.PlatformArgs?.MotionEvent.ActionButton.ToString() ?? String.Empty)
161+
#elif IOS
162+
("State", e.PlatformArgs?.GestureRecognizer.State.ToString() ?? String.Empty)
163+
//("ButtonMask", e.PlatformArgs?.GestureRecognizer.ButtonMask.ToString() ?? String.Empty)
164+
#endif
165+
];
166+
167+
private void OnPanGesture(object? sender, PanUpdatedEventArgs e) => _addBreadcrumb.Invoke(new(
168+
sender,
169+
nameof(PanGestureRecognizer.PanUpdated),
170+
[
171+
("GestureId", e.GestureId.ToString()),
172+
("StatusType", e.StatusType.ToString()),
173+
("TotalX", e.TotalX.ToString()),
174+
("TotalY", e.TotalY.ToString())
175+
]
176+
));
177+
178+
private void OnDropCompletedGesture(object? sender, DropCompletedEventArgs e) => _addBreadcrumb.Invoke(new(
179+
sender,
180+
nameof(DragGestureRecognizer.DropCompleted)
181+
));
182+
183+
private void OnDragStartingGesture(object? sender, DragStartingEventArgs e) => _addBreadcrumb.Invoke(new(
184+
sender,
185+
nameof(DragGestureRecognizer.DragStarting)
186+
));
187+
188+
189+
private void OnPinchGesture(object? sender, PinchGestureUpdatedEventArgs e) => _addBreadcrumb.Invoke(new(
190+
sender,
191+
nameof(PinchGestureRecognizer.PinchUpdated),
192+
[
193+
("GestureStatus", e.Status.ToString()),
194+
("Scale", e.Scale.ToString()),
195+
("ScaleOrigin", e.ScaleOrigin.ToString())
196+
]
197+
));
198+
199+
private void OnSwipeGesture(object? sender, SwipedEventArgs e) => _addBreadcrumb.Invoke(new(
200+
sender,
201+
nameof(SwipeGestureRecognizer.Swiped),
202+
[("Direction", e.Direction.ToString())]
203+
));
204+
205+
private void OnTapGesture(object? sender, TappedEventArgs e) => _addBreadcrumb.Invoke(new(
206+
sender,
207+
nameof(TapGestureRecognizer.Tapped),
208+
[("ButtonMask", e.Buttons.ToString())]
209+
));
210+
}

0 commit comments

Comments
 (0)