فهرست منبع

Backend change notify logic fixed once again

flabbet 1 سال پیش
والد
کامیت
55d125b535

+ 4 - 0
src/PixiEditor.AvaloniaUI/Models/Rendering/AffectedAreasGatherer.cs

@@ -108,6 +108,10 @@ internal class AffectedAreasGatherer
                     AddWholeCanvasToMainImage();
                     AddWholeCanvasToEveryImagePreview();
                     break;
+                case KeyFrameLength_ChangeInfo:
+                    AddWholeCanvasToMainImage();
+                    AddWholeCanvasToEveryImagePreview();
+                    break;
             }
         }
     }

+ 23 - 19
src/PixiEditor.ChangeableDocument/Changeables/Animations/AnimationData.cs

@@ -11,17 +11,9 @@ internal class AnimationData : IReadOnlyAnimationData
         get => _activeFrame;
         set
         {
-            int lastFrame = _activeFrame;
-            if (value < 0)
-            {
-                _activeFrame = 0;
-            }
-            else
-            {
-                _activeFrame = value;
-            }
+            _activeFrame = value < 0 ? 0 : value;
 
-            OnPreviewFrameChanged(lastFrame);
+            OnPreviewFrameChanged();
         }
     }
 
@@ -29,6 +21,7 @@ internal class AnimationData : IReadOnlyAnimationData
 
     private List<KeyFrame> keyFrames = new List<KeyFrame>();
     private readonly Document document;
+    private List<KeyFrame> lastActiveKeyFrames = new List<KeyFrame>();
     
     public AnimationData(Document document)
     {
@@ -48,23 +41,32 @@ internal class AnimationData : IReadOnlyAnimationData
             createdGroup.Children.Add(keyFrame);
             keyFrames.Add(createdGroup);
         }
+        
+        keyFrame.KeyFrameChanged += KeyFrameChanged;
+        
+        UpdateKeyFrames(keyFrames);
     }
 
     public void RemoveKeyFrame(Guid createdKeyFrameId)
     {
         TryFindKeyFrameCallback<KeyFrame>(createdKeyFrameId, out _, (frame, parent) =>
         {
-            if (parent != null)
-            {
-                parent.Children.Remove(frame);
-            }
+            frame.KeyFrameChanged -= KeyFrameChanged;
+            parent?.Children.Remove(frame);
         });
+        
+        UpdateKeyFrames(keyFrames);
     }
 
     public bool TryFindKeyFrame<T>(Guid id, out T keyFrame) where T : IReadOnlyKeyFrame
     {
         return TryFindKeyFrameCallback(id, out keyFrame, null);
     }
+    
+    private void KeyFrameChanged()
+    {
+        UpdateKeyFrames(keyFrames);
+    }
 
     private bool TryFindKeyFrameCallback<T>(Guid id, out T? foundKeyFrame,
         Action<KeyFrame, GroupKeyFrame?> onFound = null) where T : IReadOnlyKeyFrame
@@ -99,26 +101,27 @@ internal class AnimationData : IReadOnlyAnimationData
         return false;
     }
 
-    private void OnPreviewFrameChanged(int lastFrame)
+    private void OnPreviewFrameChanged()
     {
         if (KeyFrames == null)
         {
             return;
         }
 
-        NotifyKeyFrames(lastFrame, keyFrames);
+        UpdateKeyFrames(keyFrames);
     }
 
-    private void NotifyKeyFrames(int lastFrame, List<KeyFrame> root)
+    private void UpdateKeyFrames(List<KeyFrame> root)
     {
         foreach (var keyFrame in root)
         {
             bool isWithinRange = keyFrame.IsWithinRange(ActiveFrame);
-            if (keyFrame.IsWithinRange(lastFrame))
+            if (lastActiveKeyFrames.Contains(keyFrame))
             {
                 if (!isWithinRange)
                 {
                     keyFrame.Deactivated(ActiveFrame);
+                    lastActiveKeyFrames.Remove(keyFrame);
                 }
                 else
                 {
@@ -128,11 +131,12 @@ internal class AnimationData : IReadOnlyAnimationData
             else if (isWithinRange)
             {
                 keyFrame.ActiveFrameChanged(ActiveFrame);
+                lastActiveKeyFrames.Add(keyFrame);
             }
             
             if (keyFrame is GroupKeyFrame group)
             {
-                NotifyKeyFrames(lastFrame, group.Children);
+                UpdateKeyFrames(group.Children);
             }
         }
     }

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changeables/Animations/GroupKeyFrame.cs

@@ -24,7 +24,7 @@ internal class GroupKeyFrame : KeyFrame
         //if(atFrame >= EndFrame) return;
         if (document.TryFindMember<RasterLayer>(LayerGuid, out var layer))
         {
-            layer.LayerImage = originalLayerImage;
+           layer.LayerImage = originalLayerImage;
         }
     }
 

+ 4 - 0
src/PixiEditor.ChangeableDocument/Changeables/Animations/KeyFrame.cs

@@ -6,6 +6,8 @@ public abstract class KeyFrame : IReadOnlyKeyFrame
 {
     private int startFrame;
     private int duration;
+    
+    public event Action KeyFrameChanged;
 
     public virtual int StartFrame
     {
@@ -18,6 +20,7 @@ public abstract class KeyFrame : IReadOnlyKeyFrame
             }
 
             startFrame = value;
+            KeyFrameChanged?.Invoke();
         }
     }
 
@@ -32,6 +35,7 @@ public abstract class KeyFrame : IReadOnlyKeyFrame
             }
 
             duration = value;
+            KeyFrameChanged?.Invoke();
         }
     }