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++)