Преглед изворни кода

implement a pressed mixin.

Dan Walmsley пре 5 година
родитељ
комит
817476ef77

+ 33 - 0
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 - 0
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>();
+            }
+        }
+    }
+}