123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- using ChunkyImageLib;
- using PixiEditor.AnimationRenderer.Core;
- using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
- using PixiEditor.AvaloniaUI.Models.IO;
- using PixiEditor.AvaloniaUI.ViewModels.Document;
- using PixiEditor.DrawingApi.Core.Surface;
- using PixiEditor.DrawingApi.Core.Surface.ImageData;
- using PixiEditor.Numerics;
- namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
- [Command.Group("PixiEditor.Animations", "ANIMATIONS")]
- internal class AnimationsViewModel : SubViewModel<ViewModelMain>
- {
- public AnimationsViewModel(ViewModelMain owner) : base(owner)
- {
- }
-
- [Command.Basic("PixiEditor.Animation.CreateRasterKeyFrame", "Create Raster Key Frame", "Create a raster key frame", Parameter = false)]
- [Command.Basic("PixiEditor.Animation.DuplicateRasterKeyFrame", "Duplicate Raster Key Frame", "Duplicate a raster key frame", Parameter = true)]
- public void CreateRasterKeyFrame(bool duplicate)
- {
- var activeDocument = Owner.DocumentManagerSubViewModel.ActiveDocument;
- if (activeDocument?.SelectedStructureMember is null)
- {
- return;
- }
- int newFrame = GetActiveFrame(activeDocument, activeDocument.SelectedStructureMember.Id);
-
- Guid toCloneFrom = duplicate ? activeDocument.SelectedStructureMember.Id : Guid.Empty;
- int frameToCopyFrom = duplicate ? activeDocument.AnimationDataViewModel.ActiveFrameBindable : -1;
- activeDocument.AnimationDataViewModel.CreateRasterKeyFrame(
- activeDocument.SelectedStructureMember.Id,
- newFrame,
- toCloneFrom,
- frameToCopyFrom);
-
- activeDocument.Operations.SetActiveFrame(newFrame);
- }
-
- [Command.Basic("PixiEditor.Animation.DeleteKeyFrames", "Delete key frames", "Delete key frames")]
- public void DeleteKeyFrames(IList<KeyFrameViewModel> keyFrames)
- {
- var activeDocument = Owner.DocumentManagerSubViewModel.ActiveDocument;
- if (activeDocument is null)
- return;
-
- List<Guid> keyFrameIds = keyFrames.Select(x => x.Id).ToList();
-
- for(int i = 0; i < keyFrameIds.Count; i++)
- {
- if(!activeDocument.AnimationDataViewModel.TryFindKeyFrame<KeyFrameViewModel>(keyFrameIds[i], out _))
- {
- keyFrameIds.RemoveAt(i);
- i--;
- }
- }
-
- activeDocument.AnimationDataViewModel.DeleteKeyFrames(keyFrameIds);
- }
- [Command.Internal("PixiEditor.Animation.ChangeKeyFramesStartPos")]
- public void ChangeKeyFramesStartPos((Guid[] ids, int delta, bool end) info)
- {
- var activeDocument = Owner.DocumentManagerSubViewModel.ActiveDocument;
- if (activeDocument is null)
- return;
- if (!info.end)
- {
- activeDocument.AnimationDataViewModel.ChangeKeyFramesStartPos(info.ids, info.delta);
- }
- else
- {
- activeDocument.AnimationDataViewModel.EndKeyFramesStartPos();
- }
- }
-
-
- private static int GetActiveFrame(DocumentViewModel activeDocument, Guid targetLayer)
- {
- int active = activeDocument.AnimationDataViewModel.ActiveFrameBindable;
- if (activeDocument.AnimationDataViewModel.TryFindKeyFrame<KeyFrameGroupViewModel>(targetLayer, out KeyFrameGroupViewModel groupViewModel))
- {
- if(active == groupViewModel.StartFrameBindable + groupViewModel.DurationBindable - 1)
- {
- return groupViewModel.StartFrameBindable + groupViewModel.DurationBindable;
- }
- }
-
- return active;
- }
- [Command.Internal("PixiEditor.Document.StartChangeActiveFrame", CanExecute = "PixiEditor.HasDocument")]
- public void StartChangeActiveFrame(int newActiveFrame)
- {
- if (Owner.DocumentManagerSubViewModel.ActiveDocument is null)
- return;
- // TODO: same as below
- //Owner.DocumentManagerSubViewModel.ActiveDocument.EventInlet.StartChangeActiveFrame();
- }
-
- [Command.Internal("PixiEditor.Document.ChangeActiveFrame", CanExecute = "PixiEditor.HasDocument")]
- public void ChangeActiveFrame(double newActiveFrame)
- {
- if (Owner.DocumentManagerSubViewModel.ActiveDocument is null)
- return;
-
- int intNewActiveFrame = (int)newActiveFrame;
- // TODO: Check if this should be implemented
- //Owner.DocumentManagerSubViewModel.ActiveDocument.EventInlet.ChangeActiveFrame(intNewActiveFrame);
- }
- [Command.Internal("PixiEditor.Document.EndChangeActiveFrame", CanExecute = "PixiEditor.HasDocument")]
- public void EndChangeActiveFrame()
- {
- if (Owner.DocumentManagerSubViewModel.ActiveDocument is null)
- return;
-
- //Owner.DocumentManagerSubViewModel.ActiveDocument.EventInlet.EndChangeActiveFrame();
- }
-
- [Command.Internal("PixiEditor.Animation.ActiveFrameSet")]
- public void ActiveFrameSet(double value)
- {
- var document = Owner.DocumentManagerSubViewModel.ActiveDocument;
-
- if (document is null)
- return;
- document.Operations.SetActiveFrame((int)value);
- }
- }
|