diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index cc6e27133..f80ef2f2c 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -336,6 +336,7 @@ + diff --git a/Artemis/Artemis/Events/ProfileChangedEventArgs.cs b/Artemis/Artemis/Events/ProfileChangedEventArgs.cs new file mode 100644 index 000000000..18755c83f --- /dev/null +++ b/Artemis/Artemis/Events/ProfileChangedEventArgs.cs @@ -0,0 +1,15 @@ +using System; +using Artemis.Profiles; + +namespace Artemis.Events +{ + public class ProfileChangedEventArgs : EventArgs + { + public ProfileChangedEventArgs(ProfileModel profileModel) + { + ProfileModel = profileModel; + } + + public ProfileModel ProfileModel { get; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs index 2d716f77e..6dcd1490b 100644 --- a/Artemis/Artemis/Managers/MainManager.cs +++ b/Artemis/Artemis/Managers/MainManager.cs @@ -137,6 +137,10 @@ namespace Artemis.Managers var processes = System.Diagnostics.Process.GetProcesses(); var module = ModuleManager.ActiveModule; + // If the current active module is in preview-mode, leave it alone + if (module?.PreviewLayers != null) + return; + // If the active module is a process bound module, make sure it should still be enabled if (module != null && module.IsBoundToProcess) { diff --git a/Artemis/Artemis/Managers/ModuleManager.cs b/Artemis/Artemis/Managers/ModuleManager.cs index 61724e88a..24992234f 100644 --- a/Artemis/Artemis/Managers/ModuleManager.cs +++ b/Artemis/Artemis/Managers/ModuleManager.cs @@ -72,7 +72,8 @@ namespace Artemis.Managers /// /// The module to activate /// Optionally pass the LoopManager to automatically start it, if it's not running. - public void ChangeActiveModule(ModuleModel moduleModel, LoopManager loopManager = null) + /// Whether or not to store this effect as the last effect + public void ChangeActiveModule(ModuleModel moduleModel, LoopManager loopManager = null, bool storeAsLast = true) { if (_waitEffect != null) { @@ -82,8 +83,6 @@ namespace Artemis.Managers if (moduleModel == null) throw new ArgumentNullException(nameof(moduleModel)); - if (moduleModel.IsOverlay) - throw new ArgumentException("Can't set an General module as the active module"); if (_deviceManager.ActiveKeyboard == null) { @@ -102,7 +101,6 @@ namespace Artemis.Managers return; } - var wasNull = false; if (ActiveModule == null) { @@ -135,9 +133,8 @@ namespace Artemis.Managers _logger.Debug("Changed active module to: {0}", moduleModel.Name); - if (ActiveModule.IsBoundToProcess || ActiveModule.IsOverlay || ActiveModule.Name == "Profile preview") + if (ActiveModule.IsBoundToProcess || ActiveModule.IsOverlay || !storeAsLast) return; - // Regular modules are stored as the last active module _generalSettings.LastModule = ActiveModule?.Name; _generalSettings.Save(); @@ -156,7 +153,6 @@ namespace Artemis.Managers ChangeActiveModule(module, loopManager); } - /// /// Clears the current module /// diff --git a/Artemis/Artemis/Managers/ProfileManager.cs b/Artemis/Artemis/Managers/ProfileManager.cs index 2cc2e1dc9..1f7bd54d1 100644 --- a/Artemis/Artemis/Managers/ProfileManager.cs +++ b/Artemis/Artemis/Managers/ProfileManager.cs @@ -4,18 +4,17 @@ using System.Timers; using Artemis.DAL; using Artemis.Modules.Abstract; using Artemis.Settings; -using Ninject; using Ninject.Extensions.Logging; namespace Artemis.Managers { public class ProfileManager { - private readonly ILogger _logger; - private readonly ModuleManager _moduleManager; private readonly DeviceManager _deviceManager; - private readonly LoopManager _loopManager; private readonly GeneralSettings _generalSettings; + private readonly ILogger _logger; + private readonly LoopManager _loopManager; + private readonly ModuleManager _moduleManager; public ProfileManager(ILogger logger, ModuleManager moduleManager, DeviceManager deviceManager, LoopManager loopManager) @@ -44,39 +43,41 @@ namespace Artemis.Managers /// private void SetupProfilePreview(object sender, ElapsedEventArgs e) { -// if (string.IsNullOrEmpty(_generalSettings.LastKeyboard) || _deviceManager.ChangingKeyboard) -// return; -// -// var activePreview = PreviewViewModules.FirstOrDefault(vm => vm.IsActive); -// if (activePreview == null) -// { -// // Should not be active if no selected profile is set -// if (_moduleManager.ActiveModule != _profilePreviewModel) -// return; -// -// _logger.Debug("Loading last module after profile preview"); -// var lastModule = _moduleManager.GetLastModule(); -// if (lastModule != null) -// _moduleManager.ChangeActiveModule(lastModule); -// else -// _moduleManager.ClearActiveModule(); -// } -// else -// { -// if (_moduleManager.ActiveModule != null && _moduleManager.ActiveModule != _profilePreviewModel && -// _moduleManager.ActiveModule != activePreview.ModuleModel) -// { -// _logger.Debug("Activate profile preview"); -// _moduleManager.ChangeActiveModule(_profilePreviewModel); -// } -// -// // LoopManager might be running, this method won't do any harm in that case. -// _loopManager.StartAsync(); -// -// // Can safely spam this, it won't do anything if they are equal -// _profilePreviewModel.ProfileViewModel = activePreview.ProfileEditor.ProfileViewModel; -// _profilePreviewModel.ChangeProfile(activePreview.ModuleModel.ProfileModel); -// } + if (string.IsNullOrEmpty(_generalSettings.LastKeyboard) || _deviceManager.ChangingKeyboard) + return; + + var activePreview = PreviewViewModules.FirstOrDefault(vm => vm.IsActive && vm.UsesProfileEditor); + if (activePreview != null) + EnsurePreviewActive(activePreview); + else + EnsurePreviewInactive(); + } + + private void EnsurePreviewActive(ModuleViewModel toBeActive) + { + // If the current module is the same as what should be active, don't do anything + if (_moduleManager.ActiveModule != null && _moduleManager.ActiveModule == toBeActive.ModuleModel) + return; + + _logger.Debug("Activate profile preview"); + _moduleManager.ChangeActiveModule(toBeActive.ModuleModel, null, false); + + // LoopManager might be running, this method won't do any harm in that case. + _loopManager.StartAsync(); + } + + private void EnsurePreviewInactive() + { + // Check if the active module is being previewed, if so, that should no longer be happening + if (_moduleManager.ActiveModule?.PreviewLayers == null) + return; + + _logger.Debug("Deactivate profile preview"); + var lastModule = _moduleManager.GetLastModule(); + if (lastModule != null) + _moduleManager.ChangeActiveModule(lastModule); + else + _moduleManager.ClearActiveModule(); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Abstract/ModuleDataModel.cs b/Artemis/Artemis/Modules/Abstract/ModuleDataModel.cs index 48fbf1135..bea0b64fc 100644 --- a/Artemis/Artemis/Modules/Abstract/ModuleDataModel.cs +++ b/Artemis/Artemis/Modules/Abstract/ModuleDataModel.cs @@ -2,6 +2,5 @@ { public abstract class ModuleDataModel { - public ModuleDataModel ParentDataModel { get; set; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Abstract/ModuleModel.cs b/Artemis/Artemis/Modules/Abstract/ModuleModel.cs index 8f70ba617..a3bbfc5c8 100644 --- a/Artemis/Artemis/Modules/Abstract/ModuleModel.cs +++ b/Artemis/Artemis/Modules/Abstract/ModuleModel.cs @@ -23,13 +23,17 @@ namespace Artemis.Modules.Abstract public ModuleModel(DeviceManager deviceManager, LuaManager luaManager) { _luaManager = luaManager; - DeviceManager = deviceManager; - PreviewLayers = new List(); DeviceManager.OnKeyboardChanged += OnKeyboardChanged; } + #region Events + + public event EventHandler ProfileChanged; + + #endregion + #region Abstract properties /// @@ -95,6 +99,8 @@ namespace Artemis.Modules.Abstract ProfileModel = profileModel; ProfileModel?.Activate(_luaManager); + + RaiseProfileChangedEvent(new ProfileChangedEventArgs(ProfileModel)); } public virtual void Enable() @@ -107,7 +113,7 @@ namespace Artemis.Modules.Abstract { IsInitialized = false; - PreviewLayers.Clear(); + PreviewLayers = null; ProfileModel?.Deactivate(_luaManager); ProfileModel = null; } @@ -123,6 +129,12 @@ namespace Artemis.Modules.Abstract ChangeProfile(ProfileProvider.GetProfile(DeviceManager.ActiveKeyboard, this, profileName)); } + protected virtual void RaiseProfileChangedEvent(ProfileChangedEventArgs e) + { + var handler = ProfileChanged; + handler?.Invoke(this, e); + } + public abstract void Update(); public virtual void Render(RenderFrame frame, bool keyboardOnly) @@ -134,35 +146,36 @@ namespace Artemis.Modules.Abstract { lock (ProfileModel) { - // Get all enabled layers who's conditions are met - var layers = GetRenderLayers(keyboardOnly); + // Use the preview layers if they are present, else get all layers who's conditions are met + var layers = PreviewLayers ?? GetRenderLayers(keyboardOnly); + var preview = PreviewLayers != null; // Render the keyboard layer-by-layer var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(); using (var g = Graphics.FromImage(frame.KeyboardBitmap)) { - ProfileModel?.DrawLayers(g, layers, DrawType.Keyboard, DataModel, keyboardRect, false, true); + ProfileModel?.DrawLayers(g, layers, DrawType.Keyboard, DataModel, keyboardRect, preview); } // Render mice layer-by-layer var devRec = new Rect(0, 0, 40, 40); using (var g = Graphics.FromImage(frame.MouseBitmap)) { - ProfileModel?.DrawLayers(g, layers, DrawType.Mouse, DataModel, devRec, false, true); + ProfileModel?.DrawLayers(g, layers, DrawType.Mouse, DataModel, devRec, preview); } // Render headsets layer-by-layer using (var g = Graphics.FromImage(frame.HeadsetBitmap)) { - ProfileModel?.DrawLayers(g, layers, DrawType.Headset, DataModel, devRec, false, true); + ProfileModel?.DrawLayers(g, layers, DrawType.Headset, DataModel, devRec, preview); } // Render generic devices layer-by-layer using (var g = Graphics.FromImage(frame.GenericBitmap)) { - ProfileModel?.DrawLayers(g, layers, DrawType.Generic, DataModel, devRec, false, true); + ProfileModel?.DrawLayers(g, layers, DrawType.Generic, DataModel, devRec, preview); } // Render mousemats layer-by-layer using (var g = Graphics.FromImage(frame.MousematBitmap)) { - ProfileModel?.DrawLayers(g, layers, DrawType.Mousemat, DataModel, devRec, false, true); + ProfileModel?.DrawLayers(g, layers, DrawType.Mousemat, DataModel, devRec, preview); } // Trace debugging diff --git a/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs b/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs index 697b328f7..ee241e78a 100644 --- a/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs +++ b/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs @@ -13,22 +13,16 @@ namespace Artemis.Modules.Abstract { private readonly ModuleManager _moduleManager; private readonly MainManager _mainManager; + private readonly IKernel _kernel; private ModuleSettings _settings; public ModuleViewModel(MainManager mainManager, ModuleModel moduleModel, IKernel kernel) { _mainManager = mainManager; + _kernel = kernel; _moduleManager = mainManager.ModuleManager; ModuleModel = moduleModel; - Settings = moduleModel.Settings; - IParameter[] args = - { - new ConstructorArgument("mainManager", _mainManager), - new ConstructorArgument("moduleModel", ModuleModel), - new ConstructorArgument("lastProfile", Settings.LastProfile) - }; - ProfileEditor = kernel.Get(args); _mainManager.EnabledChanged += MainManagerOnEnabledChanged; _moduleManager.EffectChanged += ModuleManagerOnModuleChanged; @@ -125,13 +119,24 @@ namespace Artemis.Modules.Abstract protected override void OnActivate() { base.OnActivate(); - ProfileEditor.Activate(); + + if (!UsesProfileEditor) + return; + + IParameter[] args = + { + new ConstructorArgument("mainManager", _mainManager), + new ConstructorArgument("moduleModel", ModuleModel), + new ConstructorArgument("lastProfile", Settings.LastProfile) + }; + ProfileEditor = _kernel.Get(args); } protected override void OnDeactivate(bool close) { base.OnDeactivate(close); - ProfileEditor.Deactivate(); + ProfileEditor?.Dispose(); + ProfileEditor = null; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs b/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs index 6bf0b007b..b9354aa85 100644 --- a/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs +++ b/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs @@ -1,4 +1,5 @@ using Artemis.Modules.Abstract; +using Artemis.Modules.General.GeneralProfile; using MoonSharp.Interpreter; namespace Artemis.Modules.Games.Dota2 @@ -14,9 +15,7 @@ namespace Artemis.Modules.Games.Dota2 public Items items { get; set; } public Previously previously { get; set; } } - - - + [MoonSharpUserData] public class Provider { diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml index bde64be05..f34419489 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml @@ -29,7 +29,7 @@