Browse Source

Merge pull request #8396 from robloo/rename-entered-exited-events

Rename to PointerEntered and PointerExited
pull/8404/head
Max Katz 4 years ago
committed by GitHub
parent
commit
035059f533
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      src/Avalonia.Base/Input/IInputElement.cs
  2. 58
      src/Avalonia.Base/Input/InputElement.cs
  3. 6
      src/Avalonia.Base/Input/PointerOverPreProcessor.cs
  4. 20
      src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs
  5. 8
      src/Avalonia.Controls.DataGrid/DataGridCell.cs
  6. 12
      src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs
  7. 8
      src/Avalonia.Controls.DataGrid/DataGridRow.cs
  8. 8
      src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs
  9. 8
      src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs
  10. 12
      src/Avalonia.Controls/Calendar/CalendarItem.cs
  11. 4
      src/Avalonia.Controls/GridSplitter.cs
  12. 52
      src/Avalonia.Controls/MenuItem.cs
  13. 16
      src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
  14. 8
      src/Avalonia.Controls/Primitives/ScrollBar.cs
  15. 12
      src/Avalonia.Controls/ToolTipService.cs
  16. 4
      src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs
  17. 52
      tests/Avalonia.Base.UnitTests/Input/PointerOverTests.cs
  18. 12
      tests/Avalonia.Controls.UnitTests/ButtonTests.cs
  19. 64
      tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
  20. 4
      tests/Avalonia.UnitTests/MouseTestHelper.cs

4
src/Avalonia.Base/Input/IInputElement.cs

@ -42,12 +42,12 @@ namespace Avalonia.Input
/// <summary> /// <summary>
/// Occurs when the pointer enters the control. /// Occurs when the pointer enters the control.
/// </summary> /// </summary>
event EventHandler<PointerEventArgs>? PointerEnter; event EventHandler<PointerEventArgs>? PointerEntered;
/// <summary> /// <summary>
/// Occurs when the pointer leaves the control. /// Occurs when the pointer leaves the control.
/// </summary> /// </summary>
event EventHandler<PointerEventArgs>? PointerLeave; event EventHandler<PointerEventArgs>? PointerExited;
/// <summary> /// <summary>
/// Occurs when the pointer is pressed over the control. /// Occurs when the pointer is pressed over the control.

58
src/Avalonia.Base/Input/InputElement.cs

@ -128,16 +128,20 @@ namespace Avalonia.Input
RoutingStrategies.Tunnel | RoutingStrategies.Bubble); RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
/// <summary> /// <summary>
/// Defines the <see cref="PointerEnter"/> event. /// Defines the <see cref="PointerEntered"/> event.
/// </summary> /// </summary>
public static readonly RoutedEvent<PointerEventArgs> PointerEnterEvent = public static readonly RoutedEvent<PointerEventArgs> PointerEnteredEvent =
RoutedEvent.Register<InputElement, PointerEventArgs>(nameof(PointerEnter), RoutingStrategies.Direct); RoutedEvent.Register<InputElement, PointerEventArgs>(
nameof(PointerEntered),
RoutingStrategies.Direct);
/// <summary> /// <summary>
/// Defines the <see cref="PointerLeave"/> event. /// Defines the <see cref="PointerExited"/> event.
/// </summary> /// </summary>
public static readonly RoutedEvent<PointerEventArgs> PointerLeaveEvent = public static readonly RoutedEvent<PointerEventArgs> PointerExitedEvent =
RoutedEvent.Register<InputElement, PointerEventArgs>(nameof(PointerLeave), RoutingStrategies.Direct); RoutedEvent.Register<InputElement, PointerEventArgs>(
nameof(PointerExited),
RoutingStrategies.Direct);
/// <summary> /// <summary>
/// Defines the <see cref="PointerMoved"/> event. /// Defines the <see cref="PointerMoved"/> event.
@ -208,8 +212,8 @@ namespace Avalonia.Input
KeyDownEvent.AddClassHandler<InputElement>((x, e) => x.OnKeyDown(e)); KeyDownEvent.AddClassHandler<InputElement>((x, e) => x.OnKeyDown(e));
KeyUpEvent.AddClassHandler<InputElement>((x, e) => x.OnKeyUp(e)); KeyUpEvent.AddClassHandler<InputElement>((x, e) => x.OnKeyUp(e));
TextInputEvent.AddClassHandler<InputElement>((x, e) => x.OnTextInput(e)); TextInputEvent.AddClassHandler<InputElement>((x, e) => x.OnTextInput(e));
PointerEnterEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerEnterCore(e)); PointerEnteredEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerEnteredCore(e));
PointerLeaveEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerLeaveCore(e)); PointerExitedEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerExitedCore(e));
PointerMovedEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerMoved(e)); PointerMovedEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerMoved(e));
PointerPressedEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerPressed(e)); PointerPressedEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerPressed(e));
PointerReleasedEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerReleased(e)); PointerReleasedEvent.AddClassHandler<InputElement>((x, e) => x.OnPointerReleased(e));
@ -279,19 +283,19 @@ namespace Avalonia.Input
/// <summary> /// <summary>
/// Occurs when the pointer enters the control. /// Occurs when the pointer enters the control.
/// </summary> /// </summary>
public event EventHandler<PointerEventArgs>? PointerEnter public event EventHandler<PointerEventArgs>? PointerEntered
{ {
add { AddHandler(PointerEnterEvent, value); } add { AddHandler(PointerEnteredEvent, value); }
remove { RemoveHandler(PointerEnterEvent, value); } remove { RemoveHandler(PointerEnteredEvent, value); }
} }
/// <summary> /// <summary>
/// Occurs when the pointer leaves the control. /// Occurs when the pointer leaves the control.
/// </summary> /// </summary>
public event EventHandler<PointerEventArgs>? PointerLeave public event EventHandler<PointerEventArgs>? PointerExited
{ {
add { AddHandler(PointerLeaveEvent, value); } add { AddHandler(PointerExitedEvent, value); }
remove { RemoveHandler(PointerLeaveEvent, value); } remove { RemoveHandler(PointerExitedEvent, value); }
} }
/// <summary> /// <summary>
@ -539,18 +543,18 @@ namespace Avalonia.Input
} }
/// <summary> /// <summary>
/// Called before the <see cref="PointerEnter"/> event occurs. /// Called before the <see cref="PointerEntered"/> event occurs.
/// </summary> /// </summary>
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
protected virtual void OnPointerEnter(PointerEventArgs e) protected virtual void OnPointerEntered(PointerEventArgs e)
{ {
} }
/// <summary> /// <summary>
/// Called before the <see cref="PointerLeave"/> event occurs. /// Called before the <see cref="PointerExited"/> event occurs.
/// </summary> /// </summary>
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
protected virtual void OnPointerLeave(PointerEventArgs e) protected virtual void OnPointerExited(PointerEventArgs e)
{ {
} }
@ -561,7 +565,9 @@ namespace Avalonia.Input
protected virtual void OnPointerMoved(PointerEventArgs e) protected virtual void OnPointerMoved(PointerEventArgs e)
{ {
if (_gestureRecognizers?.HandlePointerMoved(e) == true) if (_gestureRecognizers?.HandlePointerMoved(e) == true)
{
e.Handled = true; e.Handled = true;
}
} }
/// <summary> /// <summary>
@ -571,7 +577,9 @@ namespace Avalonia.Input
protected virtual void OnPointerPressed(PointerPressedEventArgs e) protected virtual void OnPointerPressed(PointerPressedEventArgs e)
{ {
if (_gestureRecognizers?.HandlePointerPressed(e) == true) if (_gestureRecognizers?.HandlePointerPressed(e) == true)
{
e.Handled = true; e.Handled = true;
}
} }
/// <summary> /// <summary>
@ -581,7 +589,9 @@ namespace Avalonia.Input
protected virtual void OnPointerReleased(PointerReleasedEventArgs e) protected virtual void OnPointerReleased(PointerReleasedEventArgs e)
{ {
if (_gestureRecognizers?.HandlePointerReleased(e) == true) if (_gestureRecognizers?.HandlePointerReleased(e) == true)
{
e.Handled = true; e.Handled = true;
}
} }
/// <summary> /// <summary>
@ -634,23 +644,23 @@ namespace Avalonia.Input
} }
/// <summary> /// <summary>
/// Called before the <see cref="PointerEnter"/> event occurs. /// Called before the <see cref="PointerEntered"/> event occurs.
/// </summary> /// </summary>
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
private void OnPointerEnterCore(PointerEventArgs e) private void OnPointerEnteredCore(PointerEventArgs e)
{ {
IsPointerOver = true; IsPointerOver = true;
OnPointerEnter(e); OnPointerEntered(e);
} }
/// <summary> /// <summary>
/// Called before the <see cref="PointerLeave"/> event occurs. /// Called before the <see cref="PointerExited"/> event occurs.
/// </summary> /// </summary>
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
private void OnPointerLeaveCore(PointerEventArgs e) private void OnPointerExitedCore(PointerEventArgs e)
{ {
IsPointerOver = false; IsPointerOver = false;
OnPointerLeave(e); OnPointerExited(e);
} }
/// <summary> /// <summary>

6
src/Avalonia.Base/Input/PointerOverPreProcessor.cs

@ -97,7 +97,7 @@ namespace Avalonia.Input
// Do not pass rootVisual, when we have unknown (negative) position, // Do not pass rootVisual, when we have unknown (negative) position,
// so GetPosition won't return invalid values. // so GetPosition won't return invalid values.
var hasPosition = position.X >= 0 && position.Y >= 0; var hasPosition = position.X >= 0 && position.Y >= 0;
var e = new PointerEventArgs(InputElement.PointerLeaveEvent, element, pointer, var e = new PointerEventArgs(InputElement.PointerExitedEvent, element, pointer,
hasPosition ? root : null, hasPosition ? position : default, hasPosition ? root : null, hasPosition ? position : default,
timestamp, properties, inputModifiers); timestamp, properties, inputModifiers);
@ -177,7 +177,7 @@ namespace Avalonia.Input
el = root.PointerOverElement; el = root.PointerOverElement;
var e = new PointerEventArgs(InputElement.PointerLeaveEvent, el, pointer, root, position, var e = new PointerEventArgs(InputElement.PointerExitedEvent, el, pointer, root, position,
timestamp, properties, inputModifiers); timestamp, properties, inputModifiers);
if (el != null && branch != null && !el.IsAttachedToVisualTree) if (el != null && branch != null && !el.IsAttachedToVisualTree)
{ {
@ -195,7 +195,7 @@ namespace Avalonia.Input
el = root.PointerOverElement = element; el = root.PointerOverElement = element;
_lastPointer = (pointer, root.PointToScreen(position)); _lastPointer = (pointer, root.PointToScreen(position));
e.RoutedEvent = InputElement.PointerEnterEvent; e.RoutedEvent = InputElement.PointerEnteredEvent;
while (el != null && el != branch) while (el != null && el != branch)
{ {

20
src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs

@ -128,8 +128,8 @@ namespace Avalonia.Controls.Primitives
if (_inputTarget != null) if (_inputTarget != null)
{ {
_inputTarget.PointerEnter += InputTarget_PointerEnter; _inputTarget.PointerEntered += InputTarget_PointerEntered;
_inputTarget.PointerLeave += InputTarget_PointerLeave; _inputTarget.PointerExited += InputTarget_PointerExited;
_inputTarget.PointerPressed += InputTarget_PointerPressed; _inputTarget.PointerPressed += InputTarget_PointerPressed;
_inputTarget.PointerMoved += InputTarget_PointerMoved; _inputTarget.PointerMoved += InputTarget_PointerMoved;
_inputTarget.PointerReleased += InputTarget_PointerReleased; _inputTarget.PointerReleased += InputTarget_PointerReleased;
@ -194,8 +194,8 @@ namespace Avalonia.Controls.Primitives
if (_inputTarget != null) if (_inputTarget != null)
{ {
_inputTarget.PointerEnter -= InputTarget_PointerEnter; _inputTarget.PointerEntered -= InputTarget_PointerEntered;
_inputTarget.PointerLeave -= InputTarget_PointerLeave; _inputTarget.PointerExited -= InputTarget_PointerExited;
_inputTarget.PointerPressed -= InputTarget_PointerPressed; _inputTarget.PointerPressed -= InputTarget_PointerPressed;
_inputTarget.PointerMoved -= InputTarget_PointerMoved; _inputTarget.PointerMoved -= InputTarget_PointerMoved;
_inputTarget.PointerReleased -= InputTarget_PointerReleased; _inputTarget.PointerReleased -= InputTarget_PointerReleased;
@ -362,7 +362,7 @@ namespace Avalonia.Controls.Primitives
} }
/// <inheritdoc/> /// <inheritdoc/>
protected override void OnPointerLeave(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
{ {
// We only want to bother with the color name tool tip if we can provide color names. // We only want to bother with the color name tool tip if we can provide color names.
if (_selectionEllipsePanel != null && if (_selectionEllipsePanel != null &&
@ -373,7 +373,7 @@ namespace Avalonia.Controls.Primitives
UpdatePseudoClasses(); UpdatePseudoClasses();
base.OnPointerLeave(e); base.OnPointerExited(e);
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -848,16 +848,16 @@ namespace Avalonia.Controls.Primitives
UpdatePseudoClasses(); UpdatePseudoClasses();
} }
/// <inheritdoc cref="InputElement.PointerEnter"/> /// <inheritdoc cref="InputElement.PointerEntered"/>
private void InputTarget_PointerEnter(object? sender, PointerEventArgs args) private void InputTarget_PointerEntered(object? sender, PointerEventArgs args)
{ {
_isPointerOver = true; _isPointerOver = true;
UpdatePseudoClasses(); UpdatePseudoClasses();
args.Handled = true; args.Handled = true;
} }
/// <inheritdoc cref="InputElement.PointerLeave"/> /// <inheritdoc cref="InputElement.PointerExited"/>
private void InputTarget_PointerLeave(object? sender, PointerEventArgs args) private void InputTarget_PointerExited(object? sender, PointerEventArgs args)
{ {
_isPointerOver = false; _isPointerOver = false;
UpdatePseudoClasses(); UpdatePseudoClasses();

8
src/Avalonia.Controls.DataGrid/DataGridCell.cs

@ -139,18 +139,18 @@ namespace Avalonia.Controls
} }
} }
protected override void OnPointerEnter(PointerEventArgs e) protected override void OnPointerEntered(PointerEventArgs e)
{ {
base.OnPointerEnter(e); base.OnPointerEntered(e);
if (OwningRow != null) if (OwningRow != null)
{ {
IsMouseOver = true; IsMouseOver = true;
} }
} }
protected override void OnPointerLeave(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
{ {
base.OnPointerLeave(e); base.OnPointerExited(e);
if (OwningRow != null) if (OwningRow != null)
{ {

12
src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs

@ -83,9 +83,9 @@ namespace Avalonia.Controls
{ {
PointerPressed += DataGridColumnHeader_PointerPressed; PointerPressed += DataGridColumnHeader_PointerPressed;
PointerReleased += DataGridColumnHeader_PointerReleased; PointerReleased += DataGridColumnHeader_PointerReleased;
PointerMoved += DataGridColumnHeader_PointerMove; PointerMoved += DataGridColumnHeader_PointerMoved;
PointerEnter += DataGridColumnHeader_PointerEnter; PointerEntered += DataGridColumnHeader_PointerEntered;
PointerLeave += DataGridColumnHeader_PointerLeave; PointerExited += DataGridColumnHeader_PointerExited;
} }
private void OnAreSeparatorsVisibleChanged(AvaloniaPropertyChangedEventArgs e) private void OnAreSeparatorsVisibleChanged(AvaloniaPropertyChangedEventArgs e)
@ -452,7 +452,7 @@ namespace Avalonia.Controls
SetDragCursor(mousePosition); SetDragCursor(mousePosition);
} }
private void DataGridColumnHeader_PointerEnter(object sender, PointerEventArgs e) private void DataGridColumnHeader_PointerEntered(object sender, PointerEventArgs e)
{ {
if (!IsEnabled) if (!IsEnabled)
{ {
@ -464,7 +464,7 @@ namespace Avalonia.Controls
UpdatePseudoClasses(); UpdatePseudoClasses();
} }
private void DataGridColumnHeader_PointerLeave(object sender, PointerEventArgs e) private void DataGridColumnHeader_PointerExited(object sender, PointerEventArgs e)
{ {
if (!IsEnabled) if (!IsEnabled)
{ {
@ -506,7 +506,7 @@ namespace Avalonia.Controls
UpdatePseudoClasses(); UpdatePseudoClasses();
} }
private void DataGridColumnHeader_PointerMove(object sender, PointerEventArgs e) private void DataGridColumnHeader_PointerMoved(object sender, PointerEventArgs e)
{ {
if (OwningGrid == null || !IsEnabled) if (OwningGrid == null || !IsEnabled)
{ {

8
src/Avalonia.Controls.DataGrid/DataGridRow.cs

@ -607,15 +607,15 @@ namespace Avalonia.Controls
} }
} }
protected override void OnPointerEnter(PointerEventArgs e) protected override void OnPointerEntered(PointerEventArgs e)
{ {
base.OnPointerEnter(e); base.OnPointerEntered(e);
IsMouseOver = true; IsMouseOver = true;
} }
protected override void OnPointerLeave(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
{ {
IsMouseOver = false; IsMouseOver = false;
base.OnPointerLeave(e); base.OnPointerExited(e);
} }
internal void ApplyCellsState() internal void ApplyCellsState()

8
src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs

@ -375,7 +375,7 @@ namespace Avalonia.Controls
ApplyHeaderStatus(); ApplyHeaderStatus();
} }
protected override void OnPointerEnter(PointerEventArgs e) protected override void OnPointerEntered(PointerEventArgs e)
{ {
if (IsEnabled) if (IsEnabled)
{ {
@ -383,10 +383,10 @@ namespace Avalonia.Controls
UpdatePseudoClasses(); UpdatePseudoClasses();
} }
base.OnPointerEnter(e); base.OnPointerEntered(e);
} }
protected override void OnPointerLeave(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
{ {
if (IsEnabled) if (IsEnabled)
{ {
@ -394,7 +394,7 @@ namespace Avalonia.Controls
UpdatePseudoClasses(); UpdatePseudoClasses();
} }
base.OnPointerLeave(e); base.OnPointerExited(e);
} }
private void SetIsCheckedNoCallBack(bool value) private void SetIsCheckedNoCallBack(bool value)

8
src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs

@ -158,23 +158,23 @@ namespace Avalonia.Controls.Primitives
} }
} }
protected override void OnPointerEnter(PointerEventArgs e) protected override void OnPointerEntered(PointerEventArgs e)
{ {
if (OwningRow != null) if (OwningRow != null)
{ {
OwningRow.IsMouseOver = true; OwningRow.IsMouseOver = true;
} }
base.OnPointerEnter(e); base.OnPointerEntered(e);
} }
protected override void OnPointerLeave(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
{ {
if (OwningRow != null) if (OwningRow != null)
{ {
OwningRow.IsMouseOver = false; OwningRow.IsMouseOver = false;
} }
base.OnPointerLeave(e); base.OnPointerExited(e);
} }
//TODO TabStop //TODO TabStop

12
src/Avalonia.Controls/Calendar/CalendarItem.cs

@ -189,7 +189,7 @@ namespace Avalonia.Controls.Primitives
EventHandler<PointerPressedEventArgs> cellMouseLeftButtonDown = Cell_MouseLeftButtonDown; EventHandler<PointerPressedEventArgs> cellMouseLeftButtonDown = Cell_MouseLeftButtonDown;
EventHandler<PointerReleasedEventArgs> cellMouseLeftButtonUp = Cell_MouseLeftButtonUp; EventHandler<PointerReleasedEventArgs> cellMouseLeftButtonUp = Cell_MouseLeftButtonUp;
EventHandler<PointerEventArgs> cellMouseEnter = Cell_MouseEnter; EventHandler<PointerEventArgs> cellMouseEntered = Cell_MouseEntered;
EventHandler<RoutedEventArgs> cellClick = Cell_Click; EventHandler<RoutedEventArgs> cellClick = Cell_Click;
for (int i = 1; i < Calendar.RowsPerMonth; i++) for (int i = 1; i < Calendar.RowsPerMonth; i++)
@ -206,7 +206,7 @@ namespace Avalonia.Controls.Primitives
cell.SetValue(Grid.ColumnProperty, j); cell.SetValue(Grid.ColumnProperty, j);
cell.CalendarDayButtonMouseDown += cellMouseLeftButtonDown; cell.CalendarDayButtonMouseDown += cellMouseLeftButtonDown;
cell.CalendarDayButtonMouseUp += cellMouseLeftButtonUp; cell.CalendarDayButtonMouseUp += cellMouseLeftButtonUp;
cell.PointerEnter += cellMouseEnter; cell.PointerEntered += cellMouseEntered;
cell.Click += cellClick; cell.Click += cellClick;
children.Add(cell); children.Add(cell);
} }
@ -222,7 +222,7 @@ namespace Avalonia.Controls.Primitives
EventHandler<PointerPressedEventArgs> monthCalendarButtonMouseDown = Month_CalendarButtonMouseDown; EventHandler<PointerPressedEventArgs> monthCalendarButtonMouseDown = Month_CalendarButtonMouseDown;
EventHandler<PointerReleasedEventArgs> monthCalendarButtonMouseUp = Month_CalendarButtonMouseUp; EventHandler<PointerReleasedEventArgs> monthCalendarButtonMouseUp = Month_CalendarButtonMouseUp;
EventHandler<PointerEventArgs> monthMouseEnter = Month_MouseEnter; EventHandler<PointerEventArgs> monthMouseEntered = Month_MouseEntered;
for (int i = 0; i < Calendar.RowsPerYear; i++) for (int i = 0; i < Calendar.RowsPerYear; i++)
{ {
@ -238,7 +238,7 @@ namespace Avalonia.Controls.Primitives
month.SetValue(Grid.ColumnProperty, j); month.SetValue(Grid.ColumnProperty, j);
month.CalendarLeftMouseButtonDown += monthCalendarButtonMouseDown; month.CalendarLeftMouseButtonDown += monthCalendarButtonMouseDown;
month.CalendarLeftMouseButtonUp += monthCalendarButtonMouseUp; month.CalendarLeftMouseButtonUp += monthCalendarButtonMouseUp;
month.PointerEnter += monthMouseEnter; month.PointerEntered += monthMouseEntered;
children.Add(month); children.Add(month);
} }
} }
@ -876,7 +876,7 @@ namespace Avalonia.Controls.Primitives
} }
} }
internal void Cell_MouseEnter(object? sender, PointerEventArgs e) internal void Cell_MouseEntered(object? sender, PointerEventArgs e)
{ {
if (Owner != null) if (Owner != null)
{ {
@ -1162,7 +1162,7 @@ namespace Avalonia.Controls.Primitives
} }
} }
private void Month_MouseEnter(object? sender, PointerEventArgs e) private void Month_MouseEntered(object? sender, PointerEventArgs e)
{ {
if (_isMouseLeftButtonDownYearView) if (_isMouseLeftButtonDownYearView)
{ {

4
src/Avalonia.Controls/GridSplitter.cs

@ -349,9 +349,9 @@ namespace Avalonia.Controls
} }
} }
protected override void OnPointerEnter(PointerEventArgs e) protected override void OnPointerEntered(PointerEventArgs e)
{ {
base.OnPointerEnter(e); base.OnPointerEntered(e);
GridResizeDirection direction = GetEffectiveResizeDirection(); GridResizeDirection direction = GetEffectiveResizeDirection();

52
src/Avalonia.Controls/MenuItem.cs

@ -79,25 +79,33 @@ namespace Avalonia.Controls
/// Defines the <see cref="Click"/> event. /// Defines the <see cref="Click"/> event.
/// </summary> /// </summary>
public static readonly RoutedEvent<RoutedEventArgs> ClickEvent = public static readonly RoutedEvent<RoutedEventArgs> ClickEvent =
RoutedEvent.Register<MenuItem, RoutedEventArgs>(nameof(Click), RoutingStrategies.Bubble); RoutedEvent.Register<MenuItem, RoutedEventArgs>(
nameof(Click),
RoutingStrategies.Bubble);
/// <summary> /// <summary>
/// Defines the <see cref="PointerEnterItem"/> event. /// Defines the <see cref="PointerEnteredItem"/> event.
/// </summary> /// </summary>
public static readonly RoutedEvent<PointerEventArgs> PointerEnterItemEvent = public static readonly RoutedEvent<PointerEventArgs> PointerEnteredItemEvent =
RoutedEvent.Register<MenuItem, PointerEventArgs>(nameof(PointerEnterItem), RoutingStrategies.Bubble); RoutedEvent.Register<MenuItem, PointerEventArgs>(
nameof(PointerEnteredItem),
RoutingStrategies.Bubble);
/// <summary> /// <summary>
/// Defines the <see cref="PointerLeaveItem"/> event. /// Defines the <see cref="PointerExitedItem"/> event.
/// </summary> /// </summary>
public static readonly RoutedEvent<PointerEventArgs> PointerLeaveItemEvent = public static readonly RoutedEvent<PointerEventArgs> PointerExitedItemEvent =
RoutedEvent.Register<MenuItem, PointerEventArgs>(nameof(PointerLeaveItem), RoutingStrategies.Bubble); RoutedEvent.Register<MenuItem, PointerEventArgs>(
nameof(PointerExitedItem),
RoutingStrategies.Bubble);
/// <summary> /// <summary>
/// Defines the <see cref="SubmenuOpened"/> event. /// Defines the <see cref="SubmenuOpened"/> event.
/// </summary> /// </summary>
public static readonly RoutedEvent<RoutedEventArgs> SubmenuOpenedEvent = public static readonly RoutedEvent<RoutedEventArgs> SubmenuOpenedEvent =
RoutedEvent.Register<MenuItem, RoutedEventArgs>(nameof(SubmenuOpened), RoutingStrategies.Bubble); RoutedEvent.Register<MenuItem, RoutedEventArgs>(
nameof(SubmenuOpened),
RoutingStrategies.Bubble);
/// <summary> /// <summary>
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property. /// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
@ -174,24 +182,24 @@ namespace Avalonia.Controls
/// Occurs when the pointer enters a menu item. /// Occurs when the pointer enters a menu item.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// A bubbling version of the <see cref="InputElement.PointerEnter"/> event for menu items. /// A bubbling version of the <see cref="InputElement.PointerEntered"/> event for menu items.
/// </remarks> /// </remarks>
public event EventHandler<PointerEventArgs>? PointerEnterItem public event EventHandler<PointerEventArgs>? PointerEnteredItem
{ {
add { AddHandler(PointerEnterItemEvent, value); } add { AddHandler(PointerEnteredItemEvent, value); }
remove { RemoveHandler(PointerEnterItemEvent, value); } remove { RemoveHandler(PointerEnteredItemEvent, value); }
} }
/// <summary> /// <summary>
/// Raised when the pointer leaves a menu item. /// Raised when the pointer leaves a menu item.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// A bubbling version of the <see cref="InputElement.PointerLeave"/> event for menu items. /// A bubbling version of the <see cref="InputElement.PointerExited"/> event for menu items.
/// </remarks> /// </remarks>
public event EventHandler<PointerEventArgs>? PointerLeaveItem public event EventHandler<PointerEventArgs>? PointerExitedItem
{ {
add { AddHandler(PointerLeaveItemEvent, value); } add { AddHandler(PointerExitedItemEvent, value); }
remove { RemoveHandler(PointerLeaveItemEvent, value); } remove { RemoveHandler(PointerExitedItemEvent, value); }
} }
/// <summary> /// <summary>
@ -437,22 +445,22 @@ namespace Avalonia.Controls
} }
/// <inheritdoc/> /// <inheritdoc/>
protected override void OnPointerEnter(PointerEventArgs e) protected override void OnPointerEntered(PointerEventArgs e)
{ {
base.OnPointerEnter(e); base.OnPointerEntered(e);
var point = e.GetCurrentPoint(null); var point = e.GetCurrentPoint(null);
RaiseEvent(new PointerEventArgs(PointerEnterItemEvent, this, e.Pointer, this.VisualRoot, point.Position, RaiseEvent(new PointerEventArgs(PointerEnteredItemEvent, this, e.Pointer, this.VisualRoot, point.Position,
e.Timestamp, point.Properties, e.KeyModifiers)); e.Timestamp, point.Properties, e.KeyModifiers));
} }
/// <inheritdoc/> /// <inheritdoc/>
protected override void OnPointerLeave(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
{ {
base.OnPointerLeave(e); base.OnPointerExited(e);
var point = e.GetCurrentPoint(null); var point = e.GetCurrentPoint(null);
RaiseEvent(new PointerEventArgs(PointerLeaveItemEvent, this, e.Pointer, this.VisualRoot, point.Position, RaiseEvent(new PointerEventArgs(PointerExitedItemEvent, this, e.Pointer, this.VisualRoot, point.Position,
e.Timestamp, point.Properties, e.KeyModifiers)); e.Timestamp, point.Properties, e.KeyModifiers));
} }

16
src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs

@ -53,9 +53,9 @@ namespace Avalonia.Controls.Platform
Menu.PointerPressed += PointerPressed; Menu.PointerPressed += PointerPressed;
Menu.PointerReleased += PointerReleased; Menu.PointerReleased += PointerReleased;
Menu.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed); Menu.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed);
Menu.AddHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened); Menu.AddHandler(Avalonia.Controls.Menu.MenuOpenedEvent, MenuOpened);
Menu.AddHandler(MenuItem.PointerEnterItemEvent, PointerEnter); Menu.AddHandler(MenuItem.PointerEnteredItemEvent, PointerEntered);
Menu.AddHandler(MenuItem.PointerLeaveItemEvent, PointerLeave); Menu.AddHandler(MenuItem.PointerExitedItemEvent, PointerExited);
Menu.AddHandler(InputElement.PointerMovedEvent, PointerMoved); Menu.AddHandler(InputElement.PointerMovedEvent, PointerMoved);
_root = Menu.VisualRoot; _root = Menu.VisualRoot;
@ -89,9 +89,9 @@ namespace Avalonia.Controls.Platform
Menu.PointerPressed -= PointerPressed; Menu.PointerPressed -= PointerPressed;
Menu.PointerReleased -= PointerReleased; Menu.PointerReleased -= PointerReleased;
Menu.RemoveHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed); Menu.RemoveHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed);
Menu.RemoveHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened); Menu.RemoveHandler(Avalonia.Controls.Menu.MenuOpenedEvent, MenuOpened);
Menu.RemoveHandler(MenuItem.PointerEnterItemEvent, PointerEnter); Menu.RemoveHandler(MenuItem.PointerEnteredItemEvent, PointerEntered);
Menu.RemoveHandler(MenuItem.PointerLeaveItemEvent, PointerLeave); Menu.RemoveHandler(MenuItem.PointerExitedItemEvent, PointerExited);
Menu.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved); Menu.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved);
if (_root is InputElement inputRoot) if (_root is InputElement inputRoot)
@ -297,7 +297,7 @@ namespace Avalonia.Controls.Platform
e.Handled = true; e.Handled = true;
} }
protected internal virtual void PointerEnter(object? sender, PointerEventArgs e) protected internal virtual void PointerEntered(object? sender, PointerEventArgs e)
{ {
var item = GetMenuItem(e.Source as IControl); var item = GetMenuItem(e.Source as IControl);
@ -358,7 +358,7 @@ namespace Avalonia.Controls.Platform
} }
} }
protected internal virtual void PointerLeave(object? sender, PointerEventArgs e) protected internal virtual void PointerExited(object? sender, PointerEventArgs e)
{ {
var item = GetMenuItem(e.Source as IControl); var item = GetMenuItem(e.Source as IControl);

8
src/Avalonia.Controls/Primitives/ScrollBar.cs

@ -218,9 +218,9 @@ namespace Avalonia.Controls.Primitives
} }
} }
protected override void OnPointerEnter(PointerEventArgs e) protected override void OnPointerEntered(PointerEventArgs e)
{ {
base.OnPointerEnter(e); base.OnPointerEntered(e);
if (AllowAutoHide) if (AllowAutoHide)
{ {
@ -228,9 +228,9 @@ namespace Avalonia.Controls.Primitives
} }
} }
protected override void OnPointerLeave(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
{ {
base.OnPointerLeave(e); base.OnPointerExited(e);
if (AllowAutoHide) if (AllowAutoHide)
{ {

12
src/Avalonia.Controls/ToolTipService.cs

@ -26,14 +26,14 @@ namespace Avalonia.Controls
if (e.OldValue != null) if (e.OldValue != null)
{ {
control.PointerEnter -= ControlPointerEnter; control.PointerEntered -= ControlPointerEntered;
control.PointerLeave -= ControlPointerLeave; control.PointerExited -= ControlPointerExited;
} }
if (e.NewValue != null) if (e.NewValue != null)
{ {
control.PointerEnter += ControlPointerEnter; control.PointerEntered += ControlPointerEntered;
control.PointerLeave += ControlPointerLeave; control.PointerExited += ControlPointerExited;
} }
if (ToolTip.GetIsOpen(control) && e.NewValue != e.OldValue && !(e.NewValue is ToolTip)) if (ToolTip.GetIsOpen(control) && e.NewValue != e.OldValue && !(e.NewValue is ToolTip))
@ -80,7 +80,7 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
/// <param name="sender">The event sender.</param> /// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
private void ControlPointerEnter(object? sender, PointerEventArgs e) private void ControlPointerEntered(object? sender, PointerEventArgs e)
{ {
StopTimer(); StopTimer();
@ -101,7 +101,7 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
/// <param name="sender">The event sender.</param> /// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param> /// <param name="e">The event args.</param>
private void ControlPointerLeave(object? sender, PointerEventArgs e) private void ControlPointerExited(object? sender, PointerEventArgs e)
{ {
var control = (Control)sender!; var control = (Control)sender!;
Close(control); Close(control);

4
src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs

@ -121,8 +121,8 @@ namespace Avalonia.Diagnostics.Views
if (header != null) if (header != null)
{ {
header.PointerEnter += AddAdorner; header.PointerEntered += AddAdorner;
header.PointerLeave += RemoveAdorner; header.PointerExited += RemoveAdorner;
} }
item.TemplateApplied -= TreeViewItemTemplateApplied; item.TemplateApplied -= TreeViewItemTemplateApplied;

52
tests/Avalonia.Base.UnitTests/Input/PointerOverTests.cs

@ -189,7 +189,7 @@ namespace Avalonia.Base.UnitTests.Input
// Ensure that e.Handled is reset between controls. // Ensure that e.Handled is reset between controls.
root.PointerMoved += (s, e) => e.Handled = true; root.PointerMoved += (s, e) => e.Handled = true;
decorator.PointerEnter += (s, e) => e.Handled = true; decorator.PointerEntered += (s, e) => e.Handled = true;
SetHit(renderer, decorator); SetHit(renderer, decorator);
impl.Object.Input!(CreateRawPointerMovedArgs(device, root)); impl.Object.Input!(CreateRawPointerMovedArgs(device, root));
@ -231,7 +231,7 @@ namespace Avalonia.Base.UnitTests.Input
} }
}); });
AddEnterLeaveHandlers(HandleEvent, canvas, decorator); AddEnteredExitedHandlers(HandleEvent, canvas, decorator);
// Enter decorator // Enter decorator
SetHit(renderer, decorator); SetHit(renderer, decorator);
@ -246,17 +246,17 @@ namespace Avalonia.Base.UnitTests.Input
Assert.Equal( Assert.Equal(
new[] new[]
{ {
((object?)decorator, "PointerEnter"), ((object?)decorator, nameof(InputElement.PointerEntered)),
(decorator, "PointerMoved"), (decorator, nameof(InputElement.PointerMoved)),
(decorator, "PointerLeave"), (decorator, nameof(InputElement.PointerExited)),
(canvas, "PointerEnter"), (canvas, nameof(InputElement.PointerEntered)),
(canvas, "PointerMoved") (canvas, nameof(InputElement.PointerMoved))
}, },
result); result);
} }
[Fact] [Fact]
public void PointerEnter_Leave_Should_Be_Raised_In_Correct_Order() public void PointerEntered_Exited_Should_Be_Raised_In_Correct_Order()
{ {
using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager())); using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager()));
@ -289,7 +289,7 @@ namespace Avalonia.Base.UnitTests.Input
SetHit(renderer, canvas); SetHit(renderer, canvas);
impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root)); impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root));
AddEnterLeaveHandlers(HandleEvent, root, canvas, border, decorator); AddEnteredExitedHandlers(HandleEvent, root, canvas, border, decorator);
SetHit(renderer, decorator); SetHit(renderer, decorator);
impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root)); impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root));
@ -297,16 +297,16 @@ namespace Avalonia.Base.UnitTests.Input
Assert.Equal( Assert.Equal(
new[] new[]
{ {
((object?)canvas, "PointerLeave"), ((object?)canvas, nameof(InputElement.PointerExited)),
(decorator, "PointerEnter"), (decorator, nameof(InputElement.PointerEntered)),
(border, "PointerEnter"), (border, nameof(InputElement.PointerEntered)),
}, },
result); result);
} }
// https://github.com/AvaloniaUI/Avalonia/issues/7896 // https://github.com/AvaloniaUI/Avalonia/issues/7896
[Fact] [Fact]
public void PointerEnter_Leave_Should_Set_Correct_Position() public void PointerEntered_Exited_Should_Set_Correct_Position()
{ {
using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager())); using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager()));
@ -331,7 +331,7 @@ namespace Avalonia.Base.UnitTests.Input
} }
}); });
AddEnterLeaveHandlers(HandleEvent, root, canvas); AddEnteredExitedHandlers(HandleEvent, root, canvas);
SetHit(renderer, canvas); SetHit(renderer, canvas);
impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root, expectedPosition)); impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root, expectedPosition));
@ -342,10 +342,10 @@ namespace Avalonia.Base.UnitTests.Input
Assert.Equal( Assert.Equal(
new[] new[]
{ {
((object?)canvas, "PointerEnter", expectedPosition), ((object?)canvas, nameof(InputElement.PointerEntered), expectedPosition),
(root, "PointerEnter", expectedPosition), (root, nameof(InputElement.PointerEntered), expectedPosition),
(canvas, "PointerLeave", expectedPosition), (canvas, nameof(InputElement.PointerExited), expectedPosition),
(root, "PointerLeave", expectedPosition) (root, nameof(InputElement.PointerExited), expectedPosition)
}, },
result); result);
} }
@ -415,7 +415,7 @@ namespace Avalonia.Base.UnitTests.Input
} }
}); });
AddEnterLeaveHandlers(HandleEvent, root, canvas); AddEnteredExitedHandlers(HandleEvent, root, canvas);
// Init pointer over. // Init pointer over.
SetHit(renderer, canvas); SetHit(renderer, canvas);
@ -429,22 +429,22 @@ namespace Avalonia.Base.UnitTests.Input
Assert.Equal( Assert.Equal(
new[] new[]
{ {
((object?)canvas, "PointerEnter", lastClientPosition), ((object?)canvas, nameof(InputElement.PointerEntered), lastClientPosition),
(root, "PointerEnter", lastClientPosition), (root, nameof(InputElement.PointerEntered), lastClientPosition),
(canvas, "PointerLeave", lastClientPosition), (canvas, nameof(InputElement.PointerExited), lastClientPosition),
(root, "PointerLeave", lastClientPosition), (root, nameof(InputElement.PointerExited), lastClientPosition),
}, },
result); result);
} }
private static void AddEnterLeaveHandlers( private static void AddEnteredExitedHandlers(
EventHandler<PointerEventArgs> handler, EventHandler<PointerEventArgs> handler,
params IInputElement[] controls) params IInputElement[] controls)
{ {
foreach (var c in controls) foreach (var c in controls)
{ {
c.PointerEnter += handler; c.PointerEntered += handler;
c.PointerLeave += handler; c.PointerExited += handler;
c.PointerMoved += handler; c.PointerMoved += handler;
} }
} }

12
tests/Avalonia.Controls.UnitTests/ButtonTests.cs

@ -150,7 +150,7 @@ namespace Avalonia.Controls.UnitTests
target.Click += (s, e) => clicked = true; target.Click += (s, e) => clicked = true;
RaisePointerEnter(target); RaisePointerEntered(target);
RaisePointerMove(target, pt); RaisePointerMove(target, pt);
RaisePointerPressed(target, 1, MouseButton.Left, pt); RaisePointerPressed(target, 1, MouseButton.Left, pt);
@ -182,10 +182,10 @@ namespace Avalonia.Controls.UnitTests
target.Click += (s, e) => clicked = true; target.Click += (s, e) => clicked = true;
RaisePointerEnter(target); RaisePointerEntered(target);
RaisePointerMove(target, new Point(50,50)); RaisePointerMove(target, new Point(50,50));
RaisePointerPressed(target, 1, MouseButton.Left, new Point(50, 50)); RaisePointerPressed(target, 1, MouseButton.Left, new Point(50, 50));
RaisePointerLeave(target); RaisePointerExited(target);
Assert.Equal(_helper.Captured, target); Assert.Equal(_helper.Captured, target);
@ -224,7 +224,7 @@ namespace Avalonia.Controls.UnitTests
target.Click += (s, e) => clicked = true; target.Click += (s, e) => clicked = true;
RaisePointerEnter(target); RaisePointerEntered(target);
RaisePointerMove(target, pt); RaisePointerMove(target, pt);
RaisePointerPressed(target, 1, MouseButton.Left, pt); RaisePointerPressed(target, 1, MouseButton.Left, pt);
@ -422,12 +422,12 @@ namespace Avalonia.Controls.UnitTests
_helper.Up(button, mouseButton, pt); _helper.Up(button, mouseButton, pt);
} }
private void RaisePointerEnter(Button button) private void RaisePointerEntered(Button button)
{ {
_helper.Enter(button); _helper.Enter(button);
} }
private void RaisePointerLeave(Button button) private void RaisePointerExited(Button button)
{ {
_helper.Leave(button); _helper.Leave(button);
} }

64
tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs

@ -174,7 +174,7 @@ namespace Avalonia.Controls.UnitTests.Platform
} }
[Fact] [Fact]
public void PointerEnter_Opens_Item_When_Old_Item_Is_Open() public void PointerEntered_Opens_Item_When_Old_Item_Is_Open()
{ {
var target = new DefaultMenuInteractionHandler(false); var target = new DefaultMenuInteractionHandler(false);
var menu = new Mock<IMenu>(); var menu = new Mock<IMenu>();
@ -187,11 +187,11 @@ namespace Avalonia.Controls.UnitTests.Platform
x.IsTopLevel == true && x.IsTopLevel == true &&
x.HasSubMenu == true && x.HasSubMenu == true &&
x.Parent == menu.Object); x.Parent == menu.Object);
var e = CreateArgs(MenuItem.PointerEnterItemEvent, nextItem); var e = CreateArgs(MenuItem.PointerEnteredItemEvent, nextItem);
menu.SetupGet(x => x.SelectedItem).Returns(item); menu.SetupGet(x => x.SelectedItem).Returns(item);
target.PointerEnter(nextItem, e); target.PointerEntered(nextItem, e);
Mock.Get(item).Verify(x => x.Close()); Mock.Get(item).Verify(x => x.Close());
menu.VerifySet(x => x.SelectedItem = nextItem); menu.VerifySet(x => x.SelectedItem = nextItem);
@ -202,31 +202,31 @@ namespace Avalonia.Controls.UnitTests.Platform
} }
[Fact] [Fact]
public void PointerLeave_Deselects_Item_When_Menu_Not_Open() public void PointerExited_Deselects_Item_When_Menu_Not_Open()
{ {
var target = new DefaultMenuInteractionHandler(false); var target = new DefaultMenuInteractionHandler(false);
var menu = new Mock<IMenu>(); var menu = new Mock<IMenu>();
var item = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.Parent == menu.Object); var item = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.Parent == menu.Object);
var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); var e = CreateArgs(MenuItem.PointerExitedItemEvent, item);
menu.SetupGet(x => x.SelectedItem).Returns(item); menu.SetupGet(x => x.SelectedItem).Returns(item);
target.PointerLeave(item, e); target.PointerExited(item, e);
menu.VerifySet(x => x.SelectedItem = null); menu.VerifySet(x => x.SelectedItem = null);
Assert.False(e.Handled); Assert.False(e.Handled);
} }
[Fact] [Fact]
public void PointerLeave_Doesnt_Deselect_Item_When_Menu_Open() public void PointerExited_Doesnt_Deselect_Item_When_Menu_Open()
{ {
var target = new DefaultMenuInteractionHandler(false); var target = new DefaultMenuInteractionHandler(false);
var menu = new Mock<IMenu>(); var menu = new Mock<IMenu>();
var item = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.Parent == menu.Object); var item = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.Parent == menu.Object);
var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); var e = CreateArgs(MenuItem.PointerExitedItemEvent, item);
menu.SetupGet(x => x.IsOpen).Returns(true); menu.SetupGet(x => x.IsOpen).Returns(true);
menu.SetupGet(x => x.SelectedItem).Returns(item); menu.SetupGet(x => x.SelectedItem).Returns(item);
target.PointerLeave(item, e); target.PointerExited(item, e);
menu.VerifySet(x => x.SelectedItem = null, Times.Never); menu.VerifySet(x => x.SelectedItem = null, Times.Never);
Assert.False(e.Handled); Assert.False(e.Handled);
@ -382,31 +382,31 @@ namespace Avalonia.Controls.UnitTests.Platform
} }
[Fact] [Fact]
public void PointerEnter_Selects_Item() public void PointerEntered_Selects_Item()
{ {
var target = new DefaultMenuInteractionHandler(false); var target = new DefaultMenuInteractionHandler(false);
var menu = Mock.Of<IMenu>(); var menu = Mock.Of<IMenu>();
var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu);
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem);
var e = CreateArgs(MenuItem.PointerEnterItemEvent, item); var e = CreateArgs(MenuItem.PointerEnteredItemEvent, item);
target.PointerEnter(item, e); target.PointerEntered(item, e);
Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item);
Assert.False(e.Handled); Assert.False(e.Handled);
} }
[Fact] [Fact]
public void PointerEnter_Opens_Submenu_After_Delay() public void PointerEntered_Opens_Submenu_After_Delay()
{ {
var timer = new TestTimer(); var timer = new TestTimer();
var target = new DefaultMenuInteractionHandler(false, null, timer.RunOnce); var target = new DefaultMenuInteractionHandler(false, null, timer.RunOnce);
var menu = Mock.Of<IMenu>(); var menu = Mock.Of<IMenu>();
var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu);
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true);
var e = CreateArgs(MenuItem.PointerEnterItemEvent, item); var e = CreateArgs(MenuItem.PointerEnteredItemEvent, item);
target.PointerEnter(item, e); target.PointerEntered(item, e);
Mock.Get(item).Verify(x => x.Open(), Times.Never); Mock.Get(item).Verify(x => x.Open(), Times.Never);
timer.Pulse(); timer.Pulse();
@ -416,7 +416,7 @@ namespace Avalonia.Controls.UnitTests.Platform
} }
[Fact] [Fact]
public void PointerEnter_Closes_Sibling_Submenu_After_Delay() public void PointerEntered_Closes_Sibling_Submenu_After_Delay()
{ {
var timer = new TestTimer(); var timer = new TestTimer();
var target = new DefaultMenuInteractionHandler(false, null, timer.RunOnce); var target = new DefaultMenuInteractionHandler(false, null, timer.RunOnce);
@ -424,11 +424,11 @@ namespace Avalonia.Controls.UnitTests.Platform
var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu);
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem);
var sibling = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true && x.IsSubMenuOpen == true); var sibling = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true && x.IsSubMenuOpen == true);
var e = CreateArgs(MenuItem.PointerEnterItemEvent, item); var e = CreateArgs(MenuItem.PointerEnteredItemEvent, item);
Mock.Get(parentItem).SetupGet(x => x.SubItems).Returns(new[] { item, sibling }); Mock.Get(parentItem).SetupGet(x => x.SubItems).Returns(new[] { item, sibling });
target.PointerEnter(item, e); target.PointerEntered(item, e);
Mock.Get(sibling).Verify(x => x.Close(), Times.Never); Mock.Get(sibling).Verify(x => x.Close(), Times.Never);
timer.Pulse(); timer.Pulse();
@ -438,48 +438,48 @@ namespace Avalonia.Controls.UnitTests.Platform
} }
[Fact] [Fact]
public void PointerLeave_Deselects_Item() public void PointerExited_Deselects_Item()
{ {
var target = new DefaultMenuInteractionHandler(false); var target = new DefaultMenuInteractionHandler(false);
var menu = Mock.Of<IMenu>(); var menu = Mock.Of<IMenu>();
var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu);
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem);
var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); var e = CreateArgs(MenuItem.PointerExitedItemEvent, item);
Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(item); Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(item);
target.PointerLeave(item, e); target.PointerExited(item, e);
Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null);
Assert.False(e.Handled); Assert.False(e.Handled);
} }
[Fact] [Fact]
public void PointerLeave_Doesnt_Deselect_Sibling() public void PointerExited_Doesnt_Deselect_Sibling()
{ {
var target = new DefaultMenuInteractionHandler(false); var target = new DefaultMenuInteractionHandler(false);
var menu = Mock.Of<IMenu>(); var menu = Mock.Of<IMenu>();
var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu);
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem);
var sibling = Mock.Of<IMenuItem>(x => x.Parent == parentItem); var sibling = Mock.Of<IMenuItem>(x => x.Parent == parentItem);
var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); var e = CreateArgs(MenuItem.PointerExitedItemEvent, item);
Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(sibling); Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(sibling);
target.PointerLeave(item, e); target.PointerExited(item, e);
Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never);
Assert.False(e.Handled); Assert.False(e.Handled);
} }
[Fact] [Fact]
public void PointerLeave_Doesnt_Deselect_Item_If_Pointer_Over_Submenu() public void PointerExited_Doesnt_Deselect_Item_If_Pointer_Over_Submenu()
{ {
var target = new DefaultMenuInteractionHandler(false); var target = new DefaultMenuInteractionHandler(false);
var menu = Mock.Of<IMenu>(); var menu = Mock.Of<IMenu>();
var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu);
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true && x.IsPointerOverSubMenu == true); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true && x.IsPointerOverSubMenu == true);
var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); var e = CreateArgs(MenuItem.PointerExitedItemEvent, item);
target.PointerLeave(item, e); target.PointerExited(item, e);
Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never);
Assert.False(e.Handled); Assert.False(e.Handled);
@ -510,11 +510,11 @@ namespace Avalonia.Controls.UnitTests.Platform
var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var parentItem = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu);
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem && x.HasSubMenu == true);
var childItem = Mock.Of<IMenuItem>(x => x.Parent == item); var childItem = Mock.Of<IMenuItem>(x => x.Parent == item);
var enter = CreateArgs(MenuItem.PointerEnterItemEvent, item); var enter = CreateArgs(MenuItem.PointerEnteredItemEvent, item);
var leave = CreateArgs(MenuItem.PointerLeaveItemEvent, item); var leave = CreateArgs(MenuItem.PointerExitedItemEvent, item);
// Pointer enters item; item is selected. // Pointer enters item; item is selected.
target.PointerEnter(item, enter); target.PointerEntered(item, enter);
Assert.True(timer.ActionIsQueued); Assert.True(timer.ActionIsQueued);
Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item);
Mock.Get(parentItem).Invocations.Clear(); Mock.Get(parentItem).Invocations.Clear();
@ -526,13 +526,13 @@ namespace Avalonia.Controls.UnitTests.Platform
Mock.Get(item).Invocations.Clear(); Mock.Get(item).Invocations.Clear();
// Pointer briefly exits item, but submenu remains open. // Pointer briefly exits item, but submenu remains open.
target.PointerLeave(item, leave); target.PointerExited(item, leave);
Mock.Get(item).Verify(x => x.Close(), Times.Never); Mock.Get(item).Verify(x => x.Close(), Times.Never);
Mock.Get(item).Invocations.Clear(); Mock.Get(item).Invocations.Clear();
// Pointer enters child item; is selected. // Pointer enters child item; is selected.
enter.Source = childItem; enter.Source = childItem;
target.PointerEnter(childItem, enter); target.PointerEntered(childItem, enter);
Mock.Get(item).VerifySet(x => x.SelectedItem = childItem); Mock.Get(item).VerifySet(x => x.SelectedItem = childItem);
Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item);
Mock.Get(item).Invocations.Clear(); Mock.Get(item).Invocations.Clear();

4
tests/Avalonia.UnitTests/MouseTestHelper.cs

@ -107,13 +107,13 @@ namespace Avalonia.UnitTests
public void Enter(IInteractive target) public void Enter(IInteractive target)
{ {
target.RaiseEvent(new PointerEventArgs(InputElement.PointerEnterEvent, target, _pointer, (IVisual)target, default, target.RaiseEvent(new PointerEventArgs(InputElement.PointerEnteredEvent, target, _pointer, (IVisual)target, default,
Timestamp(), new PointerPointProperties((RawInputModifiers)_pressedButtons, PointerUpdateKind.Other), KeyModifiers.None)); Timestamp(), new PointerPointProperties((RawInputModifiers)_pressedButtons, PointerUpdateKind.Other), KeyModifiers.None));
} }
public void Leave(IInteractive target) public void Leave(IInteractive target)
{ {
target.RaiseEvent(new PointerEventArgs(InputElement.PointerLeaveEvent, target, _pointer, (IVisual)target, default, target.RaiseEvent(new PointerEventArgs(InputElement.PointerExitedEvent, target, _pointer, (IVisual)target, default,
Timestamp(), new PointerPointProperties((RawInputModifiers)_pressedButtons, PointerUpdateKind.Other), KeyModifiers.None)); Timestamp(), new PointerPointProperties((RawInputModifiers)_pressedButtons, PointerUpdateKind.Other), KeyModifiers.None));
} }

Loading…
Cancel
Save