diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj
index c87636a42..a12a530c9 100644
--- a/Artemis/Artemis/Artemis.csproj
+++ b/Artemis/Artemis/Artemis.csproj
@@ -298,6 +298,7 @@
+
diff --git a/Artemis/Artemis/InjectionModules/ManagerModules.cs b/Artemis/Artemis/InjectionModules/ManagerModules.cs
index f3d917790..3f409230f 100644
--- a/Artemis/Artemis/InjectionModules/ManagerModules.cs
+++ b/Artemis/Artemis/InjectionModules/ManagerModules.cs
@@ -10,6 +10,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/Managers/EffectManager.cs b/Artemis/Artemis/Managers/EffectManager.cs
index 654d11d92..88aa9c52e 100644
--- a/Artemis/Artemis/Managers/EffectManager.cs
+++ b/Artemis/Artemis/Managers/EffectManager.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Timers;
using Artemis.Events;
using Artemis.Models;
using Artemis.Modules.Effects.ProfilePreview;
@@ -20,9 +19,8 @@ namespace Artemis.Managers
private readonly KeyboardManager _keyboardManager;
private readonly ILogger _logger;
private EffectModel _activeEffect;
- private EffectModel _prePreviewEffect;
- public EffectManager(IEventAggregator events, ILogger logger, KeyboardManager keyboardManager)
+ public EffectManager(ILogger logger, IEventAggregator events, KeyboardManager keyboardManager)
{
_logger = logger;
_logger.Info("Intializing EffectManager");
@@ -32,10 +30,6 @@ namespace Artemis.Managers
EffectModels = new List();
- var profilePreviewTimer = new Timer(500);
- profilePreviewTimer.Elapsed += SetupProfilePreview;
- profilePreviewTimer.Start();
-
_logger.Info("Intialized EffectManager");
}
@@ -72,46 +66,6 @@ namespace Artemis.Managers
get { return EffectModels.OfType().Where(g => g.Enabled); }
}
- ///
- /// Keeps track of profiles being previewed and sets up the active efffect accordingly
- ///
- ///
- ///
- private void SetupProfilePreview(object sender, ElapsedEventArgs e)
- {
- if (_keyboardManager.ChangingKeyboard)
- return;
-
- // Make sure the preview model should still be active
- if (ActiveEffect is ProfilePreviewModel)
- {
- // Should not be active if no selected profile is set
- if (ProfilePreviewModel.SelectedProfile != null)
- return;
-
- if (_prePreviewEffect != null)
- {
- _logger.Debug("Change back effect after profile preview");
- ChangeEffect(_prePreviewEffect);
- }
- else
- {
- _logger.Debug("Clear effect after profile preview");
- ClearEffect(); // TODO: This fails to lock
- }
- }
- // Else make sure preview model indeed shouldn't be active
- else
- {
- if (ProfilePreviewModel?.SelectedProfile == null)
- return;
-
- _prePreviewEffect = ActiveEffect;
- _logger.Debug("Activate profile preview");
- ChangeEffect(ProfilePreviewModel);
- }
- }
-
///
/// Loads the last active effect from settings and enables it.
///
diff --git a/Artemis/Artemis/Managers/KeyboardManager.cs b/Artemis/Artemis/Managers/KeyboardManager.cs
index bceff508b..6ace41ecc 100644
--- a/Artemis/Artemis/Managers/KeyboardManager.cs
+++ b/Artemis/Artemis/Managers/KeyboardManager.cs
@@ -111,9 +111,10 @@ namespace Artemis.Managers
}
///
- /// Releases the active keyboard, if CanDisable is true
+ /// Releases the active keyboard
///
- public void ReleaseActiveKeyboard()
+ /// Whether to save the LastKeyboard (making it null)
+ public void ReleaseActiveKeyboard(bool save = false)
{
lock (this)
{
@@ -127,8 +128,11 @@ namespace Artemis.Managers
ActiveKeyboard.Disable();
ActiveKeyboard = null;
- General.Default.LastKeyboard = null;
- General.Default.Save();
+ if (save)
+ {
+ General.Default.LastKeyboard = null;
+ General.Default.Save();
+ }
_events.PublishOnUIThread(new ActiveKeyboardChanged(oldKeyboard, null));
_logger.Debug("Released keyboard: {0}", releaseName);
diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs
index dbbdf7b8c..256c347bd 100644
--- a/Artemis/Artemis/Managers/MainManager.cs
+++ b/Artemis/Artemis/Managers/MainManager.cs
@@ -27,12 +27,13 @@ namespace Artemis.Managers
private readonly ILogger _logger;
public MainManager(IEventAggregator events, ILogger logger, LoopManager loopManager,
- KeyboardManager keyboardManager, EffectManager effectManager)
+ KeyboardManager keyboardManager, EffectManager effectManager, ProfileManager profileManager)
{
_logger = logger;
LoopManager = loopManager;
KeyboardManager = keyboardManager;
EffectManager = effectManager;
+ ProfileManager = profileManager;
_logger.Info("Intializing MainManager");
@@ -68,13 +69,13 @@ namespace Artemis.Managers
public LoopManager LoopManager { get; }
public KeyboardManager KeyboardManager { get; set; }
public EffectManager EffectManager { get; set; }
+ public ProfileManager ProfileManager { get; set; }
public PipeServer PipeServer { get; set; }
public BackgroundWorker ProcessWorker { get; set; }
public KeyboardHook KeyboardHook { get; set; }
public GameStateWebServer GameStateWebServer { get; set; }
public bool ProgramEnabled { get; private set; }
- public bool Suspended { get; set; }
public bool Running { get; private set; }
public void Dispose()
diff --git a/Artemis/Artemis/Managers/ProfileManager.cs b/Artemis/Artemis/Managers/ProfileManager.cs
new file mode 100644
index 000000000..9191edec2
--- /dev/null
+++ b/Artemis/Artemis/Managers/ProfileManager.cs
@@ -0,0 +1,82 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Timers;
+using Artemis.Models;
+using Artemis.Modules.Effects.ProfilePreview;
+using Artemis.ViewModels.Abstract;
+using Ninject.Extensions.Logging;
+
+namespace Artemis.Managers
+{
+ public class ProfileManager
+ {
+ private readonly EffectManager _effectManager;
+ private readonly KeyboardManager _keyboardManager;
+ private readonly LoopManager _loopManager;
+ private readonly ILogger _logger;
+ private EffectModel _prePreviewEffect;
+
+ public ProfileManager(ILogger logger, EffectManager effectManager, KeyboardManager keyboardManager, LoopManager loopManager)
+ {
+ _logger = logger;
+ _effectManager = effectManager;
+ _keyboardManager = keyboardManager;
+ _loopManager = loopManager;
+
+ GameViewModels = new List();
+
+ var profilePreviewTimer = new Timer(500);
+ profilePreviewTimer.Elapsed += SetupProfilePreview;
+ profilePreviewTimer.Start();
+ }
+
+ public ProfilePreviewModel ProfilePreviewModel { get; set; }
+
+ public List GameViewModels { get; set; }
+
+ ///
+ /// Keeps track of profiles being previewed and sets up the active efffect accordingly
+ ///
+ ///
+ ///
+ private void SetupProfilePreview(object sender, ElapsedEventArgs e)
+ {
+ if (_keyboardManager.ChangingKeyboard || ProfilePreviewModel == null)
+ return;
+
+ var activePreview = GameViewModels.FirstOrDefault(vm => vm.IsActive);
+ if (activePreview == null)
+ {
+ // Should not be active if no selected profile is set
+ if (_effectManager.ActiveEffect != ProfilePreviewModel)
+ return;
+
+ if (_prePreviewEffect != null)
+ {
+ _logger.Debug("Change back effect after profile preview");
+ _effectManager.ChangeEffect(_prePreviewEffect);
+ }
+ else
+ {
+ _logger.Debug("Clear effect after profile preview");
+ _effectManager.ClearEffect();
+ }
+ }
+ else
+ {
+ if (_effectManager.ActiveEffect != ProfilePreviewModel)
+ {
+ _logger.Debug("Activate profile preview");
+ _prePreviewEffect = _effectManager.ActiveEffect;
+ _effectManager.ChangeEffect(ProfilePreviewModel);
+ }
+
+ // LoopManager might be running, this method won't do any harm in that case.
+ _loopManager.Start();
+
+ if (!ReferenceEquals(ProfilePreviewModel.SelectedProfile, activePreview.ProfileEditor.SelectedProfile))
+ ProfilePreviewModel.SelectedProfile = activePreview.ProfileEditor.SelectedProfile;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs b/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs
index 25e8c3516..4df9f243f 100644
--- a/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs
+++ b/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs
@@ -28,6 +28,7 @@ namespace Artemis.ViewModels.Abstract
ProfileEditor = PFactory.CreateProfileEditorViewModel(Events, mainManager, gameModel);
GameModel.Profile = ProfileEditor.SelectedProfile;
ProfileEditor.PropertyChanged += ProfileUpdater;
+ Events.Subscribe(this);
}
[Inject]
@@ -89,39 +90,7 @@ namespace Artemis.ViewModels.Abstract
SaveSettings();
}
-
- protected override void OnActivate()
- {
- base.OnActivate();
- Task.Factory.StartNew(HandleActivationSwitch);
- }
-
- protected override void OnDeactivate(bool close)
- {
- base.OnDeactivate(close);
- Task.Factory.StartNew(HandleActivationSwitch);
- }
-
- private void HandleActivationSwitch()
- {
- Thread.Sleep(600);
- if (IsActive)
- {
- if (!MainManager.LoopManager.Running)
- {
- Logger.Debug("Starting LoopManager for profile preview");
- MainManager.LoopManager.Start();
- }
- MainManager.EffectManager.ProfilePreviewModel = ProfilePreviewModel;
- ProfilePreviewModel.SelectedProfile = ProfileEditor.SelectedProfile;
- }
- else
- {
- MainManager.EffectManager.ProfilePreviewModel = ProfilePreviewModel;
- ProfilePreviewModel.SelectedProfile = null;
- }
- }
-
+
private void ProfileUpdater(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName != "SelectedProfile" && IsActive)
diff --git a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs
index ee4379427..c44dddb92 100644
--- a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs
+++ b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs
@@ -119,7 +119,7 @@ namespace Artemis.ViewModels.Flyouts
MainManager.LoopManager.Start();
}
else
- MainManager.KeyboardManager.ReleaseActiveKeyboard();
+ MainManager.KeyboardManager.ReleaseActiveKeyboard(true);
}
public void ToggleEnabled()
diff --git a/Artemis/Artemis/ViewModels/GamesViewModel.cs b/Artemis/Artemis/ViewModels/GamesViewModel.cs
index 6c787d40d..9ff8938cd 100644
--- a/Artemis/Artemis/ViewModels/GamesViewModel.cs
+++ b/Artemis/Artemis/ViewModels/GamesViewModel.cs
@@ -1,4 +1,6 @@
-using Artemis.ViewModels.Abstract;
+using Artemis.Managers;
+using Artemis.Modules.Effects.ProfilePreview;
+using Artemis.ViewModels.Abstract;
namespace Artemis.ViewModels
{
@@ -6,10 +8,13 @@ namespace Artemis.ViewModels
{
private readonly GameViewModel[] _gameViewModels;
- public GamesViewModel(GameViewModel[] gameViewModels)
+ public GamesViewModel(GameViewModel[] gameViewModels, ProfileManager profileManager, ProfilePreviewModel profilePreviewModel)
{
DisplayName = "Games";
_gameViewModels = gameViewModels;
+
+ profileManager.ProfilePreviewModel = profilePreviewModel;
+ profileManager.GameViewModels.AddRange(_gameViewModels);
}
protected override void OnActivate()