From 2cb8cac90dfaf325c84d4a30e9a90853af082283 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Tue, 22 Mar 2016 17:09:00 +0100 Subject: [PATCH] Implemented conditions logic --- Artemis/Artemis/Artemis.csproj | 12 +- .../Components/Abstract/LayerComponent.cs | 21 --- Artemis/Artemis/Components/Layer.cs | 13 -- Artemis/Artemis/Components/LayerComposite.cs | 17 --- Artemis/Artemis/DAL/ProfileProvider.cs | 1 + Artemis/Artemis/Managers/MainManager.cs | 1 - .../{ => Profiles}/LayerConditionModel.cs | 9 +- .../Profiles/LayerDynamicPropertiesModel.cs | 86 +++++++++++ Artemis/Artemis/Models/Profiles/LayerModel.cs | 135 ++++++++++++++++++ .../Models/Profiles/LayerPropertiesModel.cs | 25 ++++ .../Models/{ => Profiles}/ProfileModel.cs | 13 +- .../RocketLeague/RocketLeagueDataModel.cs | 9 ++ .../Artemis/Properties/Resources.Designer.cs | 62 ++++---- Artemis/Artemis/Properties/Resources.resx | 3 + Artemis/Artemis/Resources/folder.png | Bin 0 -> 17968 bytes .../ViewModels/ProfileEditorViewModel.cs | 50 ++++++- Artemis/Artemis/Views/ProfileEditorView.xaml | 108 +++----------- 17 files changed, 381 insertions(+), 184 deletions(-) delete mode 100644 Artemis/Artemis/Components/Abstract/LayerComponent.cs delete mode 100644 Artemis/Artemis/Components/Layer.cs delete mode 100644 Artemis/Artemis/Components/LayerComposite.cs rename Artemis/Artemis/Models/{ => Profiles}/LayerConditionModel.cs (56%) create mode 100644 Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs create mode 100644 Artemis/Artemis/Models/Profiles/LayerModel.cs create mode 100644 Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs rename Artemis/Artemis/Models/{ => Profiles}/ProfileModel.cs (68%) create mode 100644 Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs create mode 100644 Artemis/Artemis/Resources/folder.png diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index cb6ee3990..c9319d4da 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -253,9 +253,6 @@ Code - - - @@ -278,8 +275,11 @@ - - + + + + + @@ -324,6 +324,7 @@ True True + True @@ -519,6 +520,7 @@ + diff --git a/Artemis/Artemis/Components/Abstract/LayerComponent.cs b/Artemis/Artemis/Components/Abstract/LayerComponent.cs deleted file mode 100644 index c2b224c61..000000000 --- a/Artemis/Artemis/Components/Abstract/LayerComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using Artemis.Models; -using Artemis.Models.Interfaces; - -namespace Artemis.Components.Abstract -{ - public abstract class LayerComponent - { - public string Name { get; set; } - public List ConditionModels { get; set; } - - public bool ConditionsMet(IGameDataModel dataModel) - { - return ConditionModels.All(cm => cm.ConditionMet(dataModel)); - } - - public abstract void Draw(Graphics g); - } -} \ No newline at end of file diff --git a/Artemis/Artemis/Components/Layer.cs b/Artemis/Artemis/Components/Layer.cs deleted file mode 100644 index a1beb3b86..000000000 --- a/Artemis/Artemis/Components/Layer.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Drawing; -using Artemis.Components.Abstract; - -namespace Artemis.Components -{ - public class Layer : LayerComponent - { - public override void Draw(Graphics g) - { - // Read properties and draw accordingly - } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/Components/LayerComposite.cs b/Artemis/Artemis/Components/LayerComposite.cs deleted file mode 100644 index 775a707c5..000000000 --- a/Artemis/Artemis/Components/LayerComposite.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using System.Drawing; -using Artemis.Components.Abstract; - -namespace Artemis.Components -{ - public class LayerComposite : LayerComponent - { - public List LayerComponents { get; set; } - - public override void Draw(Graphics g) - { - foreach (var layerComponent in LayerComponents) - layerComponent.Draw(g); - } - } -} \ No newline at end of file diff --git a/Artemis/Artemis/DAL/ProfileProvider.cs b/Artemis/Artemis/DAL/ProfileProvider.cs index 3c847ce8b..f696beeda 100644 --- a/Artemis/Artemis/DAL/ProfileProvider.cs +++ b/Artemis/Artemis/DAL/ProfileProvider.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.IO; using System.Linq; using Artemis.Models; +using Artemis.Models.Profiles; using Newtonsoft.Json; namespace Artemis.DAL diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs index 8446f1eb3..be9ce538f 100644 --- a/Artemis/Artemis/Managers/MainManager.cs +++ b/Artemis/Artemis/Managers/MainManager.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using System.Linq; using System.Threading; -using System.Windows.Forms; using Artemis.Events; using Artemis.Models; using Artemis.Services; diff --git a/Artemis/Artemis/Models/LayerConditionModel.cs b/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs similarity index 56% rename from Artemis/Artemis/Models/LayerConditionModel.cs rename to Artemis/Artemis/Models/Profiles/LayerConditionModel.cs index 3a2896cd2..8a48cdbaa 100644 --- a/Artemis/Artemis/Models/LayerConditionModel.cs +++ b/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs @@ -1,7 +1,8 @@ using System.Collections.Generic; using System.Linq.Dynamic; +using Artemis.Models.Interfaces; -namespace Artemis.Models +namespace Artemis.Models.Profiles { public class LayerConditionModel { @@ -9,11 +10,11 @@ namespace Artemis.Models public string Value { get; set; } public string Operator { get; set; } - public bool ConditionMet(object subject) + public bool ConditionMet(IGameDataModel subject) { // Put the subject in a list, allowing Dynamic Linq to be used. - var subjectList = new List {subject}; - var res = subjectList.Where($"s => s.{Field} {Operator} {Value}").Any(); + var subjectList = new List {(T) subject}; + var res = subjectList.Where($"{Field} {Operator} {Value}").Any(); return res; } } diff --git a/Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs new file mode 100644 index 000000000..cb41291b0 --- /dev/null +++ b/Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs @@ -0,0 +1,86 @@ +using System.Collections.Generic; +using System.Drawing; +using System.Linq.Dynamic; +using System.Reflection; +using Artemis.Models.Interfaces; + +namespace Artemis.Models.Profiles +{ + public class LayerDynamicPropertiesModel + { + public string LayerProperty { get; set; } + public string GameProperty { get; set; } + public string RequiredOperator { get; set; } + public string RequiredValue { get; set; } + public LayerPopertyType LayerPopertyType { get; set; } + + /// + /// Only used when LayerPropertyType is PercentageOf or PercentageOfProperty + /// + public string PercentageSource { get; set; } + + /// + /// Only used when LayerPropertyType is Color + /// + public List LayerColors { get; set; } + + internal void ApplyProperty(IGameDataModel dataModel, LayerPropertiesModel userProps, + LayerPropertiesModel props) + { + var dataList = new List {(T) dataModel}; + + // Attempt to set the property + var layerProp = props.GetType().GetProperty(LayerProperty); + var layerUserProp = userProps.GetType().GetProperty(LayerProperty); + + if (LayerPopertyType == LayerPopertyType.PercentageOf) + SetPercentageOf(props, userProps, dataModel, int.Parse(PercentageSource)); + if (LayerPopertyType == LayerPopertyType.PercentageOfProperty) + SetPercentageOfProperty(props, userProps, dataModel); + if (LayerPopertyType == LayerPopertyType.Color) + { + if (dataList.Where($"{GameProperty} {RequiredOperator} {RequiredValue}").Any()) + SetColor(layerProp, dataModel); + } + } + + private void SetPercentageOf(LayerPropertiesModel props, LayerPropertiesModel userProps, + IGameDataModel dataModel, int percentageSource) + { + // Property that will be set + var layerProp = props.GetType().GetProperty(LayerProperty); + // Property to use as a 100% + var userProp = userProps.GetType().GetProperty(LayerProperty); + // Value to use as a source + var source = dataModel.GetType().GetProperty(GameProperty)?.GetValue(dataModel, null); + if (layerProp == null || userProp == null || source == null) + return; + + var percentage = double.Parse(source.ToString())/percentageSource; + layerProp.SetValue(props, (int) (percentage*(int) userProp.GetValue(userProps, null))); + } + + private void SetPercentageOfProperty(LayerPropertiesModel props, LayerPropertiesModel userProps, + IGameDataModel dataModel) + { + var value = dataModel.GetType().GetProperty(PercentageSource)?.GetValue(dataModel, null); + if (value != null) + SetPercentageOf(props, userProps, dataModel, (int) value); + } + + private void SetColor(PropertyInfo layerProp, IGameDataModel dataModel) + { + if (layerProp == null) + return; + if (layerProp.PropertyType == typeof (List)) + layerProp.SetValue(dataModel, LayerColors, null); + } + } + + public enum LayerPopertyType + { + PercentageOf, + PercentageOfProperty, + Color + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Models/Profiles/LayerModel.cs b/Artemis/Artemis/Models/Profiles/LayerModel.cs new file mode 100644 index 000000000..df4fd4186 --- /dev/null +++ b/Artemis/Artemis/Models/Profiles/LayerModel.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using Artemis.Models.Interfaces; +using Artemis.Properties; +using Newtonsoft.Json; +using Color = System.Drawing.Color; +using Pen = System.Drawing.Pen; + +namespace Artemis.Models.Profiles +{ + public class LayerModel + { + public LayerModel(string name, LayerType layerType) + { + Name = name; + LayerType = layerType; + LayerUserProperties = new LayerPropertiesModel(); + LayerCalculatedProperties = new LayerPropertiesModel(); + + Children = new List(); + LayerConditions = new List(); + LayerProperties = new List(); + } + + public string Name { get; set; } + public LayerType LayerType { get; set; } + public LayerPropertiesModel LayerUserProperties { get; set; } + + [JsonIgnore] + public LayerPropertiesModel LayerCalculatedProperties { get; } + + public List Children { get; set; } + public List LayerConditions { get; set; } + public List LayerProperties { get; set; } + public ImageSource LayerImage => GetPreviewImage(); + + private BitmapImage GetPreviewImage() + { + var bitmap = new Bitmap(18, 18); + using (var g = Graphics.FromImage(bitmap)) + { + g.SmoothingMode = SmoothingMode.AntiAlias; + if (LayerType == LayerType.Ellipse) + { + g.FillEllipse(new SolidBrush(LayerUserProperties.Colors.FirstOrDefault()), 0, 0, 18, 18); + g.DrawEllipse(new Pen(Color.Black, 1), 0, 0, 17, 17); + } + else if (LayerType == LayerType.Rectangle) + { + g.FillRectangle(new SolidBrush(LayerUserProperties.Colors.FirstOrDefault()), 0, 0, 18, 18); + g.DrawRectangle(new Pen(Color.Black, 1), 0, 0, 17, 17); + } + else + { + bitmap = Resources.folder; + } + } + + using (var memory = new MemoryStream()) + { + bitmap.Save(memory, ImageFormat.Png); + memory.Position = 0; + + var bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); + bitmapImage.StreamSource = memory; + bitmapImage.CacheOption = BitmapCacheOption.OnLoad; + bitmapImage.EndInit(); + + return bitmapImage; + } + } + + public bool ConditionsMet(IGameDataModel dataModel) + { + return LayerConditions.All(cm => cm.ConditionMet(dataModel)); + } + + public void Draw(IGameDataModel dataModel, Graphics g) + { + if (!ConditionsMet(dataModel)) + return; + + Update(dataModel); + switch (LayerType) + { + case LayerType.Folder: + DrawChildren(dataModel, g); + break; + case LayerType.Rectangle: + DrawRectangle(g); + break; + case LayerType.Ellipse: + DrawEllipse(g); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private void Update(IGameDataModel dataModel) + { + foreach (var dynamicProperty in LayerProperties) + dynamicProperty.ApplyProperty(dataModel, LayerUserProperties, LayerCalculatedProperties); + } + + private void DrawChildren(IGameDataModel dataModel, Graphics g) + { + foreach (var layerModel in Children) + layerModel.Draw(dataModel, g); + } + + private void DrawRectangle(Graphics g) + { + } + + private void DrawEllipse(Graphics g) + { + } + } + + public enum LayerType + { + Folder, + Rectangle, + Ellipse + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs new file mode 100644 index 000000000..20e02df5f --- /dev/null +++ b/Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace Artemis.Models.Profiles +{ + public class LayerPropertiesModel + { + public int X { get; set; } + public int Y { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public int Opacity { get; set; } + public bool ContainedBrush { get; set; } + public LinearGradientMode GradientMode { get; set; } + public bool Rotate { get; set; } + public double RotateSpeed { get; set; } + public List Colors { get; set; } + + public LayerPropertiesModel() + { + Colors = new List(); + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Models/ProfileModel.cs b/Artemis/Artemis/Models/Profiles/ProfileModel.cs similarity index 68% rename from Artemis/Artemis/Models/ProfileModel.cs rename to Artemis/Artemis/Models/Profiles/ProfileModel.cs index 769013786..86d4d409c 100644 --- a/Artemis/Artemis/Models/ProfileModel.cs +++ b/Artemis/Artemis/Models/Profiles/ProfileModel.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; -using Artemis.Components; -namespace Artemis.Models +namespace Artemis.Models.Profiles { public class ProfileModel { @@ -16,7 +15,7 @@ namespace Artemis.Models public string KeyboardName { get; set; } public string GameName { get; set; } - public LayerComposite Layers { get; set; } + public List Layers { get; set; } protected bool Equals(ProfileModel other) { @@ -27,7 +26,7 @@ namespace Artemis.Models { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; + if (obj.GetType() != GetType()) return false; return Equals((ProfileModel) obj); } @@ -35,9 +34,9 @@ namespace Artemis.Models { unchecked { - var hashCode = (Name != null ? Name.GetHashCode() : 0); - hashCode = (hashCode*397) ^ (KeyboardName != null ? KeyboardName.GetHashCode() : 0); - hashCode = (hashCode*397) ^ (GameName != null ? GameName.GetHashCode() : 0); + var hashCode = Name?.GetHashCode() ?? 0; + hashCode = (hashCode*397) ^ (KeyboardName?.GetHashCode() ?? 0); + hashCode = (hashCode*397) ^ (GameName?.GetHashCode() ?? 0); return hashCode; } } diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs new file mode 100644 index 000000000..63b8522f5 --- /dev/null +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs @@ -0,0 +1,9 @@ +using Artemis.Models.Interfaces; + +namespace Artemis.Modules.Games.RocketLeague +{ + internal class RocketLeagueDataModel : IGameDataModel + { + public int Boost { get; set; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Properties/Resources.Designer.cs b/Artemis/Artemis/Properties/Resources.Designer.cs index 353d73f90..2cca27e55 100644 --- a/Artemis/Artemis/Properties/Resources.Designer.cs +++ b/Artemis/Artemis/Properties/Resources.Designer.cs @@ -61,14 +61,14 @@ namespace Artemis.Properties { } /// - /// Looks up a localized string similar to <?xml version="1.0" encoding="UTF-16"?> - ///<!-- Used by Artemis to get the active Sign --> - ///<UserConfig> - /// <Group id="Artemis" displayName="Artemis"> - /// <VisibleVars> - /// <Var id="ActiveSign" displayName="ActiveSign" displayType="SLIDER:0:1:1000000"/> - /// </VisibleVars> - /// </Group> + /// Looks up a localized string similar to <?xml version="1.0" encoding="UTF-16"?> + ///<!-- Used by Artemis to get the active Sign --> + ///<UserConfig> + /// <Group id="Artemis" displayName="Artemis"> + /// <VisibleVars> + /// <Var id="ActiveSign" displayName="ActiveSign" displayType="SLIDER:0:1:1000000"/> + /// </VisibleVars> + /// </Group> ///</UserConfig>. /// internal static string artemisXml { @@ -88,23 +88,23 @@ namespace Artemis.Properties { } /// - /// Looks up a localized string similar to "Artemis" - ///{ - /// "uri" "http://localhost:{{port}}/csgo_game_event" - /// "timeout" "5.0" - /// "buffer" "0.1" - /// "throttle" "0.1" - /// "heartbeat" "30.0" - /// "data" - /// { - /// "provider" "1" - /// "map" "1" - /// "round" "1" - /// "player_id" "1" - /// "player_state" "1" - /// "player_weapons" "1" - /// "player_match_stats" "1" - /// } + /// Looks up a localized string similar to "Artemis" + ///{ + /// "uri" "http://localhost:{{port}}/csgo_game_event" + /// "timeout" "5.0" + /// "buffer" "0.1" + /// "throttle" "0.1" + /// "heartbeat" "30.0" + /// "data" + /// { + /// "provider" "1" + /// "map" "1" + /// "round" "1" + /// "player_id" "1" + /// "player_state" "1" + /// "player_weapons" "1" + /// "player_match_stats" "1" + /// } ///}. /// internal static string csgoGamestateConfiguration { @@ -116,7 +116,7 @@ namespace Artemis.Properties { /// /// Looks up a localized string similar to "Artemis" ///{ - /// "uri" "http://localhost:4000/" + /// "uri" "http://localhost:{{port}}/" /// "timeout" "5.0" /// "buffer" "0.1" /// "throttle" "0.1" @@ -138,6 +138,16 @@ namespace Artemis.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder { + get { + object obj = ResourceManager.GetObject("folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// diff --git a/Artemis/Artemis/Properties/Resources.resx b/Artemis/Artemis/Properties/Resources.resx index 5e03ad8fc..bf8569e4d 100644 --- a/Artemis/Artemis/Properties/Resources.resx +++ b/Artemis/Artemis/Properties/Resources.resx @@ -142,4 +142,7 @@ ..\resources\witcher3\playerwitcher.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 + + ..\Resources\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/Artemis/Artemis/Resources/folder.png b/Artemis/Artemis/Resources/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..c818db4fa188f912a4b343b3ba1c68ff21a45065 GIT binary patch literal 17968 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 + var layerFolder = new LayerModel("[VM TEST] Folder 1", LayerType.Folder); + + var layer1 = new LayerModel("[VM TEST] Rectangle 1", LayerType.Rectangle); + layer1.LayerConditions.Add(new LayerConditionModel {Field = "Boost", Operator = ">", Value = "0"}); + layer1.LayerProperties.Add(new LayerDynamicPropertiesModel + { + LayerProperty = "Width", + LayerPopertyType = LayerPopertyType.PercentageOf, + GameProperty = "Boost", + PercentageSource = "100" + }); + layer1.LayerUserProperties = new LayerPropertiesModel + { + Colors = new List {Color.Red, Color.OrangeRed}, + ContainedBrush = true, + GradientMode = LinearGradientMode.Vertical, + Width = 21, + Height = 7, + Opacity = 100, + Rotate = true, + RotateSpeed = 1, + X = 0, + Y = 0 + }; + layerFolder.Children.Add(layer1); + layerFolder.Children.Add(new LayerModel("[VM TEST] Ellipse 1", LayerType.Ellipse)); + + var testData = new RocketLeagueDataModel {Boost = 20}; + var bitmap = _mainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(4); + using (var g = Graphics.FromImage(bitmap)) + { + layerFolder.Draw(testData, g); + } + // End test + + profile.Layers.Add(layerFolder); ProfileProvider.AddOrUpdate(profile); LoadProfiles(); diff --git a/Artemis/Artemis/Views/ProfileEditorView.xaml b/Artemis/Artemis/Views/ProfileEditorView.xaml index 440d24e28..99f90af1e 100644 --- a/Artemis/Artemis/Views/ProfileEditorView.xaml +++ b/Artemis/Artemis/Views/ProfileEditorView.xaml @@ -20,7 +20,7 @@