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 @@
-
-
+ Margin="0,8" TextWrapping="Wrap" HorizontalAlignment="Left"
+ Foreground="{DynamicResource HighlightBrush}" />
+