GestureRecognizerCollection.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Avalonia.Controls;
  4. using Avalonia.LogicalTree;
  5. using Avalonia.Reactive;
  6. namespace Avalonia.Input.GestureRecognizers
  7. {
  8. public class GestureRecognizerCollection : IReadOnlyCollection<IGestureRecognizer>, IGestureRecognizerActionsDispatcher
  9. {
  10. private readonly IInputElement _inputElement;
  11. private List<IGestureRecognizer>? _recognizers;
  12. public GestureRecognizerCollection(IInputElement inputElement)
  13. {
  14. _inputElement = inputElement;
  15. }
  16. public void Add(IGestureRecognizer recognizer)
  17. {
  18. if (_recognizers == null)
  19. {
  20. // We initialize the collection when the first recognizer is added
  21. _recognizers = new List<IGestureRecognizer>();
  22. }
  23. _recognizers.Add(recognizer);
  24. recognizer.Initialize(_inputElement, this);
  25. // Hacks to make bindings work
  26. if (_inputElement is ILogical logicalParent && recognizer is ISetLogicalParent logical)
  27. {
  28. logical.SetParent(logicalParent);
  29. if (recognizer is StyledElement styleableRecognizer
  30. && _inputElement is StyledElement styleableParent)
  31. styleableParent.GetObservable(StyledElement.TemplatedParentProperty).Subscribe(parent => styleableRecognizer.TemplatedParent = parent);
  32. }
  33. }
  34. static readonly List<IGestureRecognizer> s_Empty = new List<IGestureRecognizer>();
  35. public IEnumerator<IGestureRecognizer> GetEnumerator()
  36. => _recognizers?.GetEnumerator() ?? s_Empty.GetEnumerator();
  37. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  38. public int Count => _recognizers?.Count ?? 0;
  39. internal bool HandlePointerPressed(PointerPressedEventArgs e)
  40. {
  41. if (_recognizers == null)
  42. return false;
  43. foreach (var r in _recognizers)
  44. {
  45. r.PointerPressed(e);
  46. }
  47. return e.Handled;
  48. }
  49. internal bool HandlePointerReleased(PointerReleasedEventArgs e)
  50. {
  51. if (_recognizers == null)
  52. return false;
  53. var pointer = e.Pointer as Pointer;
  54. foreach (var r in _recognizers)
  55. {
  56. if (pointer?.CapturedGestureRecognizer != null)
  57. break;
  58. r.PointerReleased(e);
  59. }
  60. return e.Handled;
  61. }
  62. internal bool HandlePointerMoved(PointerEventArgs e)
  63. {
  64. if (_recognizers == null)
  65. return false;
  66. var pointer = e.Pointer as Pointer;
  67. foreach (var r in _recognizers)
  68. {
  69. if (pointer?.CapturedGestureRecognizer != null)
  70. break;
  71. r.PointerMoved(e);
  72. }
  73. return e.Handled;
  74. }
  75. void IGestureRecognizerActionsDispatcher.Capture(IPointer pointer, IGestureRecognizer recognizer)
  76. {
  77. var p = pointer as Pointer;
  78. p?.CaptureGestureRecognizer(recognizer);
  79. foreach (var r in _recognizers!)
  80. {
  81. if (r != recognizer)
  82. r.PointerCaptureLost(pointer);
  83. }
  84. }
  85. }
  86. }