Browse Source

PixiParser 4.0 serialization done

flabbet 1 year ago
parent
commit
47207a87ff

+ 0 - 12
src/PixiEditor.AvaloniaUI/Helpers/DocumentViewModelBuilder.cs

@@ -122,13 +122,11 @@ internal class DocumentViewModelBuilder
         foreach (KeyFrameGroup group in root)
         {
             GroupKeyFrameBuilder builder = new GroupKeyFrameBuilder()
-                .WithVisibility(group.Enabled)
                 .WithNodeId(group.NodeId);
 
             foreach (var child in group.Children)
             {
                 builder.WithChild<KeyFrameBuilder>(x => x
-                    .WithVisibility(child.IsEnabled)
                     .WithKeyFrameId(child.KeyFrameId)
                     .WithNodeId(child.NodeId));
             }
@@ -193,16 +191,9 @@ internal class DocumentViewModelBuilder
 
 internal class KeyFrameBuilder()
 {
-    public bool IsVisible { get; set; }
     public int NodeId { get; set; }
     public int KeyFrameId { get; set; }
 
-    public KeyFrameBuilder WithVisibility(bool isVisible)
-    {
-        IsVisible = isVisible;
-        return this;
-    }
-
     public KeyFrameBuilder WithKeyFrameId(int layerId)
     {
         KeyFrameId = layerId;
@@ -228,9 +219,6 @@ internal class GroupKeyFrameBuilder : KeyFrameBuilder
         return this;
     }
 
-    public new GroupKeyFrameBuilder WithVisibility(bool isVisible) =>
-        base.WithVisibility(isVisible) as GroupKeyFrameBuilder;
-
     public new GroupKeyFrameBuilder WithNodeId(int layerGuid) =>
         base.WithKeyFrameId(layerGuid) as GroupKeyFrameBuilder;
 }

+ 2 - 2
src/PixiEditor.AvaloniaUI/Helpers/Extensions/PixiParserV3DocumentEx.cs

@@ -353,8 +353,8 @@ internal static class PixiParserV3DocumentEx
 
     internal class RasterKeyFrameBuilder : KeyFrameBuilder
     {
-        public new RasterKeyFrameBuilder WithVisibility(bool isVisible) =>
-            base.WithVisibility(isVisible) as RasterKeyFrameBuilder;
+        /*public new RasterKeyFrameBuilder WithVisibility(bool isVisible) =>
+            base.WithVisibility(isVisible) as RasterKeyFrameBuilder;*/
 
         public new RasterKeyFrameBuilder WithLayerGuid(int layerId) =>
             base.WithKeyFrameId(layerId) as RasterKeyFrameBuilder;

+ 2 - 2
src/PixiEditor.AvaloniaUI/ViewModels/Document/DocumentViewModel.Serialization.cs

@@ -103,7 +103,8 @@ internal partial class DocumentViewModel
                     Data = SerializationUtil.SerializeObject(node.KeyFrames[i].Data, config, allFactories), 
                     AffectedElement = node.KeyFrames[i].AffectedElement,
                     StartFrame = node.KeyFrames[i].StartFrame, 
-                    Duration = node.KeyFrames[i].Duration
+                    Duration = node.KeyFrames[i].Duration,
+                    IsVisible = node.KeyFrames[i].IsVisible
                 };
             }
                 
@@ -264,7 +265,6 @@ internal partial class DocumentViewModel
         {
             NodeId = idMap[rasterKeyFrame.NodeId],
             KeyFrameId = keyFrameIds[rasterKeyFrame.Id],
-            IsEnabled = rasterKeyFrame.IsVisible
         });
     }
 }

+ 9 - 5
src/PixiEditor.AvaloniaUI/ViewModels/Document/DocumentViewModel.cs

@@ -349,9 +349,13 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
                 {
                     Guid keyFrameGuid = Guid.NewGuid();
                     mappedKeyFrameIds.Add(keyFrame.Id, keyFrameGuid);
-                    acc.AddActions(new SetKeyFrameData_Action(guid, keyFrameGuid,
-                        SerializationUtil.Deserialize(keyFrame.Data, config, allFactories), keyFrame.StartFrame,
-                        keyFrame.Duration, keyFrame.AffectedElement));
+                    acc.AddActions(
+                        new SetKeyFrameData_Action(
+                            guid,
+                            keyFrameGuid,
+                            SerializationUtil.Deserialize(keyFrame.Data, config, allFactories),
+                            keyFrame.StartFrame,
+                            keyFrame.Duration, keyFrame.AffectedElement, keyFrame.IsVisible));
                 }
             }
 
@@ -441,7 +445,7 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
             }
         }*/
 
-        void AddAnimationData(List<KeyFrameBuilder> data, Dictionary<int, Guid> mappedIds, 
+        void AddAnimationData(List<KeyFrameBuilder> data, Dictionary<int, Guid> mappedIds,
             Dictionary<int, Guid> mappedKeyFrameIds)
         {
             foreach (var keyFrame in data)
@@ -457,7 +461,7 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
                             mappedIds[keyFrame.NodeId],
                             mappedKeyFrameIds[keyFrame.KeyFrameId],
                             -1, -1, default));
-                    
+
                     acc.AddFinishedActions();
                 }
             }

+ 16 - 0
src/PixiEditor.ChangeableDocument/Changeables/Animations/GroupKeyFrame.cs

@@ -14,6 +14,22 @@ internal class GroupKeyFrame : KeyFrame, IKeyFrameChildrenContainer
     public override int Duration => Children.Count > 0 ? Children.Max(x => x.StartFrame + x.Duration) - StartFrame : 0;
     public override int StartFrame => Children.Count > 0 ? Children.Min(x => x.StartFrame) : 0;
 
+    public override bool IsVisible
+    {
+        get
+        {
+            return isVisible;
+        }
+        set
+        {
+            isVisible = value;
+            foreach (var child in Children)
+            {
+                child.IsVisible = value;
+            }
+        }
+    }
+
     IReadOnlyList<IReadOnlyKeyFrame> IKeyFrameChildrenContainer.Children => Children;
 
     public GroupKeyFrame(Node node, int startFrame, Document document) : base(node, startFrame)

+ 2 - 1
src/PixiEditor.ChangeableDocument/Changeables/Animations/KeyFrame.cs

@@ -45,12 +45,13 @@ public abstract class KeyFrame : IReadOnlyKeyFrame
     public Guid NodeId { get; }
     public Guid Id { get; set; }
 
-    public bool IsVisible
+    public virtual bool IsVisible
     {
         get => isVisible;
         set
         {
             isVisible = value;
+            TargetNode.SetKeyFrameVisibility(Id, isVisible);
         }
     }
 

+ 6 - 4
src/PixiEditor.ChangeableDocument/Changeables/Animations/KeyFrameData.cs

@@ -11,18 +11,19 @@ public class KeyFrameData : IDisposable, IReadOnlyKeyFrameData
     public Guid KeyFrameGuid { get; }
     public string AffectedElement { get; set; }
     public object Data { get; set; }
-    
+    public bool IsVisible { get; set; } = true;
+
     private int _lastCacheHash;
 
     public bool RequiresUpdate
     {
         get
         {
-            if(Data is ICacheable cacheable)
+            if (Data is ICacheable cacheable)
             {
                 return cacheable.GetCacheHash() != _lastCacheHash;
             }
-            
+
             return false;
         }
         set
@@ -34,6 +35,7 @@ public class KeyFrameData : IDisposable, IReadOnlyKeyFrameData
         }
     }
 
+
     public KeyFrameData(Guid keyFrameGuid, int startFrame, int duration, string affectedElement)
     {
         KeyFrameGuid = keyFrameGuid;
@@ -44,7 +46,7 @@ public class KeyFrameData : IDisposable, IReadOnlyKeyFrameData
 
     public bool IsInFrame(int frame)
     {
-        return frame >= StartFrame && frame <= StartFrame + Duration;
+        return IsVisible && frame >= StartFrame && frame <= StartFrame + Duration;
     }
 
     public void Dispose()

+ 12 - 4
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Node.cs

@@ -21,7 +21,7 @@ public abstract class Node : IReadOnlyNode, IDisposable
 
     public IReadOnlyList<InputProperty> InputProperties => inputs;
     public IReadOnlyList<OutputProperty> OutputProperties => outputs;
-    public IReadOnlyList<KeyFrameData> KeyFrames => keyFrames; 
+    public IReadOnlyList<KeyFrameData> KeyFrames => keyFrames;
 
     public Surface? CachedResult
     {
@@ -184,7 +184,17 @@ public abstract class Node : IReadOnlyNode, IDisposable
         }
     }
 
-    public void AddFrame(Guid id, KeyFrameData value) 
+    public void SetKeyFrameVisibility(Guid id, bool isVisible)
+    {
+        KeyFrameData frame = keyFrames.FirstOrDefault(x => x.KeyFrameGuid == id);
+        if (frame is not null)
+        {
+            frame.IsVisible = isVisible;
+            _keyFramesDirty = true;
+        }
+    }
+
+    public void AddFrame(Guid id, KeyFrameData value)
     {
         if (keyFrames.Any(x => x.KeyFrameGuid == id))
         {
@@ -340,11 +350,9 @@ public abstract class Node : IReadOnlyNode, IDisposable
 
     public virtual void SerializeAdditionalData(Dictionary<string, object> additionalData)
     {
-      
     }
 
     internal virtual void DeserializeData(IReadOnlyDictionary<string, object> data)
     {
-        
     }
 }

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changeables/Interfaces/IReadOnlyKeyFrameData.cs

@@ -7,4 +7,5 @@ public interface IReadOnlyKeyFrameData
     Guid KeyFrameGuid { get; }
     object Data { get; }
     string AffectedElement { get; }
+    bool IsVisible { get; }
 }

+ 13 - 2
src/PixiEditor.ChangeableDocument/Changes/Animation/CreateRasterKeyFrame_Change.cs

@@ -46,19 +46,30 @@ internal class CreateRasterKeyFrame_Change : Change
 
         var existingData = targetNode.KeyFrames.FirstOrDefault(x => x.KeyFrameGuid == createdKeyFrameId);
 
+        bool isVisible = true;
+
         if (existingData is null)
         {
             targetNode.AddFrame(createdKeyFrameId,
-                new KeyFrameData(createdKeyFrameId, _frame, 1, ImageLayerNode.ImageLayerKey) { Data = img });
+                new KeyFrameData(createdKeyFrameId, _frame, 1, ImageLayerNode.ImageLayerKey) { Data = img, });
         }
         else
         {
             _frame = existingData.StartFrame;
+
+            isVisible = existingData.IsVisible;
         }
 
         target.AnimationData.AddKeyFrame(keyFrame);
         ignoreInUndo = false;
-        return new CreateRasterKeyFrame_ChangeInfo(_targetLayerGuid, _frame, createdKeyFrameId, cloneFrom.HasValue);
+
+        List<IChangeInfo> infos = new()
+        {
+            new CreateRasterKeyFrame_ChangeInfo(_targetLayerGuid, _frame, createdKeyFrameId, cloneFrom.HasValue),
+            new KeyFrameVisibility_ChangeInfo(_targetLayerGuid, isVisible)
+        };
+
+        return infos;
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)

+ 8 - 2
src/PixiEditor.ChangeableDocument/Changes/NodeGraph/SetKeyFrameData_Change.cs

@@ -11,10 +11,11 @@ internal class SetKeyFrameData_Change : Change
     private int startFrame;
     private int duration;
     private string affectedElement;
+    private bool isVisible;
 
     [GenerateMakeChangeAction]
     public SetKeyFrameData_Change(Guid nodeId, Guid keyFrameId, object data, int startFrame, int duration,
-        string affectedElement)
+        string affectedElement, bool isVisible)
     {
         this.nodeId = nodeId;
         this.keyFrameId = keyFrameId;
@@ -22,6 +23,7 @@ internal class SetKeyFrameData_Change : Change
         this.startFrame = startFrame;
         this.duration = duration;
         this.affectedElement = affectedElement;
+        this.isVisible = isVisible;
     }
 
     public override bool InitializeAndValidate(Document target)
@@ -39,7 +41,11 @@ internal class SetKeyFrameData_Change : Change
                  || IsSpecialRootKeyFrame(x));
 
 
-        var newKeyFrame = new KeyFrameData(keyFrameId, startFrame, duration, affectedElement) { Data = data };
+        var newKeyFrame = new KeyFrameData(keyFrameId, startFrame, duration, affectedElement)
+        {
+            Data = data,
+            IsVisible = isVisible
+        };
 
         if (keyFrame != null)
         {