Skip to content

Commit 70e96f8

Browse files
committed
fix: address Avalonia 12 review follow-ups
1 parent ead7ff4 commit 70e96f8

File tree

4 files changed

+106
-14
lines changed

4 files changed

+106
-14
lines changed

src/HeadlessTestingFramework/Appium/AvaloniaElement.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ public Point AbsoluteCenter
100100
get
101101
{
102102
var bounds = _control.Bounds;
103-
if (TopLevel.GetTopLevel(_control) is Visual root)
103+
var root = _control.GetPresentationSource()?.RootVisual as Visual;
104+
if (root != null)
104105
{
105106
var transform = _control.TransformToVisual(root);
106107
if (transform.HasValue)

src/HeadlessTestingFramework/GestureRecognizerTestHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public void Move(Interactive target, Interactive source, Point position, KeyModi
171171
{
172172
// When gesture recognizer has captured, the source should be the recognizer's Target
173173
var recognizerTarget = (s_gestureRecognizerTargetProperty?.GetValue(capturedRecognizer) as Interactive) ?? source;
174-
var root = Avalonia.Controls.TopLevel.GetTopLevel((Visual)target) ?? (Visual)target;
174+
var root = ((Visual)target).GetPresentationSource()?.RootVisual as Visual ?? (Visual)target;
175175

176176
// Transform position from target coordinates to root coordinates
177177
// The PointerEventArgs expects position in root visual coordinate space

src/HeadlessTestingFramework/GestureSimulator.cs

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -735,23 +735,48 @@ private HoldingRoutedEventArgs CreateHoldingRoutedEventArgs(
735735
}
736736

737737
return (HoldingRoutedEventArgs)s_holdingRoutedEventArgsCtor.Invoke(
738-
[holdingState, position, pointerType, CreatePointerEventArgs(target, position, pointerType)]);
738+
[holdingState, position, pointerType, CreateHoldingPointerEventArgs(holdingState, target, position, pointerType)]);
739739
}
740740

741-
private PointerEventArgs CreatePointerEventArgs(Interactive target, Point position, PointerType pointerType)
741+
private PointerEventArgs CreateHoldingPointerEventArgs(
742+
HoldingState holdingState,
743+
Interactive target,
744+
Point position,
745+
PointerType pointerType)
742746
{
743747
var pointer = CreatePointer(pointerType);
744-
var properties = new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.Other);
748+
var root = (Visual)target;
745749

746-
return new PointerEventArgs(
747-
InputElement.PointerMovedEvent,
748-
target,
749-
pointer,
750-
(Visual)target,
751-
position,
752-
_timestamp,
753-
properties,
754-
KeyModifiers.None);
750+
return holdingState switch
751+
{
752+
HoldingState.Started => new PointerPressedEventArgs(
753+
target,
754+
pointer,
755+
root,
756+
position,
757+
_timestamp,
758+
new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.LeftButtonPressed),
759+
KeyModifiers.None,
760+
clickCount: 1),
761+
HoldingState.Completed => new PointerReleasedEventArgs(
762+
target,
763+
pointer,
764+
root,
765+
position,
766+
_timestamp,
767+
new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.LeftButtonReleased),
768+
KeyModifiers.None,
769+
MouseButton.Left),
770+
_ => new PointerEventArgs(
771+
InputElement.PointerMovedEvent,
772+
target,
773+
pointer,
774+
root,
775+
position,
776+
_timestamp,
777+
new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.Other),
778+
KeyModifiers.None)
779+
};
755780
}
756781

757782
private PointerDeltaEventArgs CreatePointerDeltaEventArgs(Interactive target, Vector delta, Point position, RoutedEvent routedEvent, KeyModifiers modifiers)

tests/Avalonia.Controls.PanAndZoom.UnitTests/GestureSimulatorTests.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,39 @@ public void HoldingStarted_RaisesEvent_WithCorrectState()
156156
Assert.Equal(new Point(25, 25), capturedPosition);
157157
}
158158

159+
[AvaloniaFact]
160+
public void HoldingStarted_UsesPressedPointerEventArgs()
161+
{
162+
var target = new Border { Width = 100, Height = 100, Background = Brushes.Red };
163+
var window = new Window { Content = target };
164+
window.Show();
165+
166+
var simulator = new GestureSimulator();
167+
HoldingRoutedEventArgs? capturedHoldingArgs = null;
168+
169+
target.AddHandler(InputElement.HoldingEvent, (_, args) =>
170+
{
171+
if (args is HoldingRoutedEventArgs holding)
172+
{
173+
capturedHoldingArgs = holding;
174+
}
175+
});
176+
177+
simulator.HoldingStarted(target, new Point(25, 25));
178+
179+
Assert.NotNull(capturedHoldingArgs);
180+
181+
var pointerEventArgsProperty = typeof(HoldingRoutedEventArgs).GetProperty(
182+
"PointerEventArgs",
183+
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
184+
Assert.NotNull(pointerEventArgsProperty);
185+
186+
var capturedPointerEventArgs = pointerEventArgsProperty!.GetValue(capturedHoldingArgs) as PointerEventArgs;
187+
Assert.NotNull(capturedPointerEventArgs);
188+
Assert.IsType<PointerPressedEventArgs>(capturedPointerEventArgs);
189+
Assert.Equal(InputElement.PointerPressedEvent, capturedPointerEventArgs!.RoutedEvent);
190+
}
191+
159192
[AvaloniaFact]
160193
public void HoldingCompleted_RaisesEvent_WithCorrectState()
161194
{
@@ -183,6 +216,39 @@ public void HoldingCompleted_RaisesEvent_WithCorrectState()
183216
Assert.Equal(HoldingState.Completed, capturedState);
184217
}
185218

219+
[AvaloniaFact]
220+
public void HoldingCompleted_UsesReleasedPointerEventArgs()
221+
{
222+
var target = new Border { Width = 100, Height = 100, Background = Brushes.Red };
223+
var window = new Window { Content = target };
224+
window.Show();
225+
226+
var simulator = new GestureSimulator();
227+
HoldingRoutedEventArgs? capturedHoldingArgs = null;
228+
229+
target.AddHandler(InputElement.HoldingEvent, (_, args) =>
230+
{
231+
if (args is HoldingRoutedEventArgs holding)
232+
{
233+
capturedHoldingArgs = holding;
234+
}
235+
});
236+
237+
simulator.HoldingCompleted(target, new Point(50, 50));
238+
239+
Assert.NotNull(capturedHoldingArgs);
240+
241+
var pointerEventArgsProperty = typeof(HoldingRoutedEventArgs).GetProperty(
242+
"PointerEventArgs",
243+
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
244+
Assert.NotNull(pointerEventArgsProperty);
245+
246+
var capturedPointerEventArgs = pointerEventArgsProperty!.GetValue(capturedHoldingArgs) as PointerEventArgs;
247+
Assert.NotNull(capturedPointerEventArgs);
248+
Assert.IsType<PointerReleasedEventArgs>(capturedPointerEventArgs);
249+
Assert.Equal(InputElement.PointerReleasedEvent, capturedPointerEventArgs!.RoutedEvent);
250+
}
251+
186252
[AvaloniaFact]
187253
public void HoldingCancelled_RaisesEvent_WithCorrectState()
188254
{

0 commit comments

Comments
 (0)