|
|
@ -10,8 +10,6 @@ namespace Avalonia.Input.GestureRecognizers |
|
|
{ |
|
|
{ |
|
|
private readonly IInputElement _inputElement; |
|
|
private readonly IInputElement _inputElement; |
|
|
private List<IGestureRecognizer>? _recognizers; |
|
|
private List<IGestureRecognizer>? _recognizers; |
|
|
private Dictionary<IPointer, IGestureRecognizer>? _pointerGrabs; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public GestureRecognizerCollection(IInputElement inputElement) |
|
|
public GestureRecognizerCollection(IInputElement inputElement) |
|
|
{ |
|
|
{ |
|
|
@ -24,7 +22,6 @@ namespace Avalonia.Input.GestureRecognizers |
|
|
{ |
|
|
{ |
|
|
// We initialize the collection when the first recognizer is added
|
|
|
// We initialize the collection when the first recognizer is added
|
|
|
_recognizers = new List<IGestureRecognizer>(); |
|
|
_recognizers = new List<IGestureRecognizer>(); |
|
|
_pointerGrabs = new Dictionary<IPointer, IGestureRecognizer>(); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
_recognizers.Add(recognizer); |
|
|
_recognizers.Add(recognizer); |
|
|
@ -57,8 +54,6 @@ namespace Avalonia.Input.GestureRecognizers |
|
|
return false; |
|
|
return false; |
|
|
foreach (var r in _recognizers) |
|
|
foreach (var r in _recognizers) |
|
|
{ |
|
|
{ |
|
|
if (e.Handled) |
|
|
|
|
|
break; |
|
|
|
|
|
r.PointerPressed(e); |
|
|
r.PointerPressed(e); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -69,17 +64,15 @@ namespace Avalonia.Input.GestureRecognizers |
|
|
{ |
|
|
{ |
|
|
if (_recognizers == null) |
|
|
if (_recognizers == null) |
|
|
return false; |
|
|
return false; |
|
|
if (_pointerGrabs!.TryGetValue(e.Pointer, out var capture)) |
|
|
var pointer = e.Pointer as Pointer; |
|
|
|
|
|
|
|
|
|
|
|
foreach (var r in _recognizers) |
|
|
{ |
|
|
{ |
|
|
capture.PointerReleased(e); |
|
|
if (pointer?.CapturedGestureRecognizer != null) |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
r.PointerReleased(e); |
|
|
} |
|
|
} |
|
|
else |
|
|
|
|
|
foreach (var r in _recognizers) |
|
|
|
|
|
{ |
|
|
|
|
|
if (e.Handled) |
|
|
|
|
|
break; |
|
|
|
|
|
r.PointerReleased(e); |
|
|
|
|
|
} |
|
|
|
|
|
return e.Handled; |
|
|
return e.Handled; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -87,41 +80,24 @@ namespace Avalonia.Input.GestureRecognizers |
|
|
{ |
|
|
{ |
|
|
if (_recognizers == null) |
|
|
if (_recognizers == null) |
|
|
return false; |
|
|
return false; |
|
|
if (_pointerGrabs!.TryGetValue(e.Pointer, out var capture)) |
|
|
var pointer = e.Pointer as Pointer; |
|
|
{ |
|
|
|
|
|
capture.PointerMoved(e); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
foreach (var r in _recognizers) |
|
|
|
|
|
{ |
|
|
|
|
|
if (e.Handled) |
|
|
|
|
|
break; |
|
|
|
|
|
r.PointerMoved(e); |
|
|
|
|
|
} |
|
|
|
|
|
return e.Handled; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal void HandlePointerCaptureLost(PointerCaptureLostEventArgs e) |
|
|
|
|
|
{ |
|
|
|
|
|
if (_recognizers == null) |
|
|
|
|
|
return; |
|
|
|
|
|
_pointerGrabs!.Remove(e.Pointer); |
|
|
|
|
|
foreach (var r in _recognizers) |
|
|
foreach (var r in _recognizers) |
|
|
{ |
|
|
{ |
|
|
r.PointerCaptureLost(e.Pointer); |
|
|
if (pointer?.CapturedGestureRecognizer != null) |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
r.PointerMoved(e); |
|
|
} |
|
|
} |
|
|
|
|
|
return e.Handled; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void IGestureRecognizerActionsDispatcher.Capture(IPointer pointer, IGestureRecognizer recognizer) |
|
|
void IGestureRecognizerActionsDispatcher.Capture(IPointer pointer, IGestureRecognizer recognizer) |
|
|
{ |
|
|
{ |
|
|
var p = pointer as Pointer; |
|
|
var p = pointer as Pointer; |
|
|
if (p != null && p.CapturedGestureRecognizer != null && recognizer != p.CapturedGestureRecognizer) |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
pointer.Capture(_inputElement); |
|
|
|
|
|
p?.CaptureGestureRecognizer(recognizer); |
|
|
p?.CaptureGestureRecognizer(recognizer); |
|
|
|
|
|
|
|
|
_pointerGrabs![pointer] = recognizer; |
|
|
|
|
|
foreach (var r in _recognizers!) |
|
|
foreach (var r in _recognizers!) |
|
|
{ |
|
|
{ |
|
|
if (r != recognizer) |
|
|
if (r != recognizer) |
|
|
|