瀏覽代碼

Moving layers work

flabbet 4 年之前
父節點
當前提交
de4bb138b6
共有 2 個文件被更改,包括 55 次插入26 次删除
  1. 10 4
      PixiEditor/Models/DataHolders/Document/Document.Layers.cs
  2. 45 22
      PixiEditor/Models/Layers/LayerStructure.cs

+ 10 - 4
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -361,8 +361,6 @@ namespace PixiEditor.Models.DataHolders
             Guid? folder = (Guid?)props[2];
 
             Layers.Move(Layers.IndexOf(Layers.First(x => x.LayerGuid == layerGuid)), indexTo);
-
-            LayerStructure.MoveLayerToFolder(layerGuid, folder);
         }
 
         private void InjectRemoveActiveLayersUndo(object[] guidArgs, StorageBasedChange change)
@@ -529,14 +527,22 @@ namespace PixiEditor.Models.DataHolders
             int oldIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == layer));
             int newIndex = CalculateNewIndex(layerIndex, above, oldIndex);
 
+            var startFolder = LayerStructure.GetFolderByLayer(layer);
+
+            LayerStructure.PreMoveReassignBounds(startFolder, layer);
+
             Layers.Move(oldIndex, newIndex);
+
+            var newFolder = LayerStructure.GetFolderByLayer(referenceLayer);
+
+            LayerStructure.PostMoveReassignBounds(newFolder, layer);
+
             if (Layers.IndexOf(ActiveLayer) == oldIndex)
             {
                 SetMainActiveLayer(newIndex);
             }
 
-            //LayerStructure.MoveLayerToFolder(layerGuid, folderGuid);
-            //RaisePropertyChanged(nameof(LayerStructure));
+            RaisePropertyChanged(nameof(LayerStructure));
         }
 
         private void RestoreLayersProcess(Layer[] layers, UndoLayer[] layersData)

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

@@ -12,31 +12,11 @@ namespace PixiEditor.Models.Layers
 
         public ObservableCollection<GuidStructureItem> Folders { get; set; }
 
-        public GuidStructureItem GetFolderByGuid(Guid folderGuid)
+        public GuidStructureItem GetFolderByGuid(Guid? folderGuid)
         {
             return GetFolderByGuid(folderGuid, Folders);
         }
 
-        /// <summary>
-        /// Moves layer from folder if already exist to new one, or removes completely if specified folderGuid is null;
-        /// </summary>
-        /// <param name="layerGuid">Guid of layer to move.</param>
-        /// <param name="folderGuid">Folder guid to move layer to, set to null to remove completely.</param>
-        public void MoveLayerToFolder(Guid layerGuid, Guid? folderGuid)
-        {
-            GuidStructureItem oldFolder = GetFolderByLayer(layerGuid);
-            //if (oldFolder != null)
-            //{
-            //    oldFolder.LayerGuids.Remove(layerGuid);
-            //}
-
-            //if (folderGuid != null)
-            //{
-            //    var folder = GetFolderByGuid((Guid)folderGuid);
-            //    folder.LayerGuids.Add(layerGuid);
-            //}
-        }
-
         public GuidStructureItem GetFolderByLayer(Guid layerGuid)
         {
             return GetFolderByLayer(layerGuid, Folders);
@@ -70,6 +50,33 @@ namespace PixiEditor.Models.Layers
             MoveLayersInFolder(layersInOrder, difference, reverseOrder);
         }
 
+        public void PostMoveReassignBounds(GuidStructureItem? parentFolder, Guid layerGuid)
+        {
+            if (parentFolder != null)
+            {
+                int layerIndex = Owner.Layers.IndexOf(Owner.Layers.First(x => x.LayerGuid == layerGuid));
+
+                int folderTopIndex = Owner.Layers.IndexOf(Owner.Layers.First(x => x.LayerGuid == parentFolder.EndLayerGuid));
+                int folderBottomIndex = Owner.Layers.IndexOf(Owner.Layers.First(x => x.LayerGuid == parentFolder.StartLayerGuid));
+
+                int finalTopIndex = Math.Max(folderTopIndex, layerIndex);
+                int finalBottomIndex = Math.Min(folderBottomIndex, layerIndex);
+
+                Guid? topBoundLayer = FindBoundLayer(layerGuid, finalTopIndex, finalBottomIndex, false);
+                Guid? bottomBoundLayer = FindBoundLayer(layerGuid, finalTopIndex, finalBottomIndex, true);
+
+                if (topBoundLayer == parentFolder.EndLayerGuid)
+                {
+                    parentFolder.EndLayerGuid = layerGuid;
+                }
+
+                if (bottomBoundLayer == parentFolder.StartLayerGuid)
+                {
+                    parentFolder.StartLayerGuid = layerGuid;
+                }
+            }
+        }
+
         public void PostMoveReassignBounds(GuidStructureItem? parentFolder, GuidStructureItem folder)
         {
             if (parentFolder != null)
@@ -101,6 +108,22 @@ namespace PixiEditor.Models.Layers
             }
         }
 
+        public void PreMoveReassignBounds(GuidStructureItem? parentFolder, Guid layer)
+        {
+            if (parentFolder != null)
+            {
+                if (parentFolder.EndLayerGuid == layer)
+                {
+                    parentFolder.EndLayerGuid = FindBoundLayer(parentFolder, layer, false);
+                }
+
+                if (parentFolder.StartLayerGuid == layer)
+                {
+                    parentFolder.StartLayerGuid = FindBoundLayer(parentFolder, layer, true);
+                }
+            }
+        }
+
         private void PreMoveReassignBounds(GuidStructureItem? parentFolder, GuidStructureItem folder)
         {
             if (parentFolder != null)
@@ -203,7 +226,7 @@ namespace PixiEditor.Models.Layers
             return null;
         }
 
-        private GuidStructureItem GetFolderByGuid(Guid folderGuid, IEnumerable<GuidStructureItem> folders)
+        private GuidStructureItem GetFolderByGuid(Guid? folderGuid, IEnumerable<GuidStructureItem> folders)
         {
             foreach (var folder in folders)
             {