CreateRasterKeyFrame_Change.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 CreateRasterKeyFrame_Change : Change
  6. {
  7. private readonly Guid _targetLayerGuid;
  8. private int _frame;
  9. private readonly Guid? cloneFrom;
  10. private int? cloneFromFrame;
  11. private ImageLayerNode? _layer;
  12. private Guid createdKeyFrameId;
  13. [GenerateMakeChangeAction]
  14. public CreateRasterKeyFrame_Change(Guid targetLayerGuid, Guid newKeyFrameGuid, int frame,
  15. int cloneFromFrame = -1,
  16. Guid cloneFromExisting = default)
  17. {
  18. _targetLayerGuid = targetLayerGuid;
  19. _frame = frame;
  20. cloneFrom = cloneFromExisting != default ? cloneFromExisting : null;
  21. createdKeyFrameId = newKeyFrameGuid;
  22. this.cloneFromFrame = cloneFromFrame < 0 ? null : cloneFromFrame;
  23. }
  24. public override bool InitializeAndValidate(Document target)
  25. {
  26. var targetLayer = target.FindMember(_targetLayerGuid);
  27. if (targetLayer is null)
  28. {
  29. return false;
  30. }
  31. if(_frame == -1 && targetLayer.KeyFrames.All(x => x.KeyFrameGuid != createdKeyFrameId))
  32. {
  33. return false;
  34. }
  35. return _frame != 0 && target.TryFindMember(_targetLayerGuid, out _layer);
  36. }
  37. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
  38. out bool ignoreInUndo)
  39. {
  40. var cloneFromImage = cloneFrom.HasValue
  41. ? target.FindMemberOrThrow<ImageLayerNode>(cloneFrom.Value).GetLayerImageAtFrame(cloneFromFrame ?? 0)
  42. : null;
  43. ImageLayerNode targetNode = target.FindMemberOrThrow<ImageLayerNode>(_targetLayerGuid);
  44. ChunkyImage img = cloneFromImage?.CloneFromCommitted() ?? new ChunkyImage(target.Size, target.ProcessingColorSpace);
  45. var keyFrame =
  46. new RasterKeyFrame(createdKeyFrameId, targetNode.Id, _frame, target);
  47. var existingData = targetNode.KeyFrames.FirstOrDefault(x => x.KeyFrameGuid == createdKeyFrameId);
  48. bool isVisible = true;
  49. int duration = 1;
  50. if (existingData is null)
  51. {
  52. if (_frame == -1)
  53. {
  54. ignoreInUndo = true;
  55. return new None();
  56. }
  57. targetNode.AddFrame(createdKeyFrameId,
  58. new KeyFrameData(createdKeyFrameId, _frame, 1, ImageLayerNode.ImageLayerKey) { Data = img, });
  59. }
  60. else
  61. {
  62. _frame = existingData.StartFrame;
  63. duration = existingData.Duration;
  64. isVisible = existingData.IsVisible;
  65. keyFrame.StartFrame = _frame;
  66. keyFrame.Duration = duration;
  67. keyFrame.IsVisible = isVisible;
  68. }
  69. target.AnimationData.AddKeyFrame(keyFrame);
  70. ignoreInUndo = false;
  71. List<IChangeInfo> infos = new()
  72. {
  73. new CreateRasterKeyFrame_ChangeInfo(_targetLayerGuid, _frame, createdKeyFrameId, cloneFrom.HasValue),
  74. new KeyFrameLength_ChangeInfo(createdKeyFrameId, _frame, duration),
  75. new KeyFrameVisibility_ChangeInfo(_targetLayerGuid, isVisible)
  76. };
  77. return infos;
  78. }
  79. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
  80. {
  81. target.AnimationData.RemoveKeyFrame(createdKeyFrameId);
  82. target.FindMemberOrThrow<ImageLayerNode>(_targetLayerGuid).RemoveKeyFrame(createdKeyFrameId);
  83. return new DeleteKeyFrame_ChangeInfo(createdKeyFrameId);
  84. }
  85. }