KeyFramesStartPos_UpdateableChange.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using PixiEditor.ChangeableDocument.Changeables.Animations;
  2. using PixiEditor.ChangeableDocument.ChangeInfos.Animation;
  3. namespace PixiEditor.ChangeableDocument.Changes.Animation;
  4. internal class KeyFramesStartPos_UpdateableChange : InterruptableUpdateableChange
  5. {
  6. public Guid[] KeyFramesGuid { get; }
  7. public int Delta { get; set; }
  8. private Dictionary<Guid, int> originalStartFrames = new();
  9. [GenerateUpdateableChangeActions]
  10. public KeyFramesStartPos_UpdateableChange(List<Guid> keyFramesGuid, int delta) // do not delete, code generator uses this for update method
  11. {
  12. KeyFramesGuid = keyFramesGuid.ToArray();
  13. Delta = 0;
  14. }
  15. [UpdateChangeMethod]
  16. public void Update(int delta)
  17. {
  18. Delta += delta;
  19. }
  20. public override bool InitializeAndValidate(Document target)
  21. {
  22. foreach (Guid keyFrameGuid in KeyFramesGuid)
  23. {
  24. if (target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame))
  25. {
  26. originalStartFrames[keyFrameGuid] = keyFrame.StartFrame;
  27. }
  28. else
  29. {
  30. return false;
  31. }
  32. }
  33. return true;
  34. }
  35. public override OneOf<None, IChangeInfo, List<IChangeInfo>> ApplyTemporarily(Document target)
  36. {
  37. List<IChangeInfo> changes = new();
  38. foreach (Guid keyFrameGuid in KeyFramesGuid)
  39. {
  40. target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame);
  41. keyFrame.StartFrame = originalStartFrames[keyFrameGuid] + Delta;
  42. changes.Add(new KeyFrameLength_ChangeInfo(keyFrameGuid, keyFrame.StartFrame, keyFrame.Duration));
  43. }
  44. return changes;
  45. }
  46. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
  47. {
  48. List<IChangeInfo> changes = new();
  49. foreach (Guid keyFrameGuid in KeyFramesGuid)
  50. {
  51. target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame);
  52. keyFrame.StartFrame = originalStartFrames[keyFrameGuid] + Delta;
  53. changes.Add(new KeyFrameLength_ChangeInfo(keyFrameGuid, keyFrame.StartFrame, keyFrame.Duration));
  54. }
  55. ignoreInUndo = false;
  56. return changes;
  57. }
  58. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
  59. {
  60. List<IChangeInfo> changes = new();
  61. foreach (Guid keyFrameGuid in KeyFramesGuid)
  62. {
  63. target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame);
  64. keyFrame.StartFrame = originalStartFrames[keyFrameGuid];
  65. changes.Add(new KeyFrameLength_ChangeInfo(keyFrameGuid, keyFrame.StartFrame, keyFrame.Duration));
  66. }
  67. return changes;
  68. }
  69. public override bool IsMergeableWith(Change other)
  70. {
  71. return other is KeyFramesStartPos_UpdateableChange otherChange && otherChange.KeyFramesGuid.SequenceEqual(KeyFramesGuid);
  72. }
  73. }