diff --git a/Artemis/Artemis/App.config b/Artemis/Artemis/App.config index 32bf9909e..5db3e623b 100644 --- a/Artemis/Artemis/App.config +++ b/Artemis/Artemis/App.config @@ -3,6 +3,7 @@ +
@@ -29,6 +30,17 @@ + + + True + + + Default + + + + + True diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index 322673b1b..747099bf6 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -165,6 +165,10 @@ ..\packages\DynamicExpresso.Core.1.3.1.0\lib\net40\DynamicExpresso.Core.dll True + + False + lib\Ets2SdkClient.dll + ..\packages\gong-wpf-dragdrop.0.1.4.3\lib\net40\GongSolutions.Wpf.DragDrop.dll True @@ -216,6 +220,10 @@ ..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll True + + ..\packages\Ninject.Extensions.Conventions.3.2.0.0\lib\net45-full\Ninject.Extensions.Conventions.dll + True + ..\packages\Ninject.Extensions.Factory.3.2.1.0\lib\net45-full\Ninject.Extensions.Factory.dll True @@ -324,12 +332,16 @@ - + + + - - + + + + @@ -352,6 +364,18 @@ + + True + True + EurotruckSimulator2.settings + + + + + + EurotruckSimulator2View.xaml + + True True @@ -497,7 +521,6 @@ - @@ -670,6 +693,10 @@ Code + + SettingsSingleFileGenerator + EurotruckSimulator2.Designer.cs + SettingsSingleFileGenerator UnrealTournament.Designer.cs @@ -734,6 +761,8 @@ + + PreserveNewest @@ -781,6 +810,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + Designer MSBuild:Compile diff --git a/Artemis/Artemis/ArtemisBootstrapper.cs b/Artemis/Artemis/ArtemisBootstrapper.cs index d49c0808d..5b0c4ac4a 100644 --- a/Artemis/Artemis/ArtemisBootstrapper.cs +++ b/Artemis/Artemis/ArtemisBootstrapper.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -12,7 +11,6 @@ using Artemis.ViewModels; using Caliburn.Micro; using Newtonsoft.Json; using Ninject; -using Ninject.Extensions.Logging; namespace Artemis { @@ -75,7 +73,9 @@ namespace Artemis protected override void Configure() { - _kernel = new StandardKernel(new BaseModules(), new ArtemisModules(), new ManagerModules()); + _kernel = new StandardKernel(new BaseModules(), new ManagerModules(), new DeviceModules(), + new EffectModules(), new ProfileModules()); + _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); diff --git a/Artemis/Artemis/Events/ActiveEffectChanged.cs b/Artemis/Artemis/Events/ActiveEffectChanged.cs deleted file mode 100644 index fc35c1723..000000000 --- a/Artemis/Artemis/Events/ActiveEffectChanged.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Artemis.Events -{ - public class ActiveEffectChanged - { - public ActiveEffectChanged(string activeEffect) - { - ActiveEffect = activeEffect; - } - - public string ActiveEffect { get; set; } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/Events/ActiveKeyboardChanged.cs b/Artemis/Artemis/Events/ActiveKeyboardChanged.cs deleted file mode 100644 index 1557e2a99..000000000 --- a/Artemis/Artemis/Events/ActiveKeyboardChanged.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Artemis.DeviceProviders; - -namespace Artemis.Events -{ - public class ActiveKeyboardChanged - { - public ActiveKeyboardChanged(KeyboardProvider oldKeyboard, KeyboardProvider newKeyboard) - { - OldKeyboard = oldKeyboard; - NewKeyboard = newKeyboard; - } - - public KeyboardProvider OldKeyboard { get; set; } - public KeyboardProvider NewKeyboard { get; set; } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/Events/EffectChangedEventArgs.cs b/Artemis/Artemis/Events/EffectChangedEventArgs.cs new file mode 100644 index 000000000..9e9d4c9a9 --- /dev/null +++ b/Artemis/Artemis/Events/EffectChangedEventArgs.cs @@ -0,0 +1,15 @@ +using System; +using Artemis.Models; + +namespace Artemis.Events +{ + public class EffectChangedEventArgs : EventArgs + { + public EffectChangedEventArgs(EffectModel effect) + { + Effect = effect; + } + + public EffectModel Effect { get; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Events/EnabledChangedEventArgs.cs b/Artemis/Artemis/Events/EnabledChangedEventArgs.cs new file mode 100644 index 000000000..9782ed634 --- /dev/null +++ b/Artemis/Artemis/Events/EnabledChangedEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace Artemis.Events +{ + public class EnabledChangedEventArgs : EventArgs + { + public EnabledChangedEventArgs(bool enabled) + { + Enabled = enabled; + } + + public bool Enabled { get; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Events/KeyboardChangedEventArgs.cs b/Artemis/Artemis/Events/KeyboardChangedEventArgs.cs new file mode 100644 index 000000000..74b5b42a3 --- /dev/null +++ b/Artemis/Artemis/Events/KeyboardChangedEventArgs.cs @@ -0,0 +1,17 @@ +using System; +using Artemis.DeviceProviders; + +namespace Artemis.Events +{ + public class KeyboardChangedEventArgs : EventArgs + { + public KeyboardChangedEventArgs(KeyboardProvider oldKeyboard, KeyboardProvider newKeyboard) + { + OldKeyboard = oldKeyboard; + NewKeyboard = newKeyboard; + } + + public KeyboardProvider OldKeyboard { get; } + public KeyboardProvider NewKeyboard { get; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Events/RazerColorsChangedEventArgs.cs b/Artemis/Artemis/Events/RazerColorsChangedEventArgs.cs new file mode 100644 index 000000000..6005083a8 --- /dev/null +++ b/Artemis/Artemis/Events/RazerColorsChangedEventArgs.cs @@ -0,0 +1,15 @@ +using System; +using System.Windows.Media; + +namespace Artemis.Events +{ + public class RazerColorsChangedEventArgs : EventArgs + { + public RazerColorsChangedEventArgs(Color[,] colors) + { + Colors = colors; + } + + public Color[,] Colors { get; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Events/ToggleEnabled.cs b/Artemis/Artemis/Events/ToggleEnabled.cs deleted file mode 100644 index 8f30aa40e..000000000 --- a/Artemis/Artemis/Events/ToggleEnabled.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Artemis.Events -{ - public class ToggleEnabled - { - public ToggleEnabled(bool enabled) - { - Enabled = enabled; - } - - public bool Enabled { get; set; } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/InjectionFactories/IProfileEditorVmFactory.cs b/Artemis/Artemis/InjectionFactories/IProfileEditorVmFactory.cs index 85fac1570..ef596f950 100644 --- a/Artemis/Artemis/InjectionFactories/IProfileEditorVmFactory.cs +++ b/Artemis/Artemis/InjectionFactories/IProfileEditorVmFactory.cs @@ -1,13 +1,11 @@ using Artemis.Managers; using Artemis.Models; using Artemis.ViewModels.Profiles; -using Caliburn.Micro; namespace Artemis.InjectionFactories { public interface IProfileEditorVmFactory { - ProfileEditorViewModel CreateProfileEditorVm(IEventAggregator events, MainManager mainManager, - EffectModel gameModel, string lastProfile); + ProfileEditorViewModel CreateProfileEditorVm(MainManager mainManager, EffectModel gameModel, string lastProfile); } } \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/ArtemisModules.cs b/Artemis/Artemis/InjectionModules/ArtemisModules.cs deleted file mode 100644 index a8c38414c..000000000 --- a/Artemis/Artemis/InjectionModules/ArtemisModules.cs +++ /dev/null @@ -1,105 +0,0 @@ -using Artemis.DeviceProviders; -using Artemis.DeviceProviders.Corsair; -using Artemis.DeviceProviders.Logitech; -using Artemis.DeviceProviders.Razer; -using Artemis.Modules.Effects.AudioVisualizer; -using Artemis.Modules.Effects.Bubbles; -using Artemis.Modules.Effects.WindowsProfile; -using Artemis.Modules.Games.CounterStrike; -using Artemis.Modules.Games.Dota2; -using Artemis.Modules.Games.Overwatch; -using Artemis.Modules.Games.RocketLeague; -using Artemis.Modules.Games.TheDivision; -using Artemis.Modules.Games.UnrealTournament; -using Artemis.Modules.Games.Witcher3; -using Artemis.Modules.Overlays.VolumeDisplay; -using Artemis.Profiles.Layers.Animations; -using Artemis.Profiles.Layers.Conditions; -using Artemis.Profiles.Layers.Interfaces; -using Artemis.Profiles.Layers.Types.Audio; -using Artemis.Profiles.Layers.Types.Folder; -using Artemis.Profiles.Layers.Types.Generic; -using Artemis.Profiles.Layers.Types.Headset; -using Artemis.Profiles.Layers.Types.Keyboard; -using Artemis.Profiles.Layers.Types.KeyboardGif; -using Artemis.Profiles.Layers.Types.KeyPress; -using Artemis.Profiles.Layers.Types.Mouse; -using Artemis.ViewModels.Abstract; -using Ninject.Modules; - -namespace Artemis.InjectionModules -{ - public class ArtemisModules : NinjectModule - { - public override void Load() - { - #region Modules - - // Effects - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - - // Games - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - - // Overlays - Bind().To().InSingletonScope(); - - #endregion - - #region Devices - - // Keyboards - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - Bind().To().InSingletonScope(); - // Mice - Bind().To().InSingletonScope(); - // Headsets - Bind().To().InSingletonScope(); - // Other - Bind().To().InSingletonScope(); - - #endregion - - #region Layers - - // Animations - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - - // Conditions - Bind().To(); - Bind().To(); - - // Types - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - Bind().To(); - - // Bind some Layer Types to self as well in order to allow JSON.NET injection - Bind().ToSelf(); - Bind().ToSelf(); - - #endregion - } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/DeviceModules.cs b/Artemis/Artemis/InjectionModules/DeviceModules.cs new file mode 100644 index 000000000..32e101b64 --- /dev/null +++ b/Artemis/Artemis/InjectionModules/DeviceModules.cs @@ -0,0 +1,29 @@ +using Artemis.DeviceProviders; +using Artemis.DeviceProviders.Corsair; +using Artemis.DeviceProviders.Logitech; +using Artemis.DeviceProviders.Razer; +using Ninject.Modules; + +namespace Artemis.InjectionModules +{ + public class DeviceModules : NinjectModule + { + public override void Load() + { + // Keyboards + Bind().To().InSingletonScope(); + Bind().To().InSingletonScope(); + Bind().To().InSingletonScope(); + Bind().To().InSingletonScope(); + + // Mice + Bind().To().InSingletonScope(); + + // Headsets + Bind().To().InSingletonScope(); + + // Other + Bind().To().InSingletonScope(); + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/EffectModules.cs b/Artemis/Artemis/InjectionModules/EffectModules.cs new file mode 100644 index 000000000..91022f09a --- /dev/null +++ b/Artemis/Artemis/InjectionModules/EffectModules.cs @@ -0,0 +1,70 @@ +using Artemis.Models; +using Artemis.ViewModels.Abstract; +using Ninject.Extensions.Conventions; +using Ninject.Modules; + +namespace Artemis.InjectionModules +{ + public class EffectModules : NinjectModule + { + public override void Load() + { + // Effects + Kernel.Bind(x => + { + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase() + .Configure(b => b.InSingletonScope()); + }); + + Kernel.Bind(x => + { + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase() + .Configure(b => b.InSingletonScope()); + }); + + // Games + Kernel.Bind(x => + { + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase() + .Configure(b => b.InSingletonScope()); + }); + + Kernel.Bind(x => + { + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase() + .Configure(b => b.InSingletonScope()); + }); + + // Overlays + Kernel.Bind(x => + { + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase() + .Configure(b => b.InSingletonScope()); + }); + + Kernel.Bind(x => + { + x.FromThisAssembly() + .SelectAllClasses() + .InheritedFrom() + .BindBase() + .Configure(b => b.InSingletonScope()); + }); + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/InjectionModules/ProfileModules.cs b/Artemis/Artemis/InjectionModules/ProfileModules.cs new file mode 100644 index 000000000..e5e99ee50 --- /dev/null +++ b/Artemis/Artemis/InjectionModules/ProfileModules.cs @@ -0,0 +1,48 @@ +using Artemis.Profiles.Layers.Animations; +using Artemis.Profiles.Layers.Conditions; +using Artemis.Profiles.Layers.Interfaces; +using Artemis.Profiles.Layers.Types.Audio; +using Artemis.Profiles.Layers.Types.Folder; +using Artemis.Profiles.Layers.Types.Generic; +using Artemis.Profiles.Layers.Types.Headset; +using Artemis.Profiles.Layers.Types.Keyboard; +using Artemis.Profiles.Layers.Types.KeyboardGif; +using Artemis.Profiles.Layers.Types.KeyPress; +using Artemis.Profiles.Layers.Types.Mouse; +using Ninject.Modules; + +namespace Artemis.InjectionModules +{ + public class ProfileModules : NinjectModule + { + public override void Load() + { + // Animations + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + + // Conditions + Bind().To(); + Bind().To(); + + // Types + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + Bind().To(); + + // Bind some Layer Types to self as well in order to allow JSON.NET injection + Bind().ToSelf(); + Bind().ToSelf(); + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Managers/DeviceManager.cs b/Artemis/Artemis/Managers/DeviceManager.cs index ad18d36ea..8213e54d6 100644 --- a/Artemis/Artemis/Managers/DeviceManager.cs +++ b/Artemis/Artemis/Managers/DeviceManager.cs @@ -18,13 +18,12 @@ namespace Artemis.Managers /// public class DeviceManager { - private readonly IEventAggregator _events; private readonly ILogger _logger; + public event EventHandler OnKeyboardChangedEvent; - public DeviceManager(IEventAggregator events, ILogger logger, List deviceProviders) + public DeviceManager(ILogger logger, List deviceProviders) { _logger = logger; - _events = events; KeyboardProviders = deviceProviders.Where(d => d.Type == DeviceType.Keyboard) .Cast().ToList(); @@ -119,7 +118,7 @@ namespace Artemis.Managers General.Default.LastKeyboard = ActiveKeyboard.Name; General.Default.Save(); - await _events.PublishOnUIThreadAsync(new ActiveKeyboardChanged(oldKeyboard, ActiveKeyboard)); + RaiseKeyboardChangedEvent(new KeyboardChangedEventArgs(oldKeyboard, ActiveKeyboard)); _logger.Debug("Enabled keyboard: {0}", keyboardProvider.Name); if (dialog != null) @@ -162,9 +161,17 @@ namespace Artemis.Managers General.Default.Save(); } - _events.PublishOnUIThread(new ActiveKeyboardChanged(oldKeyboard, null)); + RaiseKeyboardChangedEvent(new KeyboardChangedEventArgs(oldKeyboard, null)); _logger.Debug("Released keyboard: {0}", releaseName); } } + + protected virtual void RaiseKeyboardChangedEvent(KeyboardChangedEventArgs e) + { + // I do this in all to avoid a possible race condition + // https://msdn.microsoft.com/en-us/library/w369ty8x.aspx + var handler = OnKeyboardChangedEvent; + handler?.Invoke(this, e); + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Managers/EffectManager.cs b/Artemis/Artemis/Managers/EffectManager.cs index b14b46bab..5d908d7b1 100644 --- a/Artemis/Artemis/Managers/EffectManager.cs +++ b/Artemis/Artemis/Managers/EffectManager.cs @@ -5,7 +5,6 @@ using Artemis.Events; using Artemis.Models; using Artemis.Modules.Effects.ProfilePreview; using Artemis.Settings; -using Caliburn.Micro; using Ninject.Extensions.Logging; namespace Artemis.Managers @@ -16,18 +15,18 @@ namespace Artemis.Managers public class EffectManager { private readonly DeviceManager _deviceManager; - private readonly IEventAggregator _events; private readonly ILogger _logger; private EffectModel _activeEffect; + private LoopManager _waitLoopManager; + private EffectModel _waitEffect; - public EffectManager(ILogger logger, IEventAggregator events, DeviceManager deviceManager) + public EffectManager(ILogger logger, DeviceManager deviceManager) { - _logger = logger; - _events = events; - _deviceManager = deviceManager; - EffectModels = new List(); + _logger = logger; + _deviceManager = deviceManager; + _logger.Info("Intialized EffectManager"); } @@ -44,7 +43,7 @@ namespace Artemis.Managers private set { _activeEffect = value; - _events.PublishOnUIThread(new ActiveEffectChanged(value?.Name)); + RaiseEffectChangedEvent(new EffectChangedEventArgs(value)); } } @@ -64,6 +63,8 @@ namespace Artemis.Managers get { return EffectModels.OfType().Where(g => g.Enabled); } } + public event EventHandler OnEffectChangedEvent; + /// /// Loads the last active effect from settings and enables it. /// @@ -83,17 +84,24 @@ namespace Artemis.Managers /// Optionally pass the LoopManager to automatically start it, if it's not running. public void ChangeEffect(EffectModel effectModel, LoopManager loopManager = null) { + if (_waitEffect != null) + { + _logger.Debug("Stopping effect because a change is already queued"); + return; + } + if (effectModel == null) throw new ArgumentNullException(nameof(effectModel)); if (effectModel is OverlayModel) throw new ArgumentException("Can't set an Overlay effect as the active effect"); - if (_deviceManager.ActiveKeyboard == null) - _deviceManager.EnableLastKeyboard(); - // If still null, no last keyboard, so stop. if (_deviceManager.ActiveKeyboard == null) { - _logger.Debug("Cancelling effect change, no LastKeyboard"); + _logger.Debug("Stopping effect change until keyboard is enabled"); + _waitEffect = effectModel; + _waitLoopManager = loopManager; + _deviceManager.OnKeyboardChangedEvent += DeviceManagerOnOnKeyboardChangedEvent; + _deviceManager.EnableLastKeyboard(); return; } @@ -145,6 +153,19 @@ namespace Artemis.Managers General.Default.Save(); } + private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs e) + { + _deviceManager.OnKeyboardChangedEvent -= DeviceManagerOnOnKeyboardChangedEvent; + _logger.Debug("Resuming effect change"); + + var effect = _waitEffect; + _waitEffect = null; + var loopManager = _waitLoopManager; + _waitLoopManager = null; + + ChangeEffect(effect, loopManager); + } + /// /// Clears the current effect @@ -192,5 +213,11 @@ namespace Artemis.Managers DisableGame(ActiveEffect); } + + protected virtual void RaiseEffectChangedEvent(EffectChangedEventArgs e) + { + var handler = OnEffectChangedEvent; + handler?.Invoke(this, e); + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index f5ba8c957..b4c3e40a3 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -21,10 +21,8 @@ namespace Artemis.Managers private readonly ILogger _logger; private readonly Timer _loopTimer; - public LoopManager(IEventAggregator events, ILogger logger, EffectManager effectManager, - DeviceManager deviceManager) + public LoopManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager) { - events.Subscribe(this); _logger = logger; _effectManager = effectManager; _deviceManager = deviceManager; diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs index ffbf5b547..97276aa76 100644 --- a/Artemis/Artemis/Managers/MainManager.cs +++ b/Artemis/Artemis/Managers/MainManager.cs @@ -6,15 +6,12 @@ using System.Threading.Tasks; using System.Timers; using Artemis.Events; using Artemis.Models; -using Artemis.Settings; using Artemis.Utilities; using Artemis.Utilities.DataReaders; using Artemis.Utilities.GameState; using Artemis.ViewModels; -using Caliburn.Micro; using Ninject; using Ninject.Extensions.Logging; -using Squirrel; namespace Artemis.Managers { @@ -23,16 +20,11 @@ namespace Artemis.Managers /// public class MainManager : IDisposable { - public delegate void PauseCallbackHandler(); - - private readonly IEventAggregator _events; private readonly Timer _processTimer; - public MainManager(IEventAggregator events, ILogger logger, LoopManager loopManager, DeviceManager deviceManager, + public MainManager(ILogger logger, LoopManager loopManager, DeviceManager deviceManager, EffectManager effectManager, ProfileManager profileManager, PipeServer pipeServer) { - _events = events; - Logger = logger; LoopManager = loopManager; DeviceManager = deviceManager; @@ -88,6 +80,8 @@ namespace Artemis.Managers PipeServer?.Stop(); } + public event EventHandler OnEnabledChangedEvent; + /// /// Loads the last active effect and starts the program /// @@ -96,7 +90,7 @@ namespace Artemis.Managers Logger.Debug("Enabling program"); ProgramEnabled = true; LoopManager.StartAsync(); - _events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled)); + RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled)); } /// @@ -107,7 +101,7 @@ namespace Artemis.Managers Logger.Debug("Disabling program"); LoopManager.Stop(); ProgramEnabled = false; - _events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled)); + RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled)); } /// @@ -148,5 +142,11 @@ namespace Artemis.Managers Logger.Info("Detected and enabling game: {0}", newGame.Name); EffectManager.ChangeEffect(newGame, LoopManager); } + + protected virtual void RaiseEnabledChangedEvent(EnabledChangedEventArgs e) + { + var handler = OnEnabledChangedEvent; + handler?.Invoke(this, e); + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index 3765b85c9..e24db72dc 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -18,14 +18,18 @@ namespace Artemis.Models protected DateTime LastTrace; - protected EffectModel(MainManager mainManager, IDataModel dataModel) + protected EffectModel(MainManager mainManager, EffectSettings settings, IDataModel dataModel) { MainManager = mainManager; + Settings = settings; DataModel = dataModel; + + MainManager.EffectManager.EffectModels.Add(this); } public bool Initialized { get; set; } public MainManager MainManager { get; set; } + public EffectSettings Settings { get; set; } public string Name { get; set; } public int KeyboardScale { get; set; } = 4; diff --git a/Artemis/Artemis/Models/GameModel.cs b/Artemis/Artemis/Models/GameModel.cs index a37558bfe..c5d6ad198 100644 --- a/Artemis/Artemis/Models/GameModel.cs +++ b/Artemis/Artemis/Models/GameModel.cs @@ -5,13 +5,13 @@ namespace Artemis.Models { public abstract class GameModel : EffectModel { - protected GameModel(MainManager mainManager, GameSettings settings, IDataModel dataModel) - : base(mainManager, dataModel) + protected GameModel(MainManager mainManager, GameSettings settings, IDataModel dataModel): base(mainManager, settings, dataModel) { + // Override settings to the GameSettings type Settings = settings; } - public GameSettings Settings { get; set; } + public new GameSettings Settings { get; set; } public bool Enabled { get; set; } public string ProcessName { get; set; } } diff --git a/Artemis/Artemis/Models/OverlayModel.cs b/Artemis/Artemis/Models/OverlayModel.cs index 9657577bb..631b20dfe 100644 --- a/Artemis/Artemis/Models/OverlayModel.cs +++ b/Artemis/Artemis/Models/OverlayModel.cs @@ -7,8 +7,10 @@ namespace Artemis.Models private bool _enabled; public string ProcessName; - protected OverlayModel(MainManager mainManager) : base(mainManager, null) + protected OverlayModel(MainManager mainManager, OverlaySettings settings) : base(mainManager, settings, null) { + Settings = settings; + Enabled = settings.Enabled; } public bool Enabled @@ -27,6 +29,7 @@ namespace Artemis.Models } } + public new OverlaySettings Settings { get; set; } public abstract void RenderOverlay(RenderFrame frame, bool keyboardOnly); } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs b/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs index 9e2dacc18..fa3496fef 100644 --- a/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs +++ b/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs @@ -23,18 +23,18 @@ namespace Artemis.Modules.Effects.AudioVisualizer private int _sensitivity; private IWaveIn _waveIn; - public AudioVisualizerModel(MainManager mainManager, AudioVisualizerSettings settings) : base(mainManager, null) + public AudioVisualizerModel(MainManager mainManager) : base(mainManager, new AudioVisualizerSettings(), null) { - Settings = settings; Name = "Audiovisualizer"; DeviceIds = new List(); SpectrumData = new List(); Initialized = false; + Settings = (AudioVisualizerSettings) base.Settings; } public int Lines { get; set; } - public AudioVisualizerSettings Settings { get; set; } + public new AudioVisualizerSettings Settings { get; set; } public List SpectrumData { get; set; } public List SoundRectangles { get; set; } @@ -126,7 +126,8 @@ namespace Artemis.Modules.Effects.AudioVisualizer if (keyboardHeight > SoundRectangles[i].Height) SoundRectangles[i].Height = keyboardHeight; else - SoundRectangles[i].Height = SoundRectangles[i].Height - Settings.FadeSpeed; + SoundRectangles[i].Height = SoundRectangles[i].Height - + Settings.FadeSpeed; // Apply Bars setting SoundRectangles[i].X = i*KeyboardScale; SoundRectangles[i].Width = KeyboardScale; diff --git a/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerViewModel.cs b/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerViewModel.cs index 6183d80a9..92614ef8d 100644 --- a/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerViewModel.cs +++ b/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerViewModel.cs @@ -1,25 +1,13 @@ -using Artemis.Events; -using Artemis.Managers; +using Artemis.Managers; using Artemis.ViewModels.Abstract; -using Caliburn.Micro; namespace Artemis.Modules.Effects.AudioVisualizer { - public sealed class AudioVisualizerViewModel : EffectViewModel, IHandle + public sealed class AudioVisualizerViewModel : EffectViewModel { - public AudioVisualizerViewModel(MainManager main, IEventAggregator events) - : base(main, new AudioVisualizerModel(main, new AudioVisualizerSettings())) + public AudioVisualizerViewModel(MainManager main, AudioVisualizerModel model) : base(main, model) { DisplayName = "Audio Visualization"; - events.Subscribe(this); - - MainManager.EffectManager.EffectModels.Add(EffectModel); - EffectSettings = ((AudioVisualizerModel) EffectModel).Settings; - } - - public void Handle(ActiveEffectChanged message) - { - NotifyOfPropertyChange(() => EffectEnabled); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs b/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs index 45c2fe0b0..56367d9b4 100644 --- a/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs +++ b/Artemis/Artemis/Modules/Effects/Bubbles/BubblesModel.cs @@ -14,12 +14,11 @@ namespace Artemis.Modules.Effects.Bubbles { #region Constructors - public BubblesModel(MainManager mainManager, BubblesSettings settings) - : base(mainManager, null) + public BubblesModel(MainManager mainManager) : base(mainManager, new BubblesSettings(), null) { Name = "Bubbles"; - Settings = settings; Initialized = false; + Settings = (BubblesSettings) base.Settings; } #endregion @@ -30,7 +29,7 @@ namespace Artemis.Modules.Effects.Bubbles private readonly List _bubbles = new List(); - public BubblesSettings Settings { get; } + public new BubblesSettings Settings { get; } #endregion diff --git a/Artemis/Artemis/Modules/Effects/Bubbles/BubblesViewModel.cs b/Artemis/Artemis/Modules/Effects/Bubbles/BubblesViewModel.cs index 9c2803a0e..378b26873 100644 --- a/Artemis/Artemis/Modules/Effects/Bubbles/BubblesViewModel.cs +++ b/Artemis/Artemis/Modules/Effects/Bubbles/BubblesViewModel.cs @@ -1,25 +1,13 @@ -using Artemis.Events; -using Artemis.Managers; +using Artemis.Managers; using Artemis.ViewModels.Abstract; -using Caliburn.Micro; namespace Artemis.Modules.Effects.Bubbles { - public class BubblesViewModel : EffectViewModel, IHandle + public sealed class BubblesViewModel : EffectViewModel { - public BubblesViewModel(MainManager main, IEventAggregator events) - : base(main, new BubblesModel(main, new BubblesSettings())) + public BubblesViewModel(MainManager main, BubblesModel model) : base(main, model) { DisplayName = "Bubbles"; - events.Subscribe(this); - - MainManager.EffectManager.EffectModels.Add(EffectModel); - EffectSettings = ((BubblesModel) EffectModel).Settings; - } - - public void Handle(ActiveEffectChanged message) - { - NotifyOfPropertyChange(() => EffectEnabled); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs index 513a9619d..d2d05ce38 100644 --- a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs +++ b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs @@ -14,7 +14,7 @@ namespace Artemis.Modules.Effects.ProfilePreview { public class ProfilePreviewModel : EffectModel { - public ProfilePreviewModel(MainManager mainManager) : base(mainManager, new ProfilePreviewDataModel()) + public ProfilePreviewModel(MainManager mainManager) : base(mainManager, null, new ProfilePreviewDataModel()) { Name = "Profile Preview"; } diff --git a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs index ce5b05eba..85b774605 100644 --- a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs +++ b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs @@ -69,16 +69,13 @@ namespace Artemis.Modules.Effects.WindowsProfile private SpotifyLocalAPI _spotify; private bool _spotifySetupBusy; - public WindowsProfileModel(ILogger logger, MainManager mainManager, WindowsProfileSettings settings) - : base(mainManager, new WindowsProfileDataModel()) + public WindowsProfileModel(ILogger logger, MainManager mainManager) + : base(mainManager, new WindowsProfileSettings(), new WindowsProfileDataModel()) { _logger = logger; Name = "WindowsProfile"; - Settings = settings; } - public WindowsProfileSettings Settings { get; set; } - public override void Dispose() { Initialized = false; diff --git a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs index 3bf68a2ce..0299cc0ee 100644 --- a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs +++ b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileViewModel.cs @@ -1,31 +1,25 @@ using System.ComponentModel; -using Artemis.Events; using Artemis.InjectionFactories; using Artemis.Managers; using Artemis.Modules.Effects.ProfilePreview; using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Profiles; -using Caliburn.Micro; -using Ninject.Extensions.Logging; namespace Artemis.Modules.Effects.WindowsProfile { // TODO: This effect is a hybrid between a regular effect and a game, may want to clean this up - public sealed class WindowsProfileViewModel : EffectViewModel, IHandle + public sealed class WindowsProfileViewModel : EffectViewModel { - public WindowsProfileViewModel(ILogger logger, MainManager main, IEventAggregator events, - IProfileEditorVmFactory pFactory, ProfilePreviewModel profilePreviewModel) - : base(main, new WindowsProfileModel(logger, main, new WindowsProfileSettings())) + public WindowsProfileViewModel(MainManager main, IProfileEditorVmFactory pFactory, + ProfilePreviewModel profilePreviewModel, WindowsProfileModel model) : base(main, model) { DisplayName = "Windows Profile"; PFactory = pFactory; ProfilePreviewModel = profilePreviewModel; EffectSettings = ((WindowsProfileModel) EffectModel).Settings; - ProfileEditor = PFactory.CreateProfileEditorVm(events, main, (WindowsProfileModel) EffectModel, + ProfileEditor = PFactory.CreateProfileEditorVm(main, (WindowsProfileModel) EffectModel, ((WindowsProfileSettings) EffectSettings).LastProfile); ProfilePreviewModel.Profile = ProfileEditor.SelectedProfile; - - events.Subscribe(this); ProfileEditor.PropertyChanged += ProfileUpdater; MainManager.EffectManager.EffectModels.Add(EffectModel); } @@ -35,11 +29,6 @@ namespace Artemis.Modules.Effects.WindowsProfile public IProfileEditorVmFactory PFactory { get; set; } public ProfilePreviewModel ProfilePreviewModel { get; set; } - public void Handle(ActiveEffectChanged message) - { - NotifyOfPropertyChange(() => EffectEnabled); - } - private void ProfileUpdater(object sender, PropertyChangedEventArgs e) { if (e.PropertyName != "SelectedProfile" && IsActive) diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs index 8d34cba15..339b88479 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs @@ -11,8 +11,7 @@ namespace Artemis.Modules.Games.CounterStrike { public class CounterStrikeModel : GameModel { - public CounterStrikeModel(MainManager mainManager, CounterStrikeSettings settings) - : base(mainManager, settings, new CounterStrikeDataModel()) + public CounterStrikeModel(MainManager mainManager): base(mainManager, new CounterStrikeSettings(), new CounterStrikeDataModel()) { Name = "CounterStrike"; ProcessName = "csgo"; diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml index 0a8459b29..8cc599305 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml @@ -40,7 +40,7 @@ Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,1,0"> -