Browse Source

Converted all shape tools into proper executor bases

flabbet 11 months ago
parent
commit
f0c4aa28c8

+ 0 - 18
src/PixiEditor.AvaloniaUI.GraphView/PixiEditor.AvaloniaUI.GraphView.csproj

@@ -1,18 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-    <PropertyGroup>
-        <TargetFramework>net8.0</TargetFramework>
-        <ImplicitUsings>enable</ImplicitUsings>
-        <Nullable>enable</Nullable>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <PackageReference Include="Avalonia" Version="$(AvaloniaVersion)" />
-      <PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
-    </ItemGroup>
-
-    <ItemGroup>
-      <ProjectReference Include="..\PixiEditor.Zoombox\PixiEditor.Zoombox.csproj" />
-    </ItemGroup>
-
-</Project>

+ 63 - 99
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/ComplexShapeToolExecutor.cs

@@ -14,7 +14,7 @@ namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 
 #nullable enable
 
-internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor where T : IShapeToolHandler
+internal abstract class ComplexShapeToolExecutor<T> : SimpleShapeToolExecutor where T : IShapeToolHandler
 {
     protected int StrokeWidth => toolbar.ToolSize;
 
@@ -22,23 +22,21 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
         toolbar.Fill ? toolbar.FillColor.ToColor() : DrawingApi.Core.ColorsImpl.Colors.Transparent;
 
     protected Color StrokeColor => toolbar.StrokeColor.ToColor();
-    protected Guid memberGuid;
     protected bool drawOnMask;
 
-    protected bool transforming = false;
     protected T? toolViewModel;
-    protected VecI startPos;
-    protected VecI unsnappedStartPos;
     protected RectI lastRect;
     protected double lastRadians;
 
     private bool noMovement = true;
     private IBasicShapeToolbar toolbar;
     private IColorsHandler? colorsVM;
-    private bool previewMode = false;
-
+    
     public override ExecutionState Start()
     {
+        if (base.Start() == ExecutionState.Error)
+            return ExecutionState.Error;
+
         colorsVM = GetHandler<IColorsHandler>();
         toolViewModel = GetHandler<T>();
         toolbar = (IBasicShapeToolbar?)toolViewModel?.Toolbar;
@@ -51,40 +49,31 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
         if (!drawOnMask && member is not ILayerHandler)
             return ExecutionState.Error;
 
-        memberGuid = member.Id;
-
-        if (controller.LeftMousePressed || member is not IVectorLayerHandler)
+        if (ActiveMode == ShapeToolMode.Drawing)
         {
-            startPos = controller!.LastPixelPosition;
-            unsnappedStartPos = startPos;
-            OnColorChanged(colorsVM.PrimaryColor, true);
-            DrawShape(startPos, 0, true);
+            return ExecutionState.Success;
         }
-        else
+
+        if (member is IVectorLayerHandler)
         {
-            if (member is IVectorLayerHandler)
-            {
-                var node = (VectorLayerNode)internals.Tracker.Document.FindMember(member.Id);
-                if (!InitShapeData(node.ShapeData))
-                {
-                    document.TransformHandler.HideTransform();
-                    previewMode = true;
-                    return ExecutionState.Success;
-                }
-
-                transforming = true;
-                toolbar.StrokeColor = node.ShapeData.StrokeColor.ToColor();
-                toolbar.FillColor = node.ShapeData.FillColor.ToColor();
-                toolbar.ToolSize = node.ShapeData.StrokeWidth;
-                toolbar.Fill = node.ShapeData.FillColor != Colors.Transparent;
-            }
-            else
+            var node = (VectorLayerNode)internals.Tracker.Document.FindMember(member.Id);
+
+            if (!InitShapeData(node.ShapeData))
             {
-                previewMode = true;
+                ActiveMode = ShapeToolMode.Preview;
+                return ExecutionState.Success;
             }
-        }
 
-        document.SnappingHandler.Remove(member.Id.ToString());
+            toolbar.StrokeColor = node.ShapeData.StrokeColor.ToColor();
+            toolbar.FillColor = node.ShapeData.FillColor.ToColor();
+            toolbar.ToolSize = node.ShapeData.StrokeWidth;
+            toolbar.Fill = node.ShapeData.FillColor != Colors.Transparent;
+            ActiveMode = ShapeToolMode.Transform;
+        }
+        else
+        {
+            ActiveMode = ShapeToolMode.Preview;
+        }
 
         return ExecutionState.Success;
     }
@@ -98,8 +87,8 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
 
     public static VecI Get45IncrementedPosition(VecD startPos, VecD curPos)
     {
-        Span<VecI> positions = stackalloc VecI[]
-        {
+        Span<VecI> positions =
+        [
             (VecI)(curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 1)) -
                    new VecD(0.25).Multiply((curPos - startPos).Signs())).Round(),
             (VecI)(curPos.ProjectOntoLine(startPos, startPos + new VecD(1, -1)) -
@@ -108,7 +97,8 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
                    new VecD(0.25).Multiply((curPos - startPos).Signs())).Round(),
             (VecI)(curPos.ProjectOntoLine(startPos, startPos + new VecD(0, 1)) -
                    new VecD(0.25).Multiply((curPos - startPos).Signs())).Round()
-        };
+        ];
+
         VecI max = positions[0];
         double maxLength = double.MaxValue;
         foreach (var pos in positions)
@@ -143,7 +133,7 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
 
     public override void OnTransformMoved(ShapeCorners corners)
     {
-        if (!transforming)
+        if (ActiveMode != ShapeToolMode.Transform)
             return;
 
         var rect = RectD.FromCenterAndSize(corners.RectCenter, corners.RectSize);
@@ -156,19 +146,16 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
 
     public override void OnTransformApplied()
     {
-        if (!transforming)
+        if (ActiveMode != ShapeToolMode.Transform)
             return;
-        
+
         internals!.ActionAccumulator.AddFinishedActions(EndDrawAction());
         document!.TransformHandler.HideTransform();
 
-        AddToSnapController();
-        HighlightSnapAxis(null, null);
-
         colorsVM.AddSwatch(StrokeColor.ToPaletteColor());
         colorsVM.AddSwatch(FillColor.ToPaletteColor());
 
-        previewMode = true;
+        base.OnTransformApplied();
     }
 
     public override void OnColorChanged(Color color, bool primary)
@@ -182,62 +169,44 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
 
     public override void OnSelectedObjectNudged(VecI distance)
     {
-        if (!transforming)
+        if (ActiveMode != ShapeToolMode.Transform)
             return;
         document!.TransformHandler.Nudge(distance);
     }
 
     public override void OnMidChangeUndo()
     {
-        if (!transforming)
+        if (ActiveMode != ShapeToolMode.Transform)
             return;
         document!.TransformHandler.Undo();
     }
 
     public override void OnMidChangeRedo()
     {
-        if (!transforming)
+        if (ActiveMode != ShapeToolMode.Transform)
             return;
         document!.TransformHandler.Redo();
     }
 
-    public override void OnPixelPositionChange(VecI pos)
+    protected override void PrecisePositionChangeDrawingMode(VecD pos)
     {
-        if (previewMode)
-        {
-            VecD mouseSnap = document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis, out string snapYAxis);
-            HighlightSnapAxis(snapXAxis, snapYAxis);
-            
-            if (!string.IsNullOrEmpty(snapXAxis) || !string.IsNullOrEmpty(snapYAxis))
-            {
-                document.SnappingHandler.SnappingController.HighlightedPoint = mouseSnap;
-            }
-            else
-            {
-                document.SnappingHandler.SnappingController.HighlightedPoint = null;
-            }
-        }
-
-        if (transforming || previewMode)
-            return;
+        var snapped = Snap(pos, startDrawingPos, true);
 
-        startPos = Snap(unsnappedStartPos, pos);
-        var snapped = Snap(pos, startPos);
-        
         noMovement = false;
 
-        pos = snapped;
-
-        DrawShape(pos, lastRadians, false);
+        DrawShape((VecI)snapped.Floor(), lastRadians, false);
     }
 
-    private VecI Snap(VecI pos, VecD adjustPos)
+    protected VecD Snap(VecD pos, VecD adjustPos, bool highlight = false)
     {
-        VecI snapped =
-            (VecI)document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis,
+        VecD snapped =
+            document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis,
                 out string snapYAxis);
 
-        HighlightSnapAxis(snapXAxis, snapYAxis);
+        if (highlight)
+        {
+            HighlightSnapAxis(snapXAxis, snapYAxis);
+        }
 
         if (snapped != VecI.Zero)
         {
@@ -269,38 +238,33 @@ internal abstract class ComplexShapeToolExecutor<T> : UpdateableChangeExecutor w
 
     public override void OnLeftMouseButtonUp()
     {
-        HighlightSnapAxis(null, null);
-
-        if (transforming)
-            return;
-
-        if (noMovement)
+        if (ActiveMode != ShapeToolMode.Transform)
         {
-            internals!.ActionAccumulator.AddFinishedActions(EndDrawAction());
-            AddToSnapController();
+            if (noMovement)
+            {
+                internals!.ActionAccumulator.AddFinishedActions(EndDrawAction());
+                AddMemberToSnapping();
 
-            onEnded?.Invoke(this);
-            return;
+                onEnded?.Invoke(this);
+                return;
+            }
         }
 
-        document!.TransformHandler.HideTransform();
-        document!.TransformHandler.ShowTransform(TransformMode, false, new ShapeCorners((RectD)lastRect), true);
-        transforming = true;
+        base.OnLeftMouseButtonUp();
     }
 
-    public override void ForceStop()
+    protected override void StartMode(ShapeToolMode mode)
     {
-        if (transforming)
-            document!.TransformHandler.HideTransform();
-        internals!.ActionAccumulator.AddFinishedActions(EndDrawAction());
-
-        AddToSnapController();
-        HighlightSnapAxis(null, null);
+        base.StartMode(mode);
+        if (mode == ShapeToolMode.Transform)
+        {
+            document!.TransformHandler.ShowTransform(TransformMode, false, new ShapeCorners((RectD)lastRect), true);
+        }
     }
 
-    private void AddToSnapController()
+    public override void ForceStop()
     {
-        var member = document!.StructureHelper.Find(memberGuid);
-        document.SnappingHandler.AddFromBounds(member.Id.ToString(), () => member.TightBounds ?? RectD.Empty);
+        base.ForceStop();
+        internals!.ActionAccumulator.AddFinishedActions(EndDrawAction());
     }
 }

+ 0 - 5
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineExecutor.cs

@@ -83,10 +83,6 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
     protected abstract IAction SettingsChange();
     protected abstract IAction EndDraw();
 
-    protected override void PrecisePositionChangeTransformMode(VecD pos)
-    {
-    }
-
     protected override void PrecisePositionChangeDrawingMode(VecD pos)
     {
         startedDrawing = true;
@@ -176,7 +172,6 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
         base.OnTransformApplied();
         var endDrawAction = EndDraw();
         internals!.ActionAccumulator.AddFinishedActions(endDrawAction);
-        //onEnded!(this);
 
         colorsVM.AddSwatch(new PaletteColor(StrokeColor.R, StrokeColor.G, StrokeColor.B));
     }

+ 4 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/RasterEllipseToolExecutor.cs

@@ -14,6 +14,7 @@ internal class RasterEllipseToolExecutor : ComplexShapeToolExecutor<IRasterEllip
     private void DrawEllipseOrCircle(VecI curPos, double rotationRad, bool firstDraw)
     {
         RectI rect;
+        VecI startPos = (VecI)Snap(startDrawingPos, curPos).Floor();
         if (firstDraw)
             rect = new RectI(curPos, VecI.Zero);
         else if (toolViewModel!.DrawCircle)
@@ -24,7 +25,7 @@ internal class RasterEllipseToolExecutor : ComplexShapeToolExecutor<IRasterEllip
         lastRect = rect;
         lastRadians = rotationRad;
 
-        internals!.ActionAccumulator.AddActions(new DrawRasterEllipse_Action(memberGuid, rect, rotationRad, StrokeColor, FillColor, StrokeWidth, drawOnMask, document!.AnimationHandler.ActiveFrameBindable));
+        internals!.ActionAccumulator.AddActions(new DrawRasterEllipse_Action(memberId, rect, rotationRad, StrokeColor, FillColor, StrokeWidth, drawOnMask, document!.AnimationHandler.ActiveFrameBindable));
     }
 
     public override ExecutorType Type => ExecutorType.ToolLinked;
@@ -32,7 +33,7 @@ internal class RasterEllipseToolExecutor : ComplexShapeToolExecutor<IRasterEllip
     protected override void DrawShape(VecI currentPos, double rotationRad, bool firstDraw) => DrawEllipseOrCircle(currentPos, rotationRad, firstDraw);
     protected override IAction SettingsChangedAction()
     {
-        return new DrawRasterEllipse_Action(memberGuid, lastRect, lastRadians, StrokeColor, FillColor, StrokeWidth, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
+        return new DrawRasterEllipse_Action(memberId, lastRect, lastRadians, StrokeColor, FillColor, StrokeWidth, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
     }
 
     protected override IAction TransformMovedAction(ShapeData data, ShapeCorners corners)
@@ -43,7 +44,7 @@ internal class RasterEllipseToolExecutor : ComplexShapeToolExecutor<IRasterEllip
         lastRect = rect;
         lastRadians = radians;
         
-        return new DrawRasterEllipse_Action(memberGuid, lastRect, lastRadians, StrokeColor,
+        return new DrawRasterEllipse_Action(memberId, lastRect, lastRadians, StrokeColor,
             FillColor, StrokeWidth, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
     }
 

+ 4 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/RasterRectangleToolExecutor.cs

@@ -15,6 +15,7 @@ internal class RasterRectangleToolExecutor : ComplexShapeToolExecutor<IRasterRec
     private void DrawRectangle(VecI curPos, double rotationRad, bool firstDraw)
     {
         RectI rect;
+        VecI startPos = (VecI)Snap(startDrawingPos, curPos).Floor();
         if (firstDraw)
             rect = new RectI(curPos, VecI.Zero);
         else if (toolViewModel!.DrawSquare)
@@ -26,14 +27,14 @@ internal class RasterRectangleToolExecutor : ComplexShapeToolExecutor<IRasterRec
         
         lastData = new ShapeData(rect.Center, rect.Size, rotationRad, StrokeWidth, StrokeColor, FillColor);
 
-        internals!.ActionAccumulator.AddActions(new DrawRasterRectangle_Action(memberGuid, lastData, drawOnMask, document!.AnimationHandler.ActiveFrameBindable));
+        internals!.ActionAccumulator.AddActions(new DrawRasterRectangle_Action(memberId, lastData, drawOnMask, document!.AnimationHandler.ActiveFrameBindable));
     }
 
     protected override void DrawShape(VecI currentPos, double rotationRad, bool first) => DrawRectangle(currentPos, rotationRad, first);
     protected override IAction SettingsChangedAction()
     {
         lastData = new ShapeData(lastData.Center, lastData.Size, lastRadians, StrokeWidth, StrokeColor, FillColor);
-        return new DrawRasterRectangle_Action(memberGuid, lastData, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);   
+        return new DrawRasterRectangle_Action(memberId, lastData, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);   
     }
 
     protected override IAction TransformMovedAction(ShapeData data, ShapeCorners corners)
@@ -42,7 +43,7 @@ internal class RasterRectangleToolExecutor : ComplexShapeToolExecutor<IRasterRec
         
         lastRadians = corners.RectRotation;
         
-        return new DrawRasterRectangle_Action(memberGuid, data, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
+        return new DrawRasterRectangle_Action(memberId, data, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
     }
 
     protected override IAction EndDrawAction() => new EndDrawRasterRectangle_Action();

+ 4 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorEllipseToolExecutor.cs

@@ -35,6 +35,7 @@ internal class VectorEllipseToolExecutor : ComplexShapeToolExecutor<IVectorEllip
     protected override void DrawShape(VecI curPos, double rotationRad, bool firstDraw)
     {
         RectI rect;
+        VecI startPos = (VecI)Snap(startDrawingPos, curPos).Floor();
         if (firstDraw)
             rect = new RectI(curPos, VecI.Zero);
         else if (toolViewModel!.DrawCircle)
@@ -52,12 +53,12 @@ internal class VectorEllipseToolExecutor : ComplexShapeToolExecutor<IVectorEllip
 
         lastRect = rect;
 
-        internals!.ActionAccumulator.AddActions(new SetShapeGeometry_Action(memberGuid, data));
+        internals!.ActionAccumulator.AddActions(new SetShapeGeometry_Action(memberId, data));
     }
 
     protected override IAction SettingsChangedAction()
     {
-        return new SetShapeGeometry_Action(memberGuid,
+        return new SetShapeGeometry_Action(memberId,
             new EllipseVectorData(firstCenter, firstRadius)
             {
                 StrokeColor = StrokeColor, FillColor = FillColor, StrokeWidth = StrokeWidth,
@@ -83,7 +84,7 @@ internal class VectorEllipseToolExecutor : ComplexShapeToolExecutor<IVectorEllip
         lastRect = rect;
         lastMatrix = matrix;
 
-        return new SetShapeGeometry_Action(memberGuid, ellipseData);
+        return new SetShapeGeometry_Action(memberId, ellipseData);
     }
 
     protected override IAction EndDrawAction()

+ 4 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorRectangleToolExecutor.cs

@@ -35,6 +35,7 @@ internal class VectorRectangleToolExecutor : ComplexShapeToolExecutor<IVectorRec
     protected override void DrawShape(VecI curPos, double rotationRad, bool firstDraw)
     {
         RectI rect;
+        VecI startPos = (VecI)Snap(startDrawingPos, curPos).Floor();
         if (firstDraw)
             rect = new RectI(curPos, VecI.Zero);
         else if (toolViewModel!.DrawSquare)
@@ -52,12 +53,12 @@ internal class VectorRectangleToolExecutor : ComplexShapeToolExecutor<IVectorRec
 
         lastRect = rect;
 
-        internals!.ActionAccumulator.AddActions(new SetShapeGeometry_Action(memberGuid, data));
+        internals!.ActionAccumulator.AddActions(new SetShapeGeometry_Action(memberId, data));
     }
 
     protected override IAction SettingsChangedAction()
     {
-        return new SetShapeGeometry_Action(memberGuid,
+        return new SetShapeGeometry_Action(memberId,
             new RectangleVectorData(firstCenter, firstSize)
             {
                 StrokeColor = StrokeColor, FillColor = FillColor, StrokeWidth = StrokeWidth,
@@ -85,7 +86,7 @@ internal class VectorRectangleToolExecutor : ComplexShapeToolExecutor<IVectorRec
 
         lastMatrix = matrix;
 
-        return new SetShapeGeometry_Action(memberGuid, newData);
+        return new SetShapeGeometry_Action(memberId, newData);
     }
 
     protected override IAction EndDrawAction()

+ 5 - 0
src/PixiEditor/ViewModels/Tools/Tools/RasterEllipseToolViewModel.cs

@@ -47,4 +47,9 @@ internal class RasterEllipseToolViewModel : ShapeTool, IRasterEllipseToolHandler
     {
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterEllipseTool();
     }
+    
+    public override void OnSelected()
+    {
+        ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterEllipseTool();
+    }
 }

+ 6 - 0
src/PixiEditor/ViewModels/Tools/Tools/RasterLineToolViewModel.cs

@@ -53,4 +53,10 @@ internal class RasterLineToolViewModel : ShapeTool, ILineToolHandler
     {
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterLineTool();
     }
+
+    public override void OnSelected()
+    {
+        var document = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
+        document.Tools.UseRasterLineTool();
+    }
 }

+ 5 - 0
src/PixiEditor/ViewModels/Tools/Tools/RasterRectangleToolViewModel.cs

@@ -48,4 +48,9 @@ internal class RasterRectangleToolViewModel : ShapeTool, IRasterRectangleToolHan
     {
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterRectangleTool();
     }
+
+    public override void OnSelected()
+    {
+        ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseRasterRectangleTool();
+    }
 }

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

@@ -1,5 +1,6 @@
 using Avalonia.Input;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces.Shapes;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
@@ -40,8 +41,10 @@ internal class VectorEllipseToolViewModel : ShapeTool, IVectorEllipseToolHandler
 
     public override void OnSelected()
     {
-        var layer = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.SelectedStructureMember;
-        if (layer is IVectorLayerHandler vectorLayer)
+        var document = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
+        var layer = document.SelectedStructureMember;
+        if (layer is IVectorLayerHandler vectorLayer && 
+            vectorLayer.GetShapeData(document.AnimationDataViewModel.ActiveFrameTime) is IReadOnlyEllipseData)
         {
             ShapeCorners corners = vectorLayer.TransformationCorners;
             ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument.TransformViewModel.ShowTransform(
@@ -51,11 +54,6 @@ internal class VectorEllipseToolViewModel : ShapeTool, IVectorEllipseToolHandler
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseVectorEllipseTool();
     }
 
-    public override void OnDeselecting()
-    {
-        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
-    }
-
     protected override void OnSelectedLayersChanged(IStructureMemberHandler[] layers)
     {
         OnDeselecting();

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

@@ -1,5 +1,6 @@
 using Avalonia.Input;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces.Shapes;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
@@ -52,8 +53,10 @@ internal class VectorRectangleToolViewModel : ShapeTool, IVectorRectangleToolHan
 
     public override void OnSelected()
     {
-        var layer = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.SelectedStructureMember;
-        if (layer is IVectorLayerHandler vectorLayer)
+        var document = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
+        var layer = document.SelectedStructureMember;
+        if (layer is IVectorLayerHandler vectorLayer && 
+            vectorLayer.GetShapeData(document.AnimationDataViewModel.ActiveFrameTime) is IReadOnlyRectangleData)
         {
             ShapeCorners corners = vectorLayer.TransformationCorners;
             ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument.TransformViewModel.ShowTransform(
@@ -63,11 +66,6 @@ internal class VectorRectangleToolViewModel : ShapeTool, IVectorRectangleToolHan
         ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseVectorRectangleTool();
     }
 
-    public override void OnDeselecting()
-    {
-        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
-    }
-    
     protected override void OnSelectedLayersChanged(IStructureMemberHandler[] layers)
     {
         OnDeselecting();