Browse Source

Added tap remove empty layer to vector line tool

Krzysztof Krysiński 4 months ago
parent
commit
383dd3afd1

+ 19 - 8
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/DrawableShapeToolExecutor.cs

@@ -34,6 +34,10 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
     protected RectD lastRect;
     protected double lastRadians;
 
+    protected virtual bool DeleteLayerOnNoDraw => false;
+    protected virtual bool SelectLayerOnTap => false;
+    protected virtual Predicate<ILayerHandler> CanSelectLayer => x => true;
+
     private ShapeCorners initialCorners;
     private bool noMovement = true;
     protected IFillableShapeToolbar toolbar;
@@ -363,20 +367,27 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
                 base.OnLeftMouseButtonUp(argsPositionOnCanvas);
                 onEnded?.Invoke(this);
 
-                if (lastRect.Size == VecD.Zero)
+                if (DeleteLayerOnNoDraw)
                 {
-                    var member = document!.StructureHelper.Find(memberId);
-                    if (member is not null)
+                    if (lastRect.Size == VecD.Zero)
                     {
-                        document.Operations.DeleteStructureMember(memberId);
-                        document.TransformHandler.HideTransform();
+                        var member = document!.StructureHelper.Find(memberId);
+                        if (member is not null)
+                        {
+                            document.Operations.DeleteStructureMember(memberId);
+                            document.TransformHandler.HideTransform();
+                        }
                     }
                 }
 
-                var layersUnderCursor = QueryLayers<ILayerHandler>(argsPositionOnCanvas);
-                if (layersUnderCursor.Any())
+                if (SelectLayerOnTap)
                 {
-                    document.Operations.SetSelectedMember(layersUnderCursor.First().Id);
+                    var layersUnderCursor = QueryLayers<ILayerHandler>(argsPositionOnCanvas);
+                    var firstValidLayer = layersUnderCursor.FirstOrDefault(x => CanSelectLayer(x));
+                    if (firstValidLayer != null)
+                    {
+                        document.Operations.SetSelectedMember(firstValidLayer.Id);
+                    }
                 }
 
                 return;

+ 1 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineExecutor.cs

@@ -30,7 +30,7 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
     protected bool drawOnMask;
 
     protected VecD curPos;
-    private bool startedDrawing = false;
+    protected bool startedDrawing = false;
     private T? toolViewModel;
     private IColorsHandler? colorsVM;
     protected IShapeToolbar? toolbar;

+ 8 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorEllipseToolExecutor.cs

@@ -8,6 +8,7 @@ using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces.Shapes;
 using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
 using PixiEditor.Models.Handlers;
 
@@ -24,6 +25,12 @@ internal class VectorEllipseToolExecutor : DrawableShapeToolExecutor<IVectorElli
     private Matrix3X3 lastMatrix = Matrix3X3.Identity;
 
     protected override bool AlignToPixels => false;
+    protected override bool DeleteLayerOnNoDraw => true;
+    protected override bool SelectLayerOnTap => true;
+
+    protected override Predicate<ILayerHandler> CanSelectLayer => x => x is IVectorLayerHandler vec
+                                                                       && vec.GetShapeData(vec.Document.AnimationHandler
+                                                                           .ActiveFrameTime) is IReadOnlyEllipseData;
 
     protected override bool InitShapeData(IReadOnlyShapeVectorData data)
     {
@@ -127,7 +134,7 @@ internal class VectorEllipseToolExecutor : DrawableShapeToolExecutor<IVectorElli
 
     public override bool IsFeatureEnabled<T>()
     {
-        if(typeof(T) == typeof(IMidChangeUndoableExecutor)) return false;
+        if (typeof(T) == typeof(IMidChangeUndoableExecutor)) return false;
         return base.IsFeatureEnabled<T>();
     }
 }

+ 29 - 5
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorLineToolExecutor.cs

@@ -6,10 +6,11 @@ using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
 using PixiEditor.Models.Handlers.Tools;
 using Drawie.Numerics;
 using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
+using PixiEditor.Models.Handlers;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 
-internal class VectorLineToolExecutor : LineExecutor<IVectorLineToolHandler> 
+internal class VectorLineToolExecutor : LineExecutor<IVectorLineToolHandler>
 {
     private VecD startPoint;
     private VecD endPoint;
@@ -33,7 +34,7 @@ internal class VectorLineToolExecutor : LineExecutor<IVectorLineToolHandler>
     protected override IAction DrawLine(VecD pos)
     {
         LineVectorData data = ConstructLineData(startDrawingPos, pos);
-        
+
         startPoint = startDrawingPos;
         endPoint = pos;
 
@@ -43,13 +44,36 @@ internal class VectorLineToolExecutor : LineExecutor<IVectorLineToolHandler>
     protected override IAction TransformOverlayMoved(VecD start, VecD end)
     {
         var data = ConstructLineData(start, end);
-        
+
         startPoint = start;
         endPoint = end;
 
         return new SetShapeGeometry_Action(memberId, data);
     }
 
+    public override void OnLeftMouseButtonUp(VecD argsPositionOnCanvas)
+    {
+        base.OnLeftMouseButtonUp(argsPositionOnCanvas);
+
+        if (!startedDrawing)
+        {
+            var member = document!.StructureHelper.Find(memberId);
+            if (member is not null)
+            {
+                document.Operations.DeleteStructureMember(memberId);
+                document.TransformHandler.HideTransform();
+            }
+        }
+
+        var layersUnderCursor = QueryLayers<IVectorLayerHandler>(argsPositionOnCanvas);
+        var firstValidLayer = layersUnderCursor.FirstOrDefault(x =>
+            x.GetShapeData(document.AnimationHandler.ActiveFrameTime) is IReadOnlyLineData);
+        if (firstValidLayer != null)
+        {
+            document.Operations.SetSelectedMember(firstValidLayer.Id);
+        }
+    }
+
     protected override IAction[] SettingsChange()
     {
         return [TransformOverlayMoved(startPoint, endPoint), new EndSetShapeGeometry_Action()];
@@ -63,8 +87,8 @@ internal class VectorLineToolExecutor : LineExecutor<IVectorLineToolHandler>
     public override bool IsFeatureEnabled<T>()
     {
         Type feature = typeof(T);
-        if(feature == typeof(IMidChangeUndoableExecutor)) return false;
-        
+        if (feature == typeof(IMidChangeUndoableExecutor)) return false;
+
         return base.IsFeatureEnabled<T>();
     }
 }

+ 8 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorRectangleToolExecutor.cs

@@ -8,6 +8,7 @@ using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces.Shapes;
 using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
 using PixiEditor.Models.Handlers;
 
@@ -25,6 +26,13 @@ internal class VectorRectangleToolExecutor : DrawableShapeToolExecutor<IVectorRe
 
     protected override bool AlignToPixels => false;
 
+    protected override bool DeleteLayerOnNoDraw => true;
+    protected override bool SelectLayerOnTap => true;
+
+    protected override Predicate<ILayerHandler> CanSelectLayer => x => x is IVectorLayerHandler vec
+                                                                       && vec.GetShapeData(vec.Document.AnimationHandler
+                                                                           .ActiveFrameTime) is IReadOnlyRectangleData;
+
     protected override bool InitShapeData(IReadOnlyShapeVectorData data)
     {
         if (data is not RectangleVectorData rectData)