MoveStructureMember_Change.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using PixiEditor.ChangeableDocument.Changeables.Graph;
  2. using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
  3. using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
  4. using PixiEditor.ChangeableDocument.ChangeInfos.Structure;
  5. using PixiEditor.ChangeableDocument.Changes.NodeGraph;
  6. using PixiEditor.DrawingApi.Core;
  7. using PixiEditor.DrawingApi.Core.Surfaces;
  8. namespace PixiEditor.ChangeableDocument.Changes.Structure;
  9. internal class MoveStructureMember_Change : Change
  10. {
  11. private Guid memberGuid;
  12. private Guid targetNodeGuid;
  13. private Guid originalFolderGuid;
  14. private ConnectionsData originalConnections;
  15. private bool putInsideFolder;
  16. [GenerateMakeChangeAction]
  17. public MoveStructureMember_Change(Guid memberGuid, Guid targetNode, bool putInsideFolder)
  18. {
  19. this.memberGuid = memberGuid;
  20. this.targetNodeGuid = targetNode;
  21. this.putInsideFolder = putInsideFolder;
  22. }
  23. public override bool InitializeAndValidate(Document document)
  24. {
  25. var member = document.FindMember(memberGuid);
  26. var targetFolder = document.FindNode(targetNodeGuid);
  27. if (member is null || targetFolder is null)
  28. return false;
  29. originalConnections = NodeOperations.CreateConnectionsData(member);
  30. return true;
  31. }
  32. private static List<IChangeInfo> Move(Document document, Guid sourceNodeGuid, Guid targetNodeGuid, bool putInsideFolder)
  33. {
  34. var sourceNode = document.FindMember(sourceNodeGuid);
  35. var targetNode = document.FindNode(targetNodeGuid);
  36. if (sourceNode is null || targetNode is not IRenderInput backgroundInput)
  37. return [];
  38. List<IChangeInfo> changes = new();
  39. Guid oldBackgroundId = sourceNode.RenderTarget.Node.Id;
  40. InputProperty<DrawingSurface?> inputProperty = backgroundInput.RenderTarget;
  41. if (targetNode is FolderNode folder && putInsideFolder)
  42. {
  43. inputProperty = folder.Content;
  44. }
  45. MoveStructureMember_ChangeInfo changeInfo = new(sourceNodeGuid, oldBackgroundId, targetNodeGuid);
  46. changes.AddRange(NodeOperations.DetachStructureNode(sourceNode));
  47. changes.AddRange(NodeOperations.AppendMember(inputProperty, sourceNode.Output,
  48. sourceNode.RenderTarget,
  49. sourceNode.Id));
  50. changes.Add(changeInfo);
  51. return changes;
  52. }
  53. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
  54. out bool ignoreInUndo)
  55. {
  56. var changes = Move(target, memberGuid, targetNodeGuid, putInsideFolder);
  57. ignoreInUndo = false;
  58. return changes;
  59. }
  60. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
  61. {
  62. StructureNode member = target.FindMember(memberGuid);
  63. List<IChangeInfo> changes = new List<IChangeInfo>();
  64. MoveStructureMember_ChangeInfo changeInfo = new(memberGuid, targetNodeGuid, originalFolderGuid);
  65. changes.AddRange(NodeOperations.DetachStructureNode(member));
  66. changes.AddRange(NodeOperations.ConnectStructureNodeProperties(originalConnections, member, target.NodeGraph));
  67. changes.Add(changeInfo);
  68. return changes;
  69. }
  70. }