diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj
index 22820281f..698c34680 100644
--- a/Artemis/Artemis/Artemis.csproj
+++ b/Artemis/Artemis/Artemis.csproj
@@ -653,7 +653,6 @@
-
diff --git a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs
index d57e6e47c..e6d815676 100644
--- a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs
+++ b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs
@@ -1,92 +1,92 @@
-using System.Drawing;
-using System.Linq;
-using System.Threading;
-using System.Windows;
-using System.Windows.Forms;
-using Artemis.DAL;
-using Artemis.DeviceProviders.CoolerMaster.Utilities;
-using Artemis.DeviceProviders.Logitech.Utilities;
-using Artemis.Properties;
-using Artemis.Settings;
-using Artemis.Utilities;
-
-namespace Artemis.DeviceProviders.CoolerMaster
-{
- public class MasterkeysProL : KeyboardProvider
- {
- private GeneralSettings _generalSettings;
-
- public MasterkeysProL()
- {
- Name = "CM Masterkeys Pro L";
- Slug = "cm-masterkeys-pro-l";
-
- CantEnableText = "Couldn't connect to your CM Masterkeys Pro L.\n" +
- "Please check your cables and try updating your CM software.\n\n" +
- "If needed, you can select a different keyboard in Artemis under settings.";
-
- Height = 6;
- Width = 22;
-
- PreviewSettings = new PreviewSettings(670, 189, new Thickness(-2, -5, 0, 0), Resources.masterkeys_pro_l);
- _generalSettings = SettingsProvider.Load();
- }
-
- public override void Disable()
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using System.Windows;
+using System.Windows.Forms;
+using Artemis.DAL;
+using Artemis.DeviceProviders.CoolerMaster.Utilities;
+using Artemis.DeviceProviders.Logitech.Utilities;
+using Artemis.Properties;
+using Artemis.Settings;
+using Artemis.Utilities;
+
+namespace Artemis.DeviceProviders.CoolerMaster
+{
+ public class MasterkeysProL : KeyboardProvider
+ {
+ private GeneralSettings _generalSettings;
+
+ public MasterkeysProL()
{
- CmSdk.SetControlDevice(DEVICE_INDEX.DEV_MKeys_L);
- CmSdk.EnableLedControl(false);
- Thread.Sleep(500);
- }
-
- public override bool CanEnable()
- {
- CmSdk.SetControlDevice(DEVICE_INDEX.DEV_MKeys_L);
-
- // Doesn't seem reliable but better than nothing I suppose
- return CmSdk.IsDevicePlug();
- }
-
- public override void Enable()
- {
- CmSdk.SetControlDevice(DEVICE_INDEX.DEV_MKeys_L);
- CmSdk.EnableLedControl(true);
- }
-
- public override void DrawBitmap(Bitmap bitmap)
- {
- // Resize the bitmap
- using (var b = ImageUtilities.ResizeImage(bitmap, Width, Height))
- {
- // Create an empty matrix
- var matrix = new COLOR_MATRIX {KeyColor = new KEY_COLOR[6, 22]};
-
- // Map the bytes to the matix
- for (var x = 0; x < Width; x++)
- {
- for (var y = 0; y < Height; y++)
- {
- var c = b.GetPixel(x, y);
- matrix.KeyColor[y, x] = new KEY_COLOR(c.R, c.G, c.B);
- }
- }
-
- // Send the matrix to the keyboard
- CmSdk.SetAllLedColor(matrix);
- }
- }
-
- public override KeyMatch? GetKeyPosition(Keys keyCode)
- {
- switch (_generalSettings.Layout)
- {
- case "Qwerty":
- return KeyMap.QwertyLayout.FirstOrDefault(k => k.KeyCode == keyCode);
- case "Qwertz":
- return KeyMap.QwertzLayout.FirstOrDefault(k => k.KeyCode == keyCode);
- default:
- return KeyMap.AzertyLayout.FirstOrDefault(k => k.KeyCode == keyCode);
- }
- }
- }
+ Name = "CM Masterkeys Pro L";
+ Slug = "cm-masterkeys-pro-l";
+
+ CantEnableText = "Couldn't connect to your CM Masterkeys Pro L.\n" +
+ "Please check your cables and try updating your CM software.\n\n" +
+ "If needed, you can select a different keyboard in Artemis under settings.";
+
+ Height = 6;
+ Width = 22;
+
+ PreviewSettings = new PreviewSettings(670, 189, new Thickness(-2, -5, 0, 0), Resources.masterkeys_pro_l);
+ _generalSettings = SettingsProvider.Load();
+ }
+
+ public override void Disable()
+ {
+ CmSdk.SetControlDevice(DEVICE_INDEX.DEV_MKeys_L);
+ CmSdk.EnableLedControl(false);
+ Thread.Sleep(500);
+ }
+
+ public override bool CanEnable()
+ {
+ CmSdk.SetControlDevice(DEVICE_INDEX.DEV_MKeys_L);
+
+ // Doesn't seem reliable but better than nothing I suppose
+ return CmSdk.IsDevicePlug();
+ }
+
+ public override void Enable()
+ {
+ CmSdk.SetControlDevice(DEVICE_INDEX.DEV_MKeys_L);
+ CmSdk.EnableLedControl(true);
+ }
+
+ public override void DrawBitmap(Bitmap bitmap)
+ {
+ // Resize the bitmap
+ using (var b = ImageUtilities.ResizeImage(bitmap, Width, Height))
+ {
+ // Create an empty matrix
+ var matrix = new COLOR_MATRIX {KeyColor = new KEY_COLOR[6, 22]};
+
+ // Map the bytes to the matix
+ for (var x = 0; x < Width; x++)
+ {
+ for (var y = 0; y < Height; y++)
+ {
+ var c = b.GetPixel(x, y);
+ matrix.KeyColor[y, x] = new KEY_COLOR(c.R, c.G, c.B);
+ }
+ }
+
+ // Send the matrix to the keyboard
+ CmSdk.SetAllLedColor(matrix);
+ }
+ }
+
+ public override KeyMatch? GetKeyPosition(Keys keyCode)
+ {
+ switch (_generalSettings.Layout)
+ {
+ case "Qwerty":
+ return KeyMap.QwertyLayout.FirstOrDefault(k => k.KeyCode == keyCode);
+ case "Qwertz":
+ return KeyMap.QwertzLayout.FirstOrDefault(k => k.KeyCode == keyCode);
+ default:
+ return KeyMap.AzertyLayout.FirstOrDefault(k => k.KeyCode == keyCode);
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs
index e00a811b7..f2eb70383 100644
--- a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs
+++ b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs
@@ -59,7 +59,7 @@ namespace Artemis.DeviceProviders.CoolerMaster
using (var b = ImageUtilities.ResizeImage(bitmap, Width, Height))
{
// Create an empty matrix
- var matrix = new COLOR_MATRIX { KeyColor = new KEY_COLOR[6, 22] };
+ var matrix = new COLOR_MATRIX {KeyColor = new KEY_COLOR[6, 22]};
// Map the bytes to the matix
for (var x = 0; x < Width; x++)
diff --git a/Artemis/Artemis/Profiles/ProfileModel.cs b/Artemis/Artemis/Profiles/ProfileModel.cs
index 9abcbb4ba..91de4d6b3 100644
--- a/Artemis/Artemis/Profiles/ProfileModel.cs
+++ b/Artemis/Artemis/Profiles/ProfileModel.cs
@@ -194,8 +194,13 @@ namespace Artemis.Profiles
}
public void Deactivate(LuaManager luaManager)
- {
- KeybindManager.Clear();
+ {
+ foreach (var layerModel in Layers)
+ {
+ for (var index = 0; index < layerModel.Properties.Conditions.Count; index++)
+ KeybindManager.Remove($"{GameName}-{Name}-{layerModel.Name}-{index}");
+ }
+
luaManager.ClearLua();
}
@@ -220,6 +225,7 @@ namespace Artemis.Profiles
public void ApplyKeybinds()
{
foreach (var layerModel in Layers)
+ {
for (var index = 0; index < layerModel.Properties.Conditions.Count; index++)
{
var condition = layerModel.Properties.Conditions[index];
@@ -231,6 +237,7 @@ namespace Artemis.Profiles
var kb = new KeybindModel($"{GameName}-{Name}-{layerModel.Name}-{index}", condition.HotKey, action);
KeybindManager.AddOrUpdate(kb);
}
+ }
}
#region Compare
diff --git a/Artemis/Artemis/Properties/AssemblyInfo.cs b/Artemis/Artemis/Properties/AssemblyInfo.cs
index fd3331164..a5cb9bb47 100644
--- a/Artemis/Artemis/Properties/AssemblyInfo.cs
+++ b/Artemis/Artemis/Properties/AssemblyInfo.cs
@@ -53,7 +53,7 @@ using System.Windows;
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.8.1.0")]
-[assembly: AssemblyFileVersion("1.8.1.0")]
+[assembly: AssemblyVersion("1.8.2.0")]
+[assembly: AssemblyFileVersion("1.8.2.0")]
[assembly: InternalsVisibleTo("Artemis.Explorables")]
diff --git a/Artemis/Artemis/Utilities/EditorHelper.cs b/Artemis/Artemis/Utilities/EditorHelper.cs
deleted file mode 100644
index ba7ab2eb1..000000000
--- a/Artemis/Artemis/Utilities/EditorHelper.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Artemis.Utilities
-{
- public static class EditorHelper
- {
- }
-}
diff --git a/Artemis/Artemis/Utilities/GeneralHelpers.cs b/Artemis/Artemis/Utilities/GeneralHelpers.cs
index bc2b49cd6..afc5be9d5 100644
--- a/Artemis/Artemis/Utilities/GeneralHelpers.cs
+++ b/Artemis/Artemis/Utilities/GeneralHelpers.cs
@@ -4,6 +4,8 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
+using System.Threading;
+using System.Windows;
using Microsoft.Win32;
using Newtonsoft.Json;
using static System.String;
@@ -126,5 +128,13 @@ namespace Artemis.Utilities
public List Children { get; set; }
public string DisplayType { get; set; }
}
+
+ public static void ExecuteSta(Action action)
+ {
+ var thread = new Thread(action.Invoke);
+ thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
+ thread.Start();
+ thread.Join();
+ }
}
}
\ No newline at end of file
diff --git a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs
index 149dc30d1..ade255270 100644
--- a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs
+++ b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs
@@ -28,9 +28,12 @@ using Caliburn.Micro;
using Castle.Components.DictionaryAdapter;
using GongSolutions.Wpf.DragDrop;
using MahApps.Metro;
+using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
+using Newtonsoft.Json;
using NuGet;
using Application = System.Windows.Application;
+using Clipboard = System.Windows.Clipboard;
using Cursor = System.Windows.Input.Cursor;
using Cursors = System.Windows.Input.Cursors;
using DragDropEffects = System.Windows.DragDropEffects;
@@ -44,6 +47,8 @@ namespace Artemis.ViewModels
{
private readonly DeviceManager _deviceManager;
private readonly MetroDialogService _dialogService;
+ private KeybindModel _copyKeybind;
+ private KeybindModel _pasteKeybind;
private readonly LoopManager _loopManager;
private readonly ModuleModel _moduleModel;
private ImageSource _keyboardPreview;
@@ -60,6 +65,8 @@ namespace Artemis.ViewModels
_loopManager = loopManager;
_moduleModel = moduleModel;
_dialogService = dialogService;
+ _copyKeybind = new KeybindModel("copy", new HotKey(Key.C, ModifierKeys.Control), LayerToClipboard);
+ _pasteKeybind = new KeybindModel("paste", new HotKey(Key.V, ModifierKeys.Control), ClipboardToLayer);
ProfileNames = new ObservableCollection();
Layers = new ObservableCollection();
@@ -69,6 +76,7 @@ namespace Artemis.ViewModels
PropertyChanged += EditorStateHandler;
_deviceManager.OnKeyboardChanged += DeviceManagerOnOnKeyboardChanged;
_moduleModel.ProfileChanged += ModuleModelOnProfileChanged;
+
LoadProfiles();
}
@@ -77,6 +85,8 @@ namespace Artemis.ViewModels
base.OnActivate();
_loopManager.RenderCompleted += LoopManagerOnRenderCompleted;
+ KeybindManager.AddOrUpdate(_copyKeybind);
+ KeybindManager.AddOrUpdate(_pasteKeybind);
}
public new void OnDeactivate(bool close)
@@ -85,6 +95,8 @@ namespace Artemis.ViewModels
SaveSelectedProfile();
_loopManager.RenderCompleted -= LoopManagerOnRenderCompleted;
+ KeybindManager.Remove(_copyKeybind);
+ KeybindManager.Remove(_pasteKeybind);
}
#region LUA
@@ -302,6 +314,38 @@ namespace Artemis.ViewModels
UpdateLayerList(clone);
}
+ public void LayerToClipboard()
+ {
+ if (SelectedLayer == null)
+ return;
+
+ // Probably not how the cool kids do it but leveraging on JsonConvert gives flawless serialization
+ GeneralHelpers.ExecuteSta(() => Clipboard.SetData("layer", JsonConvert.SerializeObject(SelectedLayer)));
+ }
+
+ public void ClipboardToLayer()
+ {
+ GeneralHelpers.ExecuteSta(() =>
+ {
+ var data = (string) Clipboard.GetData("layer");
+ if (data == null)
+ return;
+
+ var layerModel = JsonConvert.DeserializeObject(data);
+ if (layerModel == null)
+ return;
+
+ if (SelectedLayer != null)
+ SelectedLayer.InsertAfter(layerModel);
+ else
+ {
+ SelectedProfile.Layers.Add(layerModel);
+ SelectedProfile.FixOrder();
+ }
+ Execute.OnUIThread(() => UpdateLayerList(layerModel));
+ });
+ }
+
private void UpdateLayerList(LayerModel selectModel)
{
// Update the UI