Kaynağa Gözat

Fixed nested moving groups and moving groups outside parent related

flabbet 4 yıl önce
ebeveyn
işleme
c3ba4007c8

+ 1 - 1
PixiEditor/Models/Controllers/ClipboardController.cs

@@ -59,7 +59,7 @@ namespace PixiEditor.Models.Controllers
                 return;
             }
 
-            ViewModelMain.Current.BitmapManager.ActiveDocument.RemoveLayer((int)parameters[0]);
+            ViewModelMain.Current.BitmapManager.ActiveDocument.RemoveLayer((int)parameters[0], true);
         }
 
         private static void AddLayerProcess(object[] parameters)

+ 21 - 8
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -237,7 +237,7 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
-        public void RemoveLayer(int layerIndex)
+        public void RemoveLayer(int layerIndex, bool addToUndo)
         {
             if (Layers.Count == 0)
             {
@@ -249,8 +249,12 @@ namespace PixiEditor.Models.DataHolders
             bool wasActive = Layers[layerIndex].IsActive;
 
             StorageBasedChange change = new StorageBasedChange(this, new[] { Layers[layerIndex] });
-            UndoManager.AddUndoChange(
-                change.ToChange(RestoreLayersProcess, RemoveLayerProcess, new object[] { Layers[layerIndex].LayerGuid }, "Remove layer"));
+            if (addToUndo)
+            {
+                UndoManager.AddUndoChange(
+                    change.ToChange(RestoreLayersProcess, RemoveLayerProcess, new object[] { Layers[layerIndex].LayerGuid }, "Remove layer"));
+
+            }
 
             Layers.RemoveAt(layerIndex);
             if (wasActive)
@@ -259,9 +263,9 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
-        public void RemoveLayer(Layer layer)
+        public void RemoveLayer(Layer layer, bool addToUndo)
         {
-            RemoveLayer(Layers.IndexOf(layer));
+            RemoveLayer(Layers.IndexOf(layer), addToUndo);
         }
 
         public void RemoveActiveLayers()
@@ -306,17 +310,26 @@ namespace PixiEditor.Models.DataHolders
 
             Layer mergedLayer = layersToMerge[0];
 
+            var groupParent = LayerStructure.GetGroupByLayer(layersToMerge[^1].LayerGuid);
+
+            Layer placeholderLayer = new("_placeholder");
+            Layers.Insert(index, placeholderLayer);
+            LayerStructure.AssignParent(placeholderLayer.LayerGuid, groupParent);
+
             for (int i = 0; i < layersToMerge.Length - 1; i++)
             {
                 Layer firstLayer = mergedLayer;
                 Layer secondLayer = layersToMerge[i + 1];
                 mergedLayer = firstLayer.MergeWith(secondLayer, name, Width, Height);
-                Layers.Remove(layersToMerge[i]);
+                RemoveLayer(layersToMerge[i], false);
             }
 
-            Layers.Remove(layersToMerge[^1]);
-
             Layers.Insert(index, mergedLayer);
+            LayerStructure.AssignParent(mergedLayer.LayerGuid, groupParent);
+
+            RemoveLayer(placeholderLayer, false);
+
+            RemoveLayer(layersToMerge[^1], false);
 
             SetMainActiveLayer(Layers.IndexOf(mergedLayer));
 

+ 45 - 5
PixiEditor/Models/Layers/LayerStructure.cs

@@ -118,14 +118,22 @@ namespace PixiEditor.Models.Layers
             {
                 Guid? oldStart = parentGroup.StartLayerGuid;
                 Guid? oldEnd = parentGroup.EndLayerGuid;
-                if (group.EndLayerGuid == parentGroup.EndLayerGuid && group.StartLayerGuid != null)
+
+                if (parentGroup.Subgroups.Count == 1 && parentGroup.StartLayerGuid == group.StartLayerGuid && parentGroup.EndLayerGuid == group.EndLayerGuid)
                 {
-                    parentGroup.EndLayerGuid = FindBoundLayer(parentGroup, (Guid)group.StartLayerGuid, false);
+                    RemoveGroup(parentGroup);
                 }
-
-                if (group.StartLayerGuid == parentGroup.StartLayerGuid && group.EndLayerGuid != null)
+                else
                 {
-                    parentGroup.StartLayerGuid = FindBoundLayer(parentGroup, (Guid)group.EndLayerGuid, true);
+                    if (group.EndLayerGuid == parentGroup.EndLayerGuid && group.StartLayerGuid != null)
+                    {
+                        parentGroup.EndLayerGuid = FindBoundLayer(parentGroup, (Guid)group.StartLayerGuid, false);
+                    }
+
+                    if (group.StartLayerGuid == parentGroup.StartLayerGuid && group.EndLayerGuid != null)
+                    {
+                        parentGroup.StartLayerGuid = FindBoundLayer(parentGroup, (Guid)group.EndLayerGuid, true);
+                    }
                 }
 
                 if (parentGroup.Parent != null)
@@ -135,6 +143,38 @@ namespace PixiEditor.Models.Layers
             }
         }
 
+        /// <summary>
+        /// Checks if group is nested inside parent group.
+        /// </summary>
+        /// <param name="group">Group to check.</param>
+        /// <param name="parent">Parent of that group.</param>
+        /// <returns>True if group is nested inside parent, false if not.</returns>
+        public bool IsChildOf(GuidStructureItem group, GuidStructureItem parent)
+        {
+            if(group == null)
+            {
+                return false;
+            }
+
+            foreach (var subgroup in parent.Subgroups)
+            {
+                if(subgroup == group)
+                {
+                    return true;
+                }
+
+                if(subgroup.Subgroups.Count > 0)
+                {
+                    if(IsChildOf(group, subgroup))
+                    {
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        }
+
         public void PostMoveReassignBounds(GuidStructureItem? parentGroup, Guid layerGuid)
         {
             if (parentGroup != null)

+ 1 - 1
PixiEditor/ViewModels/SubViewModels/Main/LayersViewModel.cs

@@ -130,7 +130,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             var doc = Owner.BitmapManager.ActiveDocument;
             if (!doc.Layers[index].IsActive)
             {
-                doc.RemoveLayer(index);
+                doc.RemoveLayer(index, true);
             }
             else
             {

+ 8 - 2
PixiEditor/Views/UserControls/LayerGroupControl.xaml.cs

@@ -88,9 +88,15 @@ namespace PixiEditor.Views.UserControls
             if (dataObj.GetDataPresent("PixiEditor.Views.UserControls.LayerGroupControl"))
             {
                 var data = (LayerGroupControl)dataObj.GetData("PixiEditor.Views.UserControls.LayerGroupControl");
-                Guid group = data.GroupGuid;
                 var document = data.LayersViewModel.Owner.BitmapManager.ActiveDocument;
 
+                Guid group = data.GroupGuid;
+
+                if(group == GroupGuid || document.LayerStructure.IsChildOf(GroupData, data.GroupData))
+                {
+                    return;
+                }
+
                 int modifier = above ? 1 : -1;
 
                 Layer layer = document.Layers.First(x => x.LayerGuid == referenceLayer);
@@ -102,7 +108,7 @@ namespace PixiEditor.Views.UserControls
                 document.LayerStructure.AssignParent(tempLayer.LayerGuid, GroupData.Parent);
                 document.MoveFolderInStructure(group, tempLayer.LayerGuid, above);
                 document.LayerStructure.AssignParent(tempLayer.LayerGuid, null);
-                document.RemoveLayer(tempLayer);
+                document.RemoveLayer(tempLayer, false);
             }
         }
 

+ 10 - 1
PixiEditor/Views/UserControls/LayerItem.xaml.cs

@@ -173,7 +173,16 @@ namespace PixiEditor.Views
                 var data = (LayerGroupControl)e.Data.GetData("PixiEditor.Views.UserControls.LayerGroupControl");
                 Guid folder = data.GroupGuid;
 
-                data.LayersViewModel.Owner.BitmapManager.ActiveDocument.MoveFolderInStructure(folder, LayerGuid, above);
+                var document = data.LayersViewModel.Owner.BitmapManager.ActiveDocument;
+
+                var parentGroup = document.LayerStructure.GetGroupByLayer(LayerGuid);
+
+                if (parentGroup == data.GroupData || document.LayerStructure.IsChildOf(parentGroup, data.GroupData))
+                {
+                    return;
+                }
+
+                document.MoveFolderInStructure(folder, LayerGuid, above);
             }
         }