|
@@ -11,17 +11,9 @@ internal class AnimationData : IReadOnlyAnimationData
|
|
|
get => _activeFrame;
|
|
get => _activeFrame;
|
|
|
set
|
|
set
|
|
|
{
|
|
{
|
|
|
- int lastFrame = _activeFrame;
|
|
|
|
|
- if (value < 0)
|
|
|
|
|
- {
|
|
|
|
|
- _activeFrame = 0;
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- _activeFrame = value;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ _activeFrame = value < 0 ? 0 : value;
|
|
|
|
|
|
|
|
- OnPreviewFrameChanged(lastFrame);
|
|
|
|
|
|
|
+ OnPreviewFrameChanged();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -29,6 +21,7 @@ internal class AnimationData : IReadOnlyAnimationData
|
|
|
|
|
|
|
|
private List<KeyFrame> keyFrames = new List<KeyFrame>();
|
|
private List<KeyFrame> keyFrames = new List<KeyFrame>();
|
|
|
private readonly Document document;
|
|
private readonly Document document;
|
|
|
|
|
+ private List<KeyFrame> lastActiveKeyFrames = new List<KeyFrame>();
|
|
|
|
|
|
|
|
public AnimationData(Document document)
|
|
public AnimationData(Document document)
|
|
|
{
|
|
{
|
|
@@ -48,23 +41,32 @@ internal class AnimationData : IReadOnlyAnimationData
|
|
|
createdGroup.Children.Add(keyFrame);
|
|
createdGroup.Children.Add(keyFrame);
|
|
|
keyFrames.Add(createdGroup);
|
|
keyFrames.Add(createdGroup);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ keyFrame.KeyFrameChanged += KeyFrameChanged;
|
|
|
|
|
+
|
|
|
|
|
+ UpdateKeyFrames(keyFrames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void RemoveKeyFrame(Guid createdKeyFrameId)
|
|
public void RemoveKeyFrame(Guid createdKeyFrameId)
|
|
|
{
|
|
{
|
|
|
TryFindKeyFrameCallback<KeyFrame>(createdKeyFrameId, out _, (frame, parent) =>
|
|
TryFindKeyFrameCallback<KeyFrame>(createdKeyFrameId, out _, (frame, parent) =>
|
|
|
{
|
|
{
|
|
|
- if (parent != null)
|
|
|
|
|
- {
|
|
|
|
|
- parent.Children.Remove(frame);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ frame.KeyFrameChanged -= KeyFrameChanged;
|
|
|
|
|
+ parent?.Children.Remove(frame);
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ UpdateKeyFrames(keyFrames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public bool TryFindKeyFrame<T>(Guid id, out T keyFrame) where T : IReadOnlyKeyFrame
|
|
public bool TryFindKeyFrame<T>(Guid id, out T keyFrame) where T : IReadOnlyKeyFrame
|
|
|
{
|
|
{
|
|
|
return TryFindKeyFrameCallback(id, out keyFrame, null);
|
|
return TryFindKeyFrameCallback(id, out keyFrame, null);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private void KeyFrameChanged()
|
|
|
|
|
+ {
|
|
|
|
|
+ UpdateKeyFrames(keyFrames);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
private bool TryFindKeyFrameCallback<T>(Guid id, out T? foundKeyFrame,
|
|
private bool TryFindKeyFrameCallback<T>(Guid id, out T? foundKeyFrame,
|
|
|
Action<KeyFrame, GroupKeyFrame?> onFound = null) where T : IReadOnlyKeyFrame
|
|
Action<KeyFrame, GroupKeyFrame?> onFound = null) where T : IReadOnlyKeyFrame
|
|
@@ -99,26 +101,27 @@ internal class AnimationData : IReadOnlyAnimationData
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private void OnPreviewFrameChanged(int lastFrame)
|
|
|
|
|
|
|
+ private void OnPreviewFrameChanged()
|
|
|
{
|
|
{
|
|
|
if (KeyFrames == null)
|
|
if (KeyFrames == null)
|
|
|
{
|
|
{
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- NotifyKeyFrames(lastFrame, keyFrames);
|
|
|
|
|
|
|
+ UpdateKeyFrames(keyFrames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private void NotifyKeyFrames(int lastFrame, List<KeyFrame> root)
|
|
|
|
|
|
|
+ private void UpdateKeyFrames(List<KeyFrame> root)
|
|
|
{
|
|
{
|
|
|
foreach (var keyFrame in root)
|
|
foreach (var keyFrame in root)
|
|
|
{
|
|
{
|
|
|
bool isWithinRange = keyFrame.IsWithinRange(ActiveFrame);
|
|
bool isWithinRange = keyFrame.IsWithinRange(ActiveFrame);
|
|
|
- if (keyFrame.IsWithinRange(lastFrame))
|
|
|
|
|
|
|
+ if (lastActiveKeyFrames.Contains(keyFrame))
|
|
|
{
|
|
{
|
|
|
if (!isWithinRange)
|
|
if (!isWithinRange)
|
|
|
{
|
|
{
|
|
|
keyFrame.Deactivated(ActiveFrame);
|
|
keyFrame.Deactivated(ActiveFrame);
|
|
|
|
|
+ lastActiveKeyFrames.Remove(keyFrame);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -128,11 +131,12 @@ internal class AnimationData : IReadOnlyAnimationData
|
|
|
else if (isWithinRange)
|
|
else if (isWithinRange)
|
|
|
{
|
|
{
|
|
|
keyFrame.ActiveFrameChanged(ActiveFrame);
|
|
keyFrame.ActiveFrameChanged(ActiveFrame);
|
|
|
|
|
+ lastActiveKeyFrames.Add(keyFrame);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (keyFrame is GroupKeyFrame group)
|
|
if (keyFrame is GroupKeyFrame group)
|
|
|
{
|
|
{
|
|
|
- NotifyKeyFrames(lastFrame, group.Children);
|
|
|
|
|
|
|
+ UpdateKeyFrames(group.Children);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|