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()