From ef69c39cf5b9442209c16bbe8500546e28c61119 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sun, 25 Dec 2016 14:29:38 +0100 Subject: [PATCH] MIssing file LUA refactor LUA is made up out of modules now Added DI to LUA Added GetKeyPosition to keyboard module Cleaned up event arguments (see wiki) Made all internal classes public since Artemis isn't a library anyway Added DI convention based bindings --- Artemis/Artemis/Artemis.csproj | 25 +- Artemis/Artemis/ArtemisBootstrapper.cs | 3 +- .../DeviceProviders/Corsair/CorsairHeadset.cs | 2 +- .../DeviceProviders/Corsair/CorsairMouse.cs | 2 +- .../Corsair/CorsairMousemat.cs | 2 +- .../Artemis/DeviceProviders/Logitech/G810.cs | 2 +- .../Artemis/DeviceProviders/Logitech/G910.cs | 2 +- .../Artemis/Events/ProfileDeviceEventsArg.cs | 22 + .../Artemis/InjectionModules/BaseModules.cs | 172 +++++-- .../Artemis/InjectionModules/DeviceModules.cs | 37 -- .../Artemis/InjectionModules/EffectModules.cs | 47 -- .../InjectionModules/ManagerModules.cs | 3 +- .../InjectionModules/ProfileModules.cs | 57 --- .../LuaWrapper.cs => Managers/LuaManager.cs} | 418 +++++++++--------- Artemis/Artemis/Models/EffectModel.cs | 8 +- Artemis/Artemis/Models/GameModel.cs | 3 +- Artemis/Artemis/Models/OverlayModel.cs | 3 +- .../Modules/Effects/Bubbles/BubblesModel.cs | 23 +- .../ProfilePreview/ProfilePreviewModel.cs | 7 +- .../WindowsProfile/WindowsProfileModel.cs | 17 +- .../Games/CounterStrike/CounterStrikeModel.cs | 7 +- .../Artemis/Modules/Games/Dota2/Dota2Model.cs | 8 +- .../Modules/Games/Dota2/Dota2Settings.cs | 2 +- .../Data/Ets2TelemetryData.cs | 18 +- .../Data/Reader/Ets2TelemetryStructure.cs | 2 +- .../Data/Reader/SharedProcessMemory.cs | 2 +- .../EurotruckSimulator2Model.cs | 7 +- .../Artemis/Modules/Games/GtaV/GtaVModel.cs | 4 +- .../Modules/Games/LightFx/LightFxModel.cs | 11 +- .../Modules/Games/Overwatch/OverwatchModel.cs | 11 +- .../Games/ProjectCars/ProjectCarsModel.cs | 15 +- .../Games/RocketLeague/RocketLeagueModel.cs | 3 +- .../Games/TheDivision/TheDivisionModel.cs | 4 +- .../UnrealTournament/UnrealTournamentModel.cs | 12 +- .../Modules/Games/Witcher3/Witcher3Model.cs | 4 +- Artemis/Artemis/Modules/Games/WoW/WoWModel.cs | 4 +- .../VolumeDisplay/VolumeDisplayModel.cs | 7 +- .../Profiles/Layers/Models/LayerModel.cs | 3 + .../Profiles/Layers/Types/Audio/AudioType.cs | 2 +- .../Layers/Types/KeyPress/KeyPressType.cs | 2 +- .../Types/KeyboardGif/KeyboardGifType.cs | 2 +- .../Profiles/Lua/{Modules => }/LuaModule.cs | 22 +- .../Lua/{ => Modules}/Brushes/LuaBrush.cs | 2 +- .../Lua/{ => Modules}/Brushes/LuaColor.cs | 2 +- .../Brushes/LuaLinearGradientBrush.cs | 2 +- .../Brushes/LuaRadialGradientBrush.cs | 2 +- .../Brushes/LuaSolidColorBrush.cs | 2 +- .../Events/LuaDeviceDrawingEventArgs.cs | 3 +- .../LuaBrushesModule.cs} | 92 ++-- .../Modules/{Events => }/LuaEventsModule.cs | 51 ++- .../Profiles/Lua/Modules/LuaKeyboardModule.cs | 46 +- .../Profiles/Lua/Modules/LuaLayerModule.cs | 20 +- .../Modules/LuaMouseModule.cs} | 70 +-- .../Profiles/Lua/Modules/LuaProfileModule.cs | 16 +- .../Profiles/Lua/Wrappers/LuaDrawWrapper.cs | 4 +- .../Profiles/Lua/Wrappers/LuaLayerWrapper.cs | 183 ++++++++ Artemis/Artemis/Profiles/ProfileModel.cs | 42 +- .../Artemis/Properties/Resources.Designer.cs | 2 +- Artemis/Artemis/Utilities/ImageUtilities.cs | 2 +- Artemis/Artemis/Utilities/StickyValue.cs | 2 +- .../Profiles/LayerEditorViewModel.cs | 8 +- .../Profiles/ProfileEditorViewModel.cs | 46 +- .../ViewModels/Profiles/ProfileViewModel.cs | 26 +- Artemis/Artemis86Wrapper/Program.cs | 2 +- 64 files changed, 914 insertions(+), 718 deletions(-) create mode 100644 Artemis/Artemis/Events/ProfileDeviceEventsArg.cs delete mode 100644 Artemis/Artemis/InjectionModules/DeviceModules.cs delete mode 100644 Artemis/Artemis/InjectionModules/EffectModules.cs delete mode 100644 Artemis/Artemis/InjectionModules/ProfileModules.cs rename Artemis/Artemis/{Profiles/Lua/LuaWrapper.cs => Managers/LuaManager.cs} (51%) rename Artemis/Artemis/Profiles/Lua/{Modules => }/LuaModule.cs (52%) rename Artemis/Artemis/Profiles/Lua/{ => Modules}/Brushes/LuaBrush.cs (90%) rename Artemis/Artemis/Profiles/Lua/{ => Modules}/Brushes/LuaColor.cs (96%) rename Artemis/Artemis/Profiles/Lua/{ => Modules}/Brushes/LuaLinearGradientBrush.cs (97%) rename Artemis/Artemis/Profiles/Lua/{ => Modules}/Brushes/LuaRadialGradientBrush.cs (98%) rename Artemis/Artemis/Profiles/Lua/{ => Modules}/Brushes/LuaSolidColorBrush.cs (93%) rename Artemis/Artemis/Profiles/Lua/{Brushes/LuaBrushWrapper.cs => Modules/LuaBrushesModule.cs} (78%) rename Artemis/Artemis/Profiles/Lua/Modules/{Events => }/LuaEventsModule.cs (50%) rename Artemis/Artemis/Profiles/{LuaMouseWrapper.cs => Lua/Modules/LuaMouseModule.cs} (72%) create mode 100644 Artemis/Artemis/Profiles/Lua/Wrappers/LuaLayerWrapper.cs diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index c9451b7ee..057b9d6a7 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -336,11 +336,9 @@ + - - - @@ -354,6 +352,7 @@ + @@ -504,23 +503,23 @@ - - - - - + + + + - - - - - + + + + + + diff --git a/Artemis/Artemis/ArtemisBootstrapper.cs b/Artemis/Artemis/ArtemisBootstrapper.cs index 754eed3cc..e15174d44 100644 --- a/Artemis/Artemis/ArtemisBootstrapper.cs +++ b/Artemis/Artemis/ArtemisBootstrapper.cs @@ -77,8 +77,7 @@ namespace Artemis protected override void Configure() { - _kernel = new StandardKernel(new BaseModules(), new ManagerModules(), new DeviceModules(), - new EffectModules(), new ProfileModules()); + _kernel = new StandardKernel(new BaseModules(), new ManagerModules()); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs index 503c7e16f..cde46b320 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadset.cs @@ -8,7 +8,7 @@ using Ninject.Extensions.Logging; namespace Artemis.DeviceProviders.Corsair { - internal class CorsairHeadset : DeviceProvider + public class CorsairHeadset : DeviceProvider { public CorsairHeadset(ILogger logger) { diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs index c6586ef31..e6dcd60cf 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMouse.cs @@ -8,7 +8,7 @@ using Ninject.Extensions.Logging; namespace Artemis.DeviceProviders.Corsair { - internal class CorsairMouse : DeviceProvider + public class CorsairMouse : DeviceProvider { public CorsairMouse(ILogger logger) { diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs index d39f50fe2..e4e6cc39e 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMousemat.cs @@ -8,7 +8,7 @@ using Ninject.Extensions.Logging; namespace Artemis.DeviceProviders.Corsair { - internal class CorsairMousemat : DeviceProvider + public class CorsairMousemat : DeviceProvider { public CorsairMousemat(ILogger logger) { diff --git a/Artemis/Artemis/DeviceProviders/Logitech/G810.cs b/Artemis/Artemis/DeviceProviders/Logitech/G810.cs index e51e0b9a5..aedb226b2 100644 --- a/Artemis/Artemis/DeviceProviders/Logitech/G810.cs +++ b/Artemis/Artemis/DeviceProviders/Logitech/G810.cs @@ -8,7 +8,7 @@ using Artemis.Settings; namespace Artemis.DeviceProviders.Logitech { - internal class G810 : LogitechKeyboard + public class G810 : LogitechKeyboard { private GeneralSettings _generalSettings; diff --git a/Artemis/Artemis/DeviceProviders/Logitech/G910.cs b/Artemis/Artemis/DeviceProviders/Logitech/G910.cs index d79aca306..e6f9ae8ce 100644 --- a/Artemis/Artemis/DeviceProviders/Logitech/G910.cs +++ b/Artemis/Artemis/DeviceProviders/Logitech/G910.cs @@ -10,7 +10,7 @@ using Artemis.Settings; namespace Artemis.DeviceProviders.Logitech { - internal class G910 : LogitechKeyboard + public class G910 : LogitechKeyboard { private readonly GeneralSettings _generalSettings; diff --git a/Artemis/Artemis/Events/ProfileDeviceEventsArg.cs b/Artemis/Artemis/Events/ProfileDeviceEventsArg.cs new file mode 100644 index 000000000..6a988f1bd --- /dev/null +++ b/Artemis/Artemis/Events/ProfileDeviceEventsArg.cs @@ -0,0 +1,22 @@ +using System; +using System.Windows.Media; +using Artemis.Models.Interfaces; + +namespace Artemis.Events +{ + public class ProfileDeviceEventsArg : EventArgs + { + public ProfileDeviceEventsArg(string updateType, IDataModel dataModel, bool preview, DrawingContext drawingContext) + { + UpdateType = updateType; + DataModel = dataModel; + Preview = preview; + DrawingContext = drawingContext; + } + + public string UpdateType { get; } + public IDataModel DataModel { get; } + public bool Preview { get; } + public DrawingContext DrawingContext { get; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/BaseModules.cs b/Artemis/Artemis/InjectionModules/BaseModules.cs index cdd51407f..5c975f7f9 100644 --- a/Artemis/Artemis/InjectionModules/BaseModules.cs +++ b/Artemis/Artemis/InjectionModules/BaseModules.cs @@ -1,39 +1,135 @@ -using Artemis.Modules.Effects.ProfilePreview; -using Artemis.Services; -using Artemis.Utilities.DataReaders; -using Artemis.Utilities.GameState; -using Artemis.ViewModels; -using Artemis.ViewModels.Abstract; -using Artemis.ViewModels.Profiles; -using Ninject.Modules; - -namespace Artemis.InjectionModules -{ - internal class BaseModules : NinjectModule - { - public override void Load() - { - // ViewModels - Bind().ToSelf().InSingletonScope(); - Bind().ToSelf(); - Bind().ToSelf(); - Bind().ToSelf().InSingletonScope(); - - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - - // Models - Bind().ToSelf().InSingletonScope(); - - // Services - Bind().ToSelf().InSingletonScope(); - Bind().ToSelf().InSingletonScope(); - - // Servers - Bind().ToSelf().InSingletonScope(); - Bind().ToSelf().InSingletonScope(); - } - } +using Artemis.DeviceProviders; +using Artemis.Models; +using Artemis.Modules.Effects.ProfilePreview; +using Artemis.Profiles.Layers.Interfaces; +using Artemis.Profiles.Layers.Types.AmbientLight; +using Artemis.Profiles.Layers.Types.Audio; +using Artemis.Profiles.Layers.Types.Audio.AudioCapturing; +using Artemis.Profiles.Layers.Types.KeyPress; +using Artemis.Profiles.Lua; +using Artemis.Services; +using Artemis.Utilities.DataReaders; +using Artemis.Utilities.GameState; +using Artemis.ViewModels; +using Artemis.ViewModels.Abstract; +using Artemis.ViewModels.Profiles; +using Ninject.Extensions.Conventions; +using Ninject.Modules; + +namespace Artemis.InjectionModules +{ + public class BaseModules : NinjectModule + { + public override void Load() + { + #region ViewModels + + Bind().ToSelf().InSingletonScope(); + Bind().ToSelf(); + Bind().ToSelf(); + Bind().ToSelf().InSingletonScope(); + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindAllBaseClasses()); + + #endregion + + #region Models + + Bind().ToSelf().InSingletonScope(); + + #endregion + + #region Services + + Bind().ToSelf().InSingletonScope(); + Bind().ToSelf().InSingletonScope(); + + #endregion + + #region Servers + + Bind().ToSelf().InSingletonScope(); + Bind().ToSelf().InSingletonScope(); + + #endregion + + #region Devices + + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindAllBaseClasses()); + + #endregion + + #region Effects + + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindAllBaseClasses() + .Configure((b, c) => b.InSingletonScope().Named(c.Name)) + ); + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase()); + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase()); + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase()); + + #endregion + + #region Profiles + + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindAllInterfaces()); + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindAllInterfaces()); + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindAllInterfaces()); + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindToSelf()); + + // Type helpers + Bind().ToSelf().InSingletonScope(); + + #endregion + + #region Lua + + Kernel.Bind(x => + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindAllBaseClasses()); + + #endregion + } + } } \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/DeviceModules.cs b/Artemis/Artemis/InjectionModules/DeviceModules.cs deleted file mode 100644 index de64108ce..000000000 --- a/Artemis/Artemis/InjectionModules/DeviceModules.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Artemis.DeviceProviders; -using Artemis.DeviceProviders.Artemis; -using Artemis.DeviceProviders.CoolerMaster; -using Artemis.DeviceProviders.Corsair; -using Artemis.DeviceProviders.Logitech; -using Artemis.DeviceProviders.Razer; -using Ninject.Modules; - -namespace Artemis.InjectionModules -{ - public class DeviceModules : NinjectModule - { - public override void Load() - { - // Keyboards - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - - // Mice - Bind().To().InSingletonScope(); - - // Headsets - Bind().To().InSingletonScope(); - - // Mousemats - Bind().To().InSingletonScope(); - - // Other - Bind().To().InSingletonScope(); - } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/EffectModules.cs b/Artemis/Artemis/InjectionModules/EffectModules.cs deleted file mode 100644 index 387b85ba7..000000000 --- a/Artemis/Artemis/InjectionModules/EffectModules.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Artemis.Models; -using Artemis.ViewModels.Abstract; -using Ninject.Extensions.Conventions; -using Ninject.Modules; - -namespace Artemis.InjectionModules -{ - public class EffectModules : NinjectModule - { - public override void Load() - { - // Effects - Kernel.Bind(x => - { - x.FromThisAssembly() - .SelectAllClasses() - .InheritedFrom() - .BindBase() - .Configure((b, c) => b.InSingletonScope().Named(c.Name)); - }); - - // View models - Kernel.Bind(x => - { - x.FromThisAssembly() - .SelectAllClasses() - .InheritedFrom() - .BindBase(); - }); - - Kernel.Bind(x => - { - x.FromThisAssembly() - .SelectAllClasses() - .InheritedFrom() - .BindBase(); - }); - Kernel.Bind(x => - { - x.FromThisAssembly() - .SelectAllClasses() - .InheritedFrom() - .BindBase(); - }); - } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/ManagerModules.cs b/Artemis/Artemis/InjectionModules/ManagerModules.cs index 540e266ef..c90727795 100644 --- a/Artemis/Artemis/InjectionModules/ManagerModules.cs +++ b/Artemis/Artemis/InjectionModules/ManagerModules.cs @@ -3,7 +3,7 @@ using Ninject.Modules; namespace Artemis.InjectionModules { - internal class ManagerModules : NinjectModule + public class ManagerModules : NinjectModule { public override void Load() { @@ -12,6 +12,7 @@ namespace Artemis.InjectionModules Bind().ToSelf().InSingletonScope(); Bind().ToSelf().InSingletonScope(); Bind().ToSelf().InSingletonScope(); + Bind().ToSelf().InSingletonScope(); } } } \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/ProfileModules.cs b/Artemis/Artemis/InjectionModules/ProfileModules.cs deleted file mode 100644 index 8e91b68b8..000000000 --- a/Artemis/Artemis/InjectionModules/ProfileModules.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Artemis.Profiles.Layers.Animations; -using Artemis.Profiles.Layers.Conditions; -using Artemis.Profiles.Layers.Interfaces; -using Artemis.Profiles.Layers.Types.AmbientLight; -using Artemis.Profiles.Layers.Types.Audio; -using Artemis.Profiles.Layers.Types.Audio.AudioCapturing; -using Artemis.Profiles.Layers.Types.Folder; -using Artemis.Profiles.Layers.Types.Generic; -using Artemis.Profiles.Layers.Types.Headset; -using Artemis.Profiles.Layers.Types.Keyboard; -using Artemis.Profiles.Layers.Types.KeyboardGif; -using Artemis.Profiles.Layers.Types.KeyPress; -using Artemis.Profiles.Layers.Types.Mouse; -using Artemis.Profiles.Layers.Types.Mousemat; -using Ninject.Modules; - -namespace Artemis.InjectionModules -{ - public class ProfileModules : NinjectModule - { - public override void Load() - { - // Animations - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - - // Conditions - Bind().To(); - Bind().To(); - - // Types - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - - // Bind some Layer Types to self as well in order to allow JSON.NET injection - Bind().ToSelf(); - Bind().ToSelf(); - Bind().ToSelf(); - - // Type helpers - Bind().ToSelf().InSingletonScope(); - } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs b/Artemis/Artemis/Managers/LuaManager.cs similarity index 51% rename from Artemis/Artemis/Profiles/Lua/LuaWrapper.cs rename to Artemis/Artemis/Managers/LuaManager.cs index 0f9a94e3c..d75b73143 100644 --- a/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs +++ b/Artemis/Artemis/Managers/LuaManager.cs @@ -1,212 +1,208 @@ -using System; -using System.IO; -using System.Text; -using Artemis.DAL; -using Artemis.DeviceProviders; -using Artemis.Profiles.Layers.Models; -using Artemis.Profiles.Lua.Brushes; -using Artemis.Profiles.Lua.Modules.Events; -using Artemis.Properties; -using Castle.Core.Internal; -using MoonSharp.Interpreter; -using Ninject; -using NLog; - -namespace Artemis.Profiles.Lua -{ - /// - /// This class is a singleton due to the fact that the LuaScript isn't very memory - /// friendly when creating new ones over and over. - /// - public class LuaWrapper - { - private readonly IKernel _kernel; - private readonly Logger _logger = LogManager.GetCurrentClassLogger(); - private readonly Script _luaScript = new Script(CoreModules.Preset_SoftSandbox); - private FileSystemWatcher _watcher; - - public ProfileModel ProfileModel { get; private set; } - public KeyboardProvider KeyboardProvider { get; private set; } - public LayerModel LayerModel { get; set; } - - public LuaWrapper(IKernel kernel) - { - _kernel = kernel; - } - - public static void SetupLua(ProfileModel profileModel, KeyboardProvider keyboardProvider) - { - Clear(); - - if ((profileModel == null) || (keyboardProvider == null)) - return; - - // Setup a new environment - KeyboardProvider = keyboardProvider; - ProfileModel = profileModel; - LuaProfileWrapper = new LuaProfileWrapper(ProfileModel); - LuaBrushWrapper = new LuaBrushWrapper(); - LuaKeyboardWrapper = new LuaKeyboardWrapper(keyboardProvider); - LuaMouseWrapper = new LuaMouseWrapper(); - LuaEventsWrapper = new LuaEventsWrapper(); - - _luaScript.Options.DebugPrint = LuaPrint; - _luaScript.Globals["Profile"] = LuaProfileWrapper; - _luaScript.Globals["Events"] = LuaEventsWrapper; - _luaScript.Globals["Brushes"] = LuaBrushWrapper; - _luaScript.Globals["Keyboard"] = LuaKeyboardWrapper; - _luaScript.Globals["Mouse"] = LuaMouseWrapper; - - if (ProfileModel == null) - return; - if (ProfileModel.LuaScript.IsNullOrEmpty()) - return; - - try - { - lock (LuaEventsWrapper.InvokeLock) - { - lock (_luaScript) - { - _luaScript.DoString(ProfileModel.LuaScript); - } - } - } - catch (InternalErrorException e) - { - _logger.Error(e, "[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); - } - catch (SyntaxErrorException e) - { - _logger.Error(e, "[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); - } - catch (ScriptRuntimeException e) - { - _logger.Error(e, "[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); - } - } - - public static void Clear() - { - lock (_luaScript) - { - // Clear old fields/properties - KeyboardProvider = null; - ProfileModel = null; - LuaProfileWrapper = null; - LuaBrushWrapper = null; - LuaKeyboardWrapper?.Dispose(); - LuaKeyboardWrapper = null; - LuaMouseWrapper = null; - - try - { - _luaScript.Globals.Clear(); - _luaScript.Registry.Clear(); - _luaScript.Registry.RegisterConstants(); - _luaScript.Registry.RegisterCoreModules(CoreModules.Preset_SoftSandbox); - _luaScript.Globals.RegisterConstants(); - _luaScript.Globals.RegisterCoreModules(CoreModules.Preset_SoftSandbox); - } - catch (NullReferenceException) - { - // 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; - } - } - - #region Private lua functions - - private static void LuaPrint(string s) - { - _logger.Debug("[{0}-LUA]: {1}", ProfileModel?.Name, s); - } - - #endregion - - #region Editor - - public static void OpenEditor() - { - if (ProfileModel == null) - return; - - // Create a temp file - var fileName = Guid.NewGuid() + ".lua"; - var file = File.Create(Path.GetTempPath() + fileName); - file.Dispose(); - - // Add instructions to LUA script if it's a new file - if (ProfileModel.LuaScript.IsNullOrEmpty()) - ProfileModel.LuaScript = Encoding.UTF8.GetString(Resources.lua_placeholder); - File.WriteAllText(Path.GetTempPath() + fileName, ProfileModel.LuaScript); - - // Watch the file for changes - SetupWatcher(Path.GetTempPath(), fileName); - - // Open the temp file with the default editor - System.Diagnostics.Process.Start(Path.GetTempPath() + fileName); - } - - private static void SetupWatcher(string path, string fileName) - { - if (_watcher == null) - { - _watcher = new FileSystemWatcher(Path.GetTempPath(), fileName); - _watcher.Changed += LuaFileChanged; - _watcher.EnableRaisingEvents = true; - } - - _watcher.Path = path; - _watcher.Filter = fileName; - } - - private static void LuaFileChanged(object sender, FileSystemEventArgs args) - { - if (args.ChangeType != WatcherChangeTypes.Changed) - return; - - if (ProfileModel == null) - return; - - lock (ProfileModel) - { - using (var fs = new FileStream(args.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - using (var sr = new StreamReader(fs)) - { - ProfileModel.LuaScript = sr.ReadToEnd(); - } - } - - ProfileProvider.AddOrUpdate(ProfileModel); - - if (KeyboardProvider != null) - SetupLua(ProfileModel, KeyboardProvider); - } - } - - #endregion - } +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Artemis.DAL; +using Artemis.DeviceProviders; +using Artemis.Profiles; +using Artemis.Profiles.Lua; +using Artemis.Profiles.Lua.Modules; +using Artemis.Properties; +using Castle.Core.Internal; +using MoonSharp.Interpreter; +using Ninject; +using Ninject.Extensions.Logging; + +namespace Artemis.Managers +{ + public class LuaManager + { + private readonly DeviceManager _deviceManager; + private readonly IKernel _kernel; + private readonly ILogger _logger; + private List _luaModules; + private readonly Script _luaScript; + private FileSystemWatcher _watcher; + + public LuaManager(IKernel kernel, ILogger logger, DeviceManager deviceManager) + { + _kernel = kernel; + _logger = logger; + _deviceManager = deviceManager; + _luaScript = new Script(CoreModules.Preset_SoftSandbox); + } + + public ProfileModel ProfileModel { get; private set; } + public KeyboardProvider KeyboardProvider { get; private set; } + public LuaProfileModule ProfileModule { get; private set; } + public LuaEventsModule EventsModule { get; private set; } + + public void SetupLua(ProfileModel profileModel) + { + // Clear old state + ClearLua(); + + // Stop after that if no model provided/there is no keyboard + if (profileModel == null || _deviceManager.ActiveKeyboard == null) + return; + + ProfileModel = profileModel; + KeyboardProvider = _deviceManager.ActiveKeyboard; + + // Get new instances of all modules + _luaModules = _kernel.Get>(); + ProfileModule = (LuaProfileModule)_luaModules.First(m => m.ModuleName == "Profile"); + EventsModule = (LuaEventsModule)_luaModules.First(m => m.ModuleName == "Events"); + + // Setup new state + _luaScript.Options.DebugPrint = LuaPrint; + + // Insert each module into the script's globals + foreach (var luaModule in _luaModules) + { + _luaScript.Globals[luaModule.ModuleName] = luaModule; + } + + // If there is no LUA script, don't bother executing the string + if (ProfileModel.LuaScript.IsNullOrEmpty()) + return; + + try + { + lock (EventsModule.InvokeLock) + { + lock (_luaScript) + { + _luaScript.DoString(ProfileModel.LuaScript); + } + } + } + catch (InternalErrorException e) + { + _logger.Error(e, "[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); + } + catch (SyntaxErrorException e) + { + _logger.Error(e, "[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); + } + catch (ScriptRuntimeException e) + { + _logger.Error(e, "[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); + } + } + + public void ClearLua() + { + if (_luaModules != null) + { + foreach (var luaModule in _luaModules) + luaModule.Dispose(); + _luaModules.Clear(); + } + + try + { + _luaScript.Globals.Clear(); + _luaScript.Registry.Clear(); + _luaScript.Registry.RegisterConstants(); + _luaScript.Registry.RegisterCoreModules(CoreModules.Preset_SoftSandbox); + _luaScript.Globals.RegisterConstants(); + _luaScript.Globals.RegisterCoreModules(CoreModules.Preset_SoftSandbox); + } + catch (NullReferenceException) + { + // TODO: Ask MoonSharp folks why this is happening + } + + if (EventsModule != null) + { + lock (EventsModule.InvokeLock) + { + lock (_luaScript) + { + _luaScript.DoString(""); + } + } + } + else + { + lock (_luaScript) + { + _luaScript.DoString(""); + } + } + } + + #region Private lua functions + + private void LuaPrint(string s) + { + _logger.Info("[{0}-LUA]: {1}", ProfileModel?.Name, s); + } + + #endregion + + #region Editor + + public void OpenEditor() + { + if (ProfileModel == null) + return; + + // Create a temp file + var fileName = Guid.NewGuid() + ".lua"; + var file = File.Create(Path.GetTempPath() + fileName); + file.Dispose(); + + // Add instructions to LUA script if it's a new file + if (ProfileModel.LuaScript.IsNullOrEmpty()) + ProfileModel.LuaScript = Encoding.UTF8.GetString(Resources.lua_placeholder); + File.WriteAllText(Path.GetTempPath() + fileName, ProfileModel.LuaScript); + + // Watch the file for changes + SetupWatcher(Path.GetTempPath(), fileName); + + // Open the temp file with the default editor + System.Diagnostics.Process.Start(Path.GetTempPath() + fileName); + } + + private void SetupWatcher(string path, string fileName) + { + if (_watcher == null) + { + _watcher = new FileSystemWatcher(Path.GetTempPath(), fileName); + _watcher.Changed += LuaFileChanged; + _watcher.EnableRaisingEvents = true; + } + + _watcher.Path = path; + _watcher.Filter = fileName; + } + + private void LuaFileChanged(object sender, FileSystemEventArgs args) + { + if (args.ChangeType != WatcherChangeTypes.Changed) + return; + + if (ProfileModel == null) + return; + + lock (ProfileModel) + { + using (var fs = new FileStream(args.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + using (var sr = new StreamReader(fs)) + { + ProfileModel.LuaScript = sr.ReadToEnd(); + } + } + + ProfileProvider.AddOrUpdate(ProfileModel); + SetupLua(ProfileModel); + } + } + + #endregion + } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index eb1552d00..17a26a56c 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -23,9 +23,10 @@ namespace Artemis.Models protected DateTime LastTrace; - protected EffectModel(DeviceManager deviceManager, EffectSettings settings, IDataModel dataModel) + protected EffectModel(DeviceManager deviceManager, LuaManager luaManager, EffectSettings settings, IDataModel dataModel) { DeviceManager = deviceManager; + LuaManager = luaManager; Settings = settings; DataModel = dataModel; @@ -38,6 +39,7 @@ namespace Artemis.Models public bool Initialized { get; set; } public DeviceManager DeviceManager { get; set; } + public LuaManager LuaManager { get; } public EffectSettings Settings { get; set; } public string Name { get; set; } public int KeyboardScale { get; set; } = 4; @@ -50,7 +52,7 @@ namespace Artemis.Models public virtual void Dispose() { - Profile?.Deactivate(); + Profile?.Deactivate(LuaManager); } private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs args) @@ -85,7 +87,7 @@ namespace Artemis.Models // If the profile has no active LUA wrapper, create one if (!string.IsNullOrEmpty(Profile.LuaScript)) - Profile.Activate(DeviceManager.ActiveKeyboard); + Profile.Activate(LuaManager); // Render the keyboard layer-by-layer var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale); diff --git a/Artemis/Artemis/Models/GameModel.cs b/Artemis/Artemis/Models/GameModel.cs index 3d9d02204..402669db8 100644 --- a/Artemis/Artemis/Models/GameModel.cs +++ b/Artemis/Artemis/Models/GameModel.cs @@ -6,7 +6,8 @@ namespace Artemis.Models { public abstract class GameModel : EffectModel { - protected GameModel(DeviceManager deviceManager, GameSettings settings, IDataModel dataModel): base(deviceManager, settings, dataModel) + protected GameModel(DeviceManager deviceManager, LuaManager luaManager, GameSettings settings, + IDataModel dataModel) : base(deviceManager, luaManager, settings, dataModel) { // Override settings to the GameSettings type Settings = settings; diff --git a/Artemis/Artemis/Models/OverlayModel.cs b/Artemis/Artemis/Models/OverlayModel.cs index 3e7d4aba8..9935ab89b 100644 --- a/Artemis/Artemis/Models/OverlayModel.cs +++ b/Artemis/Artemis/Models/OverlayModel.cs @@ -8,7 +8,8 @@ namespace Artemis.Models private bool _enabled; public string ProcessName; - protected OverlayModel(DeviceManager deviceManager, OverlaySettings settings) : base(deviceManager, settings, null) + protected OverlayModel(DeviceManager deviceManager, LuaManager luaManager, OverlaySettings settings) + : base(deviceManager, luaManager, settings, null) { Settings = settings; Enabled = settings.Enabled; diff --git a/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs b/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs index fbbfcb1d2..3eb0f1e43 100644 --- a/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs +++ b/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs @@ -15,7 +15,8 @@ namespace Artemis.Modules.Effects.Bubbles { #region Constructors - public BubblesModel(DeviceManager deviceManager) : base(deviceManager, SettingsProvider.Load(), null) + public BubblesModel(DeviceManager deviceManager, LuaManager luaManager) + : base(deviceManager, luaManager, SettingsProvider.Load(), null) { Name = "Bubbles"; Initialized = false; @@ -41,7 +42,7 @@ namespace Artemis.Modules.Effects.Bubbles KeyboardScale = Settings.Smoothness; var rect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale); - var scaleFactor = Settings.Smoothness/25.0; + var scaleFactor = Settings.Smoothness / 25.0; for (var i = 0; i < Settings.BubbleCount; i++) { @@ -49,16 +50,18 @@ namespace Artemis.Modules.Effects.Bubbles ? ColorHelpers.GetRandomRainbowColor() : ColorHelpers.ToDrawingColor(Settings.BubbleColor); // -Settings.MoveSpeed because we want to spawn at least one move away from borders - var initialPositionX = (rect.Width - Settings.BubbleSize*scaleFactor*2 - Settings.MoveSpeed*scaleFactor)* - _random.NextDouble() + Settings.BubbleSize*scaleFactor; - var initialPositionY = (rect.Height - Settings.BubbleSize*scaleFactor*2 - Settings.MoveSpeed*scaleFactor)* - _random.NextDouble() + Settings.BubbleSize*scaleFactor; - var initialDirectionX = Settings.MoveSpeed*scaleFactor*_random.NextDouble()* + var initialPositionX = (rect.Width - Settings.BubbleSize * scaleFactor * 2 - + Settings.MoveSpeed * scaleFactor) * + _random.NextDouble() + Settings.BubbleSize * scaleFactor; + var initialPositionY = (rect.Height - Settings.BubbleSize * scaleFactor * 2 - + Settings.MoveSpeed * scaleFactor) * + _random.NextDouble() + Settings.BubbleSize * scaleFactor; + var initialDirectionX = Settings.MoveSpeed * scaleFactor * _random.NextDouble() * (_random.Next(1) == 0 ? -1 : 1); - var initialDirectionY = (Settings.MoveSpeed*scaleFactor - Math.Abs(initialDirectionX))* + var initialDirectionY = (Settings.MoveSpeed * scaleFactor - Math.Abs(initialDirectionX)) * (_random.Next(1) == 0 ? -1 : 1); - _bubbles.Add(new Bubble(color, (int) Math.Round(Settings.BubbleSize*scaleFactor), + _bubbles.Add(new Bubble(color, (int) Math.Round(Settings.BubbleSize * scaleFactor), new Point(initialPositionX, initialPositionY), new Vector(initialDirectionX, initialDirectionY))); } @@ -79,7 +82,7 @@ namespace Artemis.Modules.Effects.Bubbles if (Settings.IsShiftColors) bubble.Color = ColorHelpers.ShiftColor(bubble.Color, Settings.IsRandomColors - ? (int) Math.Round(Settings.ShiftColorSpeed*_random.NextDouble()) + ? (int) Math.Round(Settings.ShiftColorSpeed * _random.NextDouble()) : Settings.ShiftColorSpeed); bubble.CheckCollision(keyboardRectangle); diff --git a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs index 0b258f5fe..d30118099 100644 --- a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs +++ b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs @@ -16,8 +16,7 @@ namespace Artemis.Modules.Effects.ProfilePreview { public class ProfilePreviewModel : EffectModel { - public ProfilePreviewModel(DeviceManager deviceManager) - : base(deviceManager, null, new ProfilePreviewDataModel()) + public ProfilePreviewModel(DeviceManager deviceManager, LuaManager luaManager): base(deviceManager, luaManager, null, new ProfilePreviewDataModel()) { Name = "Profile Preview"; } @@ -55,8 +54,8 @@ namespace Artemis.Modules.Effects.ProfilePreview var renderLayers = GetRenderLayers(keyboardOnly); // If the profile has no active LUA wrapper, create one - if (!Equals(LuaWrapper.ProfileModel, Profile)) - Profile.Activate(DeviceManager.ActiveKeyboard); + if (!Equals(LuaManager.ProfileModel, Profile)) + Profile.Activate(LuaManager); // Render the keyboard layer-by-layer var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale); diff --git a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs index 7a5607c43..22ab35e8d 100644 --- a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs +++ b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs @@ -24,8 +24,9 @@ namespace Artemis.Modules.Effects.WindowsProfile private SpotifyLocalAPI _spotify; private bool _spotifySetupBusy; - public WindowsProfileModel(DeviceManager deviceManager) - : base(deviceManager, SettingsProvider.Load(), new WindowsProfileDataModel()) + public WindowsProfileModel(DeviceManager deviceManager, LuaManager luaManager) + : base(deviceManager, luaManager, SettingsProvider.Load(), + new WindowsProfileDataModel()) { _lastMusicUpdate = DateTime.Now; @@ -125,7 +126,7 @@ namespace Artemis.Modules.Effects.WindowsProfile var phav = PerformanceInfo.GetPhysicalAvailableMemoryInMiB(); var tot = PerformanceInfo.GetTotalMemoryInMiB(); - var percentFree = phav/(decimal) tot*100; + var percentFree = phav / (decimal) tot * 100; var percentOccupied = 100 - percentFree; dataModel.Performance.RAMUsage = (int) percentOccupied; @@ -222,7 +223,7 @@ namespace Artemis.Modules.Effects.WindowsProfile if (dataModel.Spotify.SongLength > 0) dataModel.Spotify.SongPercentCompleted = - (int) (status.PlayingPosition/dataModel.Spotify.SongLength*100.0); + (int) (status.PlayingPosition / dataModel.Spotify.SongLength * 100.0); } private void UpdateGooglePlayMusic(WindowsProfileDataModel dataModel) @@ -241,14 +242,14 @@ namespace Artemis.Modules.Effects.WindowsProfile #region System [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, - CallingConvention = CallingConvention.Winapi)] + CallingConvention = CallingConvention.Winapi)] public static extern short GetKeyState(int keyCode); private void UpdateKeyStates(WindowsProfileDataModel dataModel) { - dataModel.Keyboard.NumLock = ((ushort)GetKeyState(0x90) & 0xffff) != 0; - dataModel.Keyboard.CapsLock = ((ushort)GetKeyState(0x14) & 0xffff) != 0; - dataModel.Keyboard.ScrollLock = ((ushort)GetKeyState(0x91) & 0xffff) != 0; + dataModel.Keyboard.NumLock = ((ushort) GetKeyState(0x90) & 0xffff) != 0; + dataModel.Keyboard.CapsLock = ((ushort) GetKeyState(0x14) & 0xffff) != 0; + dataModel.Keyboard.ScrollLock = ((ushort) GetKeyState(0x91) & 0xffff) != 0; } private void UpdateActiveWindow(WindowsProfileDataModel dataModel) diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs index 452f2d51e..321614b5b 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs @@ -22,9 +22,10 @@ namespace Artemis.Modules.Games.CounterStrike private DateTime _lastKill; private int _lastKills; - public CounterStrikeModel(DeviceManager deviceManager, GameStateWebServer gameStateWebServer, - MetroDialogService dialogService) - : base(deviceManager, SettingsProvider.Load(), new CounterStrikeDataModel()) + public CounterStrikeModel(DeviceManager deviceManager, LuaManager luaManager, + GameStateWebServer gameStateWebServer, MetroDialogService dialogService) + : base(deviceManager, luaManager, SettingsProvider.Load(), + new CounterStrikeDataModel()) { _gameStateWebServer = gameStateWebServer; _dialogService = dialogService; diff --git a/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs b/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs index 8029a5da3..2f1a61c23 100644 --- a/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs +++ b/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs @@ -17,9 +17,9 @@ namespace Artemis.Modules.Games.Dota2 private readonly MetroDialogService _dialogService; private readonly GameStateWebServer _gameStateWebServer; - public Dota2Model(DeviceManager deviceManager, GameStateWebServer gameStateWebServer, + public Dota2Model(DeviceManager deviceManager, LuaManager luaManager, GameStateWebServer gameStateWebServer, MetroDialogService dialogService) - : base(deviceManager, SettingsProvider.Load(), new Dota2DataModel()) + : base(deviceManager, luaManager, SettingsProvider.Load(), new Dota2DataModel()) { _gameStateWebServer = gameStateWebServer; _dialogService = dialogService; @@ -109,8 +109,8 @@ namespace Artemis.Modules.Games.Dota2 if (dataModel?.map?.daytime == null) return; - var timeLeft = 240 - dataModel.map.clock_time%240; - dataModel.map.dayCyclePercentage = (int) (100.00/240*timeLeft); + var timeLeft = 240 - dataModel.map.clock_time % 240; + dataModel.map.dayCyclePercentage = (int) (100.00 / 240 * timeLeft); } public void HandleGameData(object sender, GameDataReceivedEventArgs e) diff --git a/Artemis/Artemis/Modules/Games/Dota2/Dota2Settings.cs b/Artemis/Artemis/Modules/Games/Dota2/Dota2Settings.cs index 771460b2a..af00d84e0 100644 --- a/Artemis/Artemis/Modules/Games/Dota2/Dota2Settings.cs +++ b/Artemis/Artemis/Modules/Games/Dota2/Dota2Settings.cs @@ -2,7 +2,7 @@ namespace Artemis.Modules.Games.Dota2 { - internal class Dota2Settings : GameSettings + public class Dota2Settings : GameSettings { public string GameDirectory { get; set; } } diff --git a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Ets2TelemetryData.cs b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Ets2TelemetryData.cs index a98f267cd..307f1b246 100644 --- a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Ets2TelemetryData.cs +++ b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Ets2TelemetryData.cs @@ -4,7 +4,7 @@ using Artemis.Modules.Games.EurotruckSimulator2.Data.Reader; namespace Artemis.Modules.Games.EurotruckSimulator2.Data { - internal class Ets2TelemetryData : IEts2TelemetryData + public class Ets2TelemetryData : IEts2TelemetryData { private Box _rawData; @@ -38,7 +38,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data } } - internal class Ets2Game : IEts2Game + public class Ets2Game : IEts2Game { private readonly Box _rawData; @@ -55,7 +55,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data public string TelemetryPluginVersion => _rawData.Struct.ets2_telemetry_plugin_revision.ToString(); } - internal class Ets2Vector : IEts2Vector + public class Ets2Vector : IEts2Vector { public Ets2Vector(float x, float y, float z) { @@ -69,7 +69,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data public float Z { get; } } - internal class Ets2Placement : IEts2Placement + public class Ets2Placement : IEts2Placement { public Ets2Placement(float x, float y, float z, float heading, float pitch, float roll) @@ -90,7 +90,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data public float Roll { get; } } - internal class Ets2Truck : IEts2Truck + public class Ets2Truck : IEts2Truck { private readonly Box _rawData; @@ -242,7 +242,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data */ } - internal class Ets2Trailer : IEts2Trailer + public class Ets2Trailer : IEts2Trailer { private readonly Box _rawData; @@ -271,7 +271,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data _rawData.Struct.trailerRotationZ); } - internal class Ets2Navigation : IEts2Navigation + public class Ets2Navigation : IEts2Navigation { private readonly Box _rawData; @@ -288,7 +288,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data _rawData.Struct.navigationSpeedLimit > 0 ? (int) Math.Round(_rawData.Struct.navigationSpeedLimit*3.6f) : 0; } - internal class Ets2Job : IEts2Job + public class Ets2Job : IEts2Job { private readonly Box _rawData; @@ -355,7 +355,7 @@ namespace Artemis.Modules.Games.EurotruckSimulator2.Data } */ - internal class Box where T : struct + public class Box where T : struct { public Box(T @struct) { diff --git a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/Ets2TelemetryStructure.cs b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/Ets2TelemetryStructure.cs index 89f1edaff..c80678afa 100644 --- a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/Ets2TelemetryStructure.cs +++ b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/Ets2TelemetryStructure.cs @@ -3,7 +3,7 @@ using System.Runtime.InteropServices; namespace Artemis.Modules.Games.EurotruckSimulator2.Data.Reader { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] - internal struct Ets2TelemetryStructure + public struct Ets2TelemetryStructure { private const int GeneralStringSize = 64; diff --git a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/SharedProcessMemory.cs b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/SharedProcessMemory.cs index 6de2569a4..1bd0ab7b2 100644 --- a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/SharedProcessMemory.cs +++ b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/Data/Reader/SharedProcessMemory.cs @@ -4,7 +4,7 @@ using System.Runtime.InteropServices; namespace Artemis.Modules.Games.EurotruckSimulator2.Data.Reader { - internal class SharedProcessMemory : IDisposable + public class SharedProcessMemory : IDisposable { private readonly string _mapName; private MemoryMappedViewAccessor _memoryMappedAccessor; diff --git a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/EurotruckSimulator2Model.cs b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/EurotruckSimulator2Model.cs index 2df7313e9..5ff1873f6 100644 --- a/Artemis/Artemis/Modules/Games/EurotruckSimulator2/EurotruckSimulator2Model.cs +++ b/Artemis/Artemis/Modules/Games/EurotruckSimulator2/EurotruckSimulator2Model.cs @@ -18,9 +18,10 @@ namespace Artemis.Modules.Games.EurotruckSimulator2 { private readonly MetroDialogService _dialogService; - public EurotruckSimulator2Model(DeviceManager deviceManager, MetroDialogService dialogService) - : base( - deviceManager, SettingsProvider.Load(), new EurotruckSimulator2DataModel()) + public EurotruckSimulator2Model(DeviceManager deviceManager, LuaManager luaManager, + MetroDialogService dialogService) + : base(deviceManager, luaManager, SettingsProvider.Load(), + new EurotruckSimulator2DataModel()) { _dialogService = dialogService; Name = "EurotruckSimulator2"; diff --git a/Artemis/Artemis/Modules/Games/GtaV/GtaVModel.cs b/Artemis/Artemis/Modules/Games/GtaV/GtaVModel.cs index 20c185ee9..b8e031572 100644 --- a/Artemis/Artemis/Modules/Games/GtaV/GtaVModel.cs +++ b/Artemis/Artemis/Modules/Games/GtaV/GtaVModel.cs @@ -15,8 +15,8 @@ namespace Artemis.Modules.Games.GtaV { private readonly PipeServer _pipeServer; - public GtaVModel(DeviceManager deviceManager, PipeServer pipeServer) - : base(deviceManager, SettingsProvider.Load(), new GtaVDataModel()) + public GtaVModel(DeviceManager deviceManager, LuaManager luaManager, PipeServer pipeServer) + : base(deviceManager, luaManager, SettingsProvider.Load(), new GtaVDataModel()) { _pipeServer = pipeServer; Name = "GTAV"; diff --git a/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs b/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs index 143c5eb34..d0271d8f7 100644 --- a/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs +++ b/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs @@ -6,15 +6,14 @@ using Artemis.Managers; using Artemis.Models; using Artemis.Profiles.Layers.Models; using Artemis.Utilities.DataReaders; -using Artemis.Utilities.GameState; using Newtonsoft.Json; namespace Artemis.Modules.Games.LightFx { public class LightFxModel : GameModel { - public LightFxModel(DeviceManager deviceManager, PipeServer pipeServer) - : base(deviceManager, SettingsProvider.Load(), new LightFxDataModel()) + public LightFxModel(DeviceManager deviceManager, LuaManager luaManager, PipeServer pipeServer) + : base(deviceManager, luaManager, SettingsProvider.Load(), new LightFxDataModel()) { Name = "LightFX"; ProcessName = "LoL"; @@ -26,6 +25,8 @@ namespace Artemis.Modules.Games.LightFx pipeServer.PipeMessage += PipeServerOnPipeMessage; } + public int Scale { get; set; } + private void PipeServerOnPipeMessage(string msg) { // Ensure it's Light FX JSON @@ -44,11 +45,9 @@ namespace Artemis.Modules.Games.LightFx } // Setup process name - ProcessName = Path.GetFileNameWithoutExtension(((LightFxDataModel)DataModel).LightFxState.game); + ProcessName = Path.GetFileNameWithoutExtension(((LightFxDataModel) DataModel).LightFxState.game); } - public int Scale { get; set; } - public override void Dispose() { Initialized = false; diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs index 7f53834eb..20a87d9b5 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs @@ -29,9 +29,9 @@ namespace Artemis.Modules.Games.Overwatch private DateTime _ultimateReady; private DateTime _ultimateUsed; - public OverwatchModel(DeviceManager deviceManager, PipeServer pipeServer, MetroDialogService dialogService, - DebugViewModel debugViewModel) - : base(deviceManager, SettingsProvider.Load(), new OverwatchDataModel()) + public OverwatchModel(DeviceManager deviceManager, LuaManager luaManager, PipeServer pipeServer, + MetroDialogService dialogService, DebugViewModel debugViewModel) + : base(deviceManager, luaManager, SettingsProvider.Load(), new OverwatchDataModel()) { _pipeServer = pipeServer; _dialogService = dialogService; @@ -240,7 +240,8 @@ namespace Artemis.Modules.Games.Overwatch // Ultimate is ready when Q is blinking var charCol = characterMatch.Value.Color; - var backlidColor = Color.FromRgb((byte) (charCol.R*0.25), (byte) (charCol.G*0.25), (byte) (charCol.B*0.25)); + var backlidColor = Color.FromRgb((byte) (charCol.R * 0.25), (byte) (charCol.G * 0.25), + (byte) (charCol.B * 0.25)); var ultReady = !backlidColor.Equals(colors[2, 2]); if (_ultimateUsed.AddSeconds(15) <= DateTime.Now) @@ -291,7 +292,7 @@ namespace Artemis.Modules.Games.Overwatch return; var key = Registry.LocalMachine.OpenSubKey( - @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Overwatch"); + @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Overwatch"); var path = key?.GetValue("DisplayIcon")?.ToString(); if (string.IsNullOrEmpty(path) || !File.Exists(path)) diff --git a/Artemis/Artemis/Modules/Games/ProjectCars/ProjectCarsModel.cs b/Artemis/Artemis/Modules/Games/ProjectCars/ProjectCarsModel.cs index aa82cf26f..145bb6591 100644 --- a/Artemis/Artemis/Modules/Games/ProjectCars/ProjectCarsModel.cs +++ b/Artemis/Artemis/Modules/Games/ProjectCars/ProjectCarsModel.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.IO; +using System.Collections.Generic; using Artemis.DAL; using Artemis.Managers; using Artemis.Models; using Artemis.Modules.Games.ProjectCars.Data; using Artemis.Profiles.Layers.Models; -using Artemis.Properties; using Artemis.Services; -using Artemis.Settings; -using Artemis.Utilities; -using Ninject.Extensions.Logging; namespace Artemis.Modules.Games.ProjectCars { @@ -18,8 +12,8 @@ namespace Artemis.Modules.Games.ProjectCars { private readonly MetroDialogService _dialogService; - public ProjectCarsModel(DeviceManager deviceManager, MetroDialogService dialogService) - : base(deviceManager, SettingsProvider.Load(), new ProjectCarsDataModel()) + public ProjectCarsModel(DeviceManager deviceManager, LuaManager luaManager, MetroDialogService dialogService) + : base(deviceManager, luaManager, SettingsProvider.Load(), new ProjectCarsDataModel()) { _dialogService = dialogService; Name = "ProjectCars"; @@ -49,10 +43,7 @@ namespace Artemis.Modules.Games.ProjectCars // item1 is the true/false indicating a good read or not if (returnTuple.Item1) - { - // map the data that's read from the struct and map it to the class dataModel.GameData = dataModel.GameData.MapStructToClass(returnTuple.Item2, dataModel.GameData); - } } public override List GetRenderLayers(bool keyboardOnly) diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs index c926298bd..8e8673508 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs @@ -17,8 +17,7 @@ namespace Artemis.Modules.Games.RocketLeague private Memory _memory; private GamePointersCollection _pointer; - public RocketLeagueModel(DeviceManager deviceManager) - : base(deviceManager, SettingsProvider.Load(), new RocketLeagueDataModel()) + public RocketLeagueModel(DeviceManager deviceManager, LuaManager luaManager) : base(deviceManager, luaManager, SettingsProvider.Load(), new RocketLeagueDataModel()) { Name = "RocketLeague"; ProcessName = "RocketLeague"; diff --git a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs index 59c039431..5365aacd4 100644 --- a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs +++ b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs @@ -16,8 +16,8 @@ namespace Artemis.Modules.Games.TheDivision private StickyValue _stickyAmmo; private StickyValue _stickyHp; - public TheDivisionModel(DeviceManager deviceManager, PipeServer pipeServer) - : base(deviceManager, SettingsProvider.Load(), new TheDivisionDataModel()) + public TheDivisionModel(DeviceManager deviceManager, LuaManager luaManager, PipeServer pipeServer) + : base(deviceManager, luaManager, SettingsProvider.Load(), new TheDivisionDataModel()) { _pipeServer = pipeServer; Name = "TheDivision"; diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs index bb4e0234b..ee48801a8 100644 --- a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs @@ -25,8 +25,10 @@ namespace Artemis.Modules.Games.UnrealTournament private Timer _killTimer; private int _lastScore; - public UnrealTournamentModel(DeviceManager deviceManager, PipeServer pipeServer, MetroDialogService dialogService) - : base(deviceManager, SettingsProvider.Load(), new UnrealTournamentDataModel()) + public UnrealTournamentModel(DeviceManager deviceManager, LuaManager luaManager, PipeServer pipeServer, + MetroDialogService dialogService) + : base(deviceManager, luaManager, SettingsProvider.Load(), + new UnrealTournamentDataModel()) { _pipeServer = pipeServer; _dialogService = dialogService; @@ -44,7 +46,7 @@ namespace Artemis.Modules.Games.UnrealTournament public void FindGame() { - var gameSettings = (UnrealTournamentSettings)Settings; + var gameSettings = (UnrealTournamentSettings) Settings; // If already propertly set up, don't do anything if ((gameSettings.GameDirectory != null) && File.Exists(gameSettings.GameDirectory + "UE4-Win64-Shipping.exe")) @@ -77,13 +79,13 @@ namespace Artemis.Modules.Games.UnrealTournament public void PlaceFiles() { - var gameSettings = (UnrealTournamentSettings)Settings; + var gameSettings = (UnrealTournamentSettings) Settings; var path = gameSettings.GameDirectory; if (!File.Exists(path + @"\UE4-Win64-Shipping.exe")) { _dialogService.ShowErrorMessageBox("Please select a valid Unreal Tournament directory\n\n" + - @"By default Unreal Tournament is in C:\Program Files\Epic Games\UnrealTournament"); + @"By default Unreal Tournament is in C:\Program Files\Epic Games\UnrealTournament"); gameSettings.GameDirectory = string.Empty; gameSettings.Save(); diff --git a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs index 65b1a4a51..76070e6eb 100644 --- a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs +++ b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs @@ -17,8 +17,8 @@ namespace Artemis.Modules.Games.Witcher3 private readonly Stopwatch _updateSw; private string _witcherSettings; - public Witcher3Model(DeviceManager deviceManager) - : base(deviceManager, SettingsProvider.Load(), new Witcher3DataModel()) + public Witcher3Model(DeviceManager deviceManager, LuaManager luaManager) + : base(deviceManager, luaManager, SettingsProvider.Load(), new Witcher3DataModel()) { Name = "Witcher3"; ProcessName = "witcher3"; diff --git a/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs b/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs index 3386027dd..666aa5ca1 100644 --- a/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs +++ b/Artemis/Artemis/Modules/Games/WoW/WoWModel.cs @@ -18,8 +18,8 @@ namespace Artemis.Modules.Games.WoW private readonly GamePointersCollection _pointer; private ProcessSharp _process; - public WoWModel(DeviceManager deviceManager) - : base(deviceManager, SettingsProvider.Load(), new WoWDataModel()) + public WoWModel(DeviceManager deviceManager, LuaManager luaManager) + : base(deviceManager, luaManager, SettingsProvider.Load(), new WoWDataModel()) { Name = "WoW"; ProcessName = "Wow-64"; diff --git a/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs b/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs index c6c511b4e..e43097b6c 100644 --- a/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs +++ b/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs @@ -13,7 +13,8 @@ namespace Artemis.Modules.Overlays.VolumeDisplay { public class VolumeDisplayModel : OverlayModel { - public VolumeDisplayModel(DeviceManager deviceManager): base(deviceManager, SettingsProvider.Load()) + public VolumeDisplayModel(DeviceManager deviceManager, LuaManager luaManager) + : base(deviceManager, luaManager, SettingsProvider.Load()) { Name = "VolumeDisplay"; Settings = (VolumeDisplaySettings) base.Settings; @@ -44,7 +45,7 @@ namespace Artemis.Modules.Overlays.VolumeDisplay if (VolumeDisplay.Ttl < 1) return; - var decreaseAmount = 500/fps; + var decreaseAmount = 500 / fps; VolumeDisplay.Ttl = VolumeDisplay.Ttl - decreaseAmount; if (VolumeDisplay.Ttl < 128) VolumeDisplay.Transparancy = (byte) (VolumeDisplay.Transparancy - 20); @@ -55,7 +56,7 @@ namespace Artemis.Modules.Overlays.VolumeDisplay var volumeFloat = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console) .AudioEndpointVolume.MasterVolumeLevelScalar; - VolumeDisplay.Volume = (int) (volumeFloat*100); + VolumeDisplay.Volume = (int) (volumeFloat * 100); } catch (COMException) { diff --git a/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs b/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs index 5870cdb19..826d78250 100644 --- a/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs @@ -52,6 +52,9 @@ namespace Artemis.Profiles.Layers.Models /// public void Update(IDataModel dataModel, bool preview, bool updateAnimations) { + if (LayerType == null) + return; + LayerType.Update(this, dataModel, preview); LayerAnimation?.Update(this, updateAnimations); diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs index 02e0ec205..8aa99cefd 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs @@ -16,7 +16,7 @@ using Ninject; namespace Artemis.Profiles.Layers.Types.Audio { - internal class AudioType : ILayerType + public class AudioType : ILayerType { private readonly List _audioLayers = new List(); private readonly IKernel _kernel; diff --git a/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs b/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs index f8a31e27a..6c3628cd6 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs @@ -17,7 +17,7 @@ using Artemis.ViewModels.Profiles; namespace Artemis.Profiles.Layers.Types.KeyPress { - internal class KeyPressType : ILayerType + public class KeyPressType : ILayerType { private readonly DeviceManager _deviceManager; private List _keyPressLayers; diff --git a/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs b/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs index d2edb9451..4245d5350 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs @@ -13,7 +13,7 @@ using Artemis.ViewModels.Profiles; namespace Artemis.Profiles.Layers.Types.KeyboardGif { - internal class KeyboardGifType : ILayerType + public class KeyboardGifType : ILayerType { public string Name => "Keyboard - GIF"; public bool ShowInEdtor => true; diff --git a/Artemis/Artemis/Profiles/Lua/Modules/LuaModule.cs b/Artemis/Artemis/Profiles/Lua/LuaModule.cs similarity index 52% rename from Artemis/Artemis/Profiles/Lua/Modules/LuaModule.cs rename to Artemis/Artemis/Profiles/Lua/LuaModule.cs index 68841aa77..f7859a4ca 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/LuaModule.cs +++ b/Artemis/Artemis/Profiles/Lua/LuaModule.cs @@ -1,30 +1,36 @@ using System; -using MoonSharp.Interpreter; +using Artemis.Managers; using MoonSharp.Interpreter.Interop; -namespace Artemis.Profiles.Lua.Modules +namespace Artemis.Profiles.Lua { /// /// Defines a module which will be accessable in all LUA scripts. /// - [MoonSharpUserData] public abstract class LuaModule : IDisposable { - public LuaModule(LuaWrapper luaWrapper) + public LuaModule(LuaManager luaManager) { - LuaWrapper = luaWrapper; + LuaManager = luaManager; } /// /// The name under which this module will be accessable in LUA /// - [MoonSharpVisible(false)] public abstract string ModuleName { get; } + /// + /// The LUA manager containing this module + /// [MoonSharpVisible(false)] - public LuaWrapper LuaWrapper { get; set; } + public LuaManager LuaManager { get; set; } + /// + /// Called when the LUA script is restarted + /// [MoonSharpVisible(false)] - public abstract void Dispose(); + public virtual void Dispose() + { + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/Lua/Brushes/LuaBrush.cs b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaBrush.cs similarity index 90% rename from Artemis/Artemis/Profiles/Lua/Brushes/LuaBrush.cs rename to Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaBrush.cs index 497f9616b..179fc2130 100644 --- a/Artemis/Artemis/Profiles/Lua/Brushes/LuaBrush.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaBrush.cs @@ -2,7 +2,7 @@ using MoonSharp.Interpreter; using MoonSharp.Interpreter.Interop; -namespace Artemis.Profiles.Lua.Brushes +namespace Artemis.Profiles.Lua.Modules.Brushes { [MoonSharpUserData] public abstract class LuaBrush diff --git a/Artemis/Artemis/Profiles/Lua/Brushes/LuaColor.cs b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaColor.cs similarity index 96% rename from Artemis/Artemis/Profiles/Lua/Brushes/LuaColor.cs rename to Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaColor.cs index 25e9a67cd..f4ff1ea6d 100644 --- a/Artemis/Artemis/Profiles/Lua/Brushes/LuaColor.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaColor.cs @@ -3,7 +3,7 @@ using Artemis.Utilities; using MoonSharp.Interpreter; using MoonSharp.Interpreter.Interop; -namespace Artemis.Profiles.Lua.Brushes +namespace Artemis.Profiles.Lua.Modules.Brushes { [MoonSharpUserData] public class LuaColor diff --git a/Artemis/Artemis/Profiles/Lua/Brushes/LuaLinearGradientBrush.cs b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaLinearGradientBrush.cs similarity index 97% rename from Artemis/Artemis/Profiles/Lua/Brushes/LuaLinearGradientBrush.cs rename to Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaLinearGradientBrush.cs index 2f62d030a..3336119e4 100644 --- a/Artemis/Artemis/Profiles/Lua/Brushes/LuaLinearGradientBrush.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaLinearGradientBrush.cs @@ -5,7 +5,7 @@ using System.Windows; using System.Windows.Media; using MoonSharp.Interpreter; -namespace Artemis.Profiles.Lua.Brushes +namespace Artemis.Profiles.Lua.Modules.Brushes { [MoonSharpUserData] public class LuaLinearGradientBrush : LuaBrush diff --git a/Artemis/Artemis/Profiles/Lua/Brushes/LuaRadialGradientBrush.cs b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaRadialGradientBrush.cs similarity index 98% rename from Artemis/Artemis/Profiles/Lua/Brushes/LuaRadialGradientBrush.cs rename to Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaRadialGradientBrush.cs index d1300784a..422064001 100644 --- a/Artemis/Artemis/Profiles/Lua/Brushes/LuaRadialGradientBrush.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaRadialGradientBrush.cs @@ -5,7 +5,7 @@ using System.Windows; using System.Windows.Media; using MoonSharp.Interpreter; -namespace Artemis.Profiles.Lua.Brushes +namespace Artemis.Profiles.Lua.Modules.Brushes { [MoonSharpUserData] public class LuaRadialGradientBrush : LuaBrush diff --git a/Artemis/Artemis/Profiles/Lua/Brushes/LuaSolidColorBrush.cs b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaSolidColorBrush.cs similarity index 93% rename from Artemis/Artemis/Profiles/Lua/Brushes/LuaSolidColorBrush.cs rename to Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaSolidColorBrush.cs index ed4163cf1..cdf11a038 100644 --- a/Artemis/Artemis/Profiles/Lua/Brushes/LuaSolidColorBrush.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaSolidColorBrush.cs @@ -2,7 +2,7 @@ using System.Windows.Media; using MoonSharp.Interpreter; -namespace Artemis.Profiles.Lua.Brushes +namespace Artemis.Profiles.Lua.Modules.Brushes { [MoonSharpUserData] public class LuaSolidColorBrush : LuaBrush diff --git a/Artemis/Artemis/Profiles/Lua/Modules/Events/LuaDeviceDrawingEventArgs.cs b/Artemis/Artemis/Profiles/Lua/Modules/Events/LuaDeviceDrawingEventArgs.cs index 7f12c88b5..3c5681a4d 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/Events/LuaDeviceDrawingEventArgs.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/Events/LuaDeviceDrawingEventArgs.cs @@ -8,7 +8,8 @@ namespace Artemis.Profiles.Lua.Modules.Events [MoonSharpUserData] public class LuaDeviceDrawingEventArgs : EventArgs { - public LuaDeviceDrawingEventArgs(string deviceType, IDataModel dataModel, bool preview, LuaDrawWrapper luaDrawWrapper) + public LuaDeviceDrawingEventArgs(string deviceType, IDataModel dataModel, bool preview, + LuaDrawWrapper luaDrawWrapper) { DeviceType = deviceType; DataModel = dataModel; diff --git a/Artemis/Artemis/Profiles/Lua/Brushes/LuaBrushWrapper.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaBrushesModule.cs similarity index 78% rename from Artemis/Artemis/Profiles/Lua/Brushes/LuaBrushWrapper.cs rename to Artemis/Artemis/Profiles/Lua/Modules/LuaBrushesModule.cs index 0d183e290..8a944dd59 100644 --- a/Artemis/Artemis/Profiles/Lua/Brushes/LuaBrushWrapper.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaBrushesModule.cs @@ -1,43 +1,51 @@ -using System.Collections.Generic; -using Artemis.Utilities; -using MoonSharp.Interpreter; - -namespace Artemis.Profiles.Lua.Brushes -{ - [MoonSharpUserData] - public class LuaBrushWrapper - { - public LuaColor GetColor(string hexCode) - { - return new LuaColor(hexCode); - } - - public LuaColor GetColor(byte a, byte r, byte g, byte b) - { - return new LuaColor(a, r, g, b); - } - - public LuaColor GetRandomColor() - { - return new LuaColor(ColorHelpers.GetRandomRainbowMediaColor()); - } - - public LuaSolidColorBrush GetSolidColorBrush(LuaColor color) - { - return new LuaSolidColorBrush(color); - } - - public LuaLinearGradientBrush GetLinearGradientBrush(Dictionary gradientColors, - double startX = 0.5, double startY = 0.0, double endX = 0.5, double endY = 1.0) - { - return new LuaLinearGradientBrush(gradientColors, startX, startY, endX, endY); - } - - // TODO: Check default values - public LuaRadialGradientBrush GetRadialGradientBrush(Dictionary gradientColors, - double centerX = 0.5, double centerY = 0.5, double originX = 0.5, double originY = 0.5) - { - return new LuaRadialGradientBrush(gradientColors, centerX, centerY, originX, originY); - } - } +using System.Collections.Generic; +using Artemis.Managers; +using Artemis.Profiles.Lua.Modules.Brushes; +using Artemis.Utilities; +using MoonSharp.Interpreter; + +namespace Artemis.Profiles.Lua.Modules +{ + [MoonSharpUserData] + public class LuaBrushesModule : LuaModule + { + public LuaBrushesModule(LuaManager luaManager) : base(luaManager) + { + } + + public override string ModuleName => "Brushes"; + + public LuaColor GetColor(string hexCode) + { + return new LuaColor(hexCode); + } + + public LuaColor GetColor(byte a, byte r, byte g, byte b) + { + return new LuaColor(a, r, g, b); + } + + public LuaColor GetRandomColor() + { + return new LuaColor(ColorHelpers.GetRandomRainbowMediaColor()); + } + + public LuaSolidColorBrush GetSolidColorBrush(LuaColor color) + { + return new LuaSolidColorBrush(color); + } + + public LuaLinearGradientBrush GetLinearGradientBrush(Dictionary gradientColors, + double startX = 0.5, double startY = 0.0, double endX = 0.5, double endY = 1.0) + { + return new LuaLinearGradientBrush(gradientColors, startX, startY, endX, endY); + } + + // TODO: Check default values + public LuaRadialGradientBrush GetRadialGradientBrush(Dictionary gradientColors, + double centerX = 0.5, double centerY = 0.5, double originX = 0.5, double originY = 0.5) + { + return new LuaRadialGradientBrush(gradientColors, centerX, centerY, originX, originY); + } + } } \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/Lua/Modules/Events/LuaEventsModule.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaEventsModule.cs similarity index 50% rename from Artemis/Artemis/Profiles/Lua/Modules/Events/LuaEventsModule.cs rename to Artemis/Artemis/Profiles/Lua/Modules/LuaEventsModule.cs index 8f25d2c46..1e406b540 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/Events/LuaEventsModule.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaEventsModule.cs @@ -1,34 +1,44 @@ using System; using System.Windows.Forms; -using System.Windows.Media; -using Artemis.Models.Interfaces; +using Artemis.DeviceProviders; +using Artemis.Events; +using Artemis.Managers; +using Artemis.Profiles.Lua.Modules.Events; using Artemis.Profiles.Lua.Wrappers; +using Artemis.Utilities.Keyboard; using MoonSharp.Interpreter; using NLog; -namespace Artemis.Profiles.Lua.Modules.Events +namespace Artemis.Profiles.Lua.Modules { + [MoonSharpUserData] public class LuaEventsModule : LuaModule { private readonly Logger _logger = LogManager.GetCurrentClassLogger(); + private readonly ProfileModel _profileModel; public readonly string InvokeLock = string.Empty; - public LuaEventsModule(LuaWrapper luaWrapper) : base(luaWrapper) + public LuaEventsModule(LuaManager luaManager) : base(luaManager) { + _profileModel = luaManager.ProfileModel; + _profileModel.OnDeviceUpdatedEvent += OnDeviceUpdatedEvent; + _profileModel.OnDeviceDrawnEvent += OnDeviceDrawnEvent; + KeyboardHook.KeyDownCallback += KeyboardHookOnKeyDownCallback; } public override string ModuleName => "Events"; + public event EventHandler DeviceUpdating; public event EventHandler DeviceDrawing; public event EventHandler KeyboardKeyPressed; - internal void InvokeDeviceUpdate(ProfileModel profileModel, string deviceType, IDataModel dataModel, - bool preview) + private void KeyboardHookOnKeyDownCallback(KeyEventArgs e) { try { - LuaInvoke(profileModel, () => OnDeviceUpdating(new LuaProfileWrapper(profileModel), - new LuaDeviceUpdatingEventArgs(deviceType, dataModel, preview))); + var keyMatch = LuaManager.KeyboardProvider.GetKeyPosition(e.KeyCode) ?? new KeyMatch(e.KeyCode, 0, 0); + var args = new LuaKeyPressEventArgs(e.KeyCode, keyMatch.X, keyMatch.Y); + LuaInvoke(_profileModel, () => OnKeyboardKeyPressed(LuaManager.ProfileModule, args)); } catch (Exception) { @@ -36,13 +46,12 @@ namespace Artemis.Profiles.Lua.Modules.Events } } - internal void InvokeDeviceDraw(ProfileModel profileModel, string deviceType, IDataModel dataModel, bool preview, - DrawingContext c) + private void OnDeviceUpdatedEvent(object sender, ProfileDeviceEventsArg e) { try { - LuaInvoke(profileModel, () => OnDeviceDrawing(new LuaProfileWrapper(profileModel), - new LuaDeviceDrawingEventArgs(deviceType, dataModel, preview, new LuaDrawWrapper(c)))); + var args = new LuaDeviceUpdatingEventArgs(e.UpdateType, e.DataModel, e.Preview); + LuaInvoke(_profileModel, () => OnDeviceUpdating(LuaManager.ProfileModule, args)); } catch (Exception) { @@ -50,12 +59,13 @@ namespace Artemis.Profiles.Lua.Modules.Events } } - internal void InvokeKeyPressed(ProfileModel profileModel, LuaKeyboardModule keyboard, Keys key, int x, int y) + private void OnDeviceDrawnEvent(object sender, ProfileDeviceEventsArg e) { try { - LuaInvoke(profileModel, () => OnKeyboardKeyPressed(new LuaProfileWrapper(profileModel), - keyboard, new LuaKeyPressEventArgs(key, x, y))); + var wrapper = new LuaDrawWrapper(e.DrawingContext); + var args = new LuaDeviceDrawingEventArgs(e.UpdateType, e.DataModel, e.Preview, wrapper); + LuaInvoke(_profileModel, () => OnDeviceDrawing(LuaManager.ProfileModule, args)); } catch (Exception) { @@ -86,26 +96,29 @@ namespace Artemis.Profiles.Lua.Modules.Events } } - protected virtual void OnDeviceUpdating(LuaProfileWrapper profileModel, LuaDeviceUpdatingEventArgs e) + protected virtual void OnDeviceUpdating(LuaProfileModule profileModel, LuaDeviceUpdatingEventArgs e) { DeviceUpdating?.Invoke(profileModel, e); } - protected virtual void OnDeviceDrawing(LuaProfileWrapper profileModel, LuaDeviceDrawingEventArgs e) + protected virtual void OnDeviceDrawing(LuaProfileModule profileModel, LuaDeviceDrawingEventArgs e) { DeviceDrawing?.Invoke(profileModel, e); } - protected virtual void OnKeyboardKeyPressed(LuaProfileWrapper profileModel, LuaKeyboardModule keyboard, - LuaKeyPressEventArgs e) + protected virtual void OnKeyboardKeyPressed(LuaProfileModule profileModel, LuaKeyPressEventArgs e) { KeyboardKeyPressed?.Invoke(profileModel, e); } #region Overriding members + public override void Dispose() { + _profileModel.OnDeviceUpdatedEvent -= OnDeviceUpdatedEvent; + _profileModel.OnDeviceDrawnEvent -= OnDeviceDrawnEvent; + KeyboardHook.KeyDownCallback -= KeyboardHookOnKeyDownCallback; } #endregion diff --git a/Artemis/Artemis/Profiles/Lua/Modules/LuaKeyboardModule.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaKeyboardModule.cs index 7a2f29b7c..b964a8c5a 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/LuaKeyboardModule.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaKeyboardModule.cs @@ -1,6 +1,8 @@ -using System.Windows.Forms; +using System; +using System.Diagnostics; +using System.Windows.Forms; using Artemis.DeviceProviders; -using Artemis.Utilities.Keyboard; +using Artemis.Managers; using MoonSharp.Interpreter; namespace Artemis.Profiles.Lua.Modules @@ -10,13 +12,14 @@ namespace Artemis.Profiles.Lua.Modules { private readonly KeyboardProvider _keyboardProvider; - public LuaKeyboardModule(LuaWrapper luaWrapper) : base(luaWrapper) + public LuaKeyboardModule(LuaManager luaManager) : base(luaManager) { - _keyboardProvider = luaWrapper.KeyboardProvider; - KeyboardHook.KeyDownCallback += KeyboardHookOnKeyDownCallback; + _keyboardProvider = luaManager.KeyboardProvider; + + // Register the KeyMatch type for usage in GetKeyPosition + UserData.RegisterType(typeof(KeyMatch)); } - // TODO: Visible in LUA? Decladed as invisile in base class public override string ModuleName => "Keyboard"; public string Name => _keyboardProvider.Name; @@ -24,32 +27,23 @@ namespace Artemis.Profiles.Lua.Modules public int Width => _keyboardProvider.Width; public int Height => _keyboardProvider.Height; - #region Overriding members - - public override void Dispose() - { - KeyboardHook.KeyDownCallback -= KeyboardHookOnKeyDownCallback; - } - - #endregion - - private void KeyboardHookOnKeyDownCallback(KeyEventArgs e) - { - // TODO - //var keyMatch = _keyboardProvider.GetKeyPosition(e.KeyCode); - //if (keyMatch != null) - // LuaWrapper.LuaEventsWrapper.InvokeKeyPressed(LuaWrapper.ProfileModel, this, keyMatch.Value.KeyCode, - // keyMatch.Value.X, keyMatch.Value.Y); - } - public void PressKeys(string keys) { SendKeys.SendWait(keys); } - public void GetKeyPosition(Keys key) + public KeyMatch? GetKeyPosition(string key) { - _keyboardProvider.GetKeyPosition(key); + // Convert string to Keys enum, I'm not sure if built-in enums can be converted automatically + try + { + var keyEnum = (Keys)Enum.Parse(typeof(Keys), key); + return _keyboardProvider.GetKeyPosition(keyEnum); + } + catch (ArgumentException) + { + throw new ScriptRuntimeException($"Key '{key}' not found"); + } } } } \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs index d95c2a615..aca0bb2c8 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Media; +using Artemis.Managers; using Artemis.Modules.Effects.ProfilePreview; using Artemis.Profiles.Layers.Models; -using Artemis.Profiles.Lua.Brushes; +using Artemis.Profiles.Lua.Modules.Brushes; +using Artemis.Profiles.Lua.Wrappers; using MoonSharp.Interpreter; namespace Artemis.Profiles.Lua.Modules @@ -13,10 +15,10 @@ namespace Artemis.Profiles.Lua.Modules { private readonly LayerModel _layerModel; - public LuaLayerModule(LuaWrapper luaWrapper) : base(luaWrapper) + public LuaLayerModule(LuaManager luaManager, LayerModel layerModel) : base(luaManager) { - _layerModel = luaWrapper.LayerModel; - SavedProperties = new Lua.LuaLayerProperties(_layerModel); + _layerModel = layerModel; + SavedProperties = new Wrappers.LuaLayerProperties(_layerModel); // Triger an update to fill up the Properties _layerModel.Update(new ProfilePreviewDataModel(), true, false); @@ -24,14 +26,6 @@ namespace Artemis.Profiles.Lua.Modules public override string ModuleName => "Layer"; - #region Overriding members - - public override void Dispose() - { - } - - #endregion - #region Child methods public List GetChildren() @@ -113,7 +107,7 @@ namespace Artemis.Profiles.Lua.Modules #region Advanced layer properties - public Lua.LuaLayerProperties SavedProperties { get; set; } + public Wrappers.LuaLayerProperties SavedProperties { get; set; } public string BrushType => _layerModel.Properties.Brush?.GetType().Name; diff --git a/Artemis/Artemis/Profiles/LuaMouseWrapper.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaMouseModule.cs similarity index 72% rename from Artemis/Artemis/Profiles/LuaMouseWrapper.cs rename to Artemis/Artemis/Profiles/Lua/Modules/LuaMouseModule.cs index acc0fdc81..063e970bd 100644 --- a/Artemis/Artemis/Profiles/LuaMouseWrapper.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaMouseModule.cs @@ -1,33 +1,39 @@ -using System.Runtime.InteropServices; -using System.Windows; -using MoonSharp.Interpreter; - -namespace Artemis.Profiles -{ - [MoonSharpUserData] - public class LuaMouseWrapper - { - public int Y => (int) GetMousePosition().Y; - - public int X => (int) GetMousePosition().X; - - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool GetCursorPos(ref Win32Point pt); - - public static Point GetMousePosition() - { - var w32Mouse = new Win32Point(); - GetCursorPos(ref w32Mouse); - return new Point(w32Mouse.X, w32Mouse.Y); - } - - [StructLayout(LayoutKind.Sequential)] - internal struct Win32Point - { - public int X; - public int Y; - } - } +using System.Runtime.InteropServices; +using System.Windows; +using Artemis.Managers; +using MoonSharp.Interpreter; + +namespace Artemis.Profiles.Lua.Modules +{ + [MoonSharpUserData] + public class LuaMouseModule : LuaModule + { + public LuaMouseModule(LuaManager luaManager) : base(luaManager) + { + } + + public override string ModuleName => "Mouse"; + + public int Y => (int) GetMousePosition().Y; + + public int X => (int) GetMousePosition().X; + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool GetCursorPos(ref Win32Point pt); + + public static Point GetMousePosition() + { + var w32Mouse = new Win32Point(); + GetCursorPos(ref w32Mouse); + return new Point(w32Mouse.X, w32Mouse.Y); + } + + [StructLayout(LayoutKind.Sequential)] + internal struct Win32Point + { + public int X; + public int Y; + } + } } \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/Lua/Modules/LuaProfileModule.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaProfileModule.cs index f3a1b5617..9de14efb8 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/LuaProfileModule.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaProfileModule.cs @@ -1,15 +1,19 @@ using System.Collections.Generic; using System.Linq; +using Artemis.Managers; +using Artemis.Profiles.Lua.Wrappers; +using MoonSharp.Interpreter; namespace Artemis.Profiles.Lua.Modules { + [MoonSharpUserData] public class LuaProfileModule : LuaModule { private readonly ProfileModel _profileModel; - public LuaProfileModule(LuaWrapper luaWrapper) : base(luaWrapper) + public LuaProfileModule(LuaManager luaManager) : base(luaManager) { - _profileModel = luaWrapper.ProfileModel; + _profileModel = luaManager.ProfileModel; } public override string ModuleName => "Profile"; @@ -20,14 +24,6 @@ namespace Artemis.Profiles.Lua.Modules #endregion - #region Overriding members - - public override void Dispose() - { - } - - #endregion - #region Layer methods public List GetLayers() diff --git a/Artemis/Artemis/Profiles/Lua/Wrappers/LuaDrawWrapper.cs b/Artemis/Artemis/Profiles/Lua/Wrappers/LuaDrawWrapper.cs index 7fefa6300..baecf2913 100644 --- a/Artemis/Artemis/Profiles/Lua/Wrappers/LuaDrawWrapper.cs +++ b/Artemis/Artemis/Profiles/Lua/Wrappers/LuaDrawWrapper.cs @@ -2,13 +2,13 @@ using System.Globalization; using System.Windows; using System.Windows.Media; -using Artemis.Profiles.Lua.Brushes; +using Artemis.Profiles.Lua.Modules.Brushes; using MoonSharp.Interpreter; namespace Artemis.Profiles.Lua.Wrappers { /// - /// A wrapper that is provided to each OnDraw event to allow drawing in LUA + /// A wrapper that is provided to each OnDraw event to allow drawing in LUA /// [MoonSharpUserData] public class LuaDrawWrapper diff --git a/Artemis/Artemis/Profiles/Lua/Wrappers/LuaLayerWrapper.cs b/Artemis/Artemis/Profiles/Lua/Wrappers/LuaLayerWrapper.cs new file mode 100644 index 000000000..25a44a777 --- /dev/null +++ b/Artemis/Artemis/Profiles/Lua/Wrappers/LuaLayerWrapper.cs @@ -0,0 +1,183 @@ +using System.Collections.Generic; +using System.Linq; +using System.Windows.Media; +using Artemis.Modules.Effects.ProfilePreview; +using Artemis.Profiles.Layers.Models; +using Artemis.Profiles.Lua.Modules.Brushes; +using MoonSharp.Interpreter; + +namespace Artemis.Profiles.Lua.Wrappers +{ + /// + /// Serves as a sandboxed wrapper around the LayerModel + /// + [MoonSharpUserData] + public class LuaLayerWrapper + { + private readonly LayerModel _layerModel; + + public LuaLayerWrapper(LayerModel layerModel) + { + _layerModel = layerModel; + SavedProperties = new LuaLayerProperties(layerModel); + + // Triger an update to fill up the Properties + _layerModel.Update(new ProfilePreviewDataModel(), true, false); + } + + #region Child methods + + public List GetChildren() + { + return _layerModel.Children.Select(l => new LuaLayerWrapper(l)).ToList(); + } + + public LuaLayerWrapper GetChildByName(string name) + { + var layer = _layerModel.Children.FirstOrDefault(l => l.Name == name); + return layer == null ? null : new LuaLayerWrapper(layer); + } + + #endregion + + #region General layer properties + + public string Name + { + get { return _layerModel.Name; } + set { _layerModel.Name = value; } + } + + public bool Enabled + { + get { return _layerModel.Enabled; } + set { _layerModel.Enabled = value; } + } + + public bool IsEvent + { + get { return _layerModel.IsEvent; } + set { _layerModel.IsEvent = value; } + } + + public LuaLayerWrapper Parent => new LuaLayerWrapper(_layerModel.Parent); + + #endregion + + #region Render layer properties + + public double X + { + get { return _layerModel.X; } + set { _layerModel.X = value; } + } + + public double Y + { + get { return _layerModel.Y; } + set { _layerModel.Y = value; } + } + + public double Width + { + get { return _layerModel.Width; } + set { _layerModel.Width = value; } + } + + public double Height + { + get { return _layerModel.Height; } + set { _layerModel.Height = value; } + } + + public double Opacity + { + get { return _layerModel.Opacity; } + set { _layerModel.Opacity = value; } + } + + public double AnimationProgress + { + get { return _layerModel.AnimationProgress; } + set { _layerModel.AnimationProgress = value; } + } + + #endregion + + #region Advanced layer properties + + public LuaLayerProperties SavedProperties { get; set; } + + public string BrushType => _layerModel.Properties.Brush?.GetType().Name; + + public LuaBrush Brush + { + get + { + if (_layerModel.Properties.Brush is SolidColorBrush) + return new LuaSolidColorBrush(_layerModel.Properties.Brush); + if (_layerModel.Properties.Brush is LinearGradientBrush) + return new LuaLinearGradientBrush(_layerModel.Properties.Brush); + if (_layerModel.Properties.Brush is RadialGradientBrush) + return new LuaRadialGradientBrush(_layerModel.Properties.Brush); + return null; + } + set { _layerModel.Properties.Brush = value?.Brush; } + } + + #endregion + } + + [MoonSharpUserData] + public class LuaLayerProperties + { + private readonly LayerModel _layerModel; + + public LuaLayerProperties(LayerModel layerModel) + { + _layerModel = layerModel; + } + + public double X + { + get { return _layerModel.Properties.X; } + set { _layerModel.Properties.X = value; } + } + + public double Y + { + get { return _layerModel.Properties.Y; } + set { _layerModel.Properties.Y = value; } + } + + public double Width + { + get { return _layerModel.Properties.Width; } + set { _layerModel.Properties.Width = value; } + } + + public double Height + { + get { return _layerModel.Properties.Height; } + set { _layerModel.Properties.Height = value; } + } + + public bool Contain + { + get { return _layerModel.Properties.Contain; } + set { _layerModel.Properties.Contain = value; } + } + + public double Opacity + { + get { return _layerModel.Properties.Opacity; } + set { _layerModel.Properties.Opacity = value; } + } + + public double AnimationSpeed + { + get { return _layerModel.Properties.AnimationSpeed; } + set { _layerModel.Properties.AnimationSpeed = value; } + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/ProfileModel.cs b/Artemis/Artemis/Profiles/ProfileModel.cs index 7ec550697..d191f30c4 100644 --- a/Artemis/Artemis/Profiles/ProfileModel.cs +++ b/Artemis/Artemis/Profiles/ProfileModel.cs @@ -6,10 +6,11 @@ using System.Linq; using System.Windows; using System.Windows.Media; using Artemis.DeviceProviders; +using Artemis.Events; +using Artemis.Managers; using Artemis.Models.Interfaces; using Artemis.Profiles.Layers.Interfaces; using Artemis.Profiles.Layers.Models; -using Artemis.Profiles.Lua; using Artemis.Utilities; using Artemis.Utilities.ParentChild; using Newtonsoft.Json; @@ -41,6 +42,9 @@ namespace Artemis.Profiles [JsonIgnore] public string Slug => new string(Name.Where(ch => !_invalidFileNameChars.Contains(ch)).ToArray()); + public event EventHandler OnDeviceUpdatedEvent; + public event EventHandler OnDeviceDrawnEvent; + public void FixOrder() { Layers.Sort(l => l.Order); @@ -77,12 +81,14 @@ namespace Artemis.Profiles var layers = new List(); foreach (var layerModel in Layers.OrderByDescending(l => l.Order)) { - if (!layerModel.Enabled || (keyboardOnly && (layerModel.LayerType.DrawType != DrawType.Keyboard))) + if (!layerModel.Enabled || keyboardOnly && layerModel.LayerType.DrawType != DrawType.Keyboard) continue; if (!ignoreConditions) + { if (!layerModel.ConditionsMet(dataModel)) continue; + } layers.Add(layerModel); layers.AddRange(layerModel.GetRenderLayers(dataModel, keyboardOnly, ignoreConditions)); @@ -115,12 +121,12 @@ namespace Artemis.Profiles // Update the layers foreach (var layerModel in layerModels) layerModel.Update(dataModel, preview, updateAnimations); - LuaWrapper.LuaEventsWrapper?.InvokeDeviceUpdate(this, updateType, dataModel, preview); + RaiseDeviceUpdatedEvent(new ProfileDeviceEventsArg(updateType, dataModel, preview, null)); // Draw the layers foreach (var layerModel in layerModels) layerModel.Draw(dataModel, c, preview, updateAnimations); - LuaWrapper.LuaEventsWrapper?.InvokeDeviceDraw(this, updateType, dataModel, preview, c); + RaiseDeviceDrawnEvent(new ProfileDeviceEventsArg(updateType, dataModel, preview, c)); // Remove the clip c.Pop(); @@ -132,6 +138,18 @@ namespace Artemis.Profiles } } + private void RaiseDeviceUpdatedEvent(ProfileDeviceEventsArg e) + { + var handler = OnDeviceUpdatedEvent; + handler?.Invoke(this, e); + } + + public void RaiseDeviceDrawnEvent(ProfileDeviceEventsArg e) + { + var handler = OnDeviceDrawnEvent; + handler?.Invoke(this, e); + } + /// /// Looks at all the layers wthin the profile and makes sure they are within boundaries of the given rectangle /// @@ -172,15 +190,15 @@ namespace Artemis.Profiles } } - public void Activate(KeyboardProvider keyboard) + public void Activate(LuaManager luaManager) { - if (!Equals(LuaWrapper.ProfileModel, this)) - LuaWrapper.SetupLua(this, keyboard); + if (!Equals(luaManager.ProfileModel, this)) + luaManager.SetupLua(this); } - public void Deactivate() + public void Deactivate(LuaManager luaManager) { - LuaWrapper.Clear(); + luaManager.ClearLua(); } public LayerModel AddLayer(LayerModel afterLayer) @@ -189,7 +207,9 @@ namespace Artemis.Profiles var layer = LayerModel.CreateLayer(); if (afterLayer != null) + { afterLayer.InsertAfter(layer); + } else { Layers.Add(layer); @@ -221,8 +241,8 @@ namespace Artemis.Profiles unchecked { var hashCode = Slug?.GetHashCode() ?? 0; - hashCode = (hashCode*397) ^ (KeyboardSlug?.GetHashCode() ?? 0); - hashCode = (hashCode*397) ^ (GameName?.GetHashCode() ?? 0); + hashCode = (hashCode * 397) ^ (KeyboardSlug?.GetHashCode() ?? 0); + hashCode = (hashCode * 397) ^ (GameName?.GetHashCode() ?? 0); return hashCode; } } diff --git a/Artemis/Artemis/Properties/Resources.Designer.cs b/Artemis/Artemis/Properties/Resources.Designer.cs index 467d52c81..a77b26a2d 100644 --- a/Artemis/Artemis/Properties/Resources.Designer.cs +++ b/Artemis/Artemis/Properties/Resources.Designer.cs @@ -22,7 +22,7 @@ namespace Artemis.Properties { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; diff --git a/Artemis/Artemis/Utilities/ImageUtilities.cs b/Artemis/Artemis/Utilities/ImageUtilities.cs index f9a3f1ae9..51fc2f66f 100644 --- a/Artemis/Artemis/Utilities/ImageUtilities.cs +++ b/Artemis/Artemis/Utilities/ImageUtilities.cs @@ -7,7 +7,7 @@ using System.Windows.Media.Imaging; namespace Artemis.Utilities { - internal class ImageUtilities + public class ImageUtilities { /// /// Resize the image to the specified width and height. diff --git a/Artemis/Artemis/Utilities/StickyValue.cs b/Artemis/Artemis/Utilities/StickyValue.cs index 7df32ae79..065b4eba3 100644 --- a/Artemis/Artemis/Utilities/StickyValue.cs +++ b/Artemis/Artemis/Utilities/StickyValue.cs @@ -7,7 +7,7 @@ namespace Artemis.Utilities /// /// A value that only changes it's not changed again within a set time /// - internal class StickyValue : IDisposable + public class StickyValue : IDisposable { private readonly int _stickyTime; private readonly BackgroundWorker _updateWorker; diff --git a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs index 55b12d98a..edea36331 100644 --- a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs @@ -27,14 +27,14 @@ namespace Artemis.ViewModels.Profiles private ILayerType _selectedLayerType; public LayerEditorViewModel(LayerModel layer, IDataModel dataModel, IEnumerable types, - List layerAnimations) + IEnumerable layerAnimations) { Layer = layer; ProposedLayer = Clone(layer); ProposedLayer.Children.Clear(); DataModel = DataModel; - LayerTypes = new BindableCollection(types); - LayerAnimations = layerAnimations; + LayerTypes = new BindableCollection(types.OrderBy(t => t.Name)); + LayerAnimations = layerAnimations.OrderBy(l => l.Name).ToList(); DataModelProps = new BindableCollection(GenerateTypeMap(dataModel)); @@ -118,7 +118,7 @@ namespace Artemis.ViewModels.Profiles NotifyOfPropertyChange(() => SelectedLayerType); } } - + public void PreSelect() { SelectedLayerType = LayerTypes.FirstOrDefault(t => t.Name == ProposedLayer.LayerType.Name); diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs index 02576c557..88918413a 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs @@ -16,11 +16,9 @@ using Artemis.Models; using Artemis.Profiles; using Artemis.Profiles.Layers.Models; using Artemis.Profiles.Layers.Types.Folder; -using Artemis.Profiles.Lua; using Artemis.Services; using Artemis.Styles.DropTargetAdorners; using Artemis.Utilities; -using Caliburn.Micro; using GongSolutions.Wpf.DragDrop; using MahApps.Metro.Controls.Dialogs; using Ninject; @@ -38,6 +36,7 @@ namespace Artemis.ViewModels.Profiles { private readonly DeviceManager _deviceManager; private readonly EffectModel _gameModel; + private readonly LuaManager _luaManager; private readonly Timer _saveTimer; private ImageSource _keyboardPreview; private ObservableCollection _layers; @@ -45,11 +44,12 @@ namespace Artemis.ViewModels.Profiles private bool _saving; private ProfileModel _selectedProfile; - public ProfileEditorViewModel(DeviceManager deviceManager, EffectModel gameModel, + public ProfileEditorViewModel(DeviceManager deviceManager, LuaManager luaManager, EffectModel gameModel, ProfileViewModel profileViewModel, MetroDialogService dialogService, WindowService windowService, string lastProfile) { _deviceManager = deviceManager; + _luaManager = luaManager; _gameModel = gameModel; ProfileNames = new ObservableCollection(); @@ -79,7 +79,7 @@ namespace Artemis.ViewModels.Profiles public ProfileViewModel ProfileViewModel { get; set; } public bool EditorEnabled - => (SelectedProfile != null) && !SelectedProfile.IsDefault && (_deviceManager.ActiveKeyboard != null); + => SelectedProfile != null && !SelectedProfile.IsDefault && _deviceManager.ActiveKeyboard != null; public ObservableCollection ProfileNames { @@ -125,11 +125,11 @@ namespace Artemis.ViewModels.Profiles return; // Deactivate old profile - _selectedProfile?.Deactivate(); + _selectedProfile?.Deactivate(_luaManager); // Update the value _selectedProfile = value; // Activate new profile - _selectedProfile?.Activate(_deviceManager.ActiveKeyboard); + _selectedProfile?.Activate(_luaManager); NotifyOfPropertyChange(() => SelectedProfile); NotifyOfPropertyChange(() => SelectedProfileName); } @@ -149,16 +149,16 @@ namespace Artemis.ViewModels.Profiles public PreviewSettings? PreviewSettings => _deviceManager.ActiveKeyboard?.PreviewSettings; public bool ProfileSelected => SelectedProfile != null; - public bool LayerSelected => (SelectedProfile != null) && (ProfileViewModel.SelectedLayer != null); + public bool LayerSelected => SelectedProfile != null && ProfileViewModel.SelectedLayer != null; public void DragOver(IDropInfo dropInfo) { var source = dropInfo.Data as LayerModel; var target = dropInfo.TargetItem as LayerModel; - if ((source == null) || (target == null) || (source == target)) + if (source == null || target == null || source == target) return; - if ((dropInfo.InsertPosition == RelativeInsertPosition.TargetItemCenter) && + if (dropInfo.InsertPosition == RelativeInsertPosition.TargetItemCenter && target.LayerType is FolderType) { dropInfo.DropTargetAdorner = typeof(DropTargetMetroHighlightAdorner); @@ -175,7 +175,7 @@ namespace Artemis.ViewModels.Profiles { var source = dropInfo.Data as LayerModel; var target = dropInfo.TargetItem as LayerModel; - if ((source == null) || (target == null) || (source == target)) + if (source == null || target == null || source == target) return; // Don't allow a folder to become it's own child, that's just weird @@ -196,7 +196,7 @@ namespace Artemis.ViewModels.Profiles parent.FixOrder(); } - if ((dropInfo.InsertPosition == RelativeInsertPosition.TargetItemCenter) && + if (dropInfo.InsertPosition == RelativeInsertPosition.TargetItemCenter && target.LayerType is FolderType) { // Insert into folder @@ -208,9 +208,9 @@ namespace Artemis.ViewModels.Profiles else { // Insert the source into it's new profile/parent and update the order - if ((dropInfo.InsertPosition == RelativeInsertPosition.AfterTargetItem) || - (dropInfo.InsertPosition == - (RelativeInsertPosition.TargetItemCenter | RelativeInsertPosition.AfterTargetItem))) + if (dropInfo.InsertPosition == RelativeInsertPosition.AfterTargetItem || + dropInfo.InsertPosition == + (RelativeInsertPosition.TargetItemCenter | RelativeInsertPosition.AfterTargetItem)) target.InsertAfter(source); else target.InsertBefore(source); @@ -237,7 +237,7 @@ namespace Artemis.ViewModels.Profiles public void Deactivate() { ProfileViewModel.Deactivate(); - SelectedProfile?.Deactivate(); + SelectedProfile?.Deactivate(_luaManager); _saveTimer.Stop(); } @@ -247,7 +247,7 @@ namespace Artemis.ViewModels.Profiles private void LoadProfiles() { ProfileNames.Clear(); - if ((_gameModel == null) || (_deviceManager.ActiveKeyboard == null)) + if (_gameModel == null || _deviceManager.ActiveKeyboard == null) return; ProfileNames.AddRange(ProfileProvider.GetProfileNames(_deviceManager.ActiveKeyboard, _gameModel)); @@ -255,17 +255,13 @@ namespace Artemis.ViewModels.Profiles // If a profile name was provided, try to load it ProfileModel lastProfileModel = null; if (!string.IsNullOrEmpty(LastProfile)) - { lastProfileModel = ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, _gameModel, LastProfile); - } if (lastProfileModel != null) SelectedProfile = lastProfileModel; else - { SelectedProfile = ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, _gameModel, ProfileNames.FirstOrDefault()); - } } @@ -532,7 +528,7 @@ namespace Artemis.ViewModels.Profiles var name = await DialogService.ShowInputDialog("Rename profile", "Please enter a unique new profile name"); // Null when the user cancelled - if (string.IsNullOrEmpty(name) || (name.Length < 2)) + if (string.IsNullOrEmpty(name) || name.Length < 2) return; SelectedProfile.Name = name; @@ -544,7 +540,7 @@ namespace Artemis.ViewModels.Profiles .ShowInputDialog("Name already in use", "Please enter a unique new profile name"); // Null when the user cancelled - if (string.IsNullOrEmpty(name) || (name.Length < 2)) + if (string.IsNullOrEmpty(name) || name.Length < 2) { SelectedProfile.Name = oldName; return; @@ -694,8 +690,8 @@ namespace Artemis.ViewModels.Profiles return; try { - SelectedProfile?.Activate(_deviceManager.ActiveKeyboard); - LuaWrapper.OpenEditor(); + SelectedProfile?.Activate(_luaManager); + _luaManager.OpenEditor(); } catch (Exception e) { @@ -738,7 +734,7 @@ namespace Artemis.ViewModels.Profiles public void SaveSelectedProfile() { - if (_saving || (SelectedProfile == null) || _deviceManager.ChangingKeyboard) + if (_saving || SelectedProfile == null || _deviceManager.ChangingKeyboard) return; _saving = true; diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs index 6dce58e43..219136b0e 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs @@ -11,7 +11,6 @@ using Artemis.Modules.Effects.ProfilePreview; using Artemis.Profiles; using Artemis.Profiles.Layers.Models; using Artemis.Profiles.Layers.Types.Folder; -using Artemis.Profiles.Lua; using Artemis.Properties; using Artemis.Utilities; using Caliburn.Micro; @@ -103,10 +102,11 @@ namespace Artemis.ViewModels.Profiles if (_blurProgress > 2) _blurProgress = 0; _blurProgress = _blurProgress + 0.025; - BlurRadius = (Math.Sin(_blurProgress*Math.PI) + 1)*10 + 10; + BlurRadius = (Math.Sin(_blurProgress * Math.PI) + 1) * 10 + 10; // Besides the usual checks, also check if the ActiveKeyboard isn't the NoneKeyboard - if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null || _deviceManager.ActiveKeyboard.Slug == "none") + if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null || + _deviceManager.ActiveKeyboard.Slug == "none") { var preview = new DrawingImage(); preview.Freeze(); @@ -166,8 +166,8 @@ namespace Artemis.ViewModels.Profiles new Point(layerRect.BottomRight.X - 0.7, layerRect.BottomRight.Y - 0.7)); } - LuaWrapper.LuaEventsWrapper?.InvokeDeviceDraw(SelectedProfile, "preview", new ProfilePreviewDataModel(), - true, drawingContext); + SelectedProfile.RaiseDeviceDrawnEvent(new ProfileDeviceEventsArg("preview", + new ProfilePreviewDataModel(), true, drawingContext)); // Remove the clip drawingContext.Pop(); @@ -223,8 +223,8 @@ namespace Artemis.ViewModels.Profiles var keyboard = _deviceManager.ActiveKeyboard; var pos = e.GetPosition((Image) e.OriginalSource); - var x = pos.X/((double) keyboard.PreviewSettings.Width/keyboard.Width); - var y = pos.Y/((double) keyboard.PreviewSettings.Height/keyboard.Height); + var x = pos.X / ((double) keyboard.PreviewSettings.Width / keyboard.Width); + var y = pos.Y / ((double) keyboard.PreviewSettings.Height / keyboard.Height); var hoverLayer = GetLayers().Where(l => l.MustDraw()) .FirstOrDefault(l => l.Properties.PropertiesRect(1).Contains(x, y)); @@ -244,8 +244,8 @@ namespace Artemis.ViewModels.Profiles var pos = e.GetPosition((Image) e.OriginalSource); var keyboard = _deviceManager.ActiveKeyboard; - var x = pos.X/((double) keyboard.PreviewSettings.Width/keyboard.Width); - var y = pos.Y/((double) keyboard.PreviewSettings.Height/keyboard.Height); + var x = pos.X / ((double) keyboard.PreviewSettings.Width / keyboard.Width); + var y = pos.Y / ((double) keyboard.PreviewSettings.Height / keyboard.Height); var hoverLayer = GetLayers().Where(l => l.MustDraw()) .FirstOrDefault(l => l.Properties.PropertiesRect(1).Contains(x, y)); @@ -267,7 +267,9 @@ namespace Artemis.ViewModels.Profiles : Cursors.SizeAll; } else + { KeyboardPreviewCursor = Cursors.Hand; + } } public Cursor KeyboardPreviewCursor @@ -292,14 +294,14 @@ namespace Artemis.ViewModels.Profiles { // Reset the dragging state on mouse release if (e.LeftButton == MouseButtonState.Released || - (_draggingLayer != null && SelectedLayer != _draggingLayer)) + _draggingLayer != null && SelectedLayer != _draggingLayer) { _draggingLayerOffset = null; _draggingLayer = null; return; } - if (SelectedLayer == null || (SelectedLayer.LayerType != null && !SelectedLayer.LayerType.ShowInEdtor)) + if (SelectedLayer == null || SelectedLayer.LayerType != null && !SelectedLayer.LayerType.ShowInEdtor) return; // Setup the dragging state on mouse press @@ -314,7 +316,7 @@ namespace Artemis.ViewModels.Profiles Math.Pow(y - layerRect.BottomRight.Y, 2)) < 0.6; } - if (_draggingLayerOffset == null || _draggingLayer == null || (_draggingLayer != SelectedLayer)) + if (_draggingLayerOffset == null || _draggingLayer == null || _draggingLayer != SelectedLayer) return; var draggingProps = _draggingLayer.Properties; diff --git a/Artemis/Artemis86Wrapper/Program.cs b/Artemis/Artemis86Wrapper/Program.cs index 779c38c3c..e831a0f04 100644 --- a/Artemis/Artemis86Wrapper/Program.cs +++ b/Artemis/Artemis86Wrapper/Program.cs @@ -3,7 +3,7 @@ using Artemis86Wrapper.Intergrations.Skype; namespace Artemis86Wrapper { - internal class Program + public class Program { private static void Main(string[] args) {