16 private readonly Control _control;
17 private readonly HashSet<GondwanaMouseButton> _pressed =
new();
18 private PointF _currentPosition;
20 private int _scrollDelta;
25 public Point
CurrentPosition => PointerCoordinates.ToScreenPx(_control, _currentPosition);
40 public int ScrollDelta => Interlocked.Exchange(ref _scrollDelta, 0);
49 _control = control ??
throw new ArgumentNullException(nameof(control));
51 _control.PointerPressed += OnPointerPressed;
52 _control.PointerReleased += OnPointerReleased;
53 _control.PointerMoved += OnPointerMoved;
54 _control.PointerWheelChanged += OnPointerWheelChanged;
57 private void OnPointerPressed(
object? sender, PointerPressedEventArgs e)
59 var point = e.GetCurrentPoint(sender as Control);
60 _pressed.Add(MapButton(point.Properties));
61 UpdatePosition(e, sender as Control);
64 private void OnPointerReleased(
object? sender, PointerReleasedEventArgs e)
66 _pressed.Remove(MapReleasedButton(e.InitialPressMouseButton));
67 UpdatePosition(e, sender as Control);
70 private void OnPointerMoved(
object? sender, PointerEventArgs e)
72 UpdatePosition(e, sender as Control);
75 private void UpdatePosition(PointerEventArgs e, Control? relativeTo)
77 var pos = e.GetPosition(relativeTo);
78 _currentPosition =
new PointF((
float)pos.X, (
float)pos.Y);
81 var km = e.KeyModifiers;
87 private static GondwanaMouseButton MapButton(PointerPointProperties props)
89 if (props.IsLeftButtonPressed)
return GondwanaMouseButton.Left;
90 if (props.IsRightButtonPressed)
return GondwanaMouseButton.Right;
91 if (props.IsMiddleButtonPressed)
return GondwanaMouseButton.Middle;
92 return GondwanaMouseButton.None;
95 private static GondwanaMouseButton MapReleasedButton(global::Avalonia.Input.MouseButton initialPressButton) => initialPressButton
switch
97 global::Avalonia.Input.MouseButton.Left => GondwanaMouseButton.Left,
98 global::Avalonia.Input.MouseButton.Right => GondwanaMouseButton.Right,
99 global::Avalonia.Input.MouseButton.Middle => GondwanaMouseButton.Middle,
100 _ => GondwanaMouseButton.None
103 private void OnPointerWheelChanged(
object? sender, PointerWheelEventArgs e)
107 var delta = (int)(e.Delta.Y * 120);
108 Interlocked.Add(ref _scrollDelta, delta);
114 _control.PointerPressed -= OnPointerPressed;
115 _control.PointerReleased -= OnPointerReleased;
116 _control.PointerMoved -= OnPointerMoved;
117 _control.PointerWheelChanged -= OnPointerWheelChanged;