From b2c09a96b55b0b4f78675818e3cf07c3fc8ec319 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Tue, 15 Nov 2016 23:14:08 +0100 Subject: [PATCH] Tiny UI fixes Layers can no longer be dragged/resized off of the canvas Added Qwertz option to dropdown box Added default profiles for Pro L Added default profiles for GTA V LUA DrawText returns resulting text width Fixed a null reference in LuaWrapper Save button now forces a profile save too Added profile save to debug log Bumped version number --- Artemis/Artemis/DAL/ProfileProvider.cs | 1 + .../CoolerMaster/MasterkeysProL.cs | 25 ++++++++------ .../Corsair/CorsairKeyboards.cs | 1 + .../DeviceProviders/KeyboardProvider.cs | 2 +- .../Artemis/DeviceProviders/Logitech/G810.cs | 12 +++++-- .../Artemis/DeviceProviders/Logitech/G910.cs | 16 +++++++-- .../DeviceProviders/Razer/BlackWidow.cs | 15 +++++++- .../WindowsProfile/WindowsProfileViewModel.cs | 10 ++++++ Artemis/Artemis/Modules/Games/WoW/WoWModel.cs | 2 +- .../Artemis/Profiles/Lua/LuaDrawWrapper.cs | 3 +- Artemis/Artemis/Profiles/Lua/LuaWrapper.cs | 26 +++++++++++++- Artemis/Artemis/Profiles/ProfileModel.cs | 3 +- Artemis/Artemis/Properties/AssemblyInfo.cs | 4 +-- .../Resources/Keyboards/default-profiles.zip | Bin 272626 -> 323954 bytes .../ViewModels/Abstract/EffectViewModel.cs | 2 +- .../ViewModels/Abstract/GameViewModel.cs | 7 +++- .../Flyouts/FlyoutSettingsViewModel.cs | 1 + Artemis/Artemis/ViewModels/GamesViewModel.cs | 10 ++++-- .../Profiles/ProfileEditorViewModel.cs | 18 +++++++--- .../ViewModels/Profiles/ProfileViewModel.cs | 32 +++++++++++++----- 20 files changed, 148 insertions(+), 42 deletions(-) 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 ac8cd394bacf55c66462ba145d6a3001d9ed0771..669be9f1bf503f745f5aae650183f227e20d56fd 100644 GIT binary patch delta 49816 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 delta 42 ucmezLNchu5frb{w7N#xC@7`~Jyo}|8g$OGf0}#vr!VeY<3~$~u19(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; } }