using PixiEditor.ChangeableDocument.Changeables.Animations; using PixiEditor.ChangeableDocument.ChangeInfos.Animation; namespace PixiEditor.ChangeableDocument.Changes.Animation; internal class KeyFramesStartPos_UpdateableChange : InterruptableUpdateableChange { public Guid[] KeyFramesGuid { get; } public int Delta { get; set; } private Dictionary originalStartFrames = new(); [GenerateUpdateableChangeActions] public KeyFramesStartPos_UpdateableChange(List keyFramesGuid, int delta) // do not delete, code generator uses this for update method { KeyFramesGuid = keyFramesGuid.ToArray(); Delta = 0; } [UpdateChangeMethod] public void Update(int delta) { Delta += delta; } public override bool InitializeAndValidate(Document target) { foreach (Guid keyFrameGuid in KeyFramesGuid) { if (target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame)) { originalStartFrames[keyFrameGuid] = keyFrame.StartFrame; } else { return false; } } return true; } public override OneOf> ApplyTemporarily(Document target) { List changes = new(); foreach (Guid keyFrameGuid in KeyFramesGuid) { target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame); keyFrame.StartFrame = originalStartFrames[keyFrameGuid] + Delta; changes.Add(new KeyFrameLength_ChangeInfo(keyFrameGuid, keyFrame.StartFrame, keyFrame.Duration)); } return changes; } public override OneOf> Apply(Document target, bool firstApply, out bool ignoreInUndo) { List changes = new(); foreach (Guid keyFrameGuid in KeyFramesGuid) { target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame); keyFrame.StartFrame = originalStartFrames[keyFrameGuid] + Delta; changes.Add(new KeyFrameLength_ChangeInfo(keyFrameGuid, keyFrame.StartFrame, keyFrame.Duration)); } ignoreInUndo = false; return changes; } public override OneOf> Revert(Document target) { List changes = new(); foreach (Guid keyFrameGuid in KeyFramesGuid) { target.AnimationData.TryFindKeyFrame(keyFrameGuid, out KeyFrame keyFrame); keyFrame.StartFrame = originalStartFrames[keyFrameGuid]; changes.Add(new KeyFrameLength_ChangeInfo(keyFrameGuid, keyFrame.StartFrame, keyFrame.Duration)); } return changes; } public override bool IsMergeableWith(Change other) { return other is KeyFramesStartPos_UpdateableChange otherChange && otherChange.KeyFramesGuid.SequenceEqual(KeyFramesGuid); } }