diff --git a/src/Artemis.Core/Models/Profile/LayerProperties/BaseLayerPropertyKeyframe.cs b/src/Artemis.Core/Models/Profile/LayerProperties/BaseLayerPropertyKeyframe.cs index b4adf932f..d0537d8b1 100644 --- a/src/Artemis.Core/Models/Profile/LayerProperties/BaseLayerPropertyKeyframe.cs +++ b/src/Artemis.Core/Models/Profile/LayerProperties/BaseLayerPropertyKeyframe.cs @@ -8,10 +8,16 @@ namespace Artemis.Core.Models.Profile.LayerProperties /// public abstract class BaseLayerPropertyKeyframe { - internal BaseLayerPropertyKeyframe() + internal BaseLayerPropertyKeyframe(BaseLayerProperty baseLayerProperty) { + BaseLayerProperty = baseLayerProperty; } + /// + /// The base class of the layer property this keyframe is applied to + /// + public BaseLayerProperty BaseLayerProperty { get; internal set; } + /// /// The position of this keyframe in the timeline /// @@ -20,8 +26,6 @@ namespace Artemis.Core.Models.Profile.LayerProperties /// /// The easing function applied on the value of the keyframe /// - public abstract Easings.Functions EasingFunction { get; set; } - - internal abstract BaseLayerProperty BaseLayerProperty { get; } + public Easings.Functions EasingFunction { get; set; } } } \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs b/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs index c33897687..0b284a23c 100644 --- a/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs +++ b/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs @@ -90,7 +90,7 @@ namespace Artemis.Core.Models.Profile.LayerProperties var currentKeyframe = Keyframes.FirstOrDefault(k => k.Position == time.Value); // Create a new keyframe if none found if (currentKeyframe == null) - AddKeyframe(new LayerPropertyKeyframe(value, time.Value, Easings.Functions.Linear)); + AddKeyframe(new LayerPropertyKeyframe(value, time.Value, Easings.Functions.Linear, this)); else currentKeyframe.Value = value; @@ -105,20 +105,47 @@ namespace Artemis.Core.Models.Profile.LayerProperties /// The keyframe to add public void AddKeyframe(LayerPropertyKeyframe keyframe) { + if (_keyframes.Contains(keyframe)) + return; + + keyframe.LayerProperty?.RemoveKeyframe(keyframe); + keyframe.LayerProperty = this; + keyframe.BaseLayerProperty = this; _keyframes.Add(keyframe); SortKeyframes(); OnKeyframeAdded(); } + /// + /// Removes a keyframe from the layer property + /// + /// The keyframe to remove + public LayerPropertyKeyframe CopyKeyframe(LayerPropertyKeyframe keyframe) + { + var newKeyframe = new LayerPropertyKeyframe( + keyframe.Value, + keyframe.Position, + keyframe.EasingFunction, + keyframe.LayerProperty + ); + AddKeyframe(newKeyframe); + + return newKeyframe; + } + /// /// Removes a keyframe from the layer property /// /// The keyframe to remove public void RemoveKeyframe(LayerPropertyKeyframe keyframe) { + if (!_keyframes.Contains(keyframe)) + return; + _keyframes.Remove(keyframe); keyframe.LayerProperty = null; + keyframe.BaseLayerProperty = null; SortKeyframes(); OnKeyframeRemoved(); } @@ -213,8 +240,9 @@ namespace Artemis.Core.Models.Profile.LayerProperties _keyframes.AddRange(entity.KeyframeEntities.Select(k => new LayerPropertyKeyframe( JsonConvert.DeserializeObject(k.Value), k.Position, - (Easings.Functions) k.EasingFunction) - )); + (Easings.Functions) k.EasingFunction, + this + ))); } catch (JsonException e) { diff --git a/src/Artemis.Core/Models/Profile/LayerProperties/LayerPropertyKeyFrame.cs b/src/Artemis.Core/Models/Profile/LayerProperties/LayerPropertyKeyFrame.cs index 7cb1ffcb0..af37209aa 100644 --- a/src/Artemis.Core/Models/Profile/LayerProperties/LayerPropertyKeyFrame.cs +++ b/src/Artemis.Core/Models/Profile/LayerProperties/LayerPropertyKeyFrame.cs @@ -7,10 +7,11 @@ namespace Artemis.Core.Models.Profile.LayerProperties { private TimeSpan _position; - public LayerPropertyKeyframe(T value, TimeSpan position, Easings.Functions easingFunction) + public LayerPropertyKeyframe(T value, TimeSpan position, Easings.Functions easingFunction, LayerProperty layerProperty) : base(layerProperty) { _position = position; Value = value; + LayerProperty = layerProperty; EasingFunction = easingFunction; } @@ -34,10 +35,5 @@ namespace Artemis.Core.Models.Profile.LayerProperties LayerProperty.SortKeyframes(); } } - - /// - public sealed override Easings.Functions EasingFunction { get; set; } - - internal override BaseLayerProperty BaseLayerProperty => LayerProperty; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Screens/Dialogs/ExceptionDialogView.xaml b/src/Artemis.UI.Shared/Screens/Dialogs/ExceptionDialogView.xaml index 09e40501e..4a4ad281d 100644 --- a/src/Artemis.UI.Shared/Screens/Dialogs/ExceptionDialogView.xaml +++ b/src/Artemis.UI.Shared/Screens/Dialogs/ExceptionDialogView.xaml @@ -10,29 +10,38 @@ mc:Ignorable="d" d:DesignHeight="163.274" d:DesignWidth="254.425" d:DataContext="{d:DesignInstance dialogs:ExceptionDialogViewModel}"> - - - + + - Exception message - - - + + + + + + + - + - - -