diff --git a/Artemis/Artemis/DAL/ProfileProvider.cs b/Artemis/Artemis/DAL/ProfileProvider.cs index d70c395f9..728a683d7 100644 --- a/Artemis/Artemis/DAL/ProfileProvider.cs +++ b/Artemis/Artemis/DAL/ProfileProvider.cs @@ -89,6 +89,7 @@ namespace Artemis.DAL } File.WriteAllText(path + $@"\{prof.Name}.json", json); + Logger.Debug("Saved profile {0}/{1}/{2}", prof.KeyboardSlug, prof.GameName, prof.Name); } } diff --git a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs index dc9873fdf..e2e95528f 100644 --- a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs +++ b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProL.cs @@ -3,16 +3,18 @@ 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 bool _hasControl; + private GeneralSettings _generalSettings; public MasterkeysProL() { @@ -27,16 +29,13 @@ namespace Artemis.DeviceProviders.CoolerMaster Width = 22; PreviewSettings = new PreviewSettings(670, 189, new Thickness(-2, -5, 0, 0), Resources.masterkeys_pro_l); + _generalSettings = SettingsProvider.Load(); } public override void Disable() { - if (_hasControl) - { - CmSdk.EnableLedControl(false); - Thread.Sleep(500); - } - _hasControl = false; + CmSdk.EnableLedControl(false); + Thread.Sleep(500); } public override bool CanEnable() @@ -50,8 +49,6 @@ namespace Artemis.DeviceProviders.CoolerMaster public override void Enable() { CmSdk.SetControlDevice(DEVICE_INDEX.DEV_MKeys_L); - - _hasControl = true; CmSdk.EnableLedControl(true); } @@ -80,7 +77,15 @@ namespace Artemis.DeviceProviders.CoolerMaster public override KeyMatch? GetKeyPosition(Keys keyCode) { - return KeyMap.QwertyLayout.FirstOrDefault(k => k.KeyCode == 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/Corsair/CorsairKeyboards.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs index 48a21af99..a1840dcbe 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs @@ -83,6 +83,7 @@ namespace Artemis.DeviceProviders.Corsair } Logger.Debug("Corsair SDK reported device as: {0}", _keyboard.DeviceInfo.Model); + _keyboard.Brush = _keyboardBrush ?? (_keyboardBrush = new ImageBrush()); } diff --git a/Artemis/Artemis/DeviceProviders/KeyboardProvider.cs b/Artemis/Artemis/DeviceProviders/KeyboardProvider.cs index b4cf7f1e4..afa83b09c 100644 --- a/Artemis/Artemis/DeviceProviders/KeyboardProvider.cs +++ b/Artemis/Artemis/DeviceProviders/KeyboardProvider.cs @@ -39,7 +39,7 @@ namespace Artemis.DeviceProviders /// public Bitmap KeyboardBitmap(int scale) => new Bitmap(Width*scale, Height*scale); - public Rect KeyboardRectangle(int scale) => new Rect(new Size(Width*scale, Height*scale)); + public Rect KeyboardRectangle(int scale = 4) => new Rect(new Size(Width*scale, Height*scale)); /// /// Runs CanEnable asynchronously multiple times until successful, cancelled or max tries reached diff --git a/Artemis/Artemis/DeviceProviders/Logitech/G810.cs b/Artemis/Artemis/DeviceProviders/Logitech/G810.cs index 2b3c1a509..e51e0b9a5 100644 --- a/Artemis/Artemis/DeviceProviders/Logitech/G810.cs +++ b/Artemis/Artemis/DeviceProviders/Logitech/G810.cs @@ -28,9 +28,15 @@ namespace Artemis.DeviceProviders.Logitech public override KeyMatch? GetKeyPosition(Keys keyCode) { - return _generalSettings.Layout == "Qwerty" - ? KeyMap.QwertyLayout.FirstOrDefault(k => k.KeyCode == keyCode) - : KeyMap.AzertyLayout.FirstOrDefault(k => k.KeyCode == 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/Logitech/G910.cs b/Artemis/Artemis/DeviceProviders/Logitech/G910.cs index 126eefcbf..d79aca306 100644 --- a/Artemis/Artemis/DeviceProviders/Logitech/G910.cs +++ b/Artemis/Artemis/DeviceProviders/Logitech/G910.cs @@ -30,9 +30,19 @@ namespace Artemis.DeviceProviders.Logitech public override KeyMatch? GetKeyPosition(Keys keyCode) { - var value = _generalSettings.Layout == "Qwerty" - ? KeyMap.QwertyLayout.FirstOrDefault(k => k.KeyCode == keyCode) - : KeyMap.AzertyLayout.FirstOrDefault(k => k.KeyCode == keyCode); + KeyMatch value; + switch (_generalSettings.Layout) + { + case "Qwerty": + value = KeyMap.QwertyLayout.FirstOrDefault(k => k.KeyCode == keyCode); + break; + case "Qwertz": + value = KeyMap.QwertzLayout.FirstOrDefault(k => k.KeyCode == keyCode); + break; + default: + value = KeyMap.AzertyLayout.FirstOrDefault(k => k.KeyCode == keyCode); + break; + } // Adjust the distance by 1 on both x and y for the G910 return new KeyMatch(value.KeyCode, value.X + 1, value.Y + 1); diff --git a/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs b/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs index bb934550e..4814c32bb 100644 --- a/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs +++ b/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs @@ -2,9 +2,11 @@ using System.Linq; using System.Windows; using System.Windows.Forms; +using Artemis.DAL; using Artemis.DeviceProviders.Logitech.Utilities; using Artemis.DeviceProviders.Razer.Utilities; using Artemis.Properties; +using Artemis.Settings; using Corale.Colore.Core; using Corale.Colore.Razer; using Constants = Corale.Colore.Razer.Keyboard.Constants; @@ -13,6 +15,8 @@ namespace Artemis.DeviceProviders.Razer { public class BlackWidow : KeyboardProvider { + private GeneralSettings _generalSettings; + public BlackWidow() { Name = "Razer BlackWidow Chroma"; @@ -24,6 +28,7 @@ namespace Artemis.DeviceProviders.Razer Height = Constants.MaxRows; Width = Constants.MaxColumns; PreviewSettings = new PreviewSettings(665, 175, new Thickness(0, -15, 0, 0), Resources.blackwidow); + _generalSettings = SettingsProvider.Load(); } public override bool CanEnable() @@ -56,7 +61,15 @@ namespace Artemis.DeviceProviders.Razer public override KeyMatch? GetKeyPosition(Keys keyCode) { // TODO: Needs it's own keymap or a way to get it from the Chroma SDK - return KeyMap.QwertyLayout.FirstOrDefault(k => k.KeyCode == 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/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs index 15bfb1467..e39b96325 100644 --- a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs +++ b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs @@ -27,6 +27,9 @@ namespace Artemis.Modules.Effects.WindowsProfile }; ProfileEditor = kernel.Get(args); ProfileEditor.PropertyChanged += ProfileUpdater; + + EffectModel.Profile = ProfileEditor.SelectedProfile; + ProfilePreviewModel.Profile = ProfileEditor.SelectedProfile; } public ProfileEditorViewModel ProfileEditor { get; set; } @@ -36,6 +39,7 @@ namespace Artemis.Modules.Effects.WindowsProfile { if ((e.PropertyName != "SelectedProfile") && IsActive) return; + EffectModel.Profile = ProfileEditor.SelectedProfile; ProfilePreviewModel.Profile = ProfileEditor.SelectedProfile; @@ -47,6 +51,12 @@ namespace Artemis.Modules.Effects.WindowsProfile EffectSettings.Save(); } + public override void SaveSettings() + { + ProfileEditor.SaveSelectedProfile(); + base.SaveSettings(); + } + protected override void OnActivate() { base.OnActivate(); diff --git a/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs b/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs index c0c50cd2e..3386027dd 100644 --- a/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs +++ b/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs @@ -25,7 +25,7 @@ namespace Artemis.Modules.Games.WoW ProcessName = "Wow-64"; Scale = 4; - // Currently WoW is locked behind a hidden trigger (obviously not that hidden if you're reading this) + // Currently WoW is locked behind a hidden trigger (obviously not that hidden since you're reading this) // It is using memory reading and lets first try to contact Blizzard var settings = SettingsProvider.Load(); Enabled = (settings.GamestatePort == 62575) && Settings.Enabled; diff --git a/Artemis/Artemis/Profiles/Lua/LuaDrawWrapper.cs b/Artemis/Artemis/Profiles/Lua/LuaDrawWrapper.cs index c99081dbf..86af7bb83 100644 --- a/Artemis/Artemis/Profiles/Lua/LuaDrawWrapper.cs +++ b/Artemis/Artemis/Profiles/Lua/LuaDrawWrapper.cs @@ -54,7 +54,7 @@ namespace Artemis.Profiles.Lua _ctx.DrawRectangle(luaBrush.Brush, new Pen(), new Rect(x, y, width, height)); } - public void DrawText(LuaBrush luaBrush, double x, double y, string text, int fontSize) + public double DrawText(LuaBrush luaBrush, double x, double y, string text, int fontSize) { x *= 4; y *= 4; @@ -65,6 +65,7 @@ namespace Artemis.Profiles.Lua fontSize, luaBrush.Brush); _ctx.DrawText(formatted, new Point(x, y)); + return formatted.Width/4; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs b/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs index a28201a6f..2b4e5f315 100644 --- a/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs +++ b/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs @@ -94,8 +94,11 @@ namespace Artemis.Profiles.Lua // Clear old fields/properties KeyboardProvider = null; ProfileModel = null; + LuaProfileWrapper = null; + LuaBrushWrapper = null; LuaKeyboardWrapper?.Dispose(); LuaKeyboardWrapper = null; + LuaMouseWrapper = null; try { @@ -108,8 +111,29 @@ namespace Artemis.Profiles.Lua } catch (NullReferenceException) { - // Can be missing if the user script screwed up the globals + // TODO: Ask MoonSharp folks why this is happening } + + if (LuaEventsWrapper != null) + { + lock (LuaEventsWrapper.InvokeLock) + { + lock (LuaScript) + { + LuaScript.DoString(""); + } + } + } + else + { + lock (LuaScript) + { + LuaScript.DoString(""); + } + } + + + LuaEventsWrapper = null; } } diff --git a/Artemis/Artemis/Profiles/ProfileModel.cs b/Artemis/Artemis/Profiles/ProfileModel.cs index 68df6c62f..84ebaac4d 100644 --- a/Artemis/Artemis/Profiles/ProfileModel.cs +++ b/Artemis/Artemis/Profiles/ProfileModel.cs @@ -172,8 +172,7 @@ namespace Artemis.Profiles public void Deactivate() { - if (Equals(LuaWrapper.ProfileModel, this)) - LuaWrapper.Clear(); + LuaWrapper.Clear(); } public LayerModel AddLayer(LayerModel afterLayer) diff --git a/Artemis/Artemis/Properties/AssemblyInfo.cs b/Artemis/Artemis/Properties/AssemblyInfo.cs index 26544a55b..c5d110a63 100644 --- a/Artemis/Artemis/Properties/AssemblyInfo.cs +++ b/Artemis/Artemis/Properties/AssemblyInfo.cs @@ -53,8 +53,8 @@ using System.Windows; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.4.0.0")] -[assembly: AssemblyFileVersion("1.4.0.0")] +[assembly: AssemblyVersion("1.5.0.0")] +[assembly: AssemblyFileVersion("1.5.0.0")] [assembly: InternalsVisibleTo("Artemis.Tests")] [assembly: InternalsVisibleTo("Artemis.Explorables")] diff --git a/Artemis/Artemis/Resources/Keyboards/default-profiles.zip b/Artemis/Artemis/Resources/Keyboards/default-profiles.zip index ac8cd394b..669be9f1b 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/ViewModels/Abstract/EffectViewModel.cs b/Artemis/Artemis/ViewModels/Abstract/EffectViewModel.cs index e871bbbe4..89e9ec09e 100644 --- a/Artemis/Artemis/ViewModels/Abstract/EffectViewModel.cs +++ b/Artemis/Artemis/ViewModels/Abstract/EffectViewModel.cs @@ -79,7 +79,7 @@ namespace Artemis.ViewModels.Abstract MainManager.EffectManager.ChangeEffect(EffectModel, MainManager.LoopManager); } - public void SaveSettings() + public virtual void SaveSettings() { EffectSettings?.Save(); if (!EffectEnabled) diff --git a/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs b/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs index d85226ecd..295e45b6a 100644 --- a/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs +++ b/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs @@ -1,4 +1,5 @@ using System.ComponentModel; +using System.Timers; using Artemis.Managers; using Artemis.Models; using Artemis.Modules.Effects.ProfilePreview; @@ -30,6 +31,8 @@ namespace Artemis.ViewModels.Abstract }; ProfileEditor = kernel.Get(args); ProfileEditor.PropertyChanged += ProfileUpdater; + + GameModel.Profile = ProfileEditor.SelectedProfile; } [Inject] @@ -67,9 +70,11 @@ namespace Artemis.ViewModels.Abstract public void SaveSettings() { GameSettings?.Save(); + ProfileEditor.SaveSelectedProfile(); + if (!GameEnabled) return; - + // Restart the game if it's currently running to apply settings. MainManager.EffectManager.ChangeEffect(GameModel, MainManager.LoopManager); } diff --git a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs index 61d9ba4d7..215b23bde 100644 --- a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs +++ b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs @@ -89,6 +89,7 @@ namespace Artemis.ViewModels.Flyouts public BindableCollection Layouts => new BindableCollection { "Qwerty", + "Qwertz", "Azerty" }; diff --git a/Artemis/Artemis/ViewModels/GamesViewModel.cs b/Artemis/Artemis/ViewModels/GamesViewModel.cs index d1a219f54..6aac8e4e5 100644 --- a/Artemis/Artemis/ViewModels/GamesViewModel.cs +++ b/Artemis/Artemis/ViewModels/GamesViewModel.cs @@ -1,20 +1,26 @@ using System.Linq; +using Artemis.DAL; using Artemis.Managers; using Artemis.Modules.Effects.ProfilePreview; +using Artemis.Settings; using Artemis.ViewModels.Abstract; namespace Artemis.ViewModels { public sealed class GamesViewModel : BaseViewModel { - private IOrderedEnumerable _vms; + private readonly IOrderedEnumerable _vms; public GamesViewModel(GameViewModel[] gameViewModels, ProfileManager profileManager, ProfilePreviewModel profilePreviewModel) { DisplayName = "Games"; - _vms = gameViewModels.OrderBy(g => g.DisplayName); + // Currently WoW is locked behind a hidden trigger (obviously not that hidden since you're reading this) + // It is using memory reading and lets first try to contact Blizzard + _vms = SettingsProvider.Load().GamestatePort == 62575 + ? gameViewModels.OrderBy(g => g.DisplayName) + : gameViewModels.Where(g => g.DisplayName != "WoW").OrderBy(g => g.DisplayName); profileManager.ProfilePreviewModel = profilePreviewModel; profileManager.GameViewModels.AddRange(_vms); diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs index f1ea13fa0..02576c557 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs @@ -121,9 +121,15 @@ namespace Artemis.ViewModels.Profiles get { return _selectedProfile; } set { - if (Equals(value, _selectedProfile)) return; + if (Equals(value, _selectedProfile)) + return; + + // Deactivate old profile _selectedProfile?.Deactivate(); + // Update the value _selectedProfile = value; + // Activate new profile + _selectedProfile?.Activate(_deviceManager.ActiveKeyboard); NotifyOfPropertyChange(() => SelectedProfile); NotifyOfPropertyChange(() => SelectedProfileName); } @@ -232,6 +238,7 @@ namespace Artemis.ViewModels.Profiles { ProfileViewModel.Deactivate(); SelectedProfile?.Deactivate(); + _saveTimer.Stop(); } /// @@ -726,7 +733,12 @@ namespace Artemis.ViewModels.Profiles private void ProfileSaveHandler(object sender, ElapsedEventArgs e) { - if (_saving || (SelectedProfile == null)) + SaveSelectedProfile(); + } + + public void SaveSelectedProfile() + { + if (_saving || (SelectedProfile == null) || _deviceManager.ChangingKeyboard) return; _saving = true; @@ -739,8 +751,6 @@ namespace Artemis.ViewModels.Profiles // ignored } _saving = false; - - //Execute.OnUIThread(() => UpdateLayerList(ProfileViewModel.SelectedLayer)); } } } \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs index 13028c138..fe7fdc0c5 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs @@ -55,7 +55,7 @@ namespace Artemis.ViewModels.Profiles _blurProgress = _blurProgress + 0.025; BlurRadius = (Math.Sin(_blurProgress*Math.PI) + 1)*10 + 10; - if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null || (!ShowAll && SelectedLayer == null)) + if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null) { var preview = new DrawingImage(); preview.Freeze(); @@ -321,17 +321,31 @@ namespace Artemis.ViewModels.Profiles // If no setup or reset was done, handle the actual dragging action if (_resizing) { - draggingProps.Width = (int) Math.Round(x - draggingProps.X); - draggingProps.Height = (int) Math.Round(y - draggingProps.Y); - if (draggingProps.Width < 1) - draggingProps.Width = 1; - if (draggingProps.Height < 1) - draggingProps.Height = 1; + var newWidth = Math.Round(x - draggingProps.X); + var newHeight = Math.Round(y - draggingProps.Y); + + // Ensure the layer doesn't leave the canvas + if (newWidth < 1 || draggingProps.X + newWidth <= 0) + newWidth = draggingProps.Width; + if (newHeight < 1 || draggingProps.Y + newHeight <= 0) + newHeight = draggingProps.Height; + + draggingProps.Width = newWidth; + draggingProps.Height = newHeight; } else { - draggingProps.X = (int) Math.Round(x - _draggingLayerOffset.Value.X); - draggingProps.Y = (int) Math.Round(y - _draggingLayerOffset.Value.Y); + var newX = Math.Round(x - _draggingLayerOffset.Value.X); + var newY = Math.Round(y - _draggingLayerOffset.Value.Y); + + // Ensure the layer doesn't leave the canvas + if (newX >= SelectedProfile.Width || newX + draggingProps.Width <= 0) + newX = draggingProps.X; + if (newY >= SelectedProfile.Height || newY + draggingProps.Height <= 0) + newY = draggingProps.Y; + + draggingProps.X = newX; + draggingProps.Y = newY; } }