diff --git a/src/Artemis.Core/Artemis.Core.csproj b/src/Artemis.Core/Artemis.Core.csproj index 9a4159779..8ba0ca831 100644 --- a/src/Artemis.Core/Artemis.Core.csproj +++ b/src/Artemis.Core/Artemis.Core.csproj @@ -139,6 +139,7 @@ + diff --git a/src/Artemis.Core/Events/LayerPropertyEventArgs.cs b/src/Artemis.Core/Events/LayerPropertyEventArgs.cs new file mode 100644 index 000000000..9f16dc690 --- /dev/null +++ b/src/Artemis.Core/Events/LayerPropertyEventArgs.cs @@ -0,0 +1,15 @@ +using System; +using Artemis.Core.Models.Profile.LayerProperties; + +namespace Artemis.Core.Events +{ + public class LayerPropertyEventArgs : EventArgs + { + public LayerPropertyEventArgs(BaseLayerProperty layerProperty) + { + LayerProperty = layerProperty; + } + + public BaseLayerProperty LayerProperty { get; } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 81b2d5b8b..9306fe3ec 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using Artemis.Core.Events; using Artemis.Core.Exceptions; using Artemis.Core.Extensions; using Artemis.Core.Models.Profile.LayerProperties; @@ -449,7 +450,7 @@ namespace Artemis.Core.Models.Profile layerProperty.ApplyToProperty(propertyEntity); _properties.Add((layerProperty.PluginInfo.Guid, layerProperty.Id), layerProperty); - OnLayerPropertyRegistered(); + OnLayerPropertyRegistered(new LayerPropertyEventArgs(layerProperty)); return propertyEntity != null; } @@ -471,12 +472,12 @@ namespace Artemis.Core.Models.Profile { if (!_properties.ContainsKey((layerProperty.PluginInfo.Guid, layerProperty.Id))) throw new ArtemisCoreException($"Could not find a property with ID {layerProperty.Id}."); - + var property = _properties[(layerProperty.PluginInfo.Guid, layerProperty.Id)]; property.Parent?.Children.Remove(property); _properties.Remove((layerProperty.PluginInfo.Guid, layerProperty.Id)); - OnLayerPropertyRemoved(); + OnLayerPropertyRemoved(new LayerPropertyEventArgs(property)); } /// @@ -541,8 +542,8 @@ namespace Artemis.Core.Models.Profile public event EventHandler RenderPropertiesUpdated; public event EventHandler ShapePropertiesUpdated; - public event EventHandler LayerPropertyRegistered; - public event EventHandler LayerPropertyRemoved; + public event EventHandler LayerPropertyRegistered; + public event EventHandler LayerPropertyRemoved; private void OnRenderPropertiesUpdated() { @@ -561,14 +562,14 @@ namespace Artemis.Core.Models.Profile return $"[Layer] {nameof(Name)}: {Name}, {nameof(Order)}: {Order}"; } - private void OnLayerPropertyRegistered() + private void OnLayerPropertyRegistered(LayerPropertyEventArgs e) { - LayerPropertyRegistered?.Invoke(this, EventArgs.Empty); + LayerPropertyRegistered?.Invoke(this, e); } - private void OnLayerPropertyRemoved() + private void OnLayerPropertyRemoved(LayerPropertyEventArgs e) { - LayerPropertyRemoved?.Invoke(this, EventArgs.Empty); + LayerPropertyRemoved?.Invoke(this, e); } } diff --git a/src/Artemis.Plugins.LayerBrushes.Noise/NoiseBrush.cs b/src/Artemis.Plugins.LayerBrushes.Noise/NoiseBrush.cs index d66caa98e..87503927a 100644 --- a/src/Artemis.Plugins.LayerBrushes.Noise/NoiseBrush.cs +++ b/src/Artemis.Plugins.LayerBrushes.Noise/NoiseBrush.cs @@ -9,7 +9,6 @@ namespace Artemis.Plugins.LayerBrushes.Noise { public class NoiseBrush : LayerBrush { - private const int Scale = 6; private static readonly Random Rand = new Random(); private readonly OpenSimplexNoise _noise; private float _z; @@ -42,12 +41,13 @@ namespace Artemis.Plugins.LayerBrushes.Noise public override void Render(SKCanvas canvas, SKPath path, SKPaint paint) { + return; var mainColor = MainColorProperty.CurrentValue; var scale = ScaleProperty.CurrentValue; // Scale down the render path to avoid computing a value for every pixel - var width = (int) (Math.Max(path.Bounds.Width, path.Bounds.Height) / Scale); - var height = (int) (Math.Max(path.Bounds.Width, path.Bounds.Height) / Scale); + var width = (int) (Math.Max(path.Bounds.Width, path.Bounds.Height) / scale.Width); + var height = (int) (Math.Max(path.Bounds.Width, path.Bounds.Height) / scale.Height); var opacity = (float) Math.Round(mainColor.Alpha / 255.0, 2, MidpointRounding.AwayFromZero); using (var bitmap = new SKBitmap(new SKImageInfo(width, height))) { @@ -55,10 +55,10 @@ namespace Artemis.Plugins.LayerBrushes.Noise // Only compute pixels inside LEDs, due to scaling there may be some rounding issues but it's neglect-able foreach (var artemisLed in Layer.Leds) { - var xStart = artemisLed.AbsoluteRenderRectangle.Left / Scale; - var xEnd = artemisLed.AbsoluteRenderRectangle.Right / Scale; - var yStart = artemisLed.AbsoluteRenderRectangle.Top / Scale; - var yEnd = artemisLed.AbsoluteRenderRectangle.Bottom / Scale; + var xStart = artemisLed.AbsoluteRenderRectangle.Left / scale.Width; + var xEnd = artemisLed.AbsoluteRenderRectangle.Right / scale.Width; + var yStart = artemisLed.AbsoluteRenderRectangle.Top / scale.Height; + var yEnd = artemisLed.AbsoluteRenderRectangle.Bottom / scale.Height; for (var x = xStart; x < xEnd; x++) { @@ -76,7 +76,7 @@ namespace Artemis.Plugins.LayerBrushes.Noise } } - using (var sh = SKShader.CreateBitmap(bitmap, SKShaderTileMode.Mirror, SKShaderTileMode.Mirror, SKMatrix.MakeScale(Scale, Scale))) + using (var sh = SKShader.CreateBitmap(bitmap, SKShaderTileMode.Mirror, SKShaderTileMode.Mirror, SKMatrix.MakeScale(scale.Width, scale.Height))) { paint.Shader = sh; canvas.DrawPath(Layer.LayerShape.Path, paint); diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs index 2c06a0b91..eef1fbe50 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs @@ -35,7 +35,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties public BaseLayerProperty LayerProperty { get; } public LayerPropertyViewModel Parent { get; } - public List Children { get; set; } + public List Children { get; } public bool IsExpanded { get; set; } @@ -78,5 +78,15 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties match.Initialize(this); return match; } + + public IEnumerable GetAllChildren() + { + var children = new List(); + children.AddRange(Children); + foreach (var layerPropertyViewModel in children) + children.AddRange(layerPropertyViewModel.GetAllChildren()); + + return children; + } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs index 61b373af3..b14b98ce5 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeChildViewModel.cs @@ -4,13 +4,11 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree { public class PropertyTreeChildViewModel : PropertyTreeItemViewModel { - public PropertyTreeChildViewModel(LayerPropertyViewModel layerPropertyViewModel) + public PropertyTreeChildViewModel(LayerPropertyViewModel layerPropertyViewModel) : base(layerPropertyViewModel) { - LayerPropertyViewModel = layerPropertyViewModel; PropertyInputViewModel = layerPropertyViewModel.GetPropertyInputViewModel(); } - public LayerPropertyViewModel LayerPropertyViewModel { get; } public PropertyInputViewModel PropertyInputViewModel { get; set; } public override void Update(bool forceUpdate) diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeItemViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeItemViewModel.cs index 0cafdd660..f82cc0018 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeItemViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeItemViewModel.cs @@ -4,6 +4,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree { public abstract class PropertyTreeItemViewModel : PropertyChangedBase { + public LayerPropertyViewModel LayerPropertyViewModel { get; } + + protected PropertyTreeItemViewModel(LayerPropertyViewModel layerPropertyViewModel) + { + LayerPropertyViewModel = layerPropertyViewModel; + } + /// /// Updates the tree item's input if it is visible and has keyframes enabled /// diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs index 91e357e9c..3c1e7df49 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeParentViewModel.cs @@ -1,13 +1,13 @@ using System.Linq; +using Artemis.Core.Events; using Stylet; namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree { public class PropertyTreeParentViewModel : PropertyTreeItemViewModel { - public PropertyTreeParentViewModel(LayerPropertyViewModel layerPropertyViewModel) + public PropertyTreeParentViewModel(LayerPropertyViewModel layerPropertyViewModel) : base(layerPropertyViewModel) { - LayerPropertyViewModel = layerPropertyViewModel; Children = new BindableCollection(); foreach (var childProperty in layerPropertyViewModel.Children) @@ -17,9 +17,37 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree else Children.Add(new PropertyTreeChildViewModel(childProperty)); } + + LayerPropertyViewModel.LayerProperty.Layer.LayerPropertyRegistered += LayerOnLayerPropertyRegistered; + LayerPropertyViewModel.LayerProperty.Layer.LayerPropertyRemoved += LayerOnLayerPropertyRemoved; + } + + private void LayerOnLayerPropertyRegistered(object sender, LayerPropertyEventArgs e) + { + if (e.LayerProperty.Parent == LayerPropertyViewModel.LayerProperty) + { + // Problem is we don't have a LayerPropertyViewModel here.. + } + } + + private void LayerOnLayerPropertyRemoved(object sender, LayerPropertyEventArgs e) + { + // Remove self + if (e.LayerProperty == LayerPropertyViewModel.LayerProperty) + { + LayerPropertyViewModel.LayerProperty.Layer.LayerPropertyRemoved -= LayerOnLayerPropertyRegistered; + LayerPropertyViewModel.LayerProperty.Layer.LayerPropertyRemoved -= LayerOnLayerPropertyRemoved; + } + + // Remove child + if (e.LayerProperty.Parent == LayerPropertyViewModel.LayerProperty) + { + var child = Children.FirstOrDefault(c => c.LayerPropertyViewModel.LayerProperty == e.LayerProperty); + if (child != null) + Children.Remove(child); + } } - public LayerPropertyViewModel LayerPropertyViewModel { get; } public BindableCollection Children { get; set; } public override void Update(bool forceUpdate) diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs index 286556895..b0dc9f66f 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/PropertyTree/PropertyTreeViewModel.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using Artemis.Core.Models.Profile.LayerProperties; using Artemis.UI.Services.Interfaces; using Stylet; @@ -43,6 +44,11 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.PropertyTree PropertyTreeItemViewModels.Clear(); } + public void AddLayerProperty(BaseLayerProperty layerProperty) + { + + } + /// /// Updates the tree item's input if it is visible and has keyframes enabled /// diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs index e532471fd..8ba70e788 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTimelineViewModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Artemis.Core.Models.Profile.LayerProperties; using Artemis.UI.Ninject.Factories; using Artemis.UI.Services.Interfaces; using Stylet; @@ -60,6 +61,11 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline CreateViewModels(child); } + public void AddLayerProperty(BaseLayerProperty layerProperty) + { + throw new NotImplementedException(); + } + public void ClearProperties() { PropertyTrackViewModels.Clear(); diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs index 164463723..3c7bc1480 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/Timeline/PropertyTrackViewModel.cs @@ -1,4 +1,5 @@ using System.Linq; +using Artemis.Core.Events; using Artemis.UI.Ninject.Factories; using Stylet; @@ -21,6 +22,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.LayerProperties.Timeline UpdateKeyframes(PropertyTimelineViewModel.LayerPropertiesViewModel.PixelsPerSecond); } + public PropertyTimelineViewModel PropertyTimelineViewModel { get; } public LayerPropertyViewModel LayerPropertyViewModel { get; } public BindableCollection KeyframeViewModels { get; set; }