瀏覽代碼

Move tool now changes selection on key frames change

flabbet 8 月之前
父節點
當前提交
9925f4c86b

+ 1 - 1
src/PixiEditor/Models/Handlers/IToolHandler.cs

@@ -63,7 +63,7 @@ internal interface IToolHandler : IHandler
     public void SetToolSetSettings(IToolSetHandler toolset, Dictionary<string, object>? settings);
     public void ApplyToolSetSettings(IToolSetHandler toolset);
     public void OnToolDeselected(bool transient);
-    
     public void OnPostUndo();
     public void OnPostRedo();
+    public void OnActiveFrameChanged(int newFrame);
 }

+ 5 - 0
src/PixiEditor/ViewModels/Document/AnimationDataViewModel.cs

@@ -24,6 +24,8 @@ internal class AnimationDataViewModel : ObservableObject, IAnimationHandler
 
     public IReadOnlyCollection<ICelHandler> AllCels => allCels;
 
+    public event Action<int, int> ActiveFrameChanged;
+    
     private KeyFrameCollection keyFrames = new KeyFrameCollection();
     private List<ICelHandler> allCels = new List<ICelHandler>();
     private bool onionSkinningEnabled;
@@ -187,7 +189,9 @@ internal class AnimationDataViewModel : ObservableObject, IAnimationHandler
 
     public void SetActiveFrame(int newFrame)
     {
+        int previousFrame = _activeFrameBindable;
         _activeFrameBindable = newFrame;
+        ActiveFrameChanged?.Invoke(previousFrame, newFrame);
         OnPropertyChanged(nameof(ActiveFrameBindable));
     }
     
@@ -386,4 +390,5 @@ internal class AnimationDataViewModel : ObservableObject, IAnimationHandler
         this.keyFrames = new KeyFrameCollection(layerKeyFrames);
         OnPropertyChanged(nameof(KeyFrames));
     }
+
 }

+ 13 - 1
src/PixiEditor/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -475,15 +475,22 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
         {
             e.OldDocument.PropertyChanged -= DocumentOnPropertyChanged;
             e.OldDocument.LayersChanged -= DocumentOnLayersChanged;
+            e.OldDocument.AnimationDataViewModel.ActiveFrameChanged -= ActiveFrameChanged;
         }
 
         if (e.NewDocument is not null)
         {
             e.NewDocument.PropertyChanged += DocumentOnPropertyChanged;
             e.NewDocument.LayersChanged += DocumentOnLayersChanged;
+            e.NewDocument.AnimationDataViewModel.ActiveFrameChanged += ActiveFrameChanged;
             UpdateEnabledState();
         }
     }
+    
+    private void ActiveFrameChanged(int oldFrame, int newFrame)
+    {
+        UpdateActiveFrame(newFrame);
+    }
 
     private void DocumentOnLayersChanged(object? sender, LayersChangedEventArgs e)
     {
@@ -497,7 +504,12 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
             UpdateEnabledState();
         }
     }
-
+    
+    private void UpdateActiveFrame(int newFrame)
+    {
+        ActiveTool?.OnActiveFrameChanged(newFrame);
+    }
+    
     private void UpdateEnabledState()
     {
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;

+ 1 - 0
src/PixiEditor/ViewModels/Tools/ToolViewModel.cs

@@ -182,6 +182,7 @@ internal abstract class ToolViewModel : ObservableObject, IToolHandler
     
     public virtual void OnPostUndo() { }
     public virtual void OnPostRedo() { }
+    public virtual void OnActiveFrameChanged(int newFrame) { }
 
     public void SetToolSetSettings(IToolSetHandler toolset, Dictionary<string, object>? settings)
     {

+ 10 - 5
src/PixiEditor/ViewModels/Tools/Tools/MoveToolViewModel.cs

@@ -114,15 +114,20 @@ internal class MoveToolViewModel : ToolViewModel, IMoveToolHandler
 
     protected override void OnSelectedLayersChanged(IStructureMemberHandler[] layers)
     {
-        if (ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument.TransformViewModel.TransformActive)
-        {
-            return;
-        }
+        UpdateSelection();
+    }
+    
+    public override void OnActiveFrameChanged(int newFrame)
+    {
+        UpdateSelection();
+    }
 
+    private void UpdateSelection()
+    {
         OnDeselecting(false);
         OnToolSelected(false);
     }
-    
+
     public void KeepOriginalChanged()
     {
         var activeDocument = ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument;