CreateAnimationDataFromLayer_Change.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using PixiEditor.ChangeableDocument.Changeables.Animations;
  2. using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
  3. using PixiEditor.ChangeableDocument.ChangeInfos.Animation;
  4. namespace PixiEditor.ChangeableDocument.Changes.Animation;
  5. internal class CreateAnimationDataFromLayer_Change : Change
  6. {
  7. private readonly Guid layerGuid;
  8. [GenerateMakeChangeAction]
  9. public CreateAnimationDataFromLayer_Change(Guid layerGuid)
  10. {
  11. this.layerGuid = layerGuid;
  12. }
  13. public override bool InitializeAndValidate(Document target)
  14. {
  15. return target.TryFindMember<LayerNode>(layerGuid, out LayerNode? layer) && layer.KeyFrames != null &&
  16. layer.KeyFrames.Count != 0;
  17. }
  18. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
  19. out bool ignoreInUndo)
  20. {
  21. LayerNode layer = target.FindNode(layerGuid) as LayerNode;
  22. List<IChangeInfo> infos = new List<IChangeInfo>();
  23. foreach (var frame in layer.KeyFrames)
  24. {
  25. Guid keyFrameId = frame.KeyFrameGuid;
  26. target.AnimationData.AddKeyFrame(new RasterKeyFrame(keyFrameId, layer.Id, frame.StartFrame, target)
  27. {
  28. Duration = frame.Duration,
  29. IsVisible = frame.IsVisible,
  30. });
  31. infos.Add(new CreateRasterKeyFrame_ChangeInfo(layer.Id, frame.StartFrame, keyFrameId, true));
  32. infos.Add(new KeyFrameLength_ChangeInfo(keyFrameId, frame.StartFrame, frame.Duration));
  33. infos.Add(new KeyFrameVisibility_ChangeInfo(keyFrameId, frame.IsVisible));
  34. }
  35. ignoreInUndo = false;
  36. return infos;
  37. }
  38. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
  39. {
  40. var layer = target.FindNode(layerGuid) as LayerNode;
  41. List<IChangeInfo> infos = new List<IChangeInfo>();
  42. var keyFrame = target.AnimationData.KeyFrames;
  43. var ids = keyFrame.Where(x => x.NodeId == layer.Id).Select(x => x.Id).ToList();
  44. foreach (var id in ids)
  45. {
  46. target.AnimationData.RemoveKeyFrame(id);
  47. infos.Add(new DeleteKeyFrame_ChangeInfo(id));
  48. }
  49. return infos;
  50. }
  51. }