2
0
Эх сурвалжийг харах

Merge pull request #919 from PixiEditor/fixes/1.05.2025

Fixed double clicking selecting invisible layers
Krzysztof Krysiński 3 сар өмнө
parent
commit
3815688a7c

+ 5 - 0
src/PixiEditor.ChangeableDocument/Changes/Vectors/SetShapeGeometry_UpdateableChange.cs

@@ -75,6 +75,11 @@ internal class SetShapeGeometry_UpdateableChange : InterruptableUpdateableChange
     {
         ignoreInUndo = false;
         var node = target.FindNode<VectorLayerNode>(TargetId);
+        if (node == null)
+        {
+            return new None();
+        }
+
         node.ShapeData = Data;
 
         RectD aabb = node.ShapeData.TransformedAABB.RoundOutwards();

+ 1 - 5
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/TransformSelectedExecutor.cs

@@ -161,11 +161,7 @@ internal class TransformSelectedExecutor : UpdateableChangeExecutor, ITransforma
             }
         }
 
-        var allLayers = document.StructureHelper.GetAllLayers();
-        var topMostWithinClick = allLayers.Where(x =>
-                x is { IsVisibleBindable: true, TightBounds: not null } &&
-                x.TightBounds.Value.ContainsInclusive(args.PositionOnCanvas))
-            .OrderByDescending(x => allLayers.IndexOf(x));
+        var topMostWithinClick = QueryLayers<ILayerHandler>(args.PositionOnCanvas);
 
         var nonSelected = topMostWithinClick.Where(x => x != document.SelectedStructureMember
                                                         && !document.SoftSelectedStructureMembers.Contains(x))

+ 22 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/UpdateableChangeExecutor.cs

@@ -66,10 +66,31 @@ internal abstract class UpdateableChangeExecutor
     protected T[] QueryLayers<T>(VecD pos) where T : ILayerHandler
     {
         var allLayers = document.StructureHelper.GetAllLayers();
+        FilterOutInvisible(allLayers);
         var topMostWithinClick = allLayers.Where(x =>
-                x is T { IsVisibleBindable: true, TightBounds: not null } &&
+                x is T { TightBounds: not null } &&
                 x.TightBounds.Value.ContainsInclusive(pos))
             .OrderByDescending(x => allLayers.IndexOf(x));
         return topMostWithinClick.Cast<T>().ToArray();
     }
+
+    private void FilterOutInvisible(List<ILayerHandler> allLayers)
+    {
+        allLayers.RemoveAll(x => x is ILayerHandler { IsVisibleBindable: false });
+
+        List<ILayerHandler> toRemove = new List<ILayerHandler>();
+        foreach (var layer in allLayers)
+        {
+            var parents = document.StructureHelper.GetParents(layer.Id);
+            if(parents.Any(x => !x.IsVisibleBindable))
+            {
+                toRemove.Add(layer);
+            }
+        }
+
+        foreach (var layer in toRemove)
+        {
+            allLayers.Remove(layer);
+        }
+    }
 }