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

Added addition DI to modules

Added Eurotruck Simulator 2 module
This commit is contained in:
SpoinkyNL 2016-08-19 13:06:47 +02:00
parent b0d33b29f2
commit 21dbbe4eef
75 changed files with 898 additions and 485 deletions

View File

@ -3,6 +3,7 @@
<configuration> <configuration>
<configSections> <configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Artemis.Modules.Games.EurotruckSimulator2.EurotruckSimulator2" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="Artemis.Modules.Games.UnrealTournament.UnrealTournament" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> <section name="Artemis.Modules.Games.UnrealTournament.UnrealTournament" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="Artemis.Modules.Games.WoW.WoW" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> <section name="Artemis.Modules.Games.WoW.WoW" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="Artemis.Modules.Effects.Bubbles.Bubbles" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> <section name="Artemis.Modules.Effects.Bubbles.Bubbles" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
@ -29,6 +30,17 @@
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup> </startup>
<userSettings> <userSettings>
<Artemis.Modules.Games.EurotruckSimulator2.EurotruckSimulator2>
<setting name="Enabled" serializeAs="String">
<value>True</value>
</setting>
<setting name="LastProfile" serializeAs="String">
<value>Default</value>
</setting>
<setting name="GameDirectory" serializeAs="String">
<value />
</setting>
</Artemis.Modules.Games.EurotruckSimulator2.EurotruckSimulator2>
<Artemis.Modules.Games.UnrealTournament.UnrealTournament> <Artemis.Modules.Games.UnrealTournament.UnrealTournament>
<setting name="Enabled" serializeAs="String"> <setting name="Enabled" serializeAs="String">
<value>True</value> <value>True</value>

View File

@ -165,6 +165,10 @@
<HintPath>..\packages\DynamicExpresso.Core.1.3.1.0\lib\net40\DynamicExpresso.Core.dll</HintPath> <HintPath>..\packages\DynamicExpresso.Core.1.3.1.0\lib\net40\DynamicExpresso.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Ets2SdkClient, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>lib\Ets2SdkClient.dll</HintPath>
</Reference>
<Reference Include="GongSolutions.Wpf.DragDrop, Version=0.1.4.3, Culture=neutral, PublicKeyToken=d19974ea350ccea1, processorArchitecture=MSIL"> <Reference Include="GongSolutions.Wpf.DragDrop, Version=0.1.4.3, Culture=neutral, PublicKeyToken=d19974ea350ccea1, processorArchitecture=MSIL">
<HintPath>..\packages\gong-wpf-dragdrop.0.1.4.3\lib\net40\GongSolutions.Wpf.DragDrop.dll</HintPath> <HintPath>..\packages\gong-wpf-dragdrop.0.1.4.3\lib\net40\GongSolutions.Wpf.DragDrop.dll</HintPath>
<Private>True</Private> <Private>True</Private>
@ -216,6 +220,10 @@
<HintPath>..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll</HintPath> <HintPath>..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Ninject.Extensions.Conventions, Version=3.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.Extensions.Conventions.3.2.0.0\lib\net45-full\Ninject.Extensions.Conventions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Ninject.Extensions.Factory, Version=3.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL"> <Reference Include="Ninject.Extensions.Factory, Version=3.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.Extensions.Factory.3.2.1.0\lib\net45-full\Ninject.Extensions.Factory.dll</HintPath> <HintPath>..\packages\Ninject.Extensions.Factory.3.2.1.0\lib\net45-full\Ninject.Extensions.Factory.dll</HintPath>
<Private>True</Private> <Private>True</Private>
@ -324,12 +332,16 @@
<Compile Include="DeviceProviders\Logitech\G810.cs" /> <Compile Include="DeviceProviders\Logitech\G810.cs" />
<Compile Include="DeviceProviders\Logitech\LogitechGeneric.cs" /> <Compile Include="DeviceProviders\Logitech\LogitechGeneric.cs" />
<Compile Include="DeviceProviders\Logitech\LogitechKeyboard.cs" /> <Compile Include="DeviceProviders\Logitech\LogitechKeyboard.cs" />
<Compile Include="Events\ActiveKeyboardChanged.cs" /> <Compile Include="Events\EffectChangedEventArgs.cs" />
<Compile Include="Events\EnabledChangedEventArgs.cs" />
<Compile Include="Events\KeyboardChangedEventArgs.cs" />
<Compile Include="Events\RazerColorArrayChanged.cs" /> <Compile Include="Events\RazerColorArrayChanged.cs" />
<Compile Include="Events\ToggleEnabled.cs" /> <Compile Include="Events\RazerColorsChangedEventArgs.cs" />
<Compile Include="Events\ActiveEffectChanged.cs" />
<Compile Include="InjectionFactories\ILayerEditorVmFactory.cs" /> <Compile Include="InjectionFactories\ILayerEditorVmFactory.cs" />
<Compile Include="InjectionFactories\IProfileEditorVmFactory.cs" /> <Compile Include="InjectionFactories\IProfileEditorVmFactory.cs" />
<Compile Include="InjectionModules\DeviceModules.cs" />
<Compile Include="InjectionModules\EffectModules.cs" />
<Compile Include="InjectionModules\ProfileModules.cs" />
<Compile Include="ItemBehaviours\BindableSelectedItemBehavior.cs" /> <Compile Include="ItemBehaviours\BindableSelectedItemBehavior.cs" />
<Compile Include="DeviceProviders\Corsair\CorsairKeyboards.cs" /> <Compile Include="DeviceProviders\Corsair\CorsairKeyboards.cs" />
<Compile Include="DeviceProviders\KeyboardProvider.cs" /> <Compile Include="DeviceProviders\KeyboardProvider.cs" />
@ -352,6 +364,18 @@
<Compile Include="Models\OverlaySettings.cs" /> <Compile Include="Models\OverlaySettings.cs" />
<Compile Include="Modules\Effects\AudioVisualizer\AudioVisualization.cs" /> <Compile Include="Modules\Effects\AudioVisualizer\AudioVisualization.cs" />
<Compile Include="Modules\Effects\Bubbles\Bubbles.cs" /> <Compile Include="Modules\Effects\Bubbles\Bubbles.cs" />
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>EurotruckSimulator2.settings</DependentUpon>
</Compile>
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2DataModel.cs" />
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2Model.cs" />
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2Settings.cs" />
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2View.xaml.cs">
<DependentUpon>EurotruckSimulator2View.xaml</DependentUpon>
</Compile>
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2ViewModel.cs" />
<Compile Include="Modules\Games\UnrealTournament\UnrealTournament.Designer.cs"> <Compile Include="Modules\Games\UnrealTournament\UnrealTournament.Designer.cs">
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput> <DesignTimeSharedInput>True</DesignTimeSharedInput>
@ -497,7 +521,6 @@
<Compile Include="Modules\Effects\AudioVisualizer\AudioVisualizerSettings.cs" /> <Compile Include="Modules\Effects\AudioVisualizer\AudioVisualizerSettings.cs" />
<Compile Include="Modules\Overlays\VolumeDisplay\VolumeDisplaySettings.cs" /> <Compile Include="Modules\Overlays\VolumeDisplay\VolumeDisplaySettings.cs" />
<Compile Include="Modules\Games\RocketLeague\RocketLeagueSettings.cs" /> <Compile Include="Modules\Games\RocketLeague\RocketLeagueSettings.cs" />
<Compile Include="InjectionModules\ArtemisModules.cs" />
<Compile Include="InjectionModules\BaseModules.cs" /> <Compile Include="InjectionModules\BaseModules.cs" />
<Compile Include="InjectionModules\ManagerModules.cs" /> <Compile Include="InjectionModules\ManagerModules.cs" />
<Compile Include="Profiles\Layers\Animations\GrowAnimation.cs" /> <Compile Include="Profiles\Layers\Animations\GrowAnimation.cs" />
@ -670,6 +693,10 @@
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<EmbeddedResource Include="Modules\Games\UnrealTournament\Resources\ut-plugin.zip" /> <EmbeddedResource Include="Modules\Games\UnrealTournament\Resources\ut-plugin.zip" />
<None Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>EurotruckSimulator2.Designer.cs</LastGenOutput>
</None>
<None Include="Modules\Games\UnrealTournament\UnrealTournament.settings"> <None Include="Modules\Games\UnrealTournament\UnrealTournament.settings">
<Generator>SettingsSingleFileGenerator</Generator> <Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>UnrealTournament.Designer.cs</LastGenOutput> <LastGenOutput>UnrealTournament.Designer.cs</LastGenOutput>
@ -734,6 +761,8 @@
</None> </None>
<AppDesigner Include="Properties\" /> <AppDesigner Include="Properties\" />
<Resource Include="Resources\bow.png" /> <Resource Include="Resources\bow.png" />
<Content Include="lib\ColorBox.dll" />
<Content Include="lib\Ets2SdkClient.dll" />
<Content Include="logo.ico"> <Content Include="logo.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -781,6 +810,10 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>
<Page Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2View.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Modules\Games\Overwatch\OverwatchView.xaml"> <Page Include="Modules\Games\Overwatch\OverwatchView.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>

View File

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
@ -12,7 +11,6 @@ using Artemis.ViewModels;
using Caliburn.Micro; using Caliburn.Micro;
using Newtonsoft.Json; using Newtonsoft.Json;
using Ninject; using Ninject;
using Ninject.Extensions.Logging;
namespace Artemis namespace Artemis
{ {
@ -75,7 +73,9 @@ namespace Artemis
protected override void Configure() 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<IWindowManager>().To<WindowManager>().InSingletonScope(); _kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();
_kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope(); _kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope();

View File

@ -1,12 +0,0 @@
namespace Artemis.Events
{
public class ActiveEffectChanged
{
public ActiveEffectChanged(string activeEffect)
{
ActiveEffect = activeEffect;
}
public string ActiveEffect { get; set; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -0,0 +1,14 @@
using System;
namespace Artemis.Events
{
public class EnabledChangedEventArgs : EventArgs
{
public EnabledChangedEventArgs(bool enabled)
{
Enabled = enabled;
}
public bool Enabled { get; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -1,12 +0,0 @@
namespace Artemis.Events
{
public class ToggleEnabled
{
public ToggleEnabled(bool enabled)
{
Enabled = enabled;
}
public bool Enabled { get; set; }
}
}

View File

@ -1,13 +1,11 @@
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.ViewModels.Profiles; using Artemis.ViewModels.Profiles;
using Caliburn.Micro;
namespace Artemis.InjectionFactories namespace Artemis.InjectionFactories
{ {
public interface IProfileEditorVmFactory public interface IProfileEditorVmFactory
{ {
ProfileEditorViewModel CreateProfileEditorVm(IEventAggregator events, MainManager mainManager, ProfileEditorViewModel CreateProfileEditorVm(MainManager mainManager, EffectModel gameModel, string lastProfile);
EffectModel gameModel, string lastProfile);
} }
} }

View File

@ -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<EffectViewModel>().To<AudioVisualizerViewModel>().InSingletonScope();
Bind<EffectViewModel>().To<BubblesViewModel>().InSingletonScope();
Bind<EffectViewModel>().To<WindowsProfileViewModel>().InSingletonScope();
// Games
Bind<GameViewModel>().To<CounterStrikeViewModel>().InSingletonScope();
Bind<GameViewModel>().To<Dota2ViewModel>().InSingletonScope();
Bind<GameViewModel>().To<RocketLeagueViewModel>().InSingletonScope();
Bind<GameViewModel>().To<TheDivisionViewModel>().InSingletonScope();
Bind<GameViewModel>().To<Witcher3ViewModel>().InSingletonScope();
Bind<GameViewModel>().To<OverwatchViewModel>().InSingletonScope();
Bind<GameViewModel>().To<UnrealTournamentViewModel>().InSingletonScope();
// Overlays
Bind<OverlayViewModel>().To<VolumeDisplayViewModel>().InSingletonScope();
#endregion
#region Devices
// Keyboards
Bind<DeviceProvider>().To<CorsairKeyboards>().InSingletonScope();
Bind<DeviceProvider>().To<G910>().InSingletonScope();
Bind<DeviceProvider>().To<G810>().InSingletonScope();
Bind<DeviceProvider>().To<BlackWidow>().InSingletonScope();
// Mice
Bind<DeviceProvider>().To<CorsairMice>().InSingletonScope();
// Headsets
Bind<DeviceProvider>().To<CorsairHeadsets>().InSingletonScope();
// Other
Bind<DeviceProvider>().To<LogitechGeneric>().InSingletonScope();
#endregion
#region Layers
// Animations
Bind<ILayerAnimation>().To<NoneAnimation>();
Bind<ILayerAnimation>().To<GrowAnimation>();
Bind<ILayerAnimation>().To<PulseAnimation>();
Bind<ILayerAnimation>().To<SlideDownAnimation>();
Bind<ILayerAnimation>().To<SlideLeftAnimation>();
Bind<ILayerAnimation>().To<SlideRightAnimation>();
Bind<ILayerAnimation>().To<SlideUpAnimation>();
// Conditions
Bind<ILayerCondition>().To<DataModelCondition>();
Bind<ILayerCondition>().To<EventCondition>();
// Types
Bind<ILayerType>().To<FolderType>();
Bind<ILayerType>().To<HeadsetType>();
Bind<ILayerType>().To<KeyboardType>();
Bind<ILayerType>().To<KeyboardGifType>();
Bind<ILayerType>().To<MouseType>();
Bind<ILayerType>().To<GenericType>();
Bind<ILayerType>().To<KeyPressType>();
Bind<ILayerType>().To<AudioType>();
// Bind some Layer Types to self as well in order to allow JSON.NET injection
Bind<KeyPressType>().ToSelf();
Bind<AudioType>().ToSelf();
#endregion
}
}
}

View File

@ -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<DeviceProvider>().To<CorsairKeyboards>().InSingletonScope();
Bind<DeviceProvider>().To<G910>().InSingletonScope();
Bind<DeviceProvider>().To<G810>().InSingletonScope();
Bind<DeviceProvider>().To<BlackWidow>().InSingletonScope();
// Mice
Bind<DeviceProvider>().To<CorsairMice>().InSingletonScope();
// Headsets
Bind<DeviceProvider>().To<CorsairHeadsets>().InSingletonScope();
// Other
Bind<DeviceProvider>().To<LogitechGeneric>().InSingletonScope();
}
}
}

View File

@ -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<EffectModel>()
.BindBase()
.Configure(b => b.InSingletonScope());
});
Kernel.Bind(x =>
{
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<EffectViewModel>()
.BindBase()
.Configure(b => b.InSingletonScope());
});
// Games
Kernel.Bind(x =>
{
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<GameModel>()
.BindBase()
.Configure(b => b.InSingletonScope());
});
Kernel.Bind(x =>
{
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<GameViewModel>()
.BindBase()
.Configure(b => b.InSingletonScope());
});
// Overlays
Kernel.Bind(x =>
{
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<OverlayModel>()
.BindBase()
.Configure(b => b.InSingletonScope());
});
Kernel.Bind(x =>
{
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<OverlayViewModel>()
.BindBase()
.Configure(b => b.InSingletonScope());
});
}
}
}

View File

@ -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<ILayerAnimation>().To<NoneAnimation>();
Bind<ILayerAnimation>().To<GrowAnimation>();
Bind<ILayerAnimation>().To<PulseAnimation>();
Bind<ILayerAnimation>().To<SlideDownAnimation>();
Bind<ILayerAnimation>().To<SlideLeftAnimation>();
Bind<ILayerAnimation>().To<SlideRightAnimation>();
Bind<ILayerAnimation>().To<SlideUpAnimation>();
// Conditions
Bind<ILayerCondition>().To<DataModelCondition>();
Bind<ILayerCondition>().To<EventCondition>();
// Types
Bind<ILayerType>().To<FolderType>();
Bind<ILayerType>().To<HeadsetType>();
Bind<ILayerType>().To<KeyboardType>();
Bind<ILayerType>().To<KeyboardGifType>();
Bind<ILayerType>().To<MouseType>();
Bind<ILayerType>().To<GenericType>();
Bind<ILayerType>().To<KeyPressType>();
Bind<ILayerType>().To<AudioType>();
// Bind some Layer Types to self as well in order to allow JSON.NET injection
Bind<KeyPressType>().ToSelf();
Bind<AudioType>().ToSelf();
}
}
}

View File

@ -18,13 +18,12 @@ namespace Artemis.Managers
/// </summary> /// </summary>
public class DeviceManager public class DeviceManager
{ {
private readonly IEventAggregator _events;
private readonly ILogger _logger; private readonly ILogger _logger;
public event EventHandler<KeyboardChangedEventArgs> OnKeyboardChangedEvent;
public DeviceManager(IEventAggregator events, ILogger logger, List<DeviceProvider> deviceProviders) public DeviceManager(ILogger logger, List<DeviceProvider> deviceProviders)
{ {
_logger = logger; _logger = logger;
_events = events;
KeyboardProviders = deviceProviders.Where(d => d.Type == DeviceType.Keyboard) KeyboardProviders = deviceProviders.Where(d => d.Type == DeviceType.Keyboard)
.Cast<KeyboardProvider>().ToList(); .Cast<KeyboardProvider>().ToList();
@ -119,7 +118,7 @@ namespace Artemis.Managers
General.Default.LastKeyboard = ActiveKeyboard.Name; General.Default.LastKeyboard = ActiveKeyboard.Name;
General.Default.Save(); General.Default.Save();
await _events.PublishOnUIThreadAsync(new ActiveKeyboardChanged(oldKeyboard, ActiveKeyboard)); RaiseKeyboardChangedEvent(new KeyboardChangedEventArgs(oldKeyboard, ActiveKeyboard));
_logger.Debug("Enabled keyboard: {0}", keyboardProvider.Name); _logger.Debug("Enabled keyboard: {0}", keyboardProvider.Name);
if (dialog != null) if (dialog != null)
@ -162,9 +161,17 @@ namespace Artemis.Managers
General.Default.Save(); General.Default.Save();
} }
_events.PublishOnUIThread(new ActiveKeyboardChanged(oldKeyboard, null)); RaiseKeyboardChangedEvent(new KeyboardChangedEventArgs(oldKeyboard, null));
_logger.Debug("Released keyboard: {0}", releaseName); _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);
}
} }
} }

View File

@ -5,7 +5,6 @@ using Artemis.Events;
using Artemis.Models; using Artemis.Models;
using Artemis.Modules.Effects.ProfilePreview; using Artemis.Modules.Effects.ProfilePreview;
using Artemis.Settings; using Artemis.Settings;
using Caliburn.Micro;
using Ninject.Extensions.Logging; using Ninject.Extensions.Logging;
namespace Artemis.Managers namespace Artemis.Managers
@ -16,18 +15,18 @@ namespace Artemis.Managers
public class EffectManager public class EffectManager
{ {
private readonly DeviceManager _deviceManager; private readonly DeviceManager _deviceManager;
private readonly IEventAggregator _events;
private readonly ILogger _logger; private readonly ILogger _logger;
private EffectModel _activeEffect; 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<EffectModel>(); EffectModels = new List<EffectModel>();
_logger = logger;
_deviceManager = deviceManager;
_logger.Info("Intialized EffectManager"); _logger.Info("Intialized EffectManager");
} }
@ -44,7 +43,7 @@ namespace Artemis.Managers
private set private set
{ {
_activeEffect = value; _activeEffect = value;
_events.PublishOnUIThread(new ActiveEffectChanged(value?.Name)); RaiseEffectChangedEvent(new EffectChangedEventArgs(value));
} }
} }
@ -64,6 +63,8 @@ namespace Artemis.Managers
get { return EffectModels.OfType<GameModel>().Where(g => g.Enabled); } get { return EffectModels.OfType<GameModel>().Where(g => g.Enabled); }
} }
public event EventHandler<EffectChangedEventArgs> OnEffectChangedEvent;
/// <summary> /// <summary>
/// Loads the last active effect from settings and enables it. /// Loads the last active effect from settings and enables it.
/// </summary> /// </summary>
@ -83,17 +84,24 @@ namespace Artemis.Managers
/// <param name="loopManager">Optionally pass the LoopManager to automatically start it, if it's not running.</param> /// <param name="loopManager">Optionally pass the LoopManager to automatically start it, if it's not running.</param>
public void ChangeEffect(EffectModel effectModel, LoopManager loopManager = null) 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) if (effectModel == null)
throw new ArgumentNullException(nameof(effectModel)); throw new ArgumentNullException(nameof(effectModel));
if (effectModel is OverlayModel) if (effectModel is OverlayModel)
throw new ArgumentException("Can't set an Overlay effect as the active effect"); 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) 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; return;
} }
@ -145,6 +153,19 @@ namespace Artemis.Managers
General.Default.Save(); 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);
}
/// <summary> /// <summary>
/// Clears the current effect /// Clears the current effect
@ -192,5 +213,11 @@ namespace Artemis.Managers
DisableGame(ActiveEffect); DisableGame(ActiveEffect);
} }
protected virtual void RaiseEffectChangedEvent(EffectChangedEventArgs e)
{
var handler = OnEffectChangedEvent;
handler?.Invoke(this, e);
}
} }
} }

View File

@ -21,10 +21,8 @@ namespace Artemis.Managers
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly Timer _loopTimer; private readonly Timer _loopTimer;
public LoopManager(IEventAggregator events, ILogger logger, EffectManager effectManager, public LoopManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager)
DeviceManager deviceManager)
{ {
events.Subscribe(this);
_logger = logger; _logger = logger;
_effectManager = effectManager; _effectManager = effectManager;
_deviceManager = deviceManager; _deviceManager = deviceManager;

View File

@ -6,15 +6,12 @@ using System.Threading.Tasks;
using System.Timers; using System.Timers;
using Artemis.Events; using Artemis.Events;
using Artemis.Models; using Artemis.Models;
using Artemis.Settings;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.DataReaders; using Artemis.Utilities.DataReaders;
using Artemis.Utilities.GameState; using Artemis.Utilities.GameState;
using Artemis.ViewModels; using Artemis.ViewModels;
using Caliburn.Micro;
using Ninject; using Ninject;
using Ninject.Extensions.Logging; using Ninject.Extensions.Logging;
using Squirrel;
namespace Artemis.Managers namespace Artemis.Managers
{ {
@ -23,16 +20,11 @@ namespace Artemis.Managers
/// </summary> /// </summary>
public class MainManager : IDisposable public class MainManager : IDisposable
{ {
public delegate void PauseCallbackHandler();
private readonly IEventAggregator _events;
private readonly Timer _processTimer; 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) EffectManager effectManager, ProfileManager profileManager, PipeServer pipeServer)
{ {
_events = events;
Logger = logger; Logger = logger;
LoopManager = loopManager; LoopManager = loopManager;
DeviceManager = deviceManager; DeviceManager = deviceManager;
@ -88,6 +80,8 @@ namespace Artemis.Managers
PipeServer?.Stop(); PipeServer?.Stop();
} }
public event EventHandler<EnabledChangedEventArgs> OnEnabledChangedEvent;
/// <summary> /// <summary>
/// Loads the last active effect and starts the program /// Loads the last active effect and starts the program
/// </summary> /// </summary>
@ -96,7 +90,7 @@ namespace Artemis.Managers
Logger.Debug("Enabling program"); Logger.Debug("Enabling program");
ProgramEnabled = true; ProgramEnabled = true;
LoopManager.StartAsync(); LoopManager.StartAsync();
_events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled)); RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled));
} }
/// <summary> /// <summary>
@ -107,7 +101,7 @@ namespace Artemis.Managers
Logger.Debug("Disabling program"); Logger.Debug("Disabling program");
LoopManager.Stop(); LoopManager.Stop();
ProgramEnabled = false; ProgramEnabled = false;
_events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled)); RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled));
} }
/// <summary> /// <summary>
@ -148,5 +142,11 @@ namespace Artemis.Managers
Logger.Info("Detected and enabling game: {0}", newGame.Name); Logger.Info("Detected and enabling game: {0}", newGame.Name);
EffectManager.ChangeEffect(newGame, LoopManager); EffectManager.ChangeEffect(newGame, LoopManager);
} }
protected virtual void RaiseEnabledChangedEvent(EnabledChangedEventArgs e)
{
var handler = OnEnabledChangedEvent;
handler?.Invoke(this, e);
}
} }
} }

View File

@ -18,14 +18,18 @@ namespace Artemis.Models
protected DateTime LastTrace; protected DateTime LastTrace;
protected EffectModel(MainManager mainManager, IDataModel dataModel) protected EffectModel(MainManager mainManager, EffectSettings settings, IDataModel dataModel)
{ {
MainManager = mainManager; MainManager = mainManager;
Settings = settings;
DataModel = dataModel; DataModel = dataModel;
MainManager.EffectManager.EffectModels.Add(this);
} }
public bool Initialized { get; set; } public bool Initialized { get; set; }
public MainManager MainManager { get; set; } public MainManager MainManager { get; set; }
public EffectSettings Settings { get; set; }
public string Name { get; set; } public string Name { get; set; }
public int KeyboardScale { get; set; } = 4; public int KeyboardScale { get; set; } = 4;

View File

@ -5,13 +5,13 @@ namespace Artemis.Models
{ {
public abstract class GameModel : EffectModel public abstract class GameModel : EffectModel
{ {
protected GameModel(MainManager mainManager, GameSettings settings, IDataModel dataModel) protected GameModel(MainManager mainManager, GameSettings settings, IDataModel dataModel): base(mainManager, settings, dataModel)
: base(mainManager, dataModel)
{ {
// Override settings to the GameSettings type
Settings = settings; Settings = settings;
} }
public GameSettings Settings { get; set; } public new GameSettings Settings { get; set; }
public bool Enabled { get; set; } public bool Enabled { get; set; }
public string ProcessName { get; set; } public string ProcessName { get; set; }
} }

View File

@ -7,8 +7,10 @@ namespace Artemis.Models
private bool _enabled; private bool _enabled;
public string ProcessName; 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 public bool Enabled
@ -27,6 +29,7 @@ namespace Artemis.Models
} }
} }
public new OverlaySettings Settings { get; set; }
public abstract void RenderOverlay(RenderFrame frame, bool keyboardOnly); public abstract void RenderOverlay(RenderFrame frame, bool keyboardOnly);
} }
} }

View File

@ -23,18 +23,18 @@ namespace Artemis.Modules.Effects.AudioVisualizer
private int _sensitivity; private int _sensitivity;
private IWaveIn _waveIn; 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"; Name = "Audiovisualizer";
DeviceIds = new List<string>(); DeviceIds = new List<string>();
SpectrumData = new List<byte>(); SpectrumData = new List<byte>();
Initialized = false; Initialized = false;
Settings = (AudioVisualizerSettings) base.Settings;
} }
public int Lines { get; set; } public int Lines { get; set; }
public AudioVisualizerSettings Settings { get; set; } public new AudioVisualizerSettings Settings { get; set; }
public List<byte> SpectrumData { get; set; } public List<byte> SpectrumData { get; set; }
public List<KeyboardRectangle> SoundRectangles { get; set; } public List<KeyboardRectangle> SoundRectangles { get; set; }
@ -126,7 +126,8 @@ namespace Artemis.Modules.Effects.AudioVisualizer
if (keyboardHeight > SoundRectangles[i].Height) if (keyboardHeight > SoundRectangles[i].Height)
SoundRectangles[i].Height = keyboardHeight; SoundRectangles[i].Height = keyboardHeight;
else else
SoundRectangles[i].Height = SoundRectangles[i].Height - Settings.FadeSpeed; SoundRectangles[i].Height = SoundRectangles[i].Height -
Settings.FadeSpeed;
// Apply Bars setting // Apply Bars setting
SoundRectangles[i].X = i*KeyboardScale; SoundRectangles[i].X = i*KeyboardScale;
SoundRectangles[i].Width = KeyboardScale; SoundRectangles[i].Width = KeyboardScale;

View File

@ -1,25 +1,13 @@
using Artemis.Events; using Artemis.Managers;
using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
namespace Artemis.Modules.Effects.AudioVisualizer namespace Artemis.Modules.Effects.AudioVisualizer
{ {
public sealed class AudioVisualizerViewModel : EffectViewModel, IHandle<ActiveEffectChanged> public sealed class AudioVisualizerViewModel : EffectViewModel
{ {
public AudioVisualizerViewModel(MainManager main, IEventAggregator events) public AudioVisualizerViewModel(MainManager main, AudioVisualizerModel model) : base(main, model)
: base(main, new AudioVisualizerModel(main, new AudioVisualizerSettings()))
{ {
DisplayName = "Audio Visualization"; DisplayName = "Audio Visualization";
events.Subscribe(this);
MainManager.EffectManager.EffectModels.Add(EffectModel);
EffectSettings = ((AudioVisualizerModel) EffectModel).Settings;
}
public void Handle(ActiveEffectChanged message)
{
NotifyOfPropertyChange(() => EffectEnabled);
} }
} }
} }

View File

@ -14,12 +14,11 @@ namespace Artemis.Modules.Effects.Bubbles
{ {
#region Constructors #region Constructors
public BubblesModel(MainManager mainManager, BubblesSettings settings) public BubblesModel(MainManager mainManager) : base(mainManager, new BubblesSettings(), null)
: base(mainManager, null)
{ {
Name = "Bubbles"; Name = "Bubbles";
Settings = settings;
Initialized = false; Initialized = false;
Settings = (BubblesSettings) base.Settings;
} }
#endregion #endregion
@ -30,7 +29,7 @@ namespace Artemis.Modules.Effects.Bubbles
private readonly List<Bubble> _bubbles = new List<Bubble>(); private readonly List<Bubble> _bubbles = new List<Bubble>();
public BubblesSettings Settings { get; } public new BubblesSettings Settings { get; }
#endregion #endregion

View File

@ -1,25 +1,13 @@
using Artemis.Events; using Artemis.Managers;
using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
namespace Artemis.Modules.Effects.Bubbles namespace Artemis.Modules.Effects.Bubbles
{ {
public class BubblesViewModel : EffectViewModel, IHandle<ActiveEffectChanged> public sealed class BubblesViewModel : EffectViewModel
{ {
public BubblesViewModel(MainManager main, IEventAggregator events) public BubblesViewModel(MainManager main, BubblesModel model) : base(main, model)
: base(main, new BubblesModel(main, new BubblesSettings()))
{ {
DisplayName = "Bubbles"; DisplayName = "Bubbles";
events.Subscribe(this);
MainManager.EffectManager.EffectModels.Add(EffectModel);
EffectSettings = ((BubblesModel) EffectModel).Settings;
}
public void Handle(ActiveEffectChanged message)
{
NotifyOfPropertyChange(() => EffectEnabled);
} }
} }
} }

View File

@ -14,7 +14,7 @@ namespace Artemis.Modules.Effects.ProfilePreview
{ {
public class ProfilePreviewModel : EffectModel public class ProfilePreviewModel : EffectModel
{ {
public ProfilePreviewModel(MainManager mainManager) : base(mainManager, new ProfilePreviewDataModel()) public ProfilePreviewModel(MainManager mainManager) : base(mainManager, null, new ProfilePreviewDataModel())
{ {
Name = "Profile Preview"; Name = "Profile Preview";
} }

View File

@ -69,16 +69,13 @@ namespace Artemis.Modules.Effects.WindowsProfile
private SpotifyLocalAPI _spotify; private SpotifyLocalAPI _spotify;
private bool _spotifySetupBusy; private bool _spotifySetupBusy;
public WindowsProfileModel(ILogger logger, MainManager mainManager, WindowsProfileSettings settings) public WindowsProfileModel(ILogger logger, MainManager mainManager)
: base(mainManager, new WindowsProfileDataModel()) : base(mainManager, new WindowsProfileSettings(), new WindowsProfileDataModel())
{ {
_logger = logger; _logger = logger;
Name = "WindowsProfile"; Name = "WindowsProfile";
Settings = settings;
} }
public WindowsProfileSettings Settings { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;

View File

@ -1,31 +1,25 @@
using System.ComponentModel; using System.ComponentModel;
using Artemis.Events;
using Artemis.InjectionFactories; using Artemis.InjectionFactories;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Modules.Effects.ProfilePreview; using Artemis.Modules.Effects.ProfilePreview;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Artemis.ViewModels.Profiles; using Artemis.ViewModels.Profiles;
using Caliburn.Micro;
using Ninject.Extensions.Logging;
namespace Artemis.Modules.Effects.WindowsProfile namespace Artemis.Modules.Effects.WindowsProfile
{ {
// TODO: This effect is a hybrid between a regular effect and a game, may want to clean this up // 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<ActiveEffectChanged> public sealed class WindowsProfileViewModel : EffectViewModel
{ {
public WindowsProfileViewModel(ILogger logger, MainManager main, IEventAggregator events, public WindowsProfileViewModel(MainManager main, IProfileEditorVmFactory pFactory,
IProfileEditorVmFactory pFactory, ProfilePreviewModel profilePreviewModel) ProfilePreviewModel profilePreviewModel, WindowsProfileModel model) : base(main, model)
: base(main, new WindowsProfileModel(logger, main, new WindowsProfileSettings()))
{ {
DisplayName = "Windows Profile"; DisplayName = "Windows Profile";
PFactory = pFactory; PFactory = pFactory;
ProfilePreviewModel = profilePreviewModel; ProfilePreviewModel = profilePreviewModel;
EffectSettings = ((WindowsProfileModel) EffectModel).Settings; EffectSettings = ((WindowsProfileModel) EffectModel).Settings;
ProfileEditor = PFactory.CreateProfileEditorVm(events, main, (WindowsProfileModel) EffectModel, ProfileEditor = PFactory.CreateProfileEditorVm(main, (WindowsProfileModel) EffectModel,
((WindowsProfileSettings) EffectSettings).LastProfile); ((WindowsProfileSettings) EffectSettings).LastProfile);
ProfilePreviewModel.Profile = ProfileEditor.SelectedProfile; ProfilePreviewModel.Profile = ProfileEditor.SelectedProfile;
events.Subscribe(this);
ProfileEditor.PropertyChanged += ProfileUpdater; ProfileEditor.PropertyChanged += ProfileUpdater;
MainManager.EffectManager.EffectModels.Add(EffectModel); MainManager.EffectManager.EffectModels.Add(EffectModel);
} }
@ -35,11 +29,6 @@ namespace Artemis.Modules.Effects.WindowsProfile
public IProfileEditorVmFactory PFactory { get; set; } public IProfileEditorVmFactory PFactory { get; set; }
public ProfilePreviewModel ProfilePreviewModel { get; set; } public ProfilePreviewModel ProfilePreviewModel { get; set; }
public void Handle(ActiveEffectChanged message)
{
NotifyOfPropertyChange(() => EffectEnabled);
}
private void ProfileUpdater(object sender, PropertyChangedEventArgs e) private void ProfileUpdater(object sender, PropertyChangedEventArgs e)
{ {
if (e.PropertyName != "SelectedProfile" && IsActive) if (e.PropertyName != "SelectedProfile" && IsActive)

View File

@ -11,8 +11,7 @@ namespace Artemis.Modules.Games.CounterStrike
{ {
public class CounterStrikeModel : GameModel public class CounterStrikeModel : GameModel
{ {
public CounterStrikeModel(MainManager mainManager, CounterStrikeSettings settings) public CounterStrikeModel(MainManager mainManager): base(mainManager, new CounterStrikeSettings(), new CounterStrikeDataModel())
: base(mainManager, settings, new CounterStrikeDataModel())
{ {
Name = "CounterStrike"; Name = "CounterStrike";
ProcessName = "csgo"; ProcessName = "csgo";

View File

@ -40,7 +40,7 @@
Grid.Column="0" Grid.Column="0"
Grid.ColumnSpan="2" Margin="0,0,1,0"> Grid.ColumnSpan="2" Margin="0,0,1,0">
<Label FontSize="20" HorizontalAlignment="Left" Content="CS:GO Directory" /> <Label FontSize="20" HorizontalAlignment="Left" Content="Counter-Strike Global Offensive directory" />
<Grid> <Grid>
<TextBox x:Name="GameDirectory" Height="23" TextWrapping="Wrap" Margin="5,0,30,0" <TextBox x:Name="GameDirectory" Height="23" TextWrapping="Wrap" Margin="5,0,30,0"
Text="{Binding Path=GameSettings.GameDirectory, Mode=TwoWay}" Text="{Binding Path=GameSettings.GameDirectory, Mode=TwoWay}"

View File

@ -5,17 +5,15 @@ using Artemis.Managers;
using Artemis.Properties; using Artemis.Properties;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
namespace Artemis.Modules.Games.CounterStrike namespace Artemis.Modules.Games.CounterStrike
{ {
public sealed class CounterStrikeViewModel : GameViewModel public sealed class CounterStrikeViewModel : GameViewModel
{ {
public CounterStrikeViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) public CounterStrikeViewModel(MainManager main, IProfileEditorVmFactory pFactory, CounterStrikeModel model)
: base(main, new CounterStrikeModel(main, new CounterStrikeSettings()), events, pFactory) : base(main, model, pFactory)
{ {
DisplayName = "CS:GO"; DisplayName = "CS:GO";
MainManager.EffectManager.EffectModels.Add(GameModel);
FindGameDir(); FindGameDir();
PlaceConfigFile(); PlaceConfigFile();

View File

@ -7,21 +7,18 @@ using Newtonsoft.Json;
namespace Artemis.Modules.Games.Dota2 namespace Artemis.Modules.Games.Dota2
{ {
internal class Dota2Model : GameModel public class Dota2Model : GameModel
{ {
public Dota2Model(MainManager mainManager, Dota2Settings settings) public Dota2Model(MainManager mainManager): base(mainManager, new Dota2Settings(), new Dota2DataModel())
: base(mainManager, settings, new Dota2DataModel())
{ {
Name = "Dota2"; Name = "Dota2";
ProcessName = "dota2"; ProcessName = "dota2";
Settings = settings;
Enabled = Settings.Enabled; Enabled = Settings.Enabled;
Initialized = false; Initialized = false;
Scale = 4; Scale = 4;
} }
public int Scale { get; set; } public int Scale { get; set; }
public new Dota2Settings Settings { get; set; }
public override void Dispose() public override void Dispose()
{ {

View File

@ -39,7 +39,7 @@
<StackPanel Grid.Row="1" <StackPanel Grid.Row="1"
Grid.Column="0" Grid.Column="0"
Grid.ColumnSpan="2" Margin="0,0,1,0"> Grid.ColumnSpan="2" Margin="0,0,1,0">
<Label FontSize="20" HorizontalAlignment="Left" Content="Dota 2 Directory" /> <Label FontSize="20" HorizontalAlignment="Left" Content="Dota 2 directory" />
<Grid> <Grid>
<TextBox x:Name="GameDirectory" Height="23" TextWrapping="Wrap" Margin="5,0,30,0" <TextBox x:Name="GameDirectory" Height="23" TextWrapping="Wrap" Margin="5,0,30,0"
Text="{Binding Path=GameSettings.GameDirectory, Mode=TwoWay}" Text="{Binding Path=GameSettings.GameDirectory, Mode=TwoWay}"

View File

@ -5,17 +5,14 @@ using Artemis.Managers;
using Artemis.Properties; using Artemis.Properties;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
namespace Artemis.Modules.Games.Dota2 namespace Artemis.Modules.Games.Dota2
{ {
public sealed class Dota2ViewModel : GameViewModel public sealed class Dota2ViewModel : GameViewModel
{ {
public Dota2ViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) public Dota2ViewModel(MainManager main, IProfileEditorVmFactory pFactory, Dota2Model model) : base(main, model, pFactory)
: base(main, new Dota2Model(main, new Dota2Settings()), events, pFactory)
{ {
DisplayName = "Dota 2"; DisplayName = "Dota 2";
MainManager.EffectManager.EffectModels.Add(GameModel);
FindGameDir(); FindGameDir();
PlaceConfigFile(); PlaceConfigFile();

View File

@ -0,0 +1,62 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Artemis.Modules.Games.EurotruckSimulator2 {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
internal sealed partial class EurotruckSimulator2 : global::System.Configuration.ApplicationSettingsBase {
private static EurotruckSimulator2 defaultInstance = ((EurotruckSimulator2)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new EurotruckSimulator2())));
public static EurotruckSimulator2 Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool Enabled {
get {
return ((bool)(this["Enabled"]));
}
set {
this["Enabled"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Default")]
public string LastProfile {
get {
return ((string)(this["LastProfile"]));
}
set {
this["LastProfile"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string GameDirectory {
get {
return ((string)(this["GameDirectory"]));
}
set {
this["GameDirectory"] = value;
}
}
}
}

View File

@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Artemis.Modules.Games.EurotruckSimulator2" GeneratedClassName="EurotruckSimulator2">
<Profiles />
<Settings>
<Setting Name="Enabled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="LastProfile" Type="System.String" Scope="User">
<Value Profile="(Default)">Default</Value>
</Setting>
<Setting Name="GameDirectory" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

View File

@ -0,0 +1,18 @@
using Artemis.Models.Interfaces;
using Ets2SdkClient;
namespace Artemis.Modules.Games.EurotruckSimulator2
{
public class EurotruckSimulator2DataModel : IDataModel
{
public Ets2Telemetry._Axilliary Axilliary { get; set; }
public Ets2Telemetry._Controls Controls { get; set; }
public Ets2Telemetry._Damage Damage { get; set; }
public Ets2Telemetry._Drivetrain Drivetrain { get; set; }
public Ets2Telemetry._Job Job { get; set; }
public Ets2Telemetry._Lights Lights { get; set; }
public string Manufacturer { get; set; }
public string ManufacturerId { get; set; }
public Ets2Telemetry._Physics Physics { get; set; }
}
}

View File

@ -0,0 +1,68 @@
using System.Collections.Generic;
using Artemis.Managers;
using Artemis.Models;
using Artemis.Profiles.Layers.Models;
using Ets2SdkClient;
using Ninject.Extensions.Logging;
namespace Artemis.Modules.Games.EurotruckSimulator2
{
public class EurotruckSimulator2Model : GameModel
{
public EurotruckSimulator2Model(MainManager mainManager)
: base(mainManager, new EurotruckSimulator2Settings(), new EurotruckSimulator2DataModel())
{
Name = "EurotruckSimulator2";
ProcessName = "eurotrucks2";
Scale = 4;
Enabled = Settings.Enabled;
Initialized = false;
}
public ILogger Logger { get; set; }
public int Scale { get; set; }
public Ets2SdkTelemetry Telemetry { get; set; }
public override void Dispose()
{
Initialized = false;
Telemetry.Data -= TelemetryOnData;
Telemetry = null;
}
public override void Enable()
{
Telemetry = new Ets2SdkTelemetry();
Telemetry.Data += TelemetryOnData;
if (Telemetry.Error != null)
MainManager.Logger.Error(Telemetry.Error, "Exception in the Eurotruck SDK");
Initialized = true;
}
private void TelemetryOnData(Ets2Telemetry data, bool newTimestamp)
{
((EurotruckSimulator2DataModel) DataModel).Axilliary = data.Axilliary;
((EurotruckSimulator2DataModel) DataModel).Controls = data.Controls;
((EurotruckSimulator2DataModel) DataModel).Damage = data.Damage;
((EurotruckSimulator2DataModel) DataModel).Drivetrain = data.Drivetrain;
((EurotruckSimulator2DataModel) DataModel).Job = data.Job;
((EurotruckSimulator2DataModel) DataModel).Lights = data.Lights;
((EurotruckSimulator2DataModel) DataModel).Manufacturer = data.Manufacturer;
((EurotruckSimulator2DataModel) DataModel).ManufacturerId = data.ManufacturerId;
((EurotruckSimulator2DataModel) DataModel).Physics = data.Physics;
}
public override void Update()
{
// Updating is handled in the TelemetryOnData event
}
public override List<LayerModel> GetRenderLayers(bool keyboardOnly)
{
return Profile.GetRenderLayers(DataModel, keyboardOnly);
}
}
}

View File

@ -0,0 +1,35 @@
using Artemis.Models;
namespace Artemis.Modules.Games.EurotruckSimulator2
{
public class EurotruckSimulator2Settings : GameSettings
{
public EurotruckSimulator2Settings()
{
Load();
}
public string GameDirectory { get; set; }
public sealed override void Load()
{
Enabled = EurotruckSimulator2.Default.Enabled;
LastProfile = EurotruckSimulator2.Default.LastProfile;
GameDirectory = EurotruckSimulator2.Default.GameDirectory;
}
public sealed override void Save()
{
EurotruckSimulator2.Default.Enabled = Enabled;
EurotruckSimulator2.Default.GameDirectory = GameDirectory;
EurotruckSimulator2.Default.Save();
}
public sealed override void ToDefault()
{
Enabled = true;
GameDirectory = string.Empty;
}
}
}

View File

@ -0,0 +1,67 @@
<UserControl x:Class="Artemis.Modules.Games.EurotruckSimulator2.EurotruckSimulator2View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d"
d:DesignHeight="476.986" d:DesignWidth="538.772">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid Margin="15,5,5,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,1,0">
<Label FontSize="20" HorizontalAlignment="Left">
<Label.Content>
<AccessText TextWrapping="Wrap"
Text="By default shows indicator lights, speed and engine RPM on the keyboard" />
</Label.Content>
</Label>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Label Content="Enable effect" Margin="0 3 0 0" HorizontalAlignment="Right" />
<ToggleButton x:Name="EffectEnabled" Margin="0 3 0 0" Width="25" Height="25"
IsChecked="{Binding Path=GameSettings.Enabled, Mode=TwoWay}"
Style="{DynamicResource MetroCircleToggleButtonStyle}"
cal:Message.Attach="[Event Click] = [Action ToggleEffect]" />
</StackPanel>
</StackPanel>
<StackPanel Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2" Margin="0,0,1,0">
<Label FontSize="20" HorizontalAlignment="Left" Content="Eurotruck Simulator 2 directory" />
<Grid>
<TextBox x:Name="GameDirectory" Height="23" TextWrapping="Wrap" Margin="5,0,30,0"
Text="{Binding Path=GameSettings.GameDirectory, Mode=TwoWay}"
cal:Message.Attach="[Event LostFocus] = [Action PlaceConfigFile]" />
<Button x:Name="BrowseDirectory" Content="..." RenderTransformOrigin="-0.039,-0.944"
HorizontalAlignment="Right" Width="25"
Style="{DynamicResource SquareButtonStyle}" Height="26" Margin="0,-2,0,0" />
</Grid>
</StackPanel>
<!-- Profile editor -->
<ContentControl Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" x:Name="ProfileEditor" Margin="0,0,-20,0" />
<!-- Buttons -->
<StackPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal" VerticalAlignment="Bottom">
<Button x:Name="ResetSettings" Content="Reset effect" VerticalAlignment="Top" Width="100"
Style="{DynamicResource SquareButtonStyle}" />
<Button x:Name="SaveSettings" Content="Save changes" VerticalAlignment="Top" Width="100"
Margin="10,0,0,0"
Style="{DynamicResource SquareButtonStyle}" />
</StackPanel>
</Grid>
</ScrollViewer>
</UserControl>

View File

@ -0,0 +1,15 @@
using System.Windows.Controls;
namespace Artemis.Modules.Games.EurotruckSimulator2
{
/// <summary>
/// Interaction logic for CounterStrikeView.xaml
/// </summary>
public partial class EurotruckSimulator2View : UserControl
{
public EurotruckSimulator2View()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,76 @@
using System.IO;
using System.Windows.Forms;
using Artemis.InjectionFactories;
using Artemis.Managers;
using Artemis.Utilities;
using Artemis.ViewModels.Abstract;
namespace Artemis.Modules.Games.EurotruckSimulator2
{
public sealed class EurotruckSimulator2ViewModel : GameViewModel
{
public EurotruckSimulator2ViewModel(MainManager main, IProfileEditorVmFactory pFactory, EurotruckSimulator2Model model): base(main, model, pFactory)
{
DisplayName = "ETS 2";
FindGameDir();
PlacePlugin();
}
public void FindGameDir()
{
var gameSettings = (EurotruckSimulator2Settings) GameSettings;
// If already propertly set up, don't do anything
//if (gameSettings.GameDirectory != null && File.Exists(gameSettings.GameDirectory + "csgo.exe") &&
// File.Exists(gameSettings.GameDirectory + "/csgo/cfg/gamestate_integration_artemis.cfg"))
// return;
// Demo is also supported but resides in a different directory
var dir = GeneralHelpers.FindSteamGame(@"\Euro Truck Simulator 2\bin\win_x86\eurotrucks2.exe") ??
GeneralHelpers.FindSteamGame(@"\Euro Truck Simulator 2 Demo\bin\win_x86\eurotrucks2.exe");
gameSettings.GameDirectory = dir ?? string.Empty;
gameSettings.Save();
}
public void BrowseDirectory()
{
var dialog = new FolderBrowserDialog
{
SelectedPath = ((EurotruckSimulator2Settings) GameSettings).GameDirectory
};
var result = dialog.ShowDialog();
if (result != DialogResult.OK)
return;
((EurotruckSimulator2Settings) GameSettings).GameDirectory = Path.GetDirectoryName(dialog.SelectedPath);
NotifyOfPropertyChange(() => GameSettings);
GameSettings.Save();
PlacePlugin();
}
public void PlacePlugin()
{
if (((EurotruckSimulator2Settings) GameSettings).GameDirectory == string.Empty)
return;
var path = ((EurotruckSimulator2Settings) GameSettings).GameDirectory;
//if (Directory.Exists(path + "/csgo/cfg"))
//{
// var cfgFile = Resources.csgoGamestateConfiguration.Replace("{{port}}",
// MainManager.GameStateWebServer.Port.ToString());
// File.WriteAllText(path + "/csgo/cfg/gamestate_integration_artemis.cfg", cfgFile);
// return;
//}
//DialogService.ShowErrorMessageBox("Please select a valid CS:GO directory\n\n" +
// @"By default CS:GO is in \SteamApps\common\Counter-Strike Global Offensive");
//((EurotruckSimulator2Settings) GameSettings).GameDirectory = string.Empty;
//NotifyOfPropertyChange(() => GameSettings);
//GameSettings.Save();
}
}
}

View File

@ -2,19 +2,16 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Windows.Media; using System.Windows.Media;
using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Interfaces; using Artemis.Models.Interfaces;
using Artemis.Profiles.Layers.Models; using Artemis.Profiles.Layers.Models;
using Artemis.Utilities; using Artemis.Utilities;
using Caliburn.Micro;
namespace Artemis.Modules.Games.Overwatch namespace Artemis.Modules.Games.Overwatch
{ {
public class OverwatchModel : GameModel public class OverwatchModel : GameModel
{ {
private readonly IEventAggregator _events;
private DateTime _characterChange; private DateTime _characterChange;
private string _lastMessage; private string _lastMessage;
// Using sticky values on these since they can cause flickering // Using sticky values on these since they can cause flickering
@ -24,10 +21,8 @@ namespace Artemis.Modules.Games.Overwatch
private DateTime _ultimateReady; private DateTime _ultimateReady;
private DateTime _ultimateUsed; private DateTime _ultimateUsed;
public OverwatchModel(IEventAggregator events, MainManager mainManager, OverwatchSettings settings) public OverwatchModel(MainManager mainManager): base(mainManager, new OverwatchSettings(), new OverwatchDataModel())
: base(mainManager, settings, new OverwatchDataModel())
{ {
_events = events;
Name = "Overwatch"; Name = "Overwatch";
ProcessName = "Overwatch"; ProcessName = "Overwatch";
Scale = 4; Scale = 4;
@ -126,7 +121,8 @@ namespace Artemis.Modules.Games.Overwatch
if (colors == null) if (colors == null)
return; return;
_events.PublishOnUIThread(new RazerColorArrayChanged(colors)); // TODO: Get the debug viewmodel and update the color array
//_events.PublishOnUIThread(new RazerColorArrayChanged(colors));
// Determine general game state // Determine general game state
ParseGameSate(gameDataModel, colors); ParseGameSate(gameDataModel, colors);

View File

@ -4,18 +4,16 @@ using Artemis.InjectionFactories;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Utilities.DataReaders; using Artemis.Utilities.DataReaders;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
using Microsoft.Win32; using Microsoft.Win32;
namespace Artemis.Modules.Games.Overwatch namespace Artemis.Modules.Games.Overwatch
{ {
public sealed class OverwatchViewModel : GameViewModel public sealed class OverwatchViewModel : GameViewModel
{ {
public OverwatchViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) public OverwatchViewModel(MainManager main, IProfileEditorVmFactory pFactory, OverwatchModel model)
: base(main, new OverwatchModel(events, main, new OverwatchSettings()), events, pFactory) : base(main, model, pFactory)
{ {
DisplayName = "Overwatch"; DisplayName = "Overwatch";
MainManager.EffectManager.EffectModels.Add(GameModel);
FindOverwatch(); FindOverwatch();
} }

View File

@ -15,8 +15,8 @@ namespace Artemis.Modules.Games.RocketLeague
private Memory _memory; private Memory _memory;
private GamePointersCollection _pointer; private GamePointersCollection _pointer;
public RocketLeagueModel(MainManager mainManager, RocketLeagueSettings settings) public RocketLeagueModel(MainManager mainManager)
: base(mainManager, settings, new RocketLeagueDataModel()) : base(mainManager, new RocketLeagueSettings(), new RocketLeagueDataModel())
{ {
Name = "RocketLeague"; Name = "RocketLeague";
ProcessName = "RocketLeague"; ProcessName = "RocketLeague";

View File

@ -4,7 +4,6 @@ using Artemis.Settings;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Memory; using Artemis.Utilities.Memory;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Artemis.Modules.Games.RocketLeague namespace Artemis.Modules.Games.RocketLeague
@ -13,12 +12,9 @@ namespace Artemis.Modules.Games.RocketLeague
{ {
private string _versionText; private string _versionText;
public RocketLeagueViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) public RocketLeagueViewModel(MainManager main, IProfileEditorVmFactory pFactory, RocketLeagueModel model) : base(main, model, pFactory)
: base(main, new RocketLeagueModel(main, new RocketLeagueSettings()), events, pFactory)
{ {
DisplayName = "Rocket League"; DisplayName = "Rocket League";
MainManager.EffectManager.EffectModels.Add(GameModel);
SetVersionText(); SetVersionText();
} }

View File

@ -14,8 +14,8 @@ namespace Artemis.Modules.Games.TheDivision
private StickyValue<bool> _stickyAmmo; private StickyValue<bool> _stickyAmmo;
private StickyValue<bool> _stickyHp; private StickyValue<bool> _stickyHp;
public TheDivisionModel(MainManager mainManager, TheDivisionSettings settings) public TheDivisionModel(MainManager mainManager)
: base(mainManager, settings, new TheDivisionDataModel()) : base(mainManager, new TheDivisionSettings(), new TheDivisionDataModel())
{ {
Name = "TheDivision"; Name = "TheDivision";
ProcessName = "TheDivision"; ProcessName = "TheDivision";

View File

@ -1,17 +1,15 @@
using Artemis.InjectionFactories; using Artemis.InjectionFactories;
using Artemis.Managers; using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
namespace Artemis.Modules.Games.TheDivision namespace Artemis.Modules.Games.TheDivision
{ {
public sealed class TheDivisionViewModel : GameViewModel public sealed class TheDivisionViewModel : GameViewModel
{ {
public TheDivisionViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) public TheDivisionViewModel(MainManager main, IProfileEditorVmFactory pFactory, TheDivisionModel model)
: base(main, new TheDivisionModel(main, new TheDivisionSettings()), events, pFactory) : base(main, model, pFactory)
{ {
DisplayName = "The Division"; DisplayName = "The Division";
MainManager.EffectManager.EffectModels.Add(GameModel);
} }
} }
} }

View File

@ -10,7 +10,6 @@ using Artemis.Managers;
using Artemis.Properties; using Artemis.Properties;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@ -18,8 +17,8 @@ namespace Artemis.Modules.Games.UnrealTournament
{ {
public sealed class UnrealTournamentViewModel : GameViewModel public sealed class UnrealTournamentViewModel : GameViewModel
{ {
public UnrealTournamentViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) public UnrealTournamentViewModel(MainManager main, IProfileEditorVmFactory pFactory, UnrealTournamentModel model)
: base(main, new UnrealTournamentModel(main, new UnrealTournamentSettings()), events, pFactory) : base(main, model, pFactory)
{ {
DisplayName = "Unreal Tournament"; DisplayName = "Unreal Tournament";
MainManager.EffectManager.EffectModels.Add(GameModel); MainManager.EffectManager.EffectModels.Add(GameModel);

View File

@ -16,8 +16,8 @@ namespace Artemis.Modules.Games.Witcher3
private readonly Stopwatch _updateSw; private readonly Stopwatch _updateSw;
private string _witcherSettings; private string _witcherSettings;
public Witcher3Model(MainManager mainManager, Witcher3Settings settings) public Witcher3Model(MainManager mainManager)
: base(mainManager, settings, new Witcher3DataModel()) : base(mainManager, new Witcher3Settings(), new Witcher3DataModel())
{ {
Name = "Witcher3"; Name = "Witcher3";
ProcessName = "witcher3"; ProcessName = "witcher3";

View File

@ -9,17 +9,15 @@ using Artemis.InjectionFactories;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
namespace Artemis.Modules.Games.Witcher3 namespace Artemis.Modules.Games.Witcher3
{ {
public sealed class Witcher3ViewModel : GameViewModel public sealed class Witcher3ViewModel : GameViewModel
{ {
public Witcher3ViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) public Witcher3ViewModel(MainManager main, IProfileEditorVmFactory pFactory, Witcher3Model model)
: base(main, new Witcher3Model(main, new Witcher3Settings()), events, pFactory) : base(main, model, pFactory)
{ {
DisplayName = "The Witcher 3"; DisplayName = "The Witcher 3";
MainManager.EffectManager.EffectModels.Add(GameModel);
} }
public async void AutoInstall() public async void AutoInstall()
@ -80,7 +78,7 @@ namespace Artemis.Modules.Games.Witcher3
archive.ExtractToDirectory(folder + @"witcher3-mod", true); archive.ExtractToDirectory(folder + @"witcher3-mod", true);
System.Diagnostics.Process.Start( Process.Start(
new ProcessStartInfo("https://github.com/SpoinkyNL/Artemis/wiki/The-Witcher-3")); new ProcessStartInfo("https://github.com/SpoinkyNL/Artemis/wiki/The-Witcher-3"));
return; return;
} }

View File

@ -1,54 +1,53 @@
using System.Collections.Generic; //using System.Collections.Generic;
using Artemis.Managers; //using Artemis.Managers;
using Artemis.Models; //using Artemis.Models;
using Artemis.Profiles.Layers.Models; //using Artemis.Profiles.Layers.Models;
using Artemis.Utilities.Memory; //using Artemis.Utilities.Memory;
//
namespace Artemis.Modules.Games.WorldofWarcraft //namespace Artemis.Modules.Games.WorldofWarcraft
{ //{
public class WoWModel : GameModel // public class WoWModel : GameModel
{ // {
private Memory _memory; // private Memory _memory;
//
public WoWModel(MainManager mainManager, WoWSettings settings) // public WoWModel(MainManager mainManager): base(mainManager, new WoWSettings(), new WoWDataModel())
: base(mainManager, settings, new WoWDataModel()) // {
{ // Name = "WoW";
Name = "WoW"; // ProcessName = "Wow-64";
ProcessName = "Wow-64"; // Scale = 4;
Scale = 4; // Enabled = Settings.Enabled;
Enabled = Settings.Enabled; // Initialized = false;
Initialized = false; // }
} //
// public int Scale { get; set; }
public int Scale { get; set; } //
// public override void Dispose()
public override void Dispose() // {
{ // Initialized = false;
Initialized = false; // }
} //
// public override void Enable()
public override void Enable() // {
{ // var tempProcess = MemoryHelpers.GetProcessIfRunning(ProcessName);
var tempProcess = MemoryHelpers.GetProcessIfRunning(ProcessName); // if (tempProcess == null)
if (tempProcess == null) // return;
return; //
// _memory = new Memory(tempProcess);
_memory = new Memory(tempProcess); //
// Initialized = true;
Initialized = true; // }
} //
// public override void Update()
public override void Update() // {
{ // if (Profile == null || DataModel == null || _memory == null)
if (Profile == null || DataModel == null || _memory == null) // return;
return; //
//// _memory.ReadMemory();
// _memory.ReadMemory(); // }
} //
// public override List<LayerModel> GetRenderLayers(bool keyboardOnly)
public override List<LayerModel> GetRenderLayers(bool keyboardOnly) // {
{ // return Profile.GetRenderLayers(DataModel, keyboardOnly);
return Profile.GetRenderLayers(DataModel, keyboardOnly); // }
} // }
} //}
}

View File

@ -1,17 +1,14 @@
using Artemis.InjectionFactories; //using Artemis.InjectionFactories;
using Artemis.Managers; //using Artemis.Managers;
using Artemis.ViewModels.Abstract; //using Artemis.ViewModels.Abstract;
using Caliburn.Micro; //
//namespace Artemis.Modules.Games.WorldofWarcraft
namespace Artemis.Modules.Games.WorldofWarcraft //{
{ // public sealed class WoWViewModel : GameViewModel
public sealed class WoWViewModel : GameViewModel // {
{ // public WoWViewModel(MainManager main, IProfileEditorVmFactory pFactory, WoWModel model): base(main, model, pFactory)
public WoWViewModel(MainManager main, IEventAggregator events, IProfileEditorVmFactory pFactory) // {
: base(main, new WoWModel(main, new WoWSettings()), events, pFactory) // DisplayName = "WoW";
{ // }
DisplayName = "World of Warcraft"; // }
MainManager.EffectManager.EffectModels.Add(GameModel); //}
}
}
}

View File

@ -12,19 +12,15 @@ namespace Artemis.Modules.Overlays.VolumeDisplay
{ {
public class VolumeDisplayModel : OverlayModel public class VolumeDisplayModel : OverlayModel
{ {
public VolumeDisplayModel(MainManager mainManager, VolumeDisplaySettings settings) : base(mainManager) public VolumeDisplayModel(MainManager mainManager) : base(mainManager, new VolumeDisplaySettings())
{ {
Settings = settings;
Name = "VolumeDisplay"; Name = "VolumeDisplay";
Enabled = Settings.Enabled;
VolumeDisplay = new VolumeBar(MainManager.DeviceManager, settings); VolumeDisplay = new VolumeBar(MainManager.DeviceManager, (VolumeDisplaySettings) Settings);
} }
public VolumeBar VolumeDisplay { get; set; } public VolumeBar VolumeDisplay { get; set; }
public VolumeDisplaySettings Settings { get; set; }
public override void Dispose() public override void Dispose()
{ {
KeyboardHook.KeyDownCallback -= KeyPressTask; KeyboardHook.KeyDownCallback -= KeyPressTask;

View File

@ -5,16 +5,9 @@ namespace Artemis.Modules.Overlays.VolumeDisplay
{ {
public sealed class VolumeDisplayViewModel : OverlayViewModel public sealed class VolumeDisplayViewModel : OverlayViewModel
{ {
public VolumeDisplayViewModel(MainManager mainManager) : base(mainManager) public VolumeDisplayViewModel(MainManager mainManager, VolumeDisplayModel model) : base(mainManager, model)
{ {
DisplayName = "Volume Display"; DisplayName = "Volume Display";
// Settings are loaded from file by class
OverlaySettings = new VolumeDisplaySettings();
// Create effect model and add it to MainManager
OverlayModel = new VolumeDisplayModel(mainManager, (VolumeDisplaySettings) OverlaySettings);
MainManager.EffectManager.EffectModels.Add(OverlayModel);
} }
} }
} }

View File

@ -19,7 +19,7 @@ namespace Artemis.Profiles.Layers.Models
/// <summary> /// <summary>
/// Percentage source, the number that defines 100% /// Percentage source, the number that defines 100%
/// </summary> /// </summary>
public double PercentageSource { get; set; } public float PercentageSource { get; set; }
/// <summary> /// <summary>
/// Percentage source property, the property that defines 100% /// Percentage source property, the property that defines 100%
@ -44,13 +44,13 @@ namespace Artemis.Profiles.Layers.Models
ApplyPercentageOfProperty(dataModel, properties); ApplyPercentageOfProperty(dataModel, properties);
} }
private void ApplyPercentageOf(IDataModel dataModel, LayerPropertiesModel properties, double src) private void ApplyPercentageOf(IDataModel dataModel, LayerPropertiesModel properties, float src)
{ {
if (GameProperty == null) if (GameProperty == null)
return; return;
var gameProperty = dataModel.GetPropValue<int>(GameProperty); var gameProperty = dataModel.GetPropValue<float>(GameProperty);
var percentage = decimal.ToDouble(gameProperty)/src; var percentage = gameProperty/src;
if (LayerProperty == "Width") if (LayerProperty == "Width")
ApplyWidth(properties, percentage); ApplyWidth(properties, percentage);
@ -60,9 +60,9 @@ namespace Artemis.Profiles.Layers.Models
ApplyOpacity(properties, percentage); ApplyOpacity(properties, percentage);
} }
private void ApplyWidth(LayerPropertiesModel properties, double percentage) private void ApplyWidth(LayerPropertiesModel properties, float percentage)
{ {
var newWidth = percentage*properties.Width; var newWidth = percentage*(float) properties.Width;
var difference = properties.Width - newWidth; var difference = properties.Width - newWidth;
properties.Width = newWidth; properties.Width = newWidth;
@ -71,9 +71,9 @@ namespace Artemis.Profiles.Layers.Models
properties.X = properties.X + difference; properties.X = properties.X + difference;
} }
private void ApplyHeight(LayerPropertiesModel properties, double percentage) private void ApplyHeight(LayerPropertiesModel properties, float percentage)
{ {
var newHeight = percentage*properties.Height; var newHeight = percentage*(float) properties.Height;
var difference = properties.Height - newHeight; var difference = properties.Height - newHeight;
properties.Height = newHeight; properties.Height = newHeight;
@ -81,9 +81,9 @@ namespace Artemis.Profiles.Layers.Models
properties.Y = properties.Y + difference; properties.Y = properties.Y + difference;
} }
private void ApplyOpacity(LayerPropertiesModel properties, double percentage) private void ApplyOpacity(LayerPropertiesModel properties, float percentage)
{ {
properties.Opacity = percentage*properties.Opacity; properties.Opacity = percentage*(float) properties.Opacity;
if (properties.Opacity < 0.0) if (properties.Opacity < 0.0)
properties.Opacity = 0.0; properties.Opacity = 0.0;
if (properties.Opacity > 1.0) if (properties.Opacity > 1.0)
@ -100,7 +100,7 @@ namespace Artemis.Profiles.Layers.Models
private void ApplyPercentageOfProperty(IDataModel dataModel, LayerPropertiesModel properties) private void ApplyPercentageOfProperty(IDataModel dataModel, LayerPropertiesModel properties)
{ {
var value = dataModel.GetPropValue<int>(PercentageProperty); var value = dataModel.GetPropValue<float>(PercentageProperty);
ApplyPercentageOf(dataModel, properties, value); ApplyPercentageOf(dataModel, properties, value);
} }
} }

View File

@ -93,6 +93,9 @@ namespace Artemis.Utilities
if (retVal == null) if (retVal == null)
return default(T); return default(T);
if (typeof(T) == typeof(float) && retVal.GetType() != typeof(float))
retVal = float.Parse(retVal.ToString());
// throws InvalidCastException if types are incompatible // throws InvalidCastException if types are incompatible
return (T) retVal; return (T) retVal;
} }

View File

@ -77,6 +77,8 @@ namespace Artemis.Utilities
var friendlyName = Empty; var friendlyName = Empty;
if (propertyInfo.PropertyType.Name == "Int32") if (propertyInfo.PropertyType.Name == "Int32")
friendlyName = "(Number)"; friendlyName = "(Number)";
else if (propertyInfo.PropertyType.Name == "Single")
friendlyName = "(Decimal)";
else if (propertyInfo.PropertyType.Name == "String") else if (propertyInfo.PropertyType.Name == "String")
friendlyName = "(Text)"; friendlyName = "(Text)";
else if (propertyInfo.PropertyType.Name == "Boolean") else if (propertyInfo.PropertyType.Name == "Boolean")

View File

@ -1,4 +1,6 @@
using Artemis.Managers; using System;
using Artemis.Events;
using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Services; using Artemis.Services;
using Caliburn.Micro; using Caliburn.Micro;
@ -17,6 +19,14 @@ namespace Artemis.ViewModels.Abstract
{ {
MainManager = mainManager; MainManager = mainManager;
EffectModel = effectModel; EffectModel = effectModel;
EffectSettings = effectModel.Settings;
MainManager.OnEnabledChangedEvent += MainManagerOnOnEnabledChangedEvent;
}
private void MainManagerOnOnEnabledChangedEvent(object sender, EnabledChangedEventArgs e)
{
NotifyOfPropertyChange(() => EffectEnabled);
} }
[Inject] [Inject]

View File

@ -15,20 +15,16 @@ namespace Artemis.ViewModels.Abstract
{ {
private GameSettings _gameSettings; private GameSettings _gameSettings;
protected GameViewModel(MainManager mainManager, GameModel gameModel, IEventAggregator events, protected GameViewModel(MainManager mainManager, GameModel gameModel, IProfileEditorVmFactory pFactory)
IProfileEditorVmFactory pFactory)
{ {
MainManager = mainManager; MainManager = mainManager;
GameModel = gameModel; GameModel = gameModel;
Events = events;
PFactory = pFactory; PFactory = pFactory;
GameSettings = gameModel.Settings; GameSettings = gameModel.Settings;
ProfileEditor = PFactory.CreateProfileEditorVm(Events, mainManager, gameModel, ProfileEditor = PFactory.CreateProfileEditorVm(mainManager, gameModel, GameSettings.LastProfile);
GameSettings.LastProfile);
GameModel.Profile = ProfileEditor.SelectedProfile; GameModel.Profile = ProfileEditor.SelectedProfile;
ProfileEditor.PropertyChanged += ProfileUpdater; ProfileEditor.PropertyChanged += ProfileUpdater;
Events.Subscribe(this);
} }
[Inject] [Inject]
@ -40,7 +36,6 @@ namespace Artemis.ViewModels.Abstract
[Inject] [Inject]
public MetroDialogService DialogService { get; set; } public MetroDialogService DialogService { get; set; }
public IEventAggregator Events { get; set; }
public IProfileEditorVmFactory PFactory { get; set; } public IProfileEditorVmFactory PFactory { get; set; }
public ProfileEditorViewModel ProfileEditor { get; set; } public ProfileEditorViewModel ProfileEditor { get; set; }

View File

@ -11,9 +11,11 @@ namespace Artemis.ViewModels.Abstract
protected readonly MainManager MainManager; protected readonly MainManager MainManager;
private OverlaySettings _overlaySettings; private OverlaySettings _overlaySettings;
protected OverlayViewModel(MainManager mainManager) protected OverlayViewModel(MainManager mainManager, OverlayModel overlayModel)
{ {
MainManager = mainManager; MainManager = mainManager;
OverlayModel = overlayModel;
OverlaySettings = overlayModel.Settings;
} }
[Inject] [Inject]

View File

@ -1,19 +1,13 @@
using System.Windows; using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using Artemis.Events;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public class DebugViewModel : Screen, IHandle<RazerColorArrayChanged> public class DebugViewModel : Screen
{ {
private readonly IEventAggregator _events;
private DrawingImage _razerDisplay;
public DebugViewModel(IEventAggregator events) private DrawingImage _razerDisplay;
{
_events = events;
}
public DrawingImage RazerDisplay public DrawingImage RazerDisplay
{ {
@ -26,8 +20,12 @@ namespace Artemis.ViewModels
} }
} }
public void Handle(RazerColorArrayChanged message) public void UpdateRazerDisplay(Color[,] colors)
{ {
// No point updating the display if the view isn't visible
if (!IsActive)
return;
var visual = new DrawingVisual(); var visual = new DrawingVisual();
using (var dc = visual.RenderOpen()) using (var dc = visual.RenderOpen())
{ {
@ -35,24 +33,12 @@ namespace Artemis.ViewModels
for (var y = 0; y < 6; y++) for (var y = 0; y < 6; y++)
{ {
for (var x = 0; x < 22; x++) for (var x = 0; x < 22; x++)
dc.DrawRectangle(new SolidColorBrush(message.Colors[y, x]), null, new Rect(x, y, 1, 1)); dc.DrawRectangle(new SolidColorBrush(colors[y, x]), null, new Rect(x, y, 1, 1));
} }
} }
var drawnDisplay = new DrawingImage(visual.Drawing); var drawnDisplay = new DrawingImage(visual.Drawing);
drawnDisplay.Freeze(); drawnDisplay.Freeze();
RazerDisplay = drawnDisplay; RazerDisplay = drawnDisplay;
} }
protected override void OnActivate()
{
_events.Subscribe(this);
base.OnActivate();
}
protected override void OnDeactivate(bool close)
{
_events.Unsubscribe(this);
base.OnDeactivate(close);
}
} }
} }

View File

@ -1,4 +1,5 @@
using Artemis.ViewModels.Abstract; using System.Linq;
using Artemis.ViewModels.Abstract;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
@ -16,7 +17,7 @@ namespace Artemis.ViewModels
{ {
base.OnActivate(); base.OnActivate();
foreach (var effectViewModel in _effectViewModels) foreach (var effectViewModel in _effectViewModels.OrderBy(e => e.DisplayName))
ActivateItem(effectViewModel); ActivateItem(effectViewModel);
} }
} }

View File

@ -14,8 +14,7 @@ using ILogger = Ninject.Extensions.Logging.ILogger;
namespace Artemis.ViewModels.Flyouts namespace Artemis.ViewModels.Flyouts
{ {
public sealed class FlyoutSettingsViewModel : FlyoutBaseViewModel, IHandle<ToggleEnabled>, public sealed class FlyoutSettingsViewModel : FlyoutBaseViewModel
IHandle<ActiveEffectChanged>
{ {
private readonly DebugViewModel _debugViewModel; private readonly DebugViewModel _debugViewModel;
private readonly ILogger _logger; private readonly ILogger _logger;
@ -24,8 +23,7 @@ namespace Artemis.ViewModels.Flyouts
private GeneralSettings _generalSettings; private GeneralSettings _generalSettings;
private string _selectedKeyboardProvider; private string _selectedKeyboardProvider;
public FlyoutSettingsViewModel(MainManager mainManager, IEventAggregator events, ILogger logger, public FlyoutSettingsViewModel(MainManager mainManager, ILogger logger, DebugViewModel debugViewModel)
DebugViewModel debugViewModel)
{ {
_logger = logger; _logger = logger;
_debugViewModel = debugViewModel; _debugViewModel = debugViewModel;
@ -39,7 +37,8 @@ namespace Artemis.ViewModels.Flyouts
LogLevels.AddRange(LogLevel.AllLoggingLevels.Select(l => l.Name)); LogLevels.AddRange(LogLevel.AllLoggingLevels.Select(l => l.Name));
PropertyChanged += KeyboardUpdater; PropertyChanged += KeyboardUpdater;
events.Subscribe(this); mainManager.OnEnabledChangedEvent += MainManagerOnOnEnabledChangedEvent;
mainManager.EffectManager.OnEffectChangedEvent += EffectManagerOnOnEffectChangedEvent;
} }
public MainManager MainManager { get; set; } public MainManager MainManager { get; set; }
@ -70,8 +69,9 @@ namespace Artemis.ViewModels.Flyouts
{ {
get get
{ {
var collection = var collection = new BindableCollection<string>
new BindableCollection<string>(MainManager.DeviceManager.KeyboardProviders.Select(k => k.Name)); (MainManager.DeviceManager.KeyboardProviders.Select(k => k.Name));
collection.Insert(0, "None"); collection.Insert(0, "None");
return collection; return collection;
} }
@ -145,17 +145,17 @@ namespace Artemis.ViewModels.Flyouts
} }
} }
public void Handle(ActiveEffectChanged message) private void MainManagerOnOnEnabledChangedEvent(object sender, EnabledChangedEventArgs enabledChangedEventArgs)
{
var effectDisplay = string.IsNullOrEmpty(message.ActiveEffect) ? message.ActiveEffect : "none";
ActiveEffectName = $"Active effect: {effectDisplay}";
}
public void Handle(ToggleEnabled message)
{ {
NotifyOfPropertyChange(() => Enabled); NotifyOfPropertyChange(() => Enabled);
} }
private void EffectManagerOnOnEffectChangedEvent(object sender, EffectChangedEventArgs e)
{
var effectDisplay = string.IsNullOrEmpty(e.Effect?.Name) ? "none" : e.Effect.Name;
ActiveEffectName = $"Active effect: {effectDisplay}";
}
/// <summary> /// <summary>
/// Takes proper action when the selected keyboard is changed in the UI /// Takes proper action when the selected keyboard is changed in the UI
/// </summary> /// </summary>
@ -211,7 +211,7 @@ namespace Artemis.ViewModels.Flyouts
public void NavigateTo(string url) public void NavigateTo(string url)
{ {
System.Diagnostics.Process.Start(new ProcessStartInfo(url)); Process.Start(new ProcessStartInfo(url));
} }
protected override void HandleOpen() protected override void HandleOpen()

View File

@ -1,4 +1,5 @@
using Artemis.Managers; using System.Linq;
using Artemis.Managers;
using Artemis.Modules.Effects.ProfilePreview; using Artemis.Modules.Effects.ProfilePreview;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
@ -22,7 +23,7 @@ namespace Artemis.ViewModels
{ {
base.OnActivate(); base.OnActivate();
foreach (var gameViewModel in _gameViewModels) foreach (var gameViewModel in _gameViewModels.OrderBy(g => g.DisplayName))
ActivateItem(gameViewModel); ActivateItem(gameViewModel);
} }
} }

View File

@ -156,6 +156,7 @@ namespace Artemis.ViewModels.Profiles
switch (SelectedDataModelProp.Type) switch (SelectedDataModelProp.Type)
{ {
case "Int32": case "Int32":
case "Single":
Operators.AddRange(_int32Operators); Operators.AddRange(_int32Operators);
UserValueIsVisible = true; UserValueIsVisible = true;
break; break;

View File

@ -144,11 +144,11 @@ namespace Artemis.ViewModels.Profiles
{ {
new GeneralHelpers.PropertyCollection {Display = "None"} new GeneralHelpers.PropertyCollection {Display = "None"}
}; };
Targets.AddRange(dataModelProps.Where(p => p.Type == "Int32")); Targets.AddRange(dataModelProps.Where(p => p.Type == "Int32" || p.Type == "Single"));
// Populate sources combobox // Populate sources combobox
Sources = new BindableCollection<GeneralHelpers.PropertyCollection>(); Sources = new BindableCollection<GeneralHelpers.PropertyCollection>();
Sources.AddRange(dataModelProps.Where(p => p.Type == "Int32")); Sources.AddRange(dataModelProps.Where(p => p.Type == "Int32" || p.Type == "Single"));
// Preselect according to the model // Preselect according to the model
SelectedTarget = dataModelProps.FirstOrDefault(p => p.Path == Proposed.GameProperty); SelectedTarget = dataModelProps.FirstOrDefault(p => p.Path == Proposed.GameProperty);

View File

@ -32,7 +32,7 @@ using Timer = System.Timers.Timer;
namespace Artemis.ViewModels.Profiles namespace Artemis.ViewModels.Profiles
{ {
public sealed class ProfileEditorViewModel : Screen, IHandle<ActiveKeyboardChanged>, IDropTarget public sealed class ProfileEditorViewModel : Screen, IDropTarget
{ {
private readonly EffectModel _gameModel; private readonly EffectModel _gameModel;
private readonly ILayerEditorVmFactory _layerEditorVmFactory; private readonly ILayerEditorVmFactory _layerEditorVmFactory;
@ -44,9 +44,8 @@ namespace Artemis.ViewModels.Profiles
private bool _saving; private bool _saving;
private ProfileModel _selectedProfile; private ProfileModel _selectedProfile;
public ProfileEditorViewModel(IEventAggregator events, MainManager mainManager, EffectModel gameModel, public ProfileEditorViewModel(MainManager mainManager, EffectModel gameModel, ProfileViewModel profileViewModel,
ProfileViewModel profileViewModel, MetroDialogService dialogService, string lastProfile, MetroDialogService dialogService, string lastProfile, ILayerEditorVmFactory layerEditorVmFactory)
ILayerEditorVmFactory layerEditorVmFactory)
{ {
_mainManager = mainManager; _mainManager = mainManager;
_gameModel = gameModel; _gameModel = gameModel;
@ -58,11 +57,9 @@ namespace Artemis.ViewModels.Profiles
DialogService = dialogService; DialogService = dialogService;
LastProfile = lastProfile; LastProfile = lastProfile;
events.Subscribe(this);
PropertyChanged += EditorStateHandler; PropertyChanged += EditorStateHandler;
ProfileViewModel.PropertyChanged += LayerSelectedHandler; ProfileViewModel.PropertyChanged += LayerSelectedHandler;
mainManager.DeviceManager.OnKeyboardChangedEvent += DeviceManagerOnOnKeyboardChangedEvent;
_saveTimer = new Timer(5000); _saveTimer = new Timer(5000);
_saveTimer.Elapsed += ProfileSaveHandler; _saveTimer.Elapsed += ProfileSaveHandler;
@ -199,12 +196,10 @@ namespace Artemis.ViewModels.Profiles
UpdateLayerList(source); UpdateLayerList(source);
} }
/// <summary> /// <summary>
/// Handles chaning the active keyboard, updating the preview image and profiles collection /// Handles chaning the active keyboard, updating the preview image and profiles collection
/// </summary> /// </summary>
/// <param name="message"></param> private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs e)
public void Handle(ActiveKeyboardChanged message)
{ {
NotifyOfPropertyChange(() => PreviewSettings); NotifyOfPropertyChange(() => PreviewSettings);
LoadProfiles(); LoadProfiles();
@ -529,7 +524,8 @@ namespace Artemis.ViewModels.Profiles
while (ProfileProvider.GetAll().Any(p => p.Name == name && p.GameName == SelectedProfile.GameName && while (ProfileProvider.GetAll().Any(p => p.Name == name && p.GameName == SelectedProfile.GameName &&
p.KeyboardSlug == SelectedProfile.KeyboardSlug)) p.KeyboardSlug == SelectedProfile.KeyboardSlug))
{ {
name = await DialogService.ShowInputDialog("Name already in use", "Please enter a unique new profile name"); name =
await DialogService.ShowInputDialog("Name already in use", "Please enter a unique new profile name");
// Null when the user cancelled // Null when the user cancelled
if (string.IsNullOrEmpty(name) || name.Length < 2) if (string.IsNullOrEmpty(name) || name.Length < 2)

View File

@ -20,7 +20,7 @@ using MahApps.Metro;
namespace Artemis.ViewModels.Profiles namespace Artemis.ViewModels.Profiles
{ {
public class ProfileViewModel : PropertyChangedBase, IHandle<ActiveKeyboardChanged> public class ProfileViewModel : PropertyChangedBase
{ {
private readonly DeviceManager _deviceManager; private readonly DeviceManager _deviceManager;
private double _blurProgress; private double _blurProgress;
@ -34,15 +34,15 @@ namespace Artemis.ViewModels.Profiles
private LayerModel _selectedLayer; private LayerModel _selectedLayer;
private bool _showAll; private bool _showAll;
public ProfileViewModel(IEventAggregator events, DeviceManager deviceManager) public ProfileViewModel(DeviceManager deviceManager)
{ {
events.Subscribe(this);
_deviceManager = deviceManager; _deviceManager = deviceManager;
PreviewTimer = new Timer(40); PreviewTimer = new Timer(40);
ShowAll = false; ShowAll = false;
PreviewTimer.Elapsed += InvokeUpdateKeyboardPreview; PreviewTimer.Elapsed += InvokeUpdateKeyboardPreview;
deviceManager.OnKeyboardChangedEvent += DeviceManagerOnOnKeyboardChangedEvent;
} }
public ProfileModel SelectedProfile { get; set; } public ProfileModel SelectedProfile { get; set; }
@ -97,7 +97,7 @@ namespace Artemis.ViewModels.Profiles
public bool Activated { get; set; } public bool Activated { get; set; }
public void Handle(ActiveKeyboardChanged message) private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs e)
{ {
NotifyOfPropertyChange(() => KeyboardImage); NotifyOfPropertyChange(() => KeyboardImage);
} }
@ -359,7 +359,7 @@ namespace Artemis.ViewModels.Profiles
else if (SelectedLayer.LayerType is FolderType) else if (SelectedLayer.LayerType is FolderType)
drawLayers = SelectedLayer.GetLayers().ToList(); drawLayers = SelectedLayer.GetLayers().ToList();
else else
drawLayers = new List<LayerModel> { SelectedLayer }; drawLayers = new List<LayerModel> {SelectedLayer};
return drawLayers; return drawLayers;
} }

View File

@ -10,18 +10,11 @@ namespace Artemis.ViewModels
{ {
public sealed class ShellViewModel : Conductor<IScreen>.Collection.OneActive public sealed class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{ {
private readonly DeviceManager _deviceManager;
private readonly MetroDialogService _dialogService;
private readonly BaseViewModel[] _viewModels; private readonly BaseViewModel[] _viewModels;
public ShellViewModel(IKernel kernel, IEventAggregator events, BaseViewModel[] viewModels, public ShellViewModel(IKernel kernel, BaseViewModel[] viewModels)
DeviceManager deviceManager, MetroDialogService dialogService)
{ {
_viewModels = viewModels; _viewModels = viewModels;
_deviceManager = deviceManager;
_dialogService = dialogService;
events.Subscribe(this);
// Setup UI // Setup UI
DisplayName = "Artemis"; DisplayName = "Artemis";

View File

@ -10,18 +10,17 @@ using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public class SystemTrayViewModel : Screen, IHandle<ToggleEnabled> public class SystemTrayViewModel : Screen
{ {
private readonly ShellViewModel _shellViewModel; private readonly ShellViewModel _shellViewModel;
private readonly IWindowManager _windowManager; private readonly IWindowManager _windowManager;
private string _activeIcon; private string _activeIcon;
private bool _checked;
private bool _enabled; private bool _enabled;
private string _toggleText; private string _toggleText;
private bool _checked;
public SystemTrayViewModel(IWindowManager windowManager, IEventAggregator events, public SystemTrayViewModel(IWindowManager windowManager, MetroDialogService dialogService,
MetroDialogService dialogService, ShellViewModel shellViewModel, ShellViewModel shellViewModel, MainManager mainManager)
MainManager mainManager)
{ {
_windowManager = windowManager; _windowManager = windowManager;
_shellViewModel = shellViewModel; _shellViewModel = shellViewModel;
@ -29,9 +28,10 @@ namespace Artemis.ViewModels
DialogService = dialogService; DialogService = dialogService;
MainManager = mainManager; MainManager = mainManager;
events.Subscribe(this);
MainManager.EnableProgram(); MainManager.EnableProgram();
MainManager.OnEnabledChangedEvent += MainManagerOnOnEnabledChangedEvent;
Enabled = !General.Default.Suspended;
if (General.Default.ShowOnStartup) if (General.Default.ShowOnStartup)
ShowWindow(); ShowWindow();
} }
@ -41,7 +41,6 @@ namespace Artemis.ViewModels
public MainManager MainManager { get; set; } public MainManager MainManager { get; set; }
public bool CanShowWindow => !_shellViewModel.IsActive; public bool CanShowWindow => !_shellViewModel.IsActive;
public bool CanHideWindow => _shellViewModel.IsActive && !MainManager.DeviceManager.ChangingKeyboard; public bool CanHideWindow => _shellViewModel.IsActive && !MainManager.DeviceManager.ChangingKeyboard;
public bool CanToggleEnabled => !MainManager.DeviceManager.ChangingKeyboard; public bool CanToggleEnabled => !MainManager.DeviceManager.ChangingKeyboard;
@ -82,9 +81,9 @@ namespace Artemis.ViewModels
public Mutex Mutex { get; set; } public Mutex Mutex { get; set; }
public void Handle(ToggleEnabled message) private void MainManagerOnOnEnabledChangedEvent(object sender, EnabledChangedEventArgs e)
{ {
Enabled = message.Enabled; Enabled = e.Enabled;
} }
public void ToggleEnabled() public void ToggleEnabled()

View File

@ -3,7 +3,6 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Artemis.Views"
xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"> d:DesignHeight="300" d:DesignWidth="300">

Binary file not shown.

View File

@ -17,6 +17,7 @@
<package id="NAudio" version="1.7.3" targetFramework="net452" /> <package id="NAudio" version="1.7.3" targetFramework="net452" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" />
<package id="Ninject" version="3.2.2.0" targetFramework="net452" /> <package id="Ninject" version="3.2.2.0" targetFramework="net452" />
<package id="Ninject.Extensions.Conventions" version="3.2.0.0" targetFramework="net461" />
<package id="Ninject.Extensions.Factory" version="3.2.1.0" targetFramework="net452" /> <package id="Ninject.Extensions.Factory" version="3.2.1.0" targetFramework="net452" />
<package id="Ninject.Extensions.Logging" version="3.2.3.0" targetFramework="net452" /> <package id="Ninject.Extensions.Logging" version="3.2.3.0" targetFramework="net452" />
<package id="Ninject.Extensions.Logging.nlog4" version="3.2.3.0" targetFramework="net452" /> <package id="Ninject.Extensions.Logging.nlog4" version="3.2.3.0" targetFramework="net452" />