Browse Source

Merge branch 'master' into avalonialist-ensurecapacity

pull/3475/head
Steven Kirk 7 years ago
committed by GitHub
parent
commit
200844a147
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
  2. 2
      src/Avalonia.Input/Gestures.cs
  3. 13
      src/Avalonia.Themes.Default/ItemsControl.xaml
  4. 12
      tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
  5. 4
      tests/Avalonia.Input.UnitTests/GesturesTests.cs

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

@ -6,6 +6,8 @@ using Avalonia.LogicalTree;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Threading; using Avalonia.Threading;
#nullable enable
namespace Avalonia.Controls.Platform namespace Avalonia.Controls.Platform
{ {
/// <summary> /// <summary>
@ -14,8 +16,8 @@ namespace Avalonia.Controls.Platform
public class DefaultMenuInteractionHandler : IMenuInteractionHandler public class DefaultMenuInteractionHandler : IMenuInteractionHandler
{ {
private readonly bool _isContextMenu; private readonly bool _isContextMenu;
private IDisposable _inputManagerSubscription; private IDisposable? _inputManagerSubscription;
private IRenderRoot _root; private IRenderRoot? _root;
public DefaultMenuInteractionHandler(bool isContextMenu) public DefaultMenuInteractionHandler(bool isContextMenu)
: this(isContextMenu, Input.InputManager.Instance, DefaultDelayRun) : this(isContextMenu, Input.InputManager.Instance, DefaultDelayRun)
@ -24,9 +26,11 @@ namespace Avalonia.Controls.Platform
public DefaultMenuInteractionHandler( public DefaultMenuInteractionHandler(
bool isContextMenu, bool isContextMenu,
IInputManager inputManager, IInputManager? inputManager,
Action<Action, TimeSpan> delayRun) Action<Action, TimeSpan> delayRun)
{ {
delayRun = delayRun ?? throw new ArgumentNullException(nameof(delayRun));
_isContextMenu = isContextMenu; _isContextMenu = isContextMenu;
InputManager = inputManager; InputManager = inputManager;
DelayRun = delayRun; DelayRun = delayRun;
@ -92,7 +96,7 @@ namespace Avalonia.Controls.Platform
root.Deactivated -= WindowDeactivated; root.Deactivated -= WindowDeactivated;
} }
_inputManagerSubscription.Dispose(); _inputManagerSubscription!.Dispose();
Menu = null; Menu = null;
_root = null; _root = null;
@ -100,9 +104,9 @@ namespace Avalonia.Controls.Platform
protected Action<Action, TimeSpan> DelayRun { get; } protected Action<Action, TimeSpan> DelayRun { get; }
protected IInputManager InputManager { get; } protected IInputManager? InputManager { get; }
protected IMenu Menu { get; private set; } protected IMenu? Menu { get; private set; }
protected static TimeSpan MenuShowDelay { get; } = TimeSpan.FromMilliseconds(400); protected static TimeSpan MenuShowDelay { get; } = TimeSpan.FromMilliseconds(400);
@ -131,7 +135,7 @@ namespace Avalonia.Controls.Platform
KeyDown(GetMenuItem(e.Source as IControl), e); KeyDown(GetMenuItem(e.Source as IControl), e);
} }
protected internal virtual void KeyDown(IMenuItem item, KeyEventArgs e) protected internal virtual void KeyDown(IMenuItem? item, KeyEventArgs e)
{ {
switch (e.Key) switch (e.Key)
{ {
@ -200,7 +204,7 @@ namespace Avalonia.Controls.Platform
} }
else else
{ {
Menu.Close(); Menu!.Close();
} }
e.Handled = true; e.Handled = true;
@ -213,12 +217,12 @@ namespace Avalonia.Controls.Platform
{ {
if (item == null && _isContextMenu) if (item == null && _isContextMenu)
{ {
if (Menu.MoveSelection(direction.Value, true) == true) if (Menu!.MoveSelection(direction.Value, true) == true)
{ {
e.Handled = true; e.Handled = true;
} }
} }
else if (item.Parent?.MoveSelection(direction.Value, true) == true) else if (item?.Parent?.MoveSelection(direction.Value, true) == true)
{ {
// If the the parent is an IMenu which successfully moved its selection, // If the the parent is an IMenu which successfully moved its selection,
// and the current menu is open then close the current menu and open the // and the current menu is open then close the current menu and open the
@ -408,7 +412,7 @@ namespace Avalonia.Controls.Platform
protected void CloseMenu(IMenuItem item) protected void CloseMenu(IMenuItem item)
{ {
var current = (IMenuElement)item; var current = (IMenuElement?)item;
while (current != null && !(current is IMenu)) while (current != null && !(current is IMenu))
{ {
@ -456,7 +460,7 @@ namespace Avalonia.Controls.Platform
protected void SelectItemAndAncestors(IMenuItem item) protected void SelectItemAndAncestors(IMenuItem item)
{ {
var current = item; var current = (IMenuItem?)item;
while (current?.Parent != null) while (current?.Parent != null)
{ {
@ -465,7 +469,7 @@ namespace Avalonia.Controls.Platform
} }
} }
protected static IMenuItem GetMenuItem(IControl item) protected static IMenuItem? GetMenuItem(IControl? item)
{ {
while (true) while (true)
{ {

2
src/Avalonia.Input/Gestures.cs

@ -79,7 +79,7 @@ namespace Avalonia.Input
{ {
s_lastPress = new WeakReference<IInteractive>(e.Source); s_lastPress = new WeakReference<IInteractive>(e.Source);
} }
else if (s_lastPress != null && e.ClickCount == 2 && e.MouseButton != MouseButton.Right) else if (s_lastPress != null && e.ClickCount == 2 && e.MouseButton == MouseButton.Left)
{ {
if (s_lastPress.TryGetTarget(out var target) && target == e.Source) if (s_lastPress.TryGetTarget(out var target) && target == e.Source)
{ {

13
src/Avalonia.Themes.Default/ItemsControl.xaml

@ -1,10 +1,15 @@
<Style xmlns="https://github.com/avaloniaui" Selector="ItemsControl"> <Style xmlns="https://github.com/avaloniaui" Selector="ItemsControl">
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate>
<ItemsPresenter Name="PART_ItemsPresenter" <Border Background="{TemplateBinding Background}"
Items="{TemplateBinding Items}" BorderBrush="{TemplateBinding BorderBrush}"
ItemsPanel="{TemplateBinding ItemsPanel}" BorderThickness="{TemplateBinding BorderThickness}"
ItemTemplate="{TemplateBinding ItemTemplate}"/> Padding="{TemplateBinding Padding}">
<ItemsPresenter Name="PART_ItemsPresenter"
Items="{TemplateBinding Items}"
ItemsPanel="{TemplateBinding ItemsPanel}"
ItemTemplate="{TemplateBinding ItemTemplate}"/>
</Border>
</ControlTemplate> </ControlTemplate>
</Setter> </Setter>
</Style> </Style>

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

@ -199,6 +199,18 @@ namespace Avalonia.Controls.UnitTests.Platform
menu.VerifySet(x => x.SelectedItem = null, Times.Never); menu.VerifySet(x => x.SelectedItem = null, Times.Never);
Assert.False(e.Handled); Assert.False(e.Handled);
} }
[Fact]
public void Doesnt_Throw_On_Menu_Keypress()
{
// Issue #3459
var target = new DefaultMenuInteractionHandler(false);
var menu = Mock.Of<IMenu>();
var item = Mock.Of<IMenuItem>(x => x.IsTopLevel == true && x.Parent == menu);
var e = new KeyEventArgs { Key = Key.Tab, Source = menu };
target.KeyDown(menu, e);
}
} }
public class NonTopLevel public class NonTopLevel

4
tests/Avalonia.Input.UnitTests/GesturesTests.cs

@ -135,7 +135,7 @@ namespace Avalonia.Interactivity.UnitTests
} }
[Fact] [Fact]
public void DoubleTapped_Should_Be_Raised_For_Middle_Button() public void DoubleTapped_Should_Not_Be_Raised_For_Middle_Button()
{ {
Border border = new Border(); Border border = new Border();
var decorator = new Decorator var decorator = new Decorator
@ -149,7 +149,7 @@ namespace Avalonia.Interactivity.UnitTests
_mouse.Click(border, MouseButton.Middle); _mouse.Click(border, MouseButton.Middle);
_mouse.Down(border, MouseButton.Middle, clickCount: 2); _mouse.Down(border, MouseButton.Middle, clickCount: 2);
Assert.True(raised); Assert.False(raised);
} }
[Fact] [Fact]

Loading…
Cancel
Save