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

Delete layers inside nested folders bug fix

flabbet 4 жил өмнө
parent
commit
7fd1fea7e6

+ 19 - 0
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -573,7 +573,10 @@ namespace PixiEditor.Models.DataHolders
                 int index = Layers.IndexOf(layer);
                 bool wasActive = layer.IsActive;
 
+                var layerGroup = LayerStructure.GetGroupByLayer(layer.LayerGuid);
+
                 LayerStructure.AssignParent(Layers[index].LayerGuid, null);
+                RemoveGroupsIfEmpty(layer, layerGroup);
 
                 Layers.Remove(layer);
 
@@ -584,6 +587,22 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
+        private void RemoveGroupsIfEmpty(Layer layer, GuidStructureItem layerGroup)
+        {
+            if (LayerStructure.GroupContainsOnlyLayer(layer, layerGroup))
+            {
+                if (layerGroup.Parent != null)
+                {
+                    layerGroup.Parent.Subgroups.Remove(layerGroup);
+                    RemoveGroupsIfEmpty(layer, layerGroup.Parent);
+                }
+                else
+                {
+                    LayerStructure.Groups.Remove(layerGroup);
+                }
+            }
+        }
+
         private void RemoveLayersProcess(object[] parameters)
         {
             if (parameters != null && parameters.Length > 0 && parameters[0] is IEnumerable<Guid> layerGuids)

+ 6 - 0
PixiEditor/Models/Layers/LayerStructure.cs

@@ -16,6 +16,11 @@ namespace PixiEditor.Models.Layers
 
         public ObservableCollection<GuidStructureItem> Groups { get; set; }
 
+        public static bool GroupContainsOnlyLayer(Layer layer, GuidStructureItem layerGroup)
+        {
+            return layerGroup != null && layerGroup.Subgroups.Count == 0 && layerGroup.StartLayerGuid == layer.LayerGuid && layerGroup.EndLayerGuid == layer.LayerGuid;
+        }
+
         public GuidStructureItem GetGroupByGuid(Guid? groupGuid)
         {
             return GetGroupByGuid(groupGuid, Groups);
@@ -45,6 +50,7 @@ namespace PixiEditor.Models.Layers
             LayerStructureChanged?.Invoke(this, EventArgs.Empty);
         }
 
+
 #nullable enable
         public void MoveGroup(Guid groupGuid, GuidStructureItem? parentGroup, int newIndex)
         {

+ 17 - 6
PixiEditor/Models/Layers/StructuredLayerTree.cs

@@ -125,11 +125,14 @@ namespace PixiEditor.Models.Layers
 
             foreach (var guid in layersInFolder)
             {
-                var layer = layers.First(x => x.LayerGuid == guid);
-                if (!layersInStructure.Contains(layer.LayerGuid))
+                var layer = layers.FirstOrDefault(x => x.LayerGuid == guid);
+                if (layer != null)
                 {
-                    layersInStructure.Add(layer.LayerGuid);
-                    structureItemLayers.Add(layer);
+                    if (!layersInStructure.Contains(layer.LayerGuid))
+                    {
+                        layersInStructure.Add(layer.LayerGuid);
+                        structureItemLayers.Add(layer);
+                    }
                 }
             }
 
@@ -153,8 +156,16 @@ namespace PixiEditor.Models.Layers
                 return Array.Empty<Guid>();
             }
 
-            int startIndex = layers.IndexOf(layers.First(x => x.LayerGuid == structureItem.StartLayerGuid));
-            int endIndex = layers.IndexOf(layers.First(x => x.LayerGuid == structureItem.EndLayerGuid));
+            var startLayer = layers.FirstOrDefault(x => x.LayerGuid == structureItem.StartLayerGuid);
+            var endLayer = layers.FirstOrDefault(x => x.LayerGuid == structureItem.EndLayerGuid);
+
+            if(startLayer == null || endLayer == null)
+            {
+                return Array.Empty<Guid>();
+            }
+
+            int startIndex = layers.IndexOf(startLayer);
+            int endIndex = layers.IndexOf(endLayer);
 
             if (startIndex > endIndex)
             {