diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj
index 67a903f4e..542b424c5 100644
--- a/Artemis/Artemis/Artemis.csproj
+++ b/Artemis/Artemis/Artemis.csproj
@@ -196,7 +196,7 @@
True
- ..\packages\NLog.4.3.3\lib\net45\NLog.dll
+ ..\packages\NLog.4.3.4\lib\net45\NLog.dll
True
@@ -283,7 +283,7 @@
-
+
diff --git a/Artemis/Artemis/DAL/ProfileProvider.cs b/Artemis/Artemis/DAL/ProfileProvider.cs
index df35270f5..da672dd5f 100644
--- a/Artemis/Artemis/DAL/ProfileProvider.cs
+++ b/Artemis/Artemis/DAL/ProfileProvider.cs
@@ -96,5 +96,24 @@ namespace Artemis.DAL
Directory.CreateDirectory(ProfileFolder);
Debug.WriteLine("Place presets");
}
+
+ public static ProfileModel LoadProfileIfValid(string path)
+ {
+ try
+ {
+ var deserializer = new XmlSerializer(typeof(ProfileModel));
+ using (var file = new StreamReader(path))
+ {
+ var prof = (ProfileModel) deserializer.Deserialize(file);
+ if (!(prof.GameName?.Length > 1) || !(prof.KeyboardName?.Length > 1) || !(prof.Name?.Length > 1))
+ return null;
+ return prof;
+ }
+ }
+ catch (InvalidOperationException)
+ {
+ return null;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsiarHeadsets.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadsets.cs
similarity index 95%
rename from Artemis/Artemis/DeviceProviders/Corsair/CorsiarHeadsets.cs
rename to Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadsets.cs
index 120d8945d..e52bfc626 100644
--- a/Artemis/Artemis/DeviceProviders/Corsair/CorsiarHeadsets.cs
+++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairHeadsets.cs
@@ -33,7 +33,7 @@ namespace Artemis.DeviceProviders.Corsair
public override void Disable()
{
if (CueSDK.ProtocolDetails != null)
- CueSDK.Reinitialize();
+ CueSDK.Reinitialize(true);
}
public override void UpdateDevice(Brush brush)
@@ -72,7 +72,7 @@ namespace Artemis.DeviceProviders.Corsair
try
{
if (CueSDK.ProtocolDetails == null)
- CueSDK.Initialize();
+ CueSDK.Initialize(true);
else
return true;
}
@@ -87,7 +87,7 @@ namespace Artemis.DeviceProviders.Corsair
}
catch (WrapperException)
{
- CueSDK.Reinitialize();
+ CueSDK.Reinitialize(true);
return true;
}
diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMice.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMice.cs
index 55fc2be6d..3f272988e 100644
--- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairMice.cs
+++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairMice.cs
@@ -33,7 +33,7 @@ namespace Artemis.DeviceProviders.Corsair
public override void Disable()
{
if (CueSDK.ProtocolDetails != null)
- CueSDK.Reinitialize();
+ CueSDK.Reinitialize(true);
}
public override void UpdateDevice(Brush brush)
@@ -73,7 +73,7 @@ namespace Artemis.DeviceProviders.Corsair
try
{
if (CueSDK.ProtocolDetails == null)
- CueSDK.Initialize();
+ CueSDK.Initialize(true);
else
return true;
}
@@ -88,7 +88,7 @@ namespace Artemis.DeviceProviders.Corsair
}
catch (WrapperException)
{
- CueSDK.Reinitialize();
+ CueSDK.Reinitialize(true);
return true;
}
diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairRGB.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairRGB.cs
index 025c4f7c8..8c27d6a6e 100644
--- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairRGB.cs
+++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairRGB.cs
@@ -33,7 +33,7 @@ namespace Artemis.DeviceProviders.Corsair
try
{
if (CueSDK.ProtocolDetails == null)
- CueSDK.Initialize();
+ CueSDK.Initialize(true);
}
catch (CUEException e)
{
@@ -46,7 +46,7 @@ namespace Artemis.DeviceProviders.Corsair
}
catch (WrapperException)
{
- CueSDK.Reinitialize();
+ CueSDK.Reinitialize(true);
return true;
}
@@ -93,7 +93,7 @@ namespace Artemis.DeviceProviders.Corsair
public override void Disable()
{
if (CueSDK.ProtocolDetails != null)
- CueSDK.Reinitialize();
+ CueSDK.Reinitialize(true);
}
///
diff --git a/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs b/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs
index 35ed776cc..f1480d999 100644
--- a/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs
+++ b/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs
@@ -23,9 +23,13 @@ namespace Artemis.Models.Profiles
// Put the subject in a list, allowing Dynamic Linq to be used.
var subjectList = new List {(T) subject};
- var res = Type == "String"
- ? subjectList.Where($"{Field}.ToLower() {Operator} @0", Value.ToLower()).Any()
- : subjectList.Where($"{Field} {Operator} {Value}").Any();
+ bool res;
+ if (Type == "String")
+ res = subjectList.Where($"{Field}.ToLower() {Operator} @0", Value.ToLower()).Any();
+ else if (Type == "Enum")
+ res = subjectList.Where($"{Field} {Operator} \"{Value}\"").Any();
+ else
+ res = subjectList.Where($"{Field} {Operator} {Value}").Any();
return res;
}
}
diff --git a/Artemis/Artemis/Models/Profiles/LayerModel.cs b/Artemis/Artemis/Models/Profiles/LayerModel.cs
index 149dd7819..f6e6b1ad6 100644
--- a/Artemis/Artemis/Models/Profiles/LayerModel.cs
+++ b/Artemis/Artemis/Models/Profiles/LayerModel.cs
@@ -166,12 +166,12 @@ namespace Artemis.Models.Profiles
return Enabled && (LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif);
}
- public IEnumerable GetAllLayers()
+ public IEnumerable GetAllLayers(bool ignoreEnabled)
{
var layers = new List();
foreach (var layerModel in Children)
{
- if (!layerModel.Enabled)
+ if (ignoreEnabled && !layerModel.Enabled)
continue;
layers.Add(layerModel);
layers.AddRange(layerModel.Children);
diff --git a/Artemis/Artemis/Models/Profiles/ProfileModel.cs b/Artemis/Artemis/Models/Profiles/ProfileModel.cs
index 578aa6e10..43de4b4e9 100644
--- a/Artemis/Artemis/Models/Profiles/ProfileModel.cs
+++ b/Artemis/Artemis/Models/Profiles/ProfileModel.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Windows;
@@ -11,6 +10,8 @@ using Artemis.Utilities;
using Artemis.Utilities.ParentChild;
using Brush = System.Windows.Media.Brush;
using Color = System.Windows.Media.Color;
+using Point = System.Windows.Point;
+using Size = System.Windows.Size;
namespace Artemis.Models.Profiles
{
@@ -137,18 +138,38 @@ namespace Artemis.Models.Profiles
///
/// Gives all the layers and their children in a flat list
///
- public List GetEnabledLayers()
+ public List GetLayers(bool ignoreEnabled = true)
{
var layers = new List();
foreach (var layerModel in Layers)
{
- if (!layerModel.Enabled)
+ if (ignoreEnabled && !layerModel.Enabled)
+ {
continue;
+ }
layers.Add(layerModel);
- layers.AddRange(layerModel.GetAllLayers());
+ layers.AddRange(layerModel.GetAllLayers(ignoreEnabled));
}
-
+
return layers;
}
+
+ public void FixBoundaries(Rect keyboardRectangle)
+ {
+ foreach (var layer in GetLayers(false))
+ {
+ if (layer.LayerType != LayerType.Keyboard && layer.LayerType != LayerType.KeyboardGif)
+ continue;
+
+ var props = (KeyboardPropertiesModel) layer.Properties;
+ var layerRect = new Rect(new Point(props.X, props.Y), new Size(props.Width, props.Height));
+ if (keyboardRectangle.Contains(layerRect))
+ continue;
+
+ props.X = 0;
+ props.Y = 0;
+ layer.Properties = props;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionView.xaml b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionView.xaml
index dcef1f75d..4e60f4d04 100644
--- a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionView.xaml
+++ b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionView.xaml
@@ -15,16 +15,17 @@
-
+
-
+
+
@@ -36,10 +37,11 @@
-
- Note: For this game to work with Artemis, please open up your Division settings, navigate to 3rd Party and set LED keyboard support to Yes. (This only works if you have Artemis running before starting the game)
+ Note: For this game to work with Artemis, please open up your Division settings, navigate to 3rd Party
+ and set LED keyboard support to Yes. (This only works if you have Artemis running before starting the game)
diff --git a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3View.xaml b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3View.xaml
index 55ece4f20..6e4b10bba 100644
--- a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3View.xaml
+++ b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3View.xaml
@@ -16,8 +16,8 @@
-
+
+ TextWrapping="Wrap" HorizontalAlignment="Left" FontFamily="Segoe UI Semibold" TextAlignment="Justify" MaxWidth="820">
Artemis requires the latest Witcher 3 version and mod to be installed in order to work. If you don't use any (conflicting) Witcher 3 mods, the mod can automatically be installed.
-
-
- Note: If you do use conflicting mods, we'll let you know what to do.
-
-
+
+
+
+
diff --git a/Artemis/Artemis/ViewModels/LayerEditor/LayerConditionViewModel.cs b/Artemis/Artemis/ViewModels/LayerEditor/LayerConditionViewModel.cs
index 1a1fe2e0f..edc26b714 100644
--- a/Artemis/Artemis/ViewModels/LayerEditor/LayerConditionViewModel.cs
+++ b/Artemis/Artemis/ViewModels/LayerEditor/LayerConditionViewModel.cs
@@ -6,7 +6,7 @@ using Caliburn.Micro;
namespace Artemis.ViewModels.LayerEditor
{
- public class LayerConditionViewModel : Screen
+ public sealed class LayerConditionViewModel : Screen
{
private readonly NamedOperator[] _boolOperators =
{
@@ -32,9 +32,10 @@ namespace Artemis.ViewModels.LayerEditor
new NamedOperator("Not equal to", "!=")
};
+ private bool _enumValueIsVisible;
private bool _preselecting;
-
private GeneralHelpers.PropertyCollection _selectedDataModelProp;
+ private string _selectedEnum;
private NamedOperator _selectedOperator;
private string _userValue;
private bool _userValueIsVisible;
@@ -48,6 +49,7 @@ namespace Artemis.ViewModels.LayerEditor
LayerConditionModel = layerConditionModel;
DataModelProps = dataModelProps;
Operators = new BindableCollection();
+ Enums = new BindableCollection();
PropertyChanged += UpdateModel;
PropertyChanged += UpdateForm;
@@ -55,6 +57,13 @@ namespace Artemis.ViewModels.LayerEditor
PreSelect();
}
+ public LayerConditionModel LayerConditionModel { get; set; }
+
+ public BindableCollection DataModelProps { get; set; }
+
+ public BindableCollection Operators { get; set; }
+ public BindableCollection Enums { get; set; }
+
public string UserValue
{
get { return _userValue; }
@@ -66,10 +75,6 @@ namespace Artemis.ViewModels.LayerEditor
}
}
- public LayerConditionModel LayerConditionModel { get; set; }
- public BindableCollection DataModelProps { get; set; }
- public BindableCollection Operators { get; set; }
-
public GeneralHelpers.PropertyCollection SelectedDataModelProp
{
get { return _selectedDataModelProp; }
@@ -93,6 +98,17 @@ namespace Artemis.ViewModels.LayerEditor
}
}
+ public bool EnumValueIsVisible
+ {
+ get { return _enumValueIsVisible; }
+ set
+ {
+ if (value == _enumValueIsVisible) return;
+ _enumValueIsVisible = value;
+ NotifyOfPropertyChange(() => EnumValueIsVisible);
+ }
+ }
+
public NamedOperator SelectedOperator
{
get { return _selectedOperator; }
@@ -104,6 +120,17 @@ namespace Artemis.ViewModels.LayerEditor
}
}
+ public string SelectedEnum
+ {
+ get { return _selectedEnum; }
+ set
+ {
+ if (value == _selectedEnum) return;
+ _selectedEnum = value;
+ NotifyOfPropertyChange(() => SelectedEnum);
+ }
+ }
+
///
/// Handles updating the form to match the selected data model property
///
@@ -115,32 +142,35 @@ namespace Artemis.ViewModels.LayerEditor
return;
Operators.Clear();
+ UserValueIsVisible = false;
+ EnumValueIsVisible = false;
+
+ switch (SelectedDataModelProp.Type)
+ {
+ case "Int32":
+ Operators.AddRange(_int32Operators);
+ UserValueIsVisible = true;
+ break;
+ case "Boolean":
+ Operators.AddRange(_boolOperators);
+ break;
+ default:
+ Operators.AddRange(_operators);
+ UserValueIsVisible = true;
+ break;
+ }
+
+ // Setup Enum selection if needed
if (SelectedDataModelProp.EnumValues != null)
{
- Operators.AddRange(
- SelectedDataModelProp.EnumValues.Select(val => new NamedOperator(val.SplitCamelCase(), "== " + val)));
- UserValueIsVisible = false;
+ Enums.AddRange(SelectedDataModelProp.EnumValues);
+ EnumValueIsVisible = true;
}
- else
- switch (SelectedDataModelProp.Type)
- {
- case "Int32":
- Operators.AddRange(_int32Operators);
- UserValueIsVisible = true;
- break;
- case "Boolean":
- Operators.AddRange(_boolOperators);
- UserValueIsVisible = false;
- break;
- default:
- Operators.AddRange(_operators);
- UserValueIsVisible = true;
- break;
- }
SelectedOperator = Operators.First();
}
+
///
/// Handles saving user input to the model
/// TODO: Data validation?
@@ -156,13 +186,14 @@ namespace Artemis.ViewModels.LayerEditor
// Only care about these fields
if (e.PropertyName != "UserValue" &&
e.PropertyName != "SelectedOperator" &&
- e.PropertyName != "SelectedDataModelProp")
+ e.PropertyName != "SelectedDataModelProp" &&
+ e.PropertyName != "SelectedEnum")
return;
LayerConditionModel.Field = SelectedDataModelProp.Path;
LayerConditionModel.Operator = SelectedOperator.Value;
- LayerConditionModel.Value = UserValue;
LayerConditionModel.Type = SelectedDataModelProp.Type;
+ LayerConditionModel.Value = SelectedDataModelProp.Type == "Enum" ? SelectedEnum : UserValue;
}
///
@@ -173,8 +204,12 @@ namespace Artemis.ViewModels.LayerEditor
_preselecting = true;
SelectedDataModelProp = DataModelProps.FirstOrDefault(m => m.Path == LayerConditionModel.Field);
SelectedOperator = Operators.FirstOrDefault(o => o.Value == LayerConditionModel.Operator);
- UserValue = LayerConditionModel.Value;
LayerConditionModel.Type = SelectedDataModelProp.Type;
+ if (LayerConditionModel.Type =="Enum")
+ SelectedEnum = LayerConditionModel.Value;
+ else
+ UserValue = LayerConditionModel.Value;
+
_preselecting = false;
}
diff --git a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs
index 80dd431f2..c52b9979b 100644
--- a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs
+++ b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs
@@ -7,6 +7,7 @@ using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
+using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
@@ -25,6 +26,13 @@ using Caliburn.Micro;
using GongSolutions.Wpf.DragDrop;
using MahApps.Metro;
using Ninject;
+using Application = System.Windows.Application;
+using Cursor = System.Windows.Input.Cursor;
+using Cursors = System.Windows.Input.Cursors;
+using DragDropEffects = System.Windows.DragDropEffects;
+using IDropTarget = GongSolutions.Wpf.DragDrop.IDropTarget;
+using MouseEventArgs = System.Windows.Input.MouseEventArgs;
+using Screen = Caliburn.Micro.Screen;
using Timer = System.Timers.Timer;
namespace Artemis.ViewModels
@@ -45,7 +53,8 @@ namespace Artemis.ViewModels
private LayerModel _selectedLayer;
private ProfileModel _selectedProfile;
- public ProfileEditorViewModel(IEventAggregator events, MainManager mainManager, GameModel gameModel)
+ public ProfileEditorViewModel(IEventAggregator events, MainManager mainManager, GameModel gameModel,
+ MetroDialogService dialogService)
{
_mainManager = mainManager;
_gameModel = gameModel;
@@ -53,13 +62,13 @@ namespace Artemis.ViewModels
Profiles = new BindableCollection();
Layers = new BindableCollection();
ActiveKeyboard = _mainManager.DeviceManager.ActiveKeyboard;
+ DialogService = dialogService;
events.Subscribe(this);
PreviewTimer = new Timer(40);
PreviewTimer.Elapsed += InvokeUpdateKeyboardPreview;
-
PropertyChanged += PropertyChangeHandler;
LoadProfiles();
}
@@ -99,7 +108,7 @@ namespace Artemis.ViewModels
if (Equals(value, _selectedLayer)) return;
_selectedLayer = value;
NotifyOfPropertyChange(() => SelectedLayer);
- NotifyOfPropertyChange(() => CanRemoveLayer);
+ NotifyOfPropertyChange(() => LayerSelected);
}
}
@@ -127,8 +136,8 @@ namespace Artemis.ViewModels
Layers.AddRange(SelectedProfile.Layers);
NotifyOfPropertyChange(() => SelectedProfile);
- NotifyOfPropertyChange(() => CanAddLayer);
- NotifyOfPropertyChange(() => CanRemoveLayer);
+ NotifyOfPropertyChange(() => ProfileSelected);
+ NotifyOfPropertyChange(() => LayerSelected);
}
}
@@ -147,8 +156,8 @@ namespace Artemis.ViewModels
public PreviewSettings? PreviewSettings => ActiveKeyboard?.PreviewSettings;
- public bool CanAddLayer => SelectedProfile != null;
- public bool CanRemoveLayer => SelectedProfile != null && _selectedLayer != null;
+ public bool ProfileSelected => SelectedProfile != null;
+ public bool LayerSelected => SelectedProfile != null && _selectedLayer != null;
private KeyboardProvider ActiveKeyboard { get; set; }
@@ -293,6 +302,14 @@ namespace Artemis.ViewModels
SelectedProfile = profile;
}
+ public void EditLayer()
+ {
+ if (SelectedLayer == null)
+ return;
+
+ LayerEditor(SelectedLayer);
+ }
+
///
/// Opens a new LayerEditorView for the given layer
///
@@ -369,6 +386,14 @@ namespace Artemis.ViewModels
SelectedProfile.FixOrder();
}
+ public void CloneLayer()
+ {
+ if (SelectedLayer == null)
+ return;
+
+ CloneLayer(SelectedLayer);
+ }
+
///
/// Clones the given layer and adds it to the profile, on top of the original
///
@@ -426,7 +451,7 @@ namespace Artemis.ViewModels
var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width);
var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height);
- var hoverLayer = SelectedProfile.GetEnabledLayers()
+ var hoverLayer = SelectedProfile.GetLayers()
.Where(l => l.MustDraw())
.FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties)
.GetRect(1)
@@ -447,7 +472,7 @@ namespace Artemis.ViewModels
var pos = e.GetPosition((Image) e.OriginalSource);
var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width);
var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height);
- var hoverLayer = SelectedProfile.GetEnabledLayers()
+ var hoverLayer = SelectedProfile.GetLayers()
.Where(l => l.MustDraw())
.FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties)
.GetRect(1).Contains(x, y));
@@ -594,5 +619,59 @@ namespace Artemis.ViewModels
draggingProps.Y = (int) Math.Round(y - _draggingLayerOffset.Value.Y);
}
}
+
+ public async void ImportProfile()
+ {
+ var dialog = new OpenFileDialog {Filter = "Artemis profile (*.xml)|*.xml"};
+ var result = dialog.ShowDialog();
+ if (result != DialogResult.OK)
+ return;
+
+ var profile = ProfileProvider.LoadProfileIfValid(dialog.FileName);
+ if (profile == null)
+ {
+ DialogService.ShowErrorMessageBox("Oh noes, the profile you provided is invalid. " +
+ "If this keeps happening, please make an issue on GitHub and provide the profile.");
+ return;
+ }
+
+ // Verify the game
+ if (profile.GameName != _gameModel.Name)
+ {
+ DialogService.ShowErrorMessageBox(
+ $"Oh oops! This profile is ment for {profile.GameName}, not {_gameModel.Name} :c");
+ return;
+ }
+
+ // Verify the keyboard
+ if (profile.KeyboardName != _mainManager.DeviceManager.ActiveKeyboard.Name)
+ {
+ var adjustKeyboard = await DialogService.ShowQuestionMessageBox("Profile not inteded for this keyboard",
+ $"Watch out, this profile wasn't ment for this keyboard, but for the {profile.KeyboardName}. " +
+ "You can still import it but you'll probably have to do some adjusting\n\n" +
+ "Continue?");
+ if (!adjustKeyboard.Value)
+ return;
+
+ profile.KeyboardName = _mainManager.DeviceManager.ActiveKeyboard.Name;
+ profile.FixBoundaries(_mainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(1));
+ }
+
+ // Verify the name
+ while (ProfileProvider.GetAll().Contains(profile))
+ {
+ profile.Name = await DialogService.ShowInputDialog("Rename imported profile",
+ "A profile with this name already exists for this game. Please enter a new name");
+
+ // Null when the user cancelled
+ if (string.IsNullOrEmpty(profile.Name))
+ return;
+ }
+
+ ProfileProvider.AddOrUpdate(profile);
+ LoadProfiles();
+
+ SelectedProfile = Profiles.FirstOrDefault(p => p.Name == profile.Name);
+ }
}
}
\ No newline at end of file
diff --git a/Artemis/Artemis/Views/LayerEditor/LayerConditionView.xaml b/Artemis/Artemis/Views/LayerEditor/LayerConditionView.xaml
index cfbef9477..d0a68fdaf 100644
--- a/Artemis/Artemis/Views/LayerEditor/LayerConditionView.xaml
+++ b/Artemis/Artemis/Views/LayerEditor/LayerConditionView.xaml
@@ -54,6 +54,10 @@
+
+
+
-
+
+
+
+
+
@@ -144,18 +177,59 @@
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Artemis/Artemis/packages.config b/Artemis/Artemis/packages.config
index 8b6697134..f90e94faa 100644
--- a/Artemis/Artemis/packages.config
+++ b/Artemis/Artemis/packages.config
@@ -18,8 +18,8 @@
-
-
+
+