CreateStructureMember_Change.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using PixiEditor.ChangeableDocument.ChangeInfos.Structure;
  2. using PixiEditor.ChangeableDocument.Enums;
  3. namespace PixiEditor.ChangeableDocument.Changes.Structure;
  4. internal class CreateStructureMember_Change : Change
  5. {
  6. private Guid newMemberGuid;
  7. private Guid parentFolderGuid;
  8. private int parentFolderIndex;
  9. private StructureMemberType type;
  10. [GenerateMakeChangeAction]
  11. public CreateStructureMember_Change(Guid parentFolder, Guid newGuid, int parentFolderIndex, StructureMemberType type)
  12. {
  13. this.parentFolderGuid = parentFolder;
  14. this.parentFolderIndex = parentFolderIndex;
  15. this.type = type;
  16. newMemberGuid = newGuid;
  17. }
  18. public override OneOf<Success, Error> InitializeAndValidate(Document target)
  19. {
  20. if (target.FindMember(parentFolderGuid) is null)
  21. return new Error();
  22. return new Success();
  23. }
  24. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document document, out bool ignoreInUndo)
  25. {
  26. var folder = (Folder)document.FindMemberOrThrow(parentFolderGuid);
  27. StructureMember member = type switch
  28. {
  29. StructureMemberType.Layer => new Layer(document.Size) { GuidValue = newMemberGuid },
  30. StructureMemberType.Folder => new Folder() { GuidValue = newMemberGuid },
  31. _ => throw new NotSupportedException(),
  32. };
  33. folder.Children = folder.Children.Insert(parentFolderIndex, member);
  34. ignoreInUndo = false;
  35. return type switch
  36. {
  37. StructureMemberType.Layer => CreateLayer_ChangeInfo.FromLayer(parentFolderGuid, parentFolderIndex, (Layer)member),
  38. StructureMemberType.Folder => CreateFolder_ChangeInfo.FromFolder(parentFolderGuid, parentFolderIndex, (Folder)member),
  39. _ => throw new NotSupportedException(),
  40. };
  41. }
  42. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document document)
  43. {
  44. Folder folder = (Folder)document.FindMemberOrThrow(parentFolderGuid);
  45. StructureMember child = document.FindMemberOrThrow(newMemberGuid);
  46. child.Dispose();
  47. folder.Children = folder.Children.RemoveAt(folder.Children.FindIndex(member => member.GuidValue == newMemberGuid));
  48. return new DeleteStructureMember_ChangeInfo(newMemberGuid, parentFolderGuid);
  49. }
  50. }