Browse Source

Make KeyGestures with +,-,. in them match with both the non-numpad keys and the matching numpad keys.

Fixes #225
Jeremy Koritzinsky 8 years ago
parent
commit
b463d04e9f

+ 16 - 1
src/Avalonia.Input/KeyGesture.cs

@@ -111,6 +111,21 @@ namespace Avalonia.Input
             return string.Join(" + ", parts);
         }
 
-        public bool Matches(KeyEventArgs keyEvent) => keyEvent.Key == Key && keyEvent.Modifiers == Modifiers;
+        public bool Matches(KeyEventArgs keyEvent) => ResolveNumPadOperationKey(keyEvent.Key) == Key && keyEvent.Modifiers == Modifiers;
+
+        private Key ResolveNumPadOperationKey(Key key)
+        {
+            switch (key)
+            {
+                case Key.Add:
+                    return Key.OemPlus;
+                case Key.Subtract:
+                    return Key.OemMinus;
+                case Key.Decimal:
+                    return Key.OemPeriod;
+                default:
+                    return key;
+            }
+        }
     }
 }

+ 0 - 28
tests/Avalonia.Input.UnitTests/KeyGestureParseTests.cs

@@ -1,28 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Xunit;
-
-namespace Avalonia.Input.UnitTests
-{
-    public class KeyGestureParseTests
-    {
-        private static readonly Dictionary<string, KeyGesture> SampleData = new Dictionary<string, KeyGesture>
-        {
-            {"Ctrl+A", new KeyGesture {Key = Key.A, Modifiers = InputModifiers.Control}},
-            {"  \tShift\t+Alt +B", new KeyGesture {Key = Key.B, Modifiers = InputModifiers.Shift|InputModifiers.Alt} },
-            {"Control++", new KeyGesture {Key = Key.OemPlus, Modifiers = InputModifiers.Control} }
-        };
-            
-            
-            
-        [Fact]
-        public void Key_Gesture_Is_Able_To_Parse_Sample_Data()
-        {
-            foreach (var d in SampleData)
-                Assert.Equal(d.Value, KeyGesture.Parse(d.Key));
-        }
-    }
-}

+ 44 - 0
tests/Avalonia.Input.UnitTests/KeyGestureTests.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Avalonia.Input.UnitTests
+{
+    public class KeyGestureTests
+    {
+        public static readonly IEnumerable<object[]> SampleData = new object[][]
+        {
+            new object[]{"Ctrl+A", new KeyGesture {Key = Key.A, Modifiers = InputModifiers.Control}},
+            new object[]{"  \tShift\t+Alt +B", new KeyGesture {Key = Key.B, Modifiers = InputModifiers.Shift|InputModifiers.Alt} },
+            new object[]{"Control++", new KeyGesture {Key = Key.OemPlus, Modifiers = InputModifiers.Control} }
+        };
+            
+            
+            
+        [Theory]
+        [MemberData(nameof(SampleData))]
+        public void Key_Gesture_Is_Able_To_Parse_Sample_Data(string text, KeyGesture gesture)
+        {
+            Assert.Equal(gesture, KeyGesture.Parse(text));
+        }
+
+        [Theory]
+        [InlineData(Key.OemMinus, Key.Subtract)]
+        [InlineData(Key.OemPlus, Key.Add)]
+        [InlineData(Key.OemPeriod, Key.Decimal)]
+        public void Key_Gesture_Matches_NumPad_To_Regular_Digit(Key gestureKey, Key pressedKey)
+        {
+            var keyGesture = new KeyGesture
+            {
+                Key = gestureKey
+            };
+            Assert.True(keyGesture.Matches(new KeyEventArgs
+            {
+                Key = pressedKey
+            }));
+        }
+    }
+}