Browse Source

Don't deselect sibling item on PointerLeave.

repro-ienumerable-menu-navigation
Steven Kirk 8 years ago
parent
commit
0fb1780f75
  1. 15
      src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
  2. 18
      tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs

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

@ -301,17 +301,20 @@ namespace Avalonia.Controls.Platform
return; return;
} }
if (item.IsTopLevel) if (item.Parent.SelectedItem == item)
{ {
if (!((IMenu)item.Parent).IsOpen && item.Parent.SelectedItem == item) if (item.IsTopLevel)
{
if (!((IMenu)item.Parent).IsOpen)
{
item.Parent.SelectedItem = null;
}
}
else if (!item.HasSubMenu)
{ {
item.Parent.SelectedItem = null; item.Parent.SelectedItem = null;
} }
} }
else if (!item.HasSubMenu)
{
item.Parent.SelectedItem = null;
}
} }
protected internal virtual void PointerPressed(object sender, PointerPressedEventArgs e) protected internal virtual void PointerPressed(object sender, PointerPressedEventArgs e)

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

@ -371,12 +371,30 @@ namespace Avalonia.Controls.UnitTests.Platform
var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem); var item = Mock.Of<IMenuItem>(x => x.Parent == parentItem);
var e = new PointerEventArgs { RoutedEvent = MenuItem.PointerLeaveItemEvent, Source = item }; var e = new PointerEventArgs { RoutedEvent = MenuItem.PointerLeaveItemEvent, Source = item };
Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(item);
target.PointerLeave(item, e); target.PointerLeave(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]
public void PointerLeave_Doesnt_Deselect_Sibling()
{
var target = new DefaultMenuInteractionHandler();
var menu = Mock.Of<IMenu>();
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 sibling = Mock.Of<IMenuItem>(x => x.Parent == parentItem);
var e = new PointerEventArgs { RoutedEvent = MenuItem.PointerLeaveItemEvent, Source = item };
Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(sibling);
target.PointerLeave(item, e);
Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never);
Assert.False(e.Handled);
}
[Fact] [Fact]
public void PointerLeave_Doesnt_Deselect_Item_If_Pointer_Over_Submenu() public void PointerLeave_Doesnt_Deselect_Item_If_Pointer_Over_Submenu()
{ {

Loading…
Cancel
Save