diff --git a/CUE.NET.csproj b/CUE.NET.csproj index 5047d45..316c99b 100644 --- a/CUE.NET.csproj +++ b/CUE.NET.csproj @@ -85,6 +85,7 @@ + diff --git a/Devices/Keyboard/CorsairKeyboard.cs b/Devices/Keyboard/CorsairKeyboard.cs index 054e7f2..c2c2b58 100644 --- a/Devices/Keyboard/CorsairKeyboard.cs +++ b/Devices/Keyboard/CorsairKeyboard.cs @@ -51,7 +51,7 @@ namespace CUE.NET.Devices.Keyboard } public IEnumerable Keys => new ReadOnlyCollection(_keys.Values.ToList()); - + public Color Color { get; set; } = Color.Transparent; private readonly IList _keyGroups = new List(); @@ -92,19 +92,20 @@ namespace CUE.NET.Devices.Keyboard base.UpdateLeds(forceUpdate); } - public void AttachKeyGroup(IKeyGroup keyGroup) + public bool AttachKeyGroup(IKeyGroup keyGroup) { - if (keyGroup == null) return; + if (keyGroup == null || _keyGroups.Contains(keyGroup)) return false; - if (!_keyGroups.Contains(keyGroup)) - _keyGroups.Add(keyGroup); + _keyGroups.Add(keyGroup); + return true; } - public void DetachKeyGroup(IKeyGroup keyGroup) + public bool DetachKeyGroup(IKeyGroup keyGroup) { - if (keyGroup == null) return; + if (keyGroup == null || !_keyGroups.Contains(keyGroup)) return false; _keyGroups.Remove(keyGroup); + return true; } private void InitializeKeys() diff --git a/Devices/Keyboard/Extensions/KeyGroupExtension.cs b/Devices/Keyboard/Extensions/KeyGroupExtension.cs new file mode 100644 index 0000000..a8c1364 --- /dev/null +++ b/Devices/Keyboard/Extensions/KeyGroupExtension.cs @@ -0,0 +1,46 @@ +using System.Linq; +using CUE.NET.Devices.Keyboard.Enums; +using CUE.NET.Devices.Keyboard.Keys; + +namespace CUE.NET.Devices.Keyboard.Extensions +{ + public static class KeyGroupExtension + { + public static SimpleKeyGroup ToSimpleKeyGroup(this BaseKeyGroup keyGroup) + { + SimpleKeyGroup simpleKeyGroup = keyGroup as SimpleKeyGroup; + if (simpleKeyGroup == null) + { + bool wasAttached = keyGroup.Detach(); + simpleKeyGroup = new SimpleKeyGroup(keyGroup.Keyboard, wasAttached, keyGroup.Keys.ToArray()) { Color = keyGroup.Color }; + } + return simpleKeyGroup; + } + + public static SimpleKeyGroup Exclude(this BaseKeyGroup keyGroup, params CorsairKeyboardKeyId[] keyIds) + { + SimpleKeyGroup simpleKeyGroup = keyGroup.ToSimpleKeyGroup(); + foreach (CorsairKeyboardKeyId keyId in keyIds) + simpleKeyGroup.RemoveKey(keyId); + return simpleKeyGroup; + } + + public static SimpleKeyGroup Exclude(this BaseKeyGroup keyGroup, params CorsairKey[] keyIds) + { + SimpleKeyGroup simpleKeyGroup = keyGroup.ToSimpleKeyGroup(); + foreach (CorsairKey key in keyIds) + simpleKeyGroup.RemoveKey(key); + return simpleKeyGroup; + } + + public static bool Attach(this BaseKeyGroup keyGroup) + { + return keyGroup.Keyboard?.AttachKeyGroup(keyGroup) ?? false; + } + + public static bool Detach(this BaseKeyGroup keyGroup) + { + return keyGroup.Keyboard?.DetachKeyGroup(keyGroup) ?? false; + } + } +} diff --git a/Devices/Keyboard/Keys/BaseKeyGroup.cs b/Devices/Keyboard/Keys/BaseKeyGroup.cs index 24d2b3b..42bd0d6 100644 --- a/Devices/Keyboard/Keys/BaseKeyGroup.cs +++ b/Devices/Keyboard/Keys/BaseKeyGroup.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; +using CUE.NET.Devices.Keyboard.Extensions; namespace CUE.NET.Devices.Keyboard.Keys { @@ -8,7 +9,7 @@ namespace CUE.NET.Devices.Keyboard.Keys { #region Properties & Fields - protected CorsairKeyboard Keyboard { get; } + internal CorsairKeyboard Keyboard { get; } public IEnumerable Keys => new ReadOnlyCollection(GroupKeys); protected IList GroupKeys { get; } = new List(); @@ -24,18 +25,7 @@ namespace CUE.NET.Devices.Keyboard.Keys this.Keyboard = keyboard; if (autoAttach) - keyboard.AttachKeyGroup(this); - } - - #endregion - - #region Methods - - public void MergeKeys(IKeyGroup groupToMerge) - { - foreach (CorsairKey key in groupToMerge.Keys) - if (!GroupKeys.Contains(key)) - GroupKeys.Add(key); + this.Attach(); } #endregion diff --git a/Devices/Keyboard/Keys/SimpleKeyGroup.cs b/Devices/Keyboard/Keys/SimpleKeyGroup.cs index eb1ba84..aeed1ab 100644 --- a/Devices/Keyboard/Keys/SimpleKeyGroup.cs +++ b/Devices/Keyboard/Keys/SimpleKeyGroup.cs @@ -6,18 +6,26 @@ namespace CUE.NET.Devices.Keyboard.Keys { #region Constructors - public SimpleKeyGroup(CorsairKeyboard keyboard) - : base(keyboard) + public SimpleKeyGroup(CorsairKeyboard keyboard, bool autoAttach = true) + : base(keyboard, autoAttach) { } public SimpleKeyGroup(CorsairKeyboard keyboard, params CorsairKey[] keys) - : base(keyboard) + : this(keyboard, true, keys) + { } + + public SimpleKeyGroup(CorsairKeyboard keyboard, bool autoAttach, params CorsairKey[] keys) + : base(keyboard, autoAttach) { AddKey(keys); } public SimpleKeyGroup(CorsairKeyboard keyboard, params CorsairKeyboardKeyId[] keys) - : base(keyboard) + : this(keyboard, true, keys) + { } + + public SimpleKeyGroup(CorsairKeyboard keyboard, bool autoAttach, params CorsairKeyboardKeyId[] keys) + : base(keyboard, autoAttach) { AddKey(keys); } @@ -67,6 +75,13 @@ namespace CUE.NET.Devices.Keyboard.Keys return ContainsKey(Keyboard[keyId]); } + public void MergeKeys(IKeyGroup groupToMerge) + { + foreach (CorsairKey key in groupToMerge.Keys) + if (!GroupKeys.Contains(key)) + GroupKeys.Add(key); + } + #endregion } } diff --git a/Examples/SimpleDevTest/Program.cs b/Examples/SimpleDevTest/Program.cs index f1afef2..94eeae5 100644 --- a/Examples/SimpleDevTest/Program.cs +++ b/Examples/SimpleDevTest/Program.cs @@ -7,6 +7,7 @@ using CUE.NET; using CUE.NET.Devices.Generic.Enums; using CUE.NET.Devices.Keyboard; using CUE.NET.Devices.Keyboard.Enums; +using CUE.NET.Devices.Keyboard.Extensions; using CUE.NET.Devices.Keyboard.Keys; using CUE.NET.Exceptions; @@ -34,9 +35,11 @@ namespace SimpleDevTest if (keyboard == null) throw new WrapperException("No keyboard found"); - //Ink all numbers on the keypad purple - RectangleKeyGroup purpleGroup = new RectangleKeyGroup(keyboard, CorsairKeyboardKeyId.Keypad7, CorsairKeyboardKeyId.Keypad3) - { Color = Color.Purple }; + //Ink all numbers on the keypad except the '5' purple, we want that to be gray + SimpleKeyGroup purpleGroup = new RectangleKeyGroup(keyboard, CorsairKeyboardKeyId.Keypad7, CorsairKeyboardKeyId.Keypad3) + { Color = Color.Purple } + .Exclude(CorsairKeyboardKeyId.Keypad5); + keyboard[CorsairKeyboardKeyId.Keypad5].Led.Color = Color.Gray; // Ink the Keys 'r', 'g', 'b' in their respective color // The char access seems to fail for everything except letters (SDK doesn't return a valid keyId) @@ -77,9 +80,9 @@ namespace SimpleDevTest Random random = new Random(); // Remove all the groups we created above to clear the keyboard - keyboard.DetachKeyGroup(purpleGroup); - keyboard.DetachKeyGroup(whiteGroup); - keyboard.DetachKeyGroup(yellowGroup); + purpleGroup.Detach(); + whiteGroup.Detach(); + yellowGroup.Detach(); // Flash whole keyboard three times to ... well ... just to make it happen for (int i = 0; i < 3; i++)