From 99e9620db292a35c3187d4d89ddb107812cbb1e7 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Thu, 24 Mar 2016 23:26:23 +0100 Subject: [PATCH] Progress on layer editor --- Artemis/Artemis/Artemis.csproj | 11 +- Artemis/Artemis/ArtemisBootstrapper.cs | 2 - .../{IGameDataModel.cs => GameDataModel.cs} | 0 Artemis/Artemis/Models/Profiles/LayerModel.cs | 68 +---- .../RocketLeague/RocketLeagueDataModel.cs | 5 +- .../Games/TheDivision/TheDivisionDataModel.cs | 31 ++- .../Games/TheDivision/TheDivisionModel.cs | 41 +-- .../Games/TheDivision/TheDivisionViewModel.cs | 4 +- Artemis/Artemis/Utilities/GeneralHelpers.cs | 58 +++- Artemis/Artemis/Utilities/LayerDrawer.cs | 173 ++++++++++++ .../ViewModels/LayerEditorViewModel.cs | 45 ++++ .../ViewModels/ProfileEditorViewModel.cs | 58 +--- .../Artemis/ViewModels/SystemTrayViewModel.cs | 247 +++++++++--------- Artemis/Artemis/Views/LayerEditorView.xaml | 62 +++++ Artemis/Artemis/Views/LayerEditorView.xaml.cs | 28 ++ Artemis/Artemis/Views/ProfileEditorView.xaml | 16 +- 16 files changed, 566 insertions(+), 283 deletions(-) rename Artemis/Artemis/Models/Interfaces/{IGameDataModel.cs => GameDataModel.cs} (100%) create mode 100644 Artemis/Artemis/Utilities/LayerDrawer.cs create mode 100644 Artemis/Artemis/ViewModels/LayerEditorViewModel.cs create mode 100644 Artemis/Artemis/Views/LayerEditorView.xaml create mode 100644 Artemis/Artemis/Views/LayerEditorView.xaml.cs diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index c9319d4da..2fcff35a3 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -274,7 +274,7 @@ - + @@ -383,6 +383,7 @@ + @@ -409,6 +410,7 @@ + @@ -448,6 +450,9 @@ Witcher3View.xaml + + LayerEditorView.xaml + OverlaysView.xaml @@ -597,6 +602,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/Artemis/Artemis/ArtemisBootstrapper.cs b/Artemis/Artemis/ArtemisBootstrapper.cs index e0f82e4b6..dc80755b4 100644 --- a/Artemis/Artemis/ArtemisBootstrapper.cs +++ b/Artemis/Artemis/ArtemisBootstrapper.cs @@ -2,8 +2,6 @@ using System.Linq; using System.Windows; using System.Windows.Forms; -using Artemis.Utilities; -using Artemis.Utilities.LogitechDll; using Artemis.ViewModels; using Autofac; using Caliburn.Micro; diff --git a/Artemis/Artemis/Models/Interfaces/IGameDataModel.cs b/Artemis/Artemis/Models/Interfaces/GameDataModel.cs similarity index 100% rename from Artemis/Artemis/Models/Interfaces/IGameDataModel.cs rename to Artemis/Artemis/Models/Interfaces/GameDataModel.cs diff --git a/Artemis/Artemis/Models/Profiles/LayerModel.cs b/Artemis/Artemis/Models/Profiles/LayerModel.cs index df4fd4186..1f254544b 100644 --- a/Artemis/Artemis/Models/Profiles/LayerModel.cs +++ b/Artemis/Artemis/Models/Profiles/LayerModel.cs @@ -1,22 +1,18 @@ 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 Artemis.Utilities; using Newtonsoft.Json; -using Color = System.Drawing.Color; -using Pen = System.Drawing.Pen; namespace Artemis.Models.Profiles { public class LayerModel { + [JsonIgnore] private readonly LayerDrawer _drawer; + public LayerModel(string name, LayerType layerType) { Name = name; @@ -27,56 +23,23 @@ namespace Artemis.Models.Profiles Children = new List(); LayerConditions = new List(); LayerProperties = new List(); + + _drawer = new LayerDrawer(this); } 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; - } - } + [JsonIgnore] + public LayerPropertiesModel LayerCalculatedProperties { get; } - 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; - } - } + [JsonIgnore] + public ImageSource LayerImage => _drawer.GetPreviewImage(); public bool ConditionsMet(IGameDataModel dataModel) { @@ -95,10 +58,10 @@ namespace Artemis.Models.Profiles DrawChildren(dataModel, g); break; case LayerType.Rectangle: - DrawRectangle(g); + _drawer.DrawRectangle(g); break; case LayerType.Ellipse: - DrawEllipse(g); + _drawer.DrawEllipse(g); break; default: throw new ArgumentOutOfRangeException(); @@ -107,6 +70,7 @@ namespace Artemis.Models.Profiles private void Update(IGameDataModel dataModel) { + GeneralHelpers.CopyProperties(LayerCalculatedProperties, LayerUserProperties); foreach (var dynamicProperty in LayerProperties) dynamicProperty.ApplyProperty(dataModel, LayerUserProperties, LayerCalculatedProperties); } @@ -116,14 +80,6 @@ namespace Artemis.Models.Profiles foreach (var layerModel in Children) layerModel.Draw(dataModel, g); } - - private void DrawRectangle(Graphics g) - { - } - - private void DrawEllipse(Graphics g) - { - } } public enum LayerType diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs index 63b8522f5..d85980ab8 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs @@ -1,9 +1,12 @@ -using Artemis.Models.Interfaces; +using System.Collections.Generic; +using Artemis.Models.Interfaces; +using Artemis.Utilities; namespace Artemis.Modules.Games.RocketLeague { internal class RocketLeagueDataModel : IGameDataModel { public int Boost { get; set; } + public List Properties { get; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs index 301676bfb..f42a89928 100644 --- a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs +++ b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs @@ -1,30 +1,29 @@ - using System.Collections.Generic; -using Artemis.Models.Interfaces; +using Artemis.Models.Interfaces; namespace Artemis.Modules.Games.TheDivision { public class TheDivisionDataModel : IGameDataModel { - public List DivisionPlayers { get; set; } - public GrenadeState GrenadeState { get; set; } - public bool LowAmmo { get; set; } - public bool LowHp { get; set; } - public TheDivisionDataModel() { - DivisionPlayers = new List(); + TestyTest = new TestTest(); } + + public PlayerState PartyMember1 { get; set; } + public PlayerState PartyMember2 { get; set; } + public PlayerState PartyMember3 { get; set; } + + public bool LowAmmo { get; set; } + public bool LowHp { get; set; } + public GrenadeState GrenadeState { get; set; } + + public TestTest TestyTest { get; set; } } - public class DivisionPlayer + public class TestTest { - public int Id { get; set; } - public PlayerState PlayerState { get; set; } - - public DivisionPlayer(int id) - { - Id = id; - } + public string TestS { get; set; } + public int TestI { get; set; } } public enum GrenadeState diff --git a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs index b5b025e87..c231113d0 100644 --- a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs +++ b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs @@ -1,14 +1,12 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; -using System.Linq; using Artemis.Managers; using Artemis.Models; using Artemis.Modules.Effects.TypeWave; using Artemis.Utilities; using Artemis.Utilities.Keyboard; using Artemis.Utilities.LogitechDll; -using CUE.NET; namespace Artemis.Modules.Games.TheDivision { @@ -95,8 +93,6 @@ namespace Artemis.Modules.Games.TheDivision DllManager.PlaceDll(); _dataModel = new TheDivisionDataModel(); - for (var i = 1; i < 5; i++) - _dataModel.DivisionPlayers.Add(new DivisionPlayer(i)); MainManager.PipeServer.PipeMessage += PipeServerOnPipeMessage; Initialized = true; @@ -129,16 +125,21 @@ namespace Artemis.Modules.Games.TheDivision if (keyCode >= 59 && keyCode <= 62) { var playerId = keyCode - 58; - var playerDataModel = _dataModel.DivisionPlayers.FirstOrDefault(p => p.Id == playerId); - if (playerDataModel == null) - return; + PlayerState newState; if (gPer > 10) - playerDataModel.PlayerState = PlayerState.Online; + newState = PlayerState.Online; else if (rPer > 10) - playerDataModel.PlayerState = PlayerState.Hit; + newState = PlayerState.Hit; else - playerDataModel.PlayerState = PlayerState.Offline; + newState = PlayerState.Offline; + + if (playerId == 1) + _dataModel.PartyMember1 = newState; + else if (playerId == 2) + _dataModel.PartyMember2 = newState; + else if (playerId == 3) + _dataModel.PartyMember3 = newState; } // R blinks white when low on ammo else if (keyCode == 19) @@ -180,26 +181,26 @@ namespace Artemis.Modules.Games.TheDivision _hpRect.Colors = _dataModel.LowHp ? new List {Color.Red, Color.Orange} - : new List {Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; + : new List {Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45)}; - if (_dataModel.DivisionPlayers[1].PlayerState == PlayerState.Offline) + if (_dataModel.PartyMember1 == PlayerState.Offline) _p2.Colors = new List {Color.Gray, Color.White}; - else if (_dataModel.DivisionPlayers[1].PlayerState == PlayerState.Online) - _p2.Colors = new List { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; + else if (_dataModel.PartyMember1 == PlayerState.Online) + _p2.Colors = new List {Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45)}; else _p2.Colors = new List {Color.Red, Color.Orange}; - if (_dataModel.DivisionPlayers[2].PlayerState == PlayerState.Offline) + if (_dataModel.PartyMember2 == PlayerState.Offline) _p3.Colors = new List {Color.Gray, Color.White}; - else if (_dataModel.DivisionPlayers[2].PlayerState == PlayerState.Online) - _p3.Colors = new List { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; + else if (_dataModel.PartyMember2 == PlayerState.Online) + _p3.Colors = new List {Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45)}; else _p3.Colors = new List {Color.Red, Color.Orange}; - if (_dataModel.DivisionPlayers[3].PlayerState == PlayerState.Offline) + if (_dataModel.PartyMember3 == PlayerState.Offline) _p4.Colors = new List {Color.Gray, Color.White}; - else if (_dataModel.DivisionPlayers[3].PlayerState == PlayerState.Online) - _p4.Colors = new List { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; + else if (_dataModel.PartyMember3 == PlayerState.Online) + _p4.Colors = new List {Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45)}; else _p4.Colors = new List {Color.Red, Color.Orange}; } diff --git a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionViewModel.cs b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionViewModel.cs index 01f98cc6d..2f2c5383e 100644 --- a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionViewModel.cs +++ b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionViewModel.cs @@ -17,10 +17,10 @@ namespace Artemis.Modules.Games.TheDivision GameModel = new TheDivisionModel(mainManager, (TheDivisionSettings) GameSettings); MainManager.EffectManager.EffectModels.Add(GameModel); - ProfileEditor = new ProfileEditorViewModel(MainManager, GameModel); + ProfileEditor = new ProfileEditorViewModel(MainManager, GameModel); } - public ProfileEditorViewModel ProfileEditor { get; set; } + public ProfileEditorViewModel ProfileEditor { get; set; } public static string Name => "The Division"; } diff --git a/Artemis/Artemis/Utilities/GeneralHelpers.cs b/Artemis/Artemis/Utilities/GeneralHelpers.cs index b83ed3751..cec2042fc 100644 --- a/Artemis/Artemis/Utilities/GeneralHelpers.cs +++ b/Artemis/Artemis/Utilities/GeneralHelpers.cs @@ -1,12 +1,12 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; -using System.Linq; using System.Reflection; using System.Security.Principal; -using System.Text; -using System.Threading.Tasks; using System.Windows; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Artemis.Utilities { @@ -37,12 +37,50 @@ namespace Artemis.Utilities Environment.Exit(0); } - public static bool IsRunAsAdministrator() - { - var wi = WindowsIdentity.GetCurrent(); - var wp = new WindowsPrincipal(wi); - - return wp.IsInRole(WindowsBuiltInRole.Administrator); + public static bool IsRunAsAdministrator() + { + var wi = WindowsIdentity.GetCurrent(); + var wp = new WindowsPrincipal(wi); + + return wp.IsInRole(WindowsBuiltInRole.Administrator); + } + + public static void CopyProperties(object dest, object src) + { + foreach (PropertyDescriptor item in TypeDescriptor.GetProperties(src)) + { + item.SetValue(dest, item.GetValue(src)); + } + } + + public static List GetPropertyMap(object o) + { + var res = new List(); + // No point reinventing the wheel, just serialize it to JSON and parse that + var json = JObject.FromObject(o, JsonSerializer.CreateDefault()); + res.AddRange(JObjectToPropertyCollection(json)); + + return res; + } + + private static List JObjectToPropertyCollection(JObject json) + { + var res = new List(); + foreach (var property in json.Properties()) + { + var parent = new PropertyCollection {Name = property.Name}; + foreach (var child in property.Children()) + parent.Children = JObjectToPropertyCollection(child); + + res.Add(parent); + } + return res; + } + + public struct PropertyCollection + { + public string Name { get; set; } + public List Children { get; set; } } } -} +} \ No newline at end of file diff --git a/Artemis/Artemis/Utilities/LayerDrawer.cs b/Artemis/Artemis/Utilities/LayerDrawer.cs new file mode 100644 index 000000000..e37ec462f --- /dev/null +++ b/Artemis/Artemis/Utilities/LayerDrawer.cs @@ -0,0 +1,173 @@ +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.Imaging; +using Artemis.Models.Profiles; +using Artemis.Properties; + +namespace Artemis.Utilities +{ + internal class LayerDrawer + { + private readonly LayerModel _layerModel; + private Rectangle _rectangle; + private double _rotationProgress; + private Rectangle _userRectangle; + + public LayerDrawer(LayerModel layerModel) + { + _layerModel = layerModel; + _rotationProgress = 0; + } + + public void Draw(Graphics graphics) + { + _rectangle = new Rectangle( + _layerModel.LayerCalculatedProperties.X, + _layerModel.LayerCalculatedProperties.Y, + _layerModel.LayerCalculatedProperties.Width, + _layerModel.LayerCalculatedProperties.Height); + _userRectangle = new Rectangle( + _layerModel.LayerUserProperties.X, + _layerModel.LayerUserProperties.Y, + _layerModel.LayerUserProperties.Width, + _layerModel.LayerUserProperties.Height); + + if (_layerModel.LayerType == LayerType.Ellipse) + DrawEllipse(graphics); + else if (_layerModel.LayerType == LayerType.Ellipse) + DrawRectangle(graphics); + + // Update the rotation progress + _rotationProgress = _rotationProgress + _layerModel.LayerCalculatedProperties.RotateSpeed; + + if (_layerModel.LayerCalculatedProperties.ContainedBrush && _rotationProgress > _rectangle.Width) + _rotationProgress = _layerModel.LayerCalculatedProperties.RotateSpeed; + else if (!_layerModel.LayerCalculatedProperties.ContainedBrush && _rotationProgress > _userRectangle.Width) + _rotationProgress = _layerModel.LayerCalculatedProperties.RotateSpeed; + } + + public BitmapImage GetPreviewImage() + { + _rectangle = new Rectangle(0, 0, 18, 18); + _userRectangle = new Rectangle(0, 0, 18, 18); + _layerModel.LayerCalculatedProperties.Opacity = 255; + var brush = CreateGradientBrush(_layerModel.LayerUserProperties.Colors); + var bitmap = new Bitmap(18, 18); + + using (var g = Graphics.FromImage(bitmap)) + { + g.SmoothingMode = SmoothingMode.AntiAlias; + if (_layerModel.LayerType == LayerType.Ellipse) + { + g.FillEllipse(brush, _rectangle); + g.DrawEllipse(new Pen(Color.Black, 1), 0, 0, 17, 17); + } + else if (_layerModel.LayerType == LayerType.Rectangle) + { + g.FillRectangle(brush, _rectangle); + 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 void DrawRectangle(Graphics graphics) + { + } + + public void DrawEllipse(Graphics graphics) + { + } + + private LinearGradientBrush CreateGradientBrush(List colors) + { + ColorBlend colorBlend; + var props = _layerModel.LayerCalculatedProperties; + // Create a ColorBlend + if (colors.Count == 0) + { + colorBlend = new ColorBlend + { + Colors = new[] {Color.Transparent, Color.Transparent}, + Positions = new[] {0F, 1F} + }; + } + else if (colors.Count == 1) + { + colorBlend = new ColorBlend + { + Colors = new[] {colors[0], colors[0]}, + Positions = new[] {0F, 1F} + }; + } + else + { + colorBlend = props.Rotate + ? new ColorBlend {Colors = CreateTilebleColors(colors).ToArray()} + : new ColorBlend {Colors = colors.ToArray()}; + } + + // If needed, apply opacity to the colors in the blend + if (props.Opacity < 255) + for (var i = 0; i < colorBlend.Colors.Length; i++) + colorBlend.Colors[i] = Color.FromArgb(props.Opacity, colorBlend.Colors[i]); + + // Devide the colors over the colorblend + var devider = (float) colorBlend.Colors.Length - 1; + var positions = new List(); + for (var i = 0; i < colorBlend.Colors.Length; i++) + positions.Add(i/devider); + + // Apply the devided positions + colorBlend.Positions = positions.ToArray(); + + RectangleF rect; + if (props.Rotate) + rect = _layerModel.LayerCalculatedProperties.ContainedBrush + ? new Rectangle((int) _rotationProgress + _rectangle.X, _rectangle.Y, _rectangle.Width*2, + _rectangle.Height*2) + : new Rectangle((int) _rotationProgress + _userRectangle.X, _userRectangle.Y, _userRectangle.Width*2, + _userRectangle.Height*2); + else + rect = _layerModel.LayerCalculatedProperties.ContainedBrush + ? new Rectangle(_rectangle.X, _rectangle.Y, _rectangle.Width, _rectangle.Height) + : new Rectangle(_userRectangle.X, _userRectangle.Y, _userRectangle.Width, _userRectangle.Height); + + return new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, + _layerModel.LayerCalculatedProperties.GradientMode) + { + InterpolationColors = colorBlend + }; + } + + private List CreateTilebleColors(List sourceColors) + { + // Create a list using the original colors + var tilebleColors = new List(sourceColors); + // Add the original colors again + tilebleColors.AddRange(sourceColors); + // Add the first color, smoothing the transition + tilebleColors.Add(sourceColors.FirstOrDefault()); + return tilebleColors; + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/LayerEditorViewModel.cs b/Artemis/Artemis/ViewModels/LayerEditorViewModel.cs new file mode 100644 index 000000000..dca5791f4 --- /dev/null +++ b/Artemis/Artemis/ViewModels/LayerEditorViewModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections; +using System.Diagnostics; +using System.Reflection; +using Artemis.Models.Profiles; +using Artemis.Utilities; +using Caliburn.Micro; + +namespace Artemis.ViewModels +{ + public class LayerEditorViewModel : Screen + { + private LayerModel _layer; + + public LayerEditorViewModel(LayerModel layer) + { + Layer = layer; + + DataModelProps = new BindableCollection(); + DataModelProps.AddRange(GeneralHelpers.GetPropertyMap((T)Activator.CreateInstance(typeof(T), new object[] { }))); + ProposedProperties = new LayerPropertiesModel(); + GeneralHelpers.CopyProperties(ProposedProperties, Layer.LayerUserProperties); + } + + public LayerModel Layer + { + get { return _layer; } + set + { + if (Equals(value, _layer)) return; + _layer = value; + NotifyOfPropertyChange(() => Layer); + } + } + + public BindableCollection DataModelProps { get; set; } + + public LayerPropertiesModel ProposedProperties { get; set; } + + public void Apply() + { + GeneralHelpers.CopyProperties(Layer.LayerUserProperties, ProposedProperties); + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs index 2fb888568..bd8b07218 100644 --- a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs @@ -1,25 +1,21 @@ -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; +using System.Dynamic; using System.Linq; using System.Windows.Media; using Artemis.DAL; using Artemis.Managers; using Artemis.Models; using Artemis.Models.Profiles; -using Artemis.Modules.Games.RocketLeague; -using Artemis.Modules.Games.TheDivision; using Caliburn.Micro; -using Color = System.Drawing.Color; namespace Artemis.ViewModels { - public class ProfileEditorViewModel : Screen + public class ProfileEditorViewModel : Screen { private readonly GameModel _gameModel; private readonly MainManager _mainManager; private BindableCollection _profileModels; private ProfileModel _selectedProfileModel; + private LayerEditorViewModel _editorVm; public ProfileEditorViewModel(MainManager mainManager, GameModel gameModel) { @@ -82,50 +78,22 @@ namespace Artemis.ViewModels return; } - // Test - profile.Layers = new List(); - 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(); SelectedProfileModel = profile; } + public void LayerEditor(LayerModel layer) + { + IWindowManager manager = new WindowManager(); + _editorVm = new LayerEditorViewModel(layer); + dynamic settings = new ExpandoObject(); + + settings.Title = "Artemis | Edit " + layer.Name; + manager.ShowDialog(_editorVm, null, settings); + } + private ImageSource GenerateKeyboardImage() { return null; diff --git a/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs b/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs index 1b9bc164d..bda3ecf4f 100644 --- a/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs +++ b/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs @@ -1,54 +1,53 @@ -using System; -using System.Windows; -using Artemis.Events; -using Artemis.Properties; -using Artemis.Settings; -using Artemis.Utilities; -using Caliburn.Micro; - -namespace Artemis.ViewModels -{ - public class SystemTrayViewModel : Screen, IHandle - { - private readonly ShellViewModel _shellViewModel; - - private readonly IWindowManager _windowManager; - private string _activeIcon; - private bool _checkedForUpdate; - private bool _enabled; - private string _toggleText; - - public SystemTrayViewModel(IWindowManager windowManager, ShellViewModel shellViewModel) - { - _windowManager = windowManager; - _shellViewModel = shellViewModel; - _shellViewModel.MainManager.Events.Subscribe(this); - _shellViewModel.MainManager.EnableProgram(); - _checkedForUpdate = false; - //ActiveIcon = "../logo.ico"; - - if (General.Default.ShowOnStartup) - ShowWindow(); - } - - public bool CanShowWindow => !_shellViewModel.IsActive; - - public bool CanHideWindow => _shellViewModel.IsActive; - - public bool Enabled - { - get { return _enabled; } - set - { - if (value == _enabled) return; - _enabled = value; - - ToggleText = _enabled ? "Disable Artemis" : "Enable Artemis"; - ActiveIcon = _enabled ? "../Resources/logo.ico" : "../Resources/logo-disabled.ico"; - NotifyOfPropertyChange(() => Enabled); - } - } - +using System; +using System.Windows; +using Artemis.Events; +using Artemis.Properties; +using Artemis.Settings; +using Artemis.Utilities; +using Caliburn.Micro; + +namespace Artemis.ViewModels +{ + public class SystemTrayViewModel : Screen, IHandle + { + private readonly ShellViewModel _shellViewModel; + + private readonly IWindowManager _windowManager; + private string _activeIcon; + private bool _checkedForUpdate; + private bool _enabled; + private string _toggleText; + + public SystemTrayViewModel(IWindowManager windowManager, ShellViewModel shellViewModel) + { + _windowManager = windowManager; + _shellViewModel = shellViewModel; + _shellViewModel.MainManager.Events.Subscribe(this); + _shellViewModel.MainManager.EnableProgram(); + _checkedForUpdate = false; + + if (General.Default.ShowOnStartup) + ShowWindow(); + } + + public bool CanShowWindow => !_shellViewModel.IsActive; + + public bool CanHideWindow => _shellViewModel.IsActive; + + public bool Enabled + { + get { return _enabled; } + set + { + if (value == _enabled) return; + _enabled = value; + + ToggleText = _enabled ? "Disable Artemis" : "Enable Artemis"; + ActiveIcon = _enabled ? "../Resources/logo.ico" : "../Resources/logo-disabled.ico"; + NotifyOfPropertyChange(() => Enabled); + } + } + public string ActiveIcon { get { return _activeIcon; } @@ -57,77 +56,77 @@ namespace Artemis.ViewModels _activeIcon = value; NotifyOfPropertyChange(); } - } - - public string ToggleText - { - get { return _toggleText; } - set - { - if (value == _toggleText) return; - _toggleText = value; - NotifyOfPropertyChange(() => ToggleText); - } - } - - public void Handle(ToggleEnabled message) - { - Enabled = message.Enabled; - } - - public void ToggleEnabled() - { - if (Enabled) - _shellViewModel.MainManager.DisableProgram(); - else - _shellViewModel.MainManager.EnableProgram(); - } - - protected override void OnActivate() - { - base.OnActivate(); - - NotifyOfPropertyChange(() => CanShowWindow); - NotifyOfPropertyChange(() => CanHideWindow); - } - - public void ShowWindow() - { - if (!CanShowWindow) - return; - - // manually show the next window view-model - _windowManager.ShowWindow(_shellViewModel); - - NotifyOfPropertyChange(() => CanShowWindow); - NotifyOfPropertyChange(() => CanHideWindow); - - if (_checkedForUpdate) - return; - - _checkedForUpdate = true; - Updater.CheckForUpdate(_shellViewModel.MainManager.DialogService); - } - - - public void HideWindow() - { - if (!CanHideWindow) - return; - - _shellViewModel.TryClose(); - - NotifyOfPropertyChange(() => CanShowWindow); - NotifyOfPropertyChange(() => CanHideWindow); - } - - public void ExitApplication() - { - _shellViewModel.MainManager.Shutdown(); - Application.Current.Shutdown(); - - // Sometimes you need to be rough. - Environment.Exit(0); - } - } + } + + public string ToggleText + { + get { return _toggleText; } + set + { + if (value == _toggleText) return; + _toggleText = value; + NotifyOfPropertyChange(() => ToggleText); + } + } + + public void Handle(ToggleEnabled message) + { + Enabled = message.Enabled; + } + + public void ToggleEnabled() + { + if (Enabled) + _shellViewModel.MainManager.DisableProgram(); + else + _shellViewModel.MainManager.EnableProgram(); + } + + protected override void OnActivate() + { + base.OnActivate(); + + NotifyOfPropertyChange(() => CanShowWindow); + NotifyOfPropertyChange(() => CanHideWindow); + } + + public void ShowWindow() + { + if (!CanShowWindow) + return; + + // manually show the next window view-model + _windowManager.ShowWindow(_shellViewModel); + + NotifyOfPropertyChange(() => CanShowWindow); + NotifyOfPropertyChange(() => CanHideWindow); + + if (_checkedForUpdate) + return; + + _checkedForUpdate = true; + Updater.CheckForUpdate(_shellViewModel.MainManager.DialogService); + } + + + public void HideWindow() + { + if (!CanHideWindow) + return; + + _shellViewModel.TryClose(); + + NotifyOfPropertyChange(() => CanShowWindow); + NotifyOfPropertyChange(() => CanHideWindow); + } + + public void ExitApplication() + { + _shellViewModel.MainManager.Shutdown(); + Application.Current.Shutdown(); + + // Sometimes you need to be rough. + Environment.Exit(0); + } + } } \ No newline at end of file diff --git a/Artemis/Artemis/Views/LayerEditorView.xaml b/Artemis/Artemis/Views/LayerEditorView.xaml new file mode 100644 index 000000000..b51d4d04b --- /dev/null +++ b/Artemis/Artemis/Views/LayerEditorView.xaml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Artemis/Artemis/Views/LayerEditorView.xaml.cs b/Artemis/Artemis/Views/LayerEditorView.xaml.cs new file mode 100644 index 000000000..ea8195886 --- /dev/null +++ b/Artemis/Artemis/Views/LayerEditorView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using MahApps.Metro.Controls; + +namespace Artemis.Views +{ + /// + /// Interaction logic for LayerEditorView.xaml + /// + public partial class LayerEditorView : MetroWindow + { + public LayerEditorView() + { + InitializeComponent(); + } + } +} diff --git a/Artemis/Artemis/Views/ProfileEditorView.xaml b/Artemis/Artemis/Views/ProfileEditorView.xaml index 99f90af1e..813cb7f82 100644 --- a/Artemis/Artemis/Views/ProfileEditorView.xaml +++ b/Artemis/Artemis/Views/ProfileEditorView.xaml @@ -4,6 +4,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 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:cal="http://www.caliburnproject.org" mc:Ignorable="d" d:DesignHeight="772.5" d:DesignWidth="1335"> @@ -38,29 +40,31 @@