Browse Source

Fixed viewport tools disabling linked executor

Krzysztof Krysiński 1 year ago
parent
commit
2c7298d74c

+ 9 - 0
src/PixiEditor.AvaloniaUI/Models/Handlers/IToolHandler.cs

@@ -30,6 +30,15 @@ internal interface IToolHandler : IHandler
     /// </summary>
     public virtual bool IsErasable => false;
 
+    /// <summary>
+    /// Indicates whether active linked tool stops on use.
+    /// </summary>
+    /// <remarks>
+    /// If this property is true, the linked tool will stop executing when used.
+    /// If this property is false, the linked tool will continue executing even after being used.
+    /// </remarks>
+    public virtual bool StopsLinkedToolOnUse => true;
+
     /// <summary>
     /// The mouse button that is being used with the tool
     /// </summary>

+ 5 - 0
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -275,6 +275,11 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
         if (ActiveTool == null) return;
 
         ActiveTool.UsedWith = button;
+        if (ActiveTool.StopsLinkedToolOnUse)
+        {
+            ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
+        }
+
         ActiveTool.UseTool(canvasPos);
     }
 

+ 5 - 4
src/PixiEditor.AvaloniaUI/ViewModels/Tools/ToolViewModel.cs

@@ -40,6 +40,9 @@ internal abstract class ToolViewModel : ObservableObject, IToolHandler
    /// </summary>
     public virtual bool IsErasable => false;
 
+   /// <inheritdoc cref="IToolHandler.StopsLinkedToolOnUse"/>
+    public virtual bool StopsLinkedToolOnUse => true;
+
     /// <summary>
     /// The mouse button that is being used with the tool
     /// </summary>
@@ -82,11 +85,9 @@ 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() 
-    {
-        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
-    }
+    public virtual void OnSelected() { }
 
     public virtual void OnDeselecting()
     { }

+ 0 - 1
src/PixiEditor.AvaloniaUI/ViewModels/Tools/Tools/MoveToolViewModel.cs

@@ -16,7 +16,6 @@ internal class MoveToolViewModel : ToolViewModel, IMoveToolHandler
 
     private string transformingActionDisplay = "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING";
     private bool transformingSelectedArea = false;
-
     public bool MoveAllLayers { get; set; }
 
     public MoveToolViewModel()

+ 2 - 0
src/PixiEditor.AvaloniaUI/ViewModels/Tools/Tools/MoveViewportToolViewModel.cs

@@ -13,6 +13,8 @@ internal class MoveViewportToolViewModel : ToolViewModel
     public override bool HideHighlight => true;
     public override LocalizedString Tooltip => new LocalizedString("MOVE_VIEWPORT_TOOLTIP", Shortcut);
 
+    public override bool StopsLinkedToolOnUse => false;
+
     public MoveViewportToolViewModel()
     {
         Cursor = new Cursor(StandardCursorType.SizeAll);

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

@@ -11,6 +11,7 @@ internal class RotateViewportToolViewModel : ToolViewModel
     public override string ToolNameLocalizationKey => "ROTATE_VIEWPORT_TOOL";
     public override BrushShape BrushShape => BrushShape.Hidden;
     public override bool HideHighlight => true;
+    public override bool StopsLinkedToolOnUse => false;
     public override LocalizedString Tooltip => new LocalizedString("ROTATE_VIEWPORT_TOOLTIP", Shortcut);
 
     public RotateViewportToolViewModel()

+ 2 - 0
src/PixiEditor.AvaloniaUI/ViewModels/Tools/Tools/ZoomToolViewModel.cs

@@ -21,6 +21,8 @@ internal class ZoomToolViewModel : ToolViewModel
     public override string ToolNameLocalizationKey => "ZOOM_TOOL";
     public override BrushShape BrushShape => BrushShape.Hidden;
 
+    public override bool StopsLinkedToolOnUse => false;
+
     public ZoomToolViewModel()
     {
         ActionDisplay = defaultActionDisplay;