31 private readonly Dictionary<long, GondwanaTouchPoint> _activeTouches =
new();
32 private GondwanaTouchPoint[] _activeTouchesSnapshot = Array.Empty<GondwanaTouchPoint>();
33 private readonly ConcurrentQueue<GondwanaTouchPoint> _pendingBegins =
new();
34 private readonly ConcurrentQueue<GondwanaTouchPoint> _pendingEnds =
new();
35 private bool _isDisposed;
38 public IReadOnlyList<GondwanaTouchPoint>
ActiveTouches => _activeTouchesSnapshot;
59 _component = component ??
throw new ArgumentNullException(nameof(component));
61 _component.TouchStart += OnTouchStart;
62 _component.TouchMove += OnTouchMove;
63 _component.TouchEnd += OnTouchEnd;
64 _component.TouchCancel += OnTouchCancel;
66 Engine.
Logger.LogInformation(
"BlazorTouchAdapter initialized.");
69 private void OnTouchStart(BrowserTouchEventArgs e)
71 if (_isDisposed)
return;
72 foreach (var t
in e.ChangedTouches)
74 var point =
new GondwanaTouchPoint((
int)t.Identifier, GetPosition(t),
TouchPhase.Began);
75 _activeTouches[t.Identifier] = point;
76 _pendingBegins.Enqueue(point);
81 private void OnTouchMove(BrowserTouchEventArgs e)
83 if (_isDisposed)
return;
84 foreach (var t
in e.ChangedTouches)
86 if (!_activeTouches.ContainsKey(t.Identifier))
continue;
87 var point =
new GondwanaTouchPoint((
int)t.Identifier, GetPosition(t),
TouchPhase.Moved);
88 _activeTouches[t.Identifier] = point;
93 private void OnTouchEnd(BrowserTouchEventArgs e)
95 if (_isDisposed)
return;
96 foreach (var t
in e.ChangedTouches)
98 if (!_activeTouches.ContainsKey(t.Identifier))
continue;
99 var point =
new GondwanaTouchPoint((
int)t.Identifier, GetPosition(t),
TouchPhase.Ended);
100 _activeTouches.Remove(t.Identifier);
101 _pendingEnds.Enqueue(point);
106 private void OnTouchCancel(BrowserTouchEventArgs e)
108 if (_isDisposed)
return;
109 foreach (var t
in e.ChangedTouches)
111 if (!_activeTouches.TryGetValue(t.Identifier, out var existing))
continue;
112 var point =
new GondwanaTouchPoint(existing.Id, existing.Position,
TouchPhase.Cancelled);
113 _activeTouches.Remove(t.Identifier);
114 _pendingEnds.Enqueue(point);
122 if (_pendingBegins.IsEmpty)
123 return Array.Empty<GondwanaTouchPoint>();
125 var snapshot =
new List<GondwanaTouchPoint>(_pendingBegins.Count);
126 while (_pendingBegins.TryDequeue(out var point))
134 if (_pendingEnds.IsEmpty)
135 return Array.Empty<GondwanaTouchPoint>();
137 var snapshot =
new List<GondwanaTouchPoint>(_pendingEnds.Count);
138 while (_pendingEnds.TryDequeue(out var point))
143 private void RebuildSnapshot()
145 _activeTouchesSnapshot = _activeTouches.Values.ToArray();
148 private Point GetPosition(BrowserTouchPoint t) =>
149 _component.ToScreenPx(t.ClientX, t.ClientY);
154 if (_isDisposed)
return;
157 _component.TouchStart -= OnTouchStart;
158 _component.TouchMove -= OnTouchMove;
159 _component.TouchEnd -= OnTouchEnd;
160 _component.TouchCancel -= OnTouchCancel;
162 Engine.
Logger.LogInformation(
"BlazorTouchAdapter disposed.");