diff --git a/Artemis/Artemis.sln b/Artemis/Artemis.sln index 69fb5b679..785b97bb9 100644 --- a/Artemis/Artemis.sln +++ b/Artemis/Artemis.sln @@ -13,6 +13,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LogiLed2Artemis", "LogiLed2 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis86Wrapper", "Artemis86Wrapper\Artemis86Wrapper.csproj", "{47A9BBFD-4BEA-4D7D-8AB7-896E760B2CF2}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LightFX2Artemis", "LightFX2Artemis\LightFX2Artemis.vcxproj", "{1A349CF5-2008-41E8-AC13-874CBBCDFA0A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CD_ROM|Any CPU = CD_ROM|Any CPU @@ -178,6 +180,34 @@ Global {47A9BBFD-4BEA-4D7D-8AB7-896E760B2CF2}.SingleImage|x64.Build.0 = Release|Any CPU {47A9BBFD-4BEA-4D7D-8AB7-896E760B2CF2}.SingleImage|x86.ActiveCfg = Release|Any CPU {47A9BBFD-4BEA-4D7D-8AB7-896E760B2CF2}.SingleImage|x86.Build.0 = Release|Any CPU + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.CD_ROM|Any CPU.ActiveCfg = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.CD_ROM|Any CPU.Build.0 = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.CD_ROM|x64.ActiveCfg = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.CD_ROM|x64.Build.0 = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.CD_ROM|x86.ActiveCfg = Release|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.CD_ROM|x86.Build.0 = Release|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Debug|x64.ActiveCfg = Debug|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Debug|x64.Build.0 = Debug|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Debug|x86.ActiveCfg = Debug|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Debug|x86.Build.0 = Debug|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.DVD-5|Any CPU.ActiveCfg = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.DVD-5|Any CPU.Build.0 = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.DVD-5|x64.ActiveCfg = Debug|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.DVD-5|x64.Build.0 = Debug|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.DVD-5|x86.ActiveCfg = Debug|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.DVD-5|x86.Build.0 = Debug|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Release|Any CPU.ActiveCfg = Release|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Release|x64.ActiveCfg = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Release|x64.Build.0 = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Release|x86.ActiveCfg = Release|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.Release|x86.Build.0 = Release|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.SingleImage|Any CPU.ActiveCfg = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.SingleImage|Any CPU.Build.0 = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.SingleImage|x64.ActiveCfg = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.SingleImage|x64.Build.0 = Release|x64 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.SingleImage|x86.ActiveCfg = Release|Win32 + {1A349CF5-2008-41E8-AC13-874CBBCDFA0A}.SingleImage|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index 13d87422d..8d31a8a77 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -321,6 +321,7 @@ + diff --git a/Artemis/Artemis/DeviceProviders/Artemis/NoneKeyboard.cs b/Artemis/Artemis/DeviceProviders/Artemis/NoneKeyboard.cs new file mode 100644 index 000000000..9aa51c19b --- /dev/null +++ b/Artemis/Artemis/DeviceProviders/Artemis/NoneKeyboard.cs @@ -0,0 +1,42 @@ +using System.Drawing; +using System.Windows; +using System.Windows.Forms; +using Artemis.Properties; + +namespace Artemis.DeviceProviders.Artemis +{ + public class NoneKeyboard : KeyboardProvider + { + public NoneKeyboard() + { + Name = "None"; + Slug = "none"; + CantEnableText = "Waaaaah, this should not be happening!"; + Height = 1; + Width = 1; + PreviewSettings = new PreviewSettings(984, 375, new Thickness(0, 0, 0, 0), Resources.none); + } + + public override void Disable() + { + } + + public override bool CanEnable() + { + return true; + } + + public override void Enable() + { + } + + public override void DrawBitmap(Bitmap bitmap) + { + } + + public override KeyMatch? GetKeyPosition(Keys keyCode) + { + return null; + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs index f30936674..503c7e16f 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs @@ -46,20 +46,19 @@ namespace Artemis.DeviceProviders.Corsair var leds = CueSDK.HeadsetSDK.Leds.Count(); var step = (double) bitmap.Width/leds; - using (bitmap) - { - var ledIndex = 0; - // Color each LED according to one of the pixels - foreach (var corsairLed in CueSDK.HeadsetSDK.Leds) - { - var col = ledIndex == 0 - ? bitmap.GetPixel(0, 0) - : bitmap.GetPixel((int) ((ledIndex + 1)*step - 1), (int) ((ledIndex + 1)*step - 1)); - corsairLed.Color = col; - ledIndex++; - } + var ledIndex = 0; + // Color each LED according to one of the pixels + foreach (var corsairLed in CueSDK.HeadsetSDK.Leds) + { + var col = ledIndex == 0 + ? bitmap.GetPixel(0, 0) + : bitmap.GetPixel((int) ((ledIndex + 1)*step - 1), (int) ((ledIndex + 1)*step - 1)); + + corsairLed.Color = col; + ledIndex++; } + CueSDK.HeadsetSDK.Update(); } diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs index e153be07e..c6586ef31 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs @@ -46,20 +46,19 @@ namespace Artemis.DeviceProviders.Corsair var leds = CueSDK.MouseSDK.Leds.Count(); var step = (double) bitmap.Width/leds; - using (bitmap) - { - var ledIndex = 0; - // Color each LED according to one of the pixels - foreach (var corsairLed in CueSDK.MouseSDK.Leds) - { - var col = ledIndex == 0 - ? bitmap.GetPixel(0, 0) - : bitmap.GetPixel((int) ((ledIndex + 1)*step - 1), (int) ((ledIndex + 1)*step - 1)); - corsairLed.Color = col; - ledIndex++; - } + var ledIndex = 0; + // Color each LED according to one of the pixels + foreach (var corsairLed in CueSDK.MouseSDK.Leds) + { + var col = ledIndex == 0 + ? bitmap.GetPixel(0, 0) + : bitmap.GetPixel((int) ((ledIndex + 1)*step - 1), (int) ((ledIndex + 1)*step - 1)); + + corsairLed.Color = col; + ledIndex++; } + CueSDK.MouseSDK.Update(); } diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs index badf7b4e4..d39f50fe2 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs @@ -48,39 +48,36 @@ namespace Artemis.DeviceProviders.Corsair var xStep = (double) bitmap.Width/6; // This approach will break if any mousemats with different LED amounts are released, for now it will do. - using (bitmap) + var ledIndex = 0; + // Color each LED according to one of the pixels + foreach (var corsairLed in CueSDK.MousematSDK.Leds.OrderBy(l => l.ToString())) { - var ledIndex = 0; - // Color each LED according to one of the pixels - foreach (var corsairLed in CueSDK.MousematSDK.Leds.OrderBy(l => l.ToString())) + Color col; + // Left side + if (ledIndex < 5) { - Color col; - // Left side - if (ledIndex < 5) - { - col = ledIndex == 0 - ? bitmap.GetPixel(0, (int) (ledIndex*yStep)) - : bitmap.GetPixel(0, (int) (ledIndex*yStep) - 1); - } - // Bottom - else if (ledIndex < 10) - { - // Start at index 1 because the corner belongs to the left side - var zoneIndex = ledIndex - 4; - col = bitmap.GetPixel((int) (zoneIndex*xStep), bitmap.Height - 1); - } - // Right side - else - { - var zoneIndex = ledIndex - 10; - col = zoneIndex == 4 - ? bitmap.GetPixel(bitmap.Height - 1, bitmap.Height - (int) (zoneIndex*yStep)) - : bitmap.GetPixel(bitmap.Height - 1, bitmap.Height - 1 - (int) (zoneIndex*yStep)); - } - - corsairLed.Color = col; - ledIndex++; + col = ledIndex == 0 + ? bitmap.GetPixel(0, (int) (ledIndex*yStep)) + : bitmap.GetPixel(0, (int) (ledIndex*yStep) - 1); } + // Bottom + else if (ledIndex < 10) + { + // Start at index 1 because the corner belongs to the left side + var zoneIndex = ledIndex - 4; + col = bitmap.GetPixel((int) (zoneIndex*xStep), bitmap.Height - 1); + } + // Right side + else + { + var zoneIndex = ledIndex - 10; + col = zoneIndex == 4 + ? bitmap.GetPixel(bitmap.Height - 1, bitmap.Height - (int) (zoneIndex*yStep)) + : bitmap.GetPixel(bitmap.Height - 1, bitmap.Height - 1 - (int) (zoneIndex*yStep)); + } + + corsairLed.Color = col; + ledIndex++; } CueSDK.MousematSDK.Update(); } diff --git a/Artemis/Artemis/DeviceProviders/Logitech/LogitechGeneric.cs b/Artemis/Artemis/DeviceProviders/Logitech/LogitechGeneric.cs index fcf07d3f9..5da53fe28 100644 --- a/Artemis/Artemis/DeviceProviders/Logitech/LogitechGeneric.cs +++ b/Artemis/Artemis/DeviceProviders/Logitech/LogitechGeneric.cs @@ -25,12 +25,9 @@ namespace Artemis.DeviceProviders.Logitech if (!CanUse || bitmap == null) return; - using (bitmap) - { - var col = bitmap.GetPixel(bitmap.Width/2, bitmap.Height/2); - LogitechGSDK.LogiLedSetTargetDevice(LogitechGSDK.LOGI_DEVICETYPE_RGB); - LogitechGSDK.LogiLedSetLighting((int) (col.R/2.55), (int) (col.G/2.55), (int) (col.B/2.55)); - } + var col = bitmap.GetPixel(bitmap.Width/2, bitmap.Height/2); + LogitechGSDK.LogiLedSetTargetDevice(LogitechGSDK.LOGI_DEVICETYPE_RGB); + LogitechGSDK.LogiLedSetLighting((int) (col.R/2.55), (int) (col.G/2.55), (int) (col.B/2.55)); } public override bool TryEnable() diff --git a/Artemis/Artemis/InjectionModules/DeviceModules.cs b/Artemis/Artemis/InjectionModules/DeviceModules.cs index 46839dd26..de64108ce 100644 --- a/Artemis/Artemis/InjectionModules/DeviceModules.cs +++ b/Artemis/Artemis/InjectionModules/DeviceModules.cs @@ -1,4 +1,5 @@ using Artemis.DeviceProviders; +using Artemis.DeviceProviders.Artemis; using Artemis.DeviceProviders.CoolerMaster; using Artemis.DeviceProviders.Corsair; using Artemis.DeviceProviders.Logitech; @@ -12,6 +13,7 @@ namespace Artemis.InjectionModules public override void Load() { // Keyboards + Bind().To().InSingletonScope(); Bind().To().InSingletonScope(); Bind().To().InSingletonScope(); Bind().To().InSingletonScope(); diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index 1261bdb48..4892d203e 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -4,9 +4,9 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Timers; -using System.Windows; -using System.Windows.Threading; using Artemis.DeviceProviders; +using Artemis.ViewModels; +using Caliburn.Micro; using Ninject.Extensions.Logging; using Timer = System.Timers.Timer; @@ -17,17 +17,20 @@ namespace Artemis.Managers /// public class LoopManager : IDisposable { + private readonly DebugViewModel _debugViewModel; private readonly DeviceManager _deviceManager; private readonly EffectManager _effectManager; private readonly ILogger _logger; private readonly Timer _loopTimer; private bool _canShowException; - public LoopManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager) + public LoopManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager, + DebugViewModel debugViewModel) { _logger = logger; _effectManager = effectManager; _deviceManager = deviceManager; + _debugViewModel = debugViewModel; _canShowException = true; // Setup timers @@ -38,6 +41,19 @@ namespace Artemis.Managers _logger.Info("Intialized LoopManager"); } + public DebugViewModel DebugViewModel { get; set; } + + /// + /// Gets whether the loop is running + /// + public bool Running { get; private set; } + + public void Dispose() + { + _loopTimer.Stop(); + _loopTimer.Dispose(); + } + private void LoopTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) { try @@ -48,7 +64,7 @@ namespace Artemis.Managers { if (_canShowException) { - Caliburn.Micro.Execute.OnUIThread(delegate + Execute.OnUIThread(delegate { _canShowException = false; _loopTimer.Stop(); @@ -59,17 +75,6 @@ namespace Artemis.Managers } } - /// - /// Gets whether the loop is running - /// - public bool Running { get; private set; } - - public void Dispose() - { - _loopTimer.Stop(); - _loopTimer.Dispose(); - } - public Task StartAsync() { return Task.Run(() => Start()); @@ -185,6 +190,8 @@ namespace Artemis.Managers foreach (var mousemat in mousemats) mousemat.UpdateDevice(frame.MousematBitmap); + _debugViewModel.DrawFrame(frame); + OnRenderCompleted(); } } @@ -254,6 +261,7 @@ namespace Artemis.Managers MouseBitmap?.Dispose(); HeadsetBitmap?.Dispose(); GenericBitmap?.Dispose(); + MousematBitmap?.Dispose(); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index 6df55e873..ff2f3e409 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -36,12 +36,6 @@ namespace Artemis.Models DeviceManager.OnKeyboardChangedEvent += DeviceManagerOnOnKeyboardChangedEvent; } - private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs args) - { - if (!string.IsNullOrEmpty(Settings?.LastProfile)) - Profile = ProfileProvider.GetProfile(DeviceManager.ActiveKeyboard, this, Settings.LastProfile); - } - public bool Initialized { get; set; } public DeviceManager DeviceManager { get; set; } public EffectSettings Settings { get; set; } @@ -59,6 +53,12 @@ namespace Artemis.Models Profile?.Deactivate(); } + private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs args) + { + if (!string.IsNullOrEmpty(Settings?.LastProfile)) + Profile = ProfileProvider.GetProfile(DeviceManager.ActiveKeyboard, this, Settings.LastProfile); + } + // Called on creation public abstract void Enable(); @@ -89,15 +89,15 @@ namespace Artemis.Models var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale); using (var g = Graphics.FromImage(frame.KeyboardBitmap)) { - Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), - DataModel, keyboardRect, false, true, "keyboard"); + Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), + DataModel, keyboardRect, false, true, "keyboard"); } // Render mice layer-by-layer var devRec = new Rect(0, 0, 40, 40); using (var g = Graphics.FromImage(frame.MouseBitmap)) { - Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), DataModel, - devRec, false, true, "mouse"); + Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), + DataModel, devRec, false, true, "mouse"); } // Render headsets layer-by-layer using (var g = Graphics.FromImage(frame.HeadsetBitmap)) diff --git a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs index 2fb32ec1b..0b258f5fe 100644 --- a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs +++ b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs @@ -62,7 +62,7 @@ namespace Artemis.Modules.Effects.ProfilePreview var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale); using (var g = Graphics.FromImage(frame.KeyboardBitmap)) { - Profile.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), + Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), DataModel, keyboardRect, true, true, "keyboard"); } // Render mice layer-by-layer diff --git a/Artemis/Artemis/Profiles/Layers/Types/Folder/FolderType.cs b/Artemis/Artemis/Profiles/Layers/Types/Folder/FolderType.cs index c9f289373..2db638ead 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Folder/FolderType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Folder/FolderType.cs @@ -13,9 +13,9 @@ namespace Artemis.Profiles.Layers.Types.Folder public class FolderType : ILayerType { public string Name => "Folder"; - public bool ShowInEdtor { get; } = false; + public bool ShowInEdtor => false; // FolderType pretents to be a keyboard so it's children get drawn - public DrawType DrawType { get; } = DrawType.Keyboard; + public DrawType DrawType => DrawType.Keyboard; public ImageSource DrawThumbnail(LayerModel layer) { diff --git a/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs index ae0d4a389..80c7aa4ec 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs @@ -1,16 +1,13 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using Artemis.Profiles.Layers.Abstract; using Artemis.Profiles.Layers.Interfaces; using Artemis.ViewModels.Profiles; using Caliburn.Micro; -using ColorBox; namespace Artemis.Profiles.Layers.Types.Generic { public class GenericPropertiesViewModel : LayerPropertiesViewModel { - private IEnumerable _availableBrushTypes; private ILayerAnimation _selectedLayerAnimation; public GenericPropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm) diff --git a/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericType.cs b/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericType.cs index 77ccd3b69..97fde86e3 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericType.cs @@ -15,17 +15,15 @@ namespace Artemis.Profiles.Layers.Types.Generic public class GenericType : ILayerType { public string Name => "Generic (Logitech)"; - public bool ShowInEdtor { get; } = false; - public DrawType DrawType { get; } = DrawType.Generic; + public bool ShowInEdtor => false; + public DrawType DrawType => DrawType.Generic; public ImageSource DrawThumbnail(LayerModel layer) { var thumbnailRect = new Rect(0, 0, 18, 18); var visual = new DrawingVisual(); using (var c = visual.RenderOpen()) - { c.DrawImage(ImageUtilities.BitmapToBitmapImage(Resources.generic), thumbnailRect); - } var image = new DrawingImage(visual.Drawing); return image; @@ -61,7 +59,7 @@ namespace Artemis.Profiles.Layers.Types.Generic layerModel.Properties.Y = 0; layerModel.Properties.Contain = true; - layerModel.ApplyProperties(false); + layerModel.ApplyProperties(true); if (isPreview || dataModel == null) return; diff --git a/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetType.cs b/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetType.cs index cbf75c0d4..76092cbea 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetType.cs @@ -15,8 +15,8 @@ namespace Artemis.Profiles.Layers.Types.Headset public class HeadsetType : ILayerType { public string Name => "Headset"; - public bool ShowInEdtor { get; } = false; - public DrawType DrawType { get; } = DrawType.Headset; + public bool ShowInEdtor => false; + public DrawType DrawType => DrawType.Headset; public ImageSource DrawThumbnail(LayerModel layer) { diff --git a/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs b/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs index 0bed586e0..f8a31e27a 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs @@ -20,12 +20,14 @@ namespace Artemis.Profiles.Layers.Types.KeyPress internal class KeyPressType : ILayerType { private readonly DeviceManager _deviceManager; - private List _keyPressLayers = new List(); + private List _keyPressLayers; private LayerModel _layerModel; public KeyPressType(DeviceManager deviceManager) { _deviceManager = deviceManager; + _keyPressLayers = new List(); + KeyboardHook.KeyDownCallback += KeyboardHookOnKeyDownCallback; } @@ -33,8 +35,8 @@ namespace Artemis.Profiles.Layers.Types.KeyPress public string Name => "Keyboard - Key press"; - public bool ShowInEdtor { get; } = false; - public DrawType DrawType { get; } = DrawType.Keyboard; + public bool ShowInEdtor => false; + public DrawType DrawType => DrawType.Keyboard; public ImageSource DrawThumbnail(LayerModel layer) { @@ -77,10 +79,12 @@ namespace Artemis.Profiles.Layers.Types.KeyPress lock (_keyPressLayers) { // Remove expired key presses - _keyPressLayers = _keyPressLayers.Where(k => !k.LayerAnimation.MustExpire(k)).ToList(); + var updateLayers = _keyPressLayers.Where(k => !k.LayerAnimation.MustExpire(k)).ToList(); // Update the ones that are still active - foreach (var keyPressLayer in _keyPressLayers) - keyPressLayer.Update(null, false, true); + foreach (var updateLayer in updateLayers) + updateLayer.Update(null, false, true); + + _keyPressLayers = updateLayers; } } diff --git a/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardType.cs b/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardType.cs index 8fbc1ddf7..d1ef34882 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardType.cs @@ -12,8 +12,8 @@ namespace Artemis.Profiles.Layers.Types.Keyboard public class KeyboardType : ILayerType { public string Name => "Keyboard"; - public bool ShowInEdtor { get; } = true; - public DrawType DrawType { get; } = DrawType.Keyboard; + public bool ShowInEdtor => true; + public DrawType DrawType => DrawType.Keyboard; public ImageSource DrawThumbnail(LayerModel layer) { diff --git a/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs b/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs index dd524577b..d2edb9451 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs @@ -16,8 +16,8 @@ namespace Artemis.Profiles.Layers.Types.KeyboardGif internal class KeyboardGifType : ILayerType { public string Name => "Keyboard - GIF"; - public bool ShowInEdtor { get; } = true; - public DrawType DrawType { get; } = DrawType.Keyboard; + public bool ShowInEdtor => true; + public DrawType DrawType => DrawType.Keyboard; public ImageSource DrawThumbnail(LayerModel layer) { diff --git a/Artemis/Artemis/Profiles/Layers/Types/Mouse/MouseType.cs b/Artemis/Artemis/Profiles/Layers/Types/Mouse/MouseType.cs index b8a58f535..14b74f57b 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Mouse/MouseType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Mouse/MouseType.cs @@ -15,8 +15,8 @@ namespace Artemis.Profiles.Layers.Types.Mouse public class MouseType : ILayerType { public string Name => "Mouse"; - public bool ShowInEdtor { get; } = false; - public DrawType DrawType { get; } = DrawType.Mouse; + public bool ShowInEdtor => false; + public DrawType DrawType => DrawType.Mouse; public ImageSource DrawThumbnail(LayerModel layer) { diff --git a/Artemis/Artemis/Profiles/Layers/Types/Mousemat/MousematType.cs b/Artemis/Artemis/Profiles/Layers/Types/Mousemat/MousematType.cs index e9b24af82..d4986e7c0 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Mousemat/MousematType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Mousemat/MousematType.cs @@ -15,8 +15,8 @@ namespace Artemis.Profiles.Layers.Types.Mousemat public class MousematType : ILayerType { public string Name => "Mousemat"; - public bool ShowInEdtor { get; } = false; - public DrawType DrawType { get; } = DrawType.Mousemat; + public bool ShowInEdtor => false; + public DrawType DrawType => DrawType.Mousemat; public ImageSource DrawThumbnail(LayerModel layer) { diff --git a/Artemis/Artemis/Properties/AssemblyInfo.cs b/Artemis/Artemis/Properties/AssemblyInfo.cs index a8cbd9941..3b0d98cfa 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.6.0.1")] -[assembly: AssemblyFileVersion("1.6.0.1")] +[assembly: AssemblyVersion("1.6.1.0")] +[assembly: AssemblyFileVersion("1.6.1.0")] [assembly: InternalsVisibleTo("Artemis.Explorables")] diff --git a/Artemis/Artemis/Resources/Keyboards/default-profiles.zip b/Artemis/Artemis/Resources/Keyboards/default-profiles.zip index c31d8020a..5713033cc 100644 Binary files a/Artemis/Artemis/Resources/Keyboards/default-profiles.zip and b/Artemis/Artemis/Resources/Keyboards/default-profiles.zip differ diff --git a/Artemis/Artemis/Utilities/ImageUtilities.cs b/Artemis/Artemis/Utilities/ImageUtilities.cs index 3326e3253..f9a3f1ae9 100644 --- a/Artemis/Artemis/Utilities/ImageUtilities.cs +++ b/Artemis/Artemis/Utilities/ImageUtilities.cs @@ -90,5 +90,21 @@ namespace Artemis.Utilities bitmap.Render(iconImage); return bitmap; } + + public static DrawingImage BitmapToDrawingImage(Bitmap b, Rect rect) + { + if (b == null) + return new DrawingImage(); + + var visual = new DrawingVisual(); + using (var c = visual.RenderOpen()) + { + c.DrawImage(BitmapToBitmapImage(b), rect); + } + + var image = new DrawingImage(visual.Drawing); + image.Freeze(); + return image; + } } } \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/DebugViewModel.cs b/Artemis/Artemis/ViewModels/DebugViewModel.cs index 2dab9f89b..43cb16d5b 100644 --- a/Artemis/Artemis/ViewModels/DebugViewModel.cs +++ b/Artemis/Artemis/ViewModels/DebugViewModel.cs @@ -3,13 +3,28 @@ using System.IO; using System.Linq; using System.Windows; using System.Windows.Media; +using Artemis.Managers; +using Artemis.Utilities; using Caliburn.Micro; +using Action = System.Action; namespace Artemis.ViewModels { public class DebugViewModel : Screen { + private readonly DeviceManager _deviceManager; + private DrawingImage _razerDisplay; + private DrawingImage _keyboard; + private DrawingImage _mouse; + private DrawingImage _headset; + private DrawingImage _mousemat; + private DrawingImage _generic; + + public DebugViewModel(DeviceManager deviceManager) + { + _deviceManager = deviceManager; + } public DrawingImage RazerDisplay { @@ -22,6 +37,62 @@ namespace Artemis.ViewModels } } + + public DrawingImage Keyboard + { + get { return _keyboard; } + set + { + if (Equals(value, _keyboard)) return; + _keyboard = value; + NotifyOfPropertyChange(() => Keyboard); + } + } + + public DrawingImage Mouse + { + get { return _mouse; } + set + { + if (Equals(value, _mouse)) return; + _mouse = value; + NotifyOfPropertyChange(() => Mouse); + } + } + + public DrawingImage Headset + { + get { return _headset; } + set + { + if (Equals(value, _headset)) return; + _headset = value; + NotifyOfPropertyChange(() => Headset); + } + } + + public DrawingImage Mousemat + { + get { return _mousemat; } + set + { + if (Equals(value, _mousemat)) return; + _mousemat = value; + NotifyOfPropertyChange(() => Mousemat); + } + } + + public DrawingImage Generic + { + get { return _generic; } + set + { + if (Equals(value, _generic)) return; + _generic = value; + NotifyOfPropertyChange(() => Generic); + } + } + public void OpenLog() { // Get the logging directory @@ -52,5 +123,24 @@ namespace Artemis.ViewModels drawnDisplay.Freeze(); RazerDisplay = drawnDisplay; } + + public void DrawFrame(RenderFrame frame) + { + // No point updating the display if the view isn't visible + if (!IsActive) + return; + + // Only update keyboard if there is an active keyboard + if (_deviceManager.ActiveKeyboard != null) + { + var rect = _deviceManager.ActiveKeyboard.KeyboardRectangle(1); + Keyboard = ImageUtilities.BitmapToDrawingImage(frame.KeyboardBitmap, rect); + } + + Mouse = ImageUtilities.BitmapToDrawingImage(frame.MouseBitmap, new Rect(0, 0, 10, 10)); + Headset = ImageUtilities.BitmapToDrawingImage(frame.HeadsetBitmap, new Rect(0, 0, 10, 10)); + Mousemat = ImageUtilities.BitmapToDrawingImage(frame.MousematBitmap, new Rect(0, 0, 10, 10)); + Generic = ImageUtilities.BitmapToDrawingImage(frame.GenericBitmap, new Rect(0, 0, 10, 10)); + } } } \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs index 215b23bde..c038d47ba 100644 --- a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs +++ b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs @@ -70,11 +70,7 @@ namespace Artemis.ViewModels.Flyouts { get { - var collection = new BindableCollection - (MainManager.DeviceManager.KeyboardProviders.Select(k => k.Name)); - - collection.Insert(0, "None"); - return collection; + return new BindableCollection(MainManager.DeviceManager.KeyboardProviders.Select(k => k.Name)); } } diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs index 47605c4f7..6dce58e43 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Timers; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -45,6 +44,57 @@ namespace Artemis.ViewModels.Profiles deviceManager.OnKeyboardChangedEvent += DeviceManagerOnOnKeyboardChangedEvent; } + public ProfileModel SelectedProfile { get; set; } + + public LayerModel SelectedLayer + { + get { return _selectedLayer; } + set + { + if (Equals(value, _selectedLayer)) return; + _selectedLayer = value; + NotifyOfPropertyChange(() => SelectedLayer); + } + } + + public DrawingImage KeyboardPreview + { + get { return _keyboardPreview; } + set + { + if (Equals(value, _keyboardPreview)) return; + _keyboardPreview = value; + NotifyOfPropertyChange(() => KeyboardPreview); + } + } + + public double BlurRadius + { + get { return _blurRadius; } + set + { + if (value.Equals(_blurRadius)) return; + _blurRadius = value; + NotifyOfPropertyChange(() => BlurRadius); + } + } + + public bool ShowAll + { + get { return _showAll; } + set + { + if (value == _showAll) return; + _showAll = value; + NotifyOfPropertyChange(() => ShowAll); + } + } + + public ImageSource KeyboardImage => ImageUtilities + .BitmapToBitmapImage(_deviceManager.ActiveKeyboard?.PreviewSettings.Image ?? Resources.none); + + public bool Activated { get; set; } + private void LoopManagerOnRenderCompleted(object sender, EventArgs eventArgs) { if (!Activated) @@ -55,7 +105,8 @@ namespace Artemis.ViewModels.Profiles _blurProgress = _blurProgress + 0.025; BlurRadius = (Math.Sin(_blurProgress*Math.PI) + 1)*10 + 10; - if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null) + // Besides the usual checks, also check if the ActiveKeyboard isn't the NoneKeyboard + if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null || _deviceManager.ActiveKeyboard.Slug == "none") { var preview = new DrawingImage(); preview.Freeze(); @@ -127,57 +178,6 @@ namespace Artemis.ViewModels.Profiles KeyboardPreview = drawnPreview; } - public ProfileModel SelectedProfile { get; set; } - - public LayerModel SelectedLayer - { - get { return _selectedLayer; } - set - { - if (Equals(value, _selectedLayer)) return; - _selectedLayer = value; - NotifyOfPropertyChange(() => SelectedLayer); - } - } - - public DrawingImage KeyboardPreview - { - get { return _keyboardPreview; } - set - { - if (Equals(value, _keyboardPreview)) return; - _keyboardPreview = value; - NotifyOfPropertyChange(() => KeyboardPreview); - } - } - - public double BlurRadius - { - get { return _blurRadius; } - set - { - if (value.Equals(_blurRadius)) return; - _blurRadius = value; - NotifyOfPropertyChange(() => BlurRadius); - } - } - - public bool ShowAll - { - get { return _showAll; } - set - { - if (value == _showAll) return; - _showAll = value; - NotifyOfPropertyChange(() => ShowAll); - } - } - - public ImageSource KeyboardImage => ImageUtilities - .BitmapToBitmapImage(_deviceManager.ActiveKeyboard?.PreviewSettings.Image ?? Resources.none); - - public bool Activated { get; set; } - private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs e) { NotifyOfPropertyChange(() => KeyboardImage); diff --git a/Artemis/Artemis/Views/DebugView.xaml b/Artemis/Artemis/Views/DebugView.xaml index 32f3d9e9d..6e361c581 100644 --- a/Artemis/Artemis/Views/DebugView.xaml +++ b/Artemis/Artemis/Views/DebugView.xaml @@ -12,27 +12,71 @@ + + - + + + + +