1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Smoothed out profile preview activation

This commit is contained in:
SpoinkyNL 2016-05-12 00:27:35 +02:00
parent aafd361a6b
commit 0739885453
9 changed files with 106 additions and 89 deletions

View File

@ -298,6 +298,7 @@
<Compile Include="Managers\KeyboardManager.cs" />
<Compile Include="Managers\LoopManager.cs" />
<Compile Include="Managers\MainManager.cs" />
<Compile Include="Managers\ProfileManager.cs" />
<Compile Include="Models\EffectModel.cs" />
<Compile Include="Models\EffectSettings.cs" />
<Compile Include="Models\GameSettings.cs" />

View File

@ -10,6 +10,7 @@ namespace Artemis.InjectionModules
Bind<MainManager>().ToSelf().InSingletonScope();
Bind<KeyboardManager>().ToSelf().InSingletonScope();
Bind<EffectManager>().ToSelf().InSingletonScope();
Bind<ProfileManager>().ToSelf().InSingletonScope();
}
}
}

View File

@ -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<EffectModel>();
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<GameModel>().Where(g => g.Enabled); }
}
/// <summary>
/// Keeps track of profiles being previewed and sets up the active efffect accordingly
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// Loads the last active effect from settings and enables it.
/// </summary>

View File

@ -111,9 +111,10 @@ namespace Artemis.Managers
}
/// <summary>
/// Releases the active keyboard, if CanDisable is true
/// Releases the active keyboard
/// </summary>
public void ReleaseActiveKeyboard()
/// <param name="save">Whether to save the LastKeyboard (making it null)</param>
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);

View File

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

View File

@ -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<GameViewModel>();
var profilePreviewTimer = new Timer(500);
profilePreviewTimer.Elapsed += SetupProfilePreview;
profilePreviewTimer.Start();
}
public ProfilePreviewModel ProfilePreviewModel { get; set; }
public List<GameViewModel> GameViewModels { get; set; }
/// <summary>
/// Keeps track of profiles being previewed and sets up the active efffect accordingly
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
}
}
}

View File

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

View File

@ -119,7 +119,7 @@ namespace Artemis.ViewModels.Flyouts
MainManager.LoopManager.Start();
}
else
MainManager.KeyboardManager.ReleaseActiveKeyboard();
MainManager.KeyboardManager.ReleaseActiveKeyboard(true);
}
public void ToggleEnabled()

View File

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