Browse Source

Implemented modify image node pair change

CPKreuz 1 year ago
parent
commit
f977579c04

+ 12 - 1
src/PixiEditor.AvaloniaUI/ViewModels/Document/NodeGraphViewModel.cs

@@ -172,7 +172,18 @@ internal class NodeGraphViewModel : ViewModelBase, INodeGraphHandler
 
     public void CreateNode(Type nodeType)
     {
-        Internals.ActionAccumulator.AddFinishedActions(new CreateNode_Action(nodeType, Guid.NewGuid()));
+        IAction change;
+        
+        if (nodeType == typeof(ModifyImageLeftNode) || nodeType == typeof(ModifyImageRightNode))
+        {
+            change = new CreateModifyImageNodePair_Action(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid());
+        }
+        else
+        {
+            change = new CreateNode_Action(nodeType, Guid.NewGuid());
+        }
+        
+        Internals.ActionAccumulator.AddFinishedActions(change);
     }
 
     // TODO: Remove this

+ 5 - 2
src/PixiEditor.ChangeableDocument/ChangeInfos/NodeGraph/CreateNode_ChangeInfo.cs

@@ -19,9 +19,12 @@ public record CreateNode_ChangeInfo(
             .ToImmutableArray();
     }
 
-    public static CreateNode_ChangeInfo CreateFromNode(IReadOnlyNode node)
+    public static CreateNode_ChangeInfo CreateFromNode(IReadOnlyNode node) =>
+        CreateFromNode(node, node.GetType().Name.Replace("Node", ""));
+    
+    public static CreateNode_ChangeInfo CreateFromNode(IReadOnlyNode node, string name)
     {
-        return new CreateNode_ChangeInfo(node.GetType().Name.Replace("Node", ""), node.Position, node.Id,
+        return new CreateNode_ChangeInfo(name, node.Position, node.Id,
             CreatePropertyInfos(node.InputProperties, true, node.Id),
             CreatePropertyInfos(node.OutputProperties, false, node.Id));
     }

+ 6 - 7
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/ModifyImageRightNode.cs

@@ -9,29 +9,28 @@ namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 
 public class ModifyImageRightNode : Node
 {
-    private Paint drawingPaint = new Paint() { BlendMode = BlendMode.Src };
+    private ModifyImageLeftNode startNode;
     
-    public InputProperty<ChunkyImage?> _InternalImage { get; }
+    private Paint drawingPaint = new Paint() { BlendMode = BlendMode.Src };
     
     public FieldInputProperty<Color> Color { get; }
     
     public OutputProperty<ChunkyImage> Output { get; }
     
-    public ModifyImageRightNode() 
+    public ModifyImageRightNode(ModifyImageLeftNode startNode)
     {
-        _InternalImage = CreateInput<ChunkyImage>(nameof(_InternalImage), "_InternalImage", null);
+        this.startNode = startNode;
         Color = CreateFieldInput(nameof(Color), "COLOR", _ => new Color(0, 0, 0, 255));
         Output = CreateOutput<ChunkyImage>(nameof(Output), "OUTPUT", null);
     }
 
     protected override ChunkyImage? OnExecute(KeyFrameTime frameTime)
     {
-        if (_InternalImage.Value == null)
+        if (startNode.Image.Value is not { CommittedSize: var size })
         {
             return null;
         }
         
-        var size = _InternalImage.Value.CommittedSize;
         var width = size.X;
         var height = size.Y;
 
@@ -58,5 +57,5 @@ public class ModifyImageRightNode : Node
 
     public override bool Validate() => true;
 
-    public override Node CreateCopy() => new ModifyImageRightNode();
+    public override Node CreateCopy() => throw new NotImplementedException();
 }

+ 61 - 0
src/PixiEditor.ChangeableDocument/Changes/NodeGraph/CreateModifyImageNodePair_Change.cs

@@ -0,0 +1,61 @@
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.ChangeableDocument.ChangeInfos.NodeGraph;
+using PixiEditor.Numerics;
+
+namespace PixiEditor.ChangeableDocument.Changes.NodeGraph;
+
+internal class CreateModifyImageNodePair_Change : Change
+{
+    private Guid startId;
+    private Guid endId;
+    private Guid zoneId;
+    
+    [GenerateMakeChangeAction]
+    public CreateModifyImageNodePair_Change(Guid startId, Guid endId, Guid zoneId)
+    {
+        this.startId = startId;
+        this.endId = endId;
+        this.zoneId = zoneId;
+    }
+
+    public override bool InitializeAndValidate(Document target) => true;
+
+    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
+    {
+        var start = new ModifyImageLeftNode();
+        var end = new ModifyImageRightNode(start);
+
+        start.Id = startId;
+        end.Id = endId;
+        end.Position = new VecD(100, 0);
+        
+        target.NodeGraph.AddNode(start);
+        target.NodeGraph.AddNode(end);
+        
+        ignoreInUndo = false;
+
+        return new List<IChangeInfo>
+        {
+            CreateNode_ChangeInfo.CreateFromNode(start, "Modify Image"),
+            CreateNode_ChangeInfo.CreateFromNode(end, "Modify Image"),
+            new CreateNodeFrame_ChangeInfo(zoneId, [startId, endId])
+        };
+    }
+
+    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
+    {
+        var startChange = RemoveNode(target, startId);
+        var endChange = RemoveNode(target, endId);
+        var zoneChange = new DeleteNodeFrame_ChangeInfo(zoneId);
+
+        return new List<IChangeInfo> { startChange, endChange, zoneChange };
+    }
+
+    private DeleteNode_ChangeInfo RemoveNode(Document target, Guid id)
+    {
+        Node node = target.FindNodeOrThrow<Node>(id);
+        target.NodeGraph.RemoveNode(node);
+
+        return new DeleteNode_ChangeInfo(id);
+    }
+}