Browse Source

implement a pressed mixin.

pull/4018/head
Dan Walmsley 6 years ago
parent
commit
817476ef77
  1. 33
      src/Avalonia.Controls/Mixins/PressedMixin.cs
  2. 37
      tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs

33
src/Avalonia.Controls/Mixins/PressedMixin.cs

@ -0,0 +1,33 @@
using Avalonia.Interactivity;
using Avalonia.Input;
namespace Avalonia.Controls.Mixins
{
/// <summary>
/// Adds pressed functionality to control classes.
///
/// Adds the ':pressed' class when the item is pressed.
/// </summary>
public static class PressedMixin
{
private static void HandlePointerPressed<TControl>(TControl sender, PointerPressedEventArgs e) where TControl : Control
{
if (e.GetCurrentPoint(sender).Properties.IsLeftButtonPressed)
{
((IPseudoClasses)sender.Classes).Set(":pressed", true);
}
}
private static void HandlePointerReleased<TControl>(TControl sender) where TControl : Control
{
((IPseudoClasses)sender.Classes).Set(":pressed", false);
}
public static void Attach<TControl>() where TControl : Control
{
InputElement.PointerPressedEvent.AddClassHandler<TControl>((x, e) => HandlePointerPressed(x, e), RoutingStrategies.Tunnel, true);
InputElement.PointerReleasedEvent.AddClassHandler<TControl>((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true);
InputElement.PointerCaptureLostEvent.AddClassHandler<TControl>((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true);
}
}
}

37
tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs

@ -0,0 +1,37 @@
using Avalonia.Controls.Mixins;
using Avalonia.UnitTests;
using Xunit;
namespace Avalonia.Controls.UnitTests.Mixins
{
public class PressedMixinTests
{
private MouseTestHelper _mouse = new MouseTestHelper();
[Fact]
public void Selected_Class_Should_Not_Initially_Be_Added()
{
var target = new TestControl();
Assert.Empty(target.Classes);
}
[Fact]
public void Setting_IsSelected_Should_Add_Selected_Class()
{
var target = new TestControl();
_mouse.Down(target);
Assert.Equal(new[] { ":pressed" }, target.Classes);
}
private class TestControl : Control
{
static TestControl()
{
PressedMixin.Attach<TestControl>();
}
}
}
}
Loading…
Cancel
Save