瀏覽代碼

Don't disable transform on transient tool change

flabbet 9 月之前
父節點
當前提交
9f3191d70c

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

@@ -58,7 +58,7 @@ internal interface IToolHandler : IHandler
 
     public void ModifierKeyChanged(bool ctrlIsDown, bool shiftIsDown, bool altIsDown);
     public void UseTool(VecD pos);
-    public void OnSelected();
+    public void OnSelected(bool restoring);
 
-    public void OnDeselecting();
+    public void OnDeselecting(bool transient);
 }

+ 1 - 2
src/PixiEditor/ViewModels/SubViewModels/IoViewModel.cs

@@ -280,8 +280,7 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
             return;
         var tools = Owner.ToolsSubViewModel;
 
-        var rightCanUp = (button == MouseButton.Right && tools.RightClickMode == RightClickMode.Erase ||
-                          tools.RightClickMode == RightClickMode.SecondaryColor);
+        var rightCanUp = (button == MouseButton.Right) && tools.RightClickMode is RightClickMode.Erase or RightClickMode.SecondaryColor;
 
         if (button == MouseButton.Left || rightCanUp)
         {

+ 5 - 2
src/PixiEditor/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -223,10 +223,11 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
 
         if (ActiveTool != null)
         {
-            ActiveTool.OnDeselecting();
+            ActiveTool.OnDeselecting(transient);
             ActiveTool.Toolbar.SettingChanged -= ToolbarSettingChanged;
         }
 
+        bool wasTransient = ActiveTool?.IsTransient ?? false;
         if (ActiveTool != null) ActiveTool.IsTransient = false;
         bool shareToolbar = EnableSharedToolbar;
         if (ActiveTool is not null)
@@ -247,13 +248,15 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
         }
 
         if (LastActionTool != ActiveTool)
+        {
             SelectedToolChanged?.Invoke(this, new SelectedToolEventArgs(LastActionTool, ActiveTool));
+        }
 
         //update old tool
         LastActionTool?.ModifierKeyChanged(false, false, false);
         //update new tool
         ActiveTool.ModifierKeyChanged(ctrlIsDown, shiftIsDown, altIsDown);
-        ActiveTool.OnSelected();
+        ActiveTool.OnSelected(wasTransient);
 
         tool.IsActive = true;
         ActiveTool.IsTransient = transient;

+ 5 - 2
src/PixiEditor/ViewModels/Tools/ShapeTool.cs

@@ -20,8 +20,11 @@ internal abstract class ShapeTool : ToolViewModel, IShapeToolHandler
         Toolbar = new BasicShapeToolbar();
     }
 
-    public override void OnDeselecting()
+    public override void OnDeselecting(bool transient)
     {
-        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
+        if (!transient)
+        {
+            ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
+        }
     }
 }

+ 2 - 2
src/PixiEditor/ViewModels/Tools/ToolViewModel.cs

@@ -143,11 +143,11 @@ internal abstract class ToolViewModel : ObservableObject, IToolHandler
     public virtual void ModifierKeyChanged(bool ctrlIsDown, bool shiftIsDown, bool altIsDown) { }
 
     public virtual void UseTool(VecD pos) { }
-    public virtual void OnSelected() { }
+    public virtual void OnSelected(bool restoring) { }
     
     protected virtual void OnSelectedLayersChanged(IStructureMemberHandler[] layers) { }
 
-    public virtual void OnDeselecting()
+    public virtual void OnDeselecting(bool transient)
     {
     }
 

+ 15 - 6
src/PixiEditor/ViewModels/Tools/Tools/MoveToolViewModel.cs

@@ -77,14 +77,23 @@ internal class MoveToolViewModel : ToolViewModel, IMoveToolHandler
         }
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
+        if (TransformingSelectedArea)
+        {
+            return;
+        }
+        
         ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TransformSelectedArea(true);
     }
 
-    public override void OnDeselecting()
+    public override void OnDeselecting(bool transient)
     {
-        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
+        var vm = ViewModelMain.Current;
+        if (!transient)
+        {
+            vm.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
+        }
     }
 
     protected override void OnSelectedLayersChanged(IStructureMemberHandler[] layers)
@@ -93,8 +102,8 @@ internal class MoveToolViewModel : ToolViewModel, IMoveToolHandler
         {
             return;
         }
-        
-        OnDeselecting();
-        OnSelected();
+
+        OnDeselecting(false);
+        OnSelected(false);
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/MoveViewportToolViewModel.cs

@@ -25,7 +25,7 @@ internal class MoveViewportToolViewModel : ToolViewModel
         Cursor = new Cursor(StandardCursorType.SizeAll);
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
         ActionDisplay = new LocalizedString("MOVE_VIEWPORT_ACTION_DISPLAY");
     }

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/PenToolViewModel.cs

@@ -77,7 +77,7 @@ namespace PixiEditor.ViewModels.Tools.Tools
             actualToolSize = oldSetting.Value;
         }
 
-        public override void OnDeselecting()
+        public override void OnDeselecting(bool transient)
         {
             if (!PixelPerfectEnabled)
             {

+ 3 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterEllipseToolViewModel.cs

@@ -48,8 +48,10 @@ internal class RasterEllipseToolViewModel : ShapeTool, IRasterEllipseToolHandler
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterEllipseTool();
     }
     
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
+        if(restoring) return;
+        
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterEllipseTool();
     }
 }

+ 3 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterLineToolViewModel.cs

@@ -54,8 +54,10 @@ internal class RasterLineToolViewModel : ShapeTool, ILineToolHandler
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterLineTool();
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
+        if (restoring) return;
+        
         var document = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
         document.Tools.UseRasterLineTool();
     }

+ 3 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterRectangleToolViewModel.cs

@@ -49,8 +49,10 @@ internal class RasterRectangleToolViewModel : ShapeTool, IRasterRectangleToolHan
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterRectangleTool();
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
+        if(restoring) return;
+        
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterRectangleTool();
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RotateViewportToolViewModel.cs

@@ -23,7 +23,7 @@ internal class RotateViewportToolViewModel : ToolViewModel
     {
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
         ActionDisplay = new LocalizedString("ROTATE_VIEWPORT_ACTION_DISPLAY");
     }

+ 5 - 3
src/PixiEditor/ViewModels/Tools/Tools/VectorEllipseToolViewModel.cs

@@ -39,8 +39,10 @@ internal class VectorEllipseToolViewModel : ShapeTool, IVectorEllipseToolHandler
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseVectorEllipseTool();
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
+        if (restoring) return;
+        
         var document = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
         var layer = document.SelectedStructureMember;
         if (layer is IVectorLayerHandler vectorLayer && 
@@ -56,7 +58,7 @@ internal class VectorEllipseToolViewModel : ShapeTool, IVectorEllipseToolHandler
 
     protected override void OnSelectedLayersChanged(IStructureMemberHandler[] layers)
     {
-        OnDeselecting();
-        OnSelected();
+        OnDeselecting(false);
+        OnSelected(false);
     }
 }

+ 5 - 3
src/PixiEditor/ViewModels/Tools/Tools/VectorLineToolViewModel.cs

@@ -59,8 +59,10 @@ internal class VectorLineToolViewModel : ShapeTool, IVectorLineToolHandler
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseVectorLineTool();
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
+        if (restoring) return;
+        
         var document = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
         var layer = document.SelectedStructureMember;
         if (layer is IVectorLayerHandler vectorLayer)
@@ -79,7 +81,7 @@ internal class VectorLineToolViewModel : ShapeTool, IVectorLineToolHandler
 
     protected override void OnSelectedLayersChanged(IStructureMemberHandler[] layers)
     {
-        OnDeselecting();
-        OnSelected();
+        OnDeselecting(false);
+        OnSelected(false);
     }
 }

+ 5 - 3
src/PixiEditor/ViewModels/Tools/Tools/VectorRectangleToolViewModel.cs

@@ -51,8 +51,10 @@ internal class VectorRectangleToolViewModel : ShapeTool, IVectorRectangleToolHan
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseVectorRectangleTool();
     }
 
-    public override void OnSelected()
+    public override void OnSelected(bool restoring)
     {
+        if (restoring) return;
+        
         var document = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
         var layer = document.SelectedStructureMember;
         if (layer is IVectorLayerHandler vectorLayer && 
@@ -68,7 +70,7 @@ internal class VectorRectangleToolViewModel : ShapeTool, IVectorRectangleToolHan
 
     protected override void OnSelectedLayersChanged(IStructureMemberHandler[] layers)
     {
-        OnDeselecting();
-        OnSelected();
+        OnDeselecting(false);
+        OnSelected(false);
     }
 }