Pārlūkot izejas kodu

Fixed nested pre-move out of bounds

flabbet 4 gadi atpakaļ
vecāks
revīzija
4059667938

+ 8 - 2
PixiEditor/Models/DataHolders/Document/Document.Constructors.cs

@@ -21,10 +21,16 @@ namespace PixiEditor.Models.DataHolders
             XamlAccesibleViewModel = ViewModelMain.Current ?? null;
             GeneratePreviewLayer();
             Layers.CollectionChanged += Layers_CollectionChanged;
-            LayerStructure.Groups.CollectionChanged += Folders_CollectionChanged1;
+            LayerStructure.Groups.CollectionChanged += Groups_CollectionChanged;
+            LayerStructure.LayerStructureChanged += LayerStructure_LayerStructureChanged;
         }
 
-        private void Folders_CollectionChanged1(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
+        private void LayerStructure_LayerStructureChanged(object sender, System.EventArgs e)
+        {
+            RaisePropertyChanged(nameof(LayerStructure));
+        }
+
+        private void Groups_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
         {
             RaisePropertyChanged(nameof(LayerStructure));
         }

+ 9 - 9
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -115,9 +115,9 @@ namespace PixiEditor.Models.DataHolders
                 "Move layer"));
         }
 
-        public void MoveFolderInStructure(Guid folderGuid, Guid referenceLayer, bool above = false)
+        public void MoveFolderInStructure(Guid groupGuid, Guid referenceLayer, bool above = false)
         {
-            var args = new object[] { folderGuid, referenceLayer, above };
+            var args = new object[] { groupGuid, referenceLayer, above };
 
             MoveFolderInStructureProcess(args);
 
@@ -467,28 +467,28 @@ namespace PixiEditor.Models.DataHolders
             Guid referenceLayerGuid = (Guid)parameter[1];
             bool above = (bool)parameter[2];
 
-            GuidStructureItem folder = LayerStructure.GetGroupByGuid(folderGuid);
-            GuidStructureItem referenceLayerFolder = LayerStructure.GetGroupByLayer(referenceLayerGuid);
+            GuidStructureItem group = LayerStructure.GetGroupByGuid(folderGuid);
+            GuidStructureItem referenceLayergroup = LayerStructure.GetGroupByLayer(referenceLayerGuid);
 
             Layer referenceLayer = Layers.First(x => x.LayerGuid == referenceLayerGuid);
 
             int layerIndex = Layers.IndexOf(referenceLayer);
-            int folderTopIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == folder.EndLayerGuid));
+            int folderTopIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == group.EndLayerGuid));
             int oldIndex = folderTopIndex;
 
             if (layerIndex < folderTopIndex)
             {
-                int folderBottomIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == folder.StartLayerGuid));
+                int folderBottomIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == group.StartLayerGuid));
                 oldIndex = folderBottomIndex;
             }
 
             int newIndex = CalculateNewIndex(layerIndex, above, oldIndex);
 
-            LayerStructure.MoveGroup(folderGuid, folder.Parent, newIndex);
+            LayerStructure.MoveGroup(folderGuid, group.Parent, newIndex);
 
-            ReassignParent(folder, referenceLayerFolder);
+            ReassignParent(group, referenceLayergroup);
 
-            LayerStructure.PostMoveReassignBounds(folder.Parent, folder);
+            LayerStructure.PostMoveReassignBounds(group.Parent, group);
         }
 
         private void ReassignParent(GuidStructureItem folder, GuidStructureItem referenceLayerFolder)

+ 43 - 10
PixiEditor/Models/Layers/LayerStructure.cs

@@ -9,6 +9,8 @@ namespace PixiEditor.Models.Layers
 {
     public class LayerStructure
     {
+        public event EventHandler LayerStructureChanged;
+
         public Document Owner { get; set; }
 
         public ObservableCollection<GuidStructureItem> Groups { get; set; }
@@ -36,6 +38,8 @@ namespace PixiEditor.Models.Layers
                 group.Parent = parent;
                 parent.Subfolders.Add(group);
             }
+
+            LayerStructureChanged?.Invoke(this, EventArgs.Empty);
         }
 
 #nullable enable
@@ -64,6 +68,8 @@ namespace PixiEditor.Models.Layers
             List<Guid> layersInOrder = GetLayersInOrder(new FolderData(groupTopIndex, groupBottomIndex));
 
             MoveLayersInGroup(layersInOrder, difference, reverseOrder);
+
+            LayerStructureChanged?.Invoke(this, EventArgs.Empty);
         }
 
         public void PostMoveReassignBounds(GuidStructureItem? parentFolder, Guid layerGuid)
@@ -143,6 +149,8 @@ namespace PixiEditor.Models.Layers
             }
 
             PostMoveReassignBounds(parent, layer);
+
+            LayerStructureChanged?.Invoke(this, EventArgs.Empty);
         }
 
         public void PreMoveReassignBounds(GuidStructureItem? parentGroup, Guid layer)
@@ -156,7 +164,6 @@ namespace PixiEditor.Models.Layers
                 }
                 else
                 {
-
                     if (parentGroup.EndLayerGuid == layer)
                     {
                         parentGroup.EndLayerGuid = FindBoundLayer(parentGroup, layer, false);
@@ -185,29 +192,51 @@ namespace PixiEditor.Models.Layers
             {
                 parentFolder.Parent.Subfolders.Remove(parentFolder);
             }
+
+            LayerStructureChanged?.Invoke(this, EventArgs.Empty);
         }
 
-        private void PreMoveReassignBounds(GuidStructureItem? parentFolder, GuidStructureItem folder)
+        private void PreMoveReassignBounds(GuidStructureItem? parentGroup, GuidStructureItem group)
         {
-            if (parentFolder != null)
+            if (parentGroup != null)
             {
-                if (folder.EndLayerGuid == parentFolder.EndLayerGuid && folder.StartLayerGuid != null)
+                Guid? oldStart = group.StartLayerGuid;
+                Guid? oldEnd = group.EndLayerGuid;
+                if (group.EndLayerGuid == parentGroup.EndLayerGuid && group.StartLayerGuid != null)
                 {
-                    parentFolder.EndLayerGuid = FindBoundLayer(parentFolder, (Guid)folder.StartLayerGuid, false);
+                    parentGroup.EndLayerGuid = FindBoundLayer(parentGroup, (Guid)group.StartLayerGuid, false);
                 }
 
-                if (folder.StartLayerGuid == parentFolder.StartLayerGuid && folder.EndLayerGuid != null)
+                if (group.StartLayerGuid == parentGroup.StartLayerGuid && group.EndLayerGuid != null)
                 {
-                    parentFolder.StartLayerGuid = FindBoundLayer(parentFolder, (Guid)folder.EndLayerGuid, true);
+                    parentGroup.StartLayerGuid = FindBoundLayer(parentGroup, (Guid)group.EndLayerGuid, true);
                 }
 
-                if (parentFolder.Parent != null)
+                if (parentGroup.Parent != null)
                 {
-                    PreMoveReassignBounds(parentFolder.Parent, parentFolder);
+                    ApplyBoundsToParents(parentGroup.Parent, parentGroup, oldStart, oldEnd);
                 }
             }
         }
 
+        private void ApplyBoundsToParents(GuidStructureItem parent, GuidStructureItem group, Guid? oldStart, Guid? oldEnd)
+        {
+            if(parent.StartLayerGuid == oldStart)
+            {
+                parent.StartLayerGuid = group.StartLayerGuid;
+            }
+
+            if (parent.EndLayerGuid == oldEnd)
+            {
+                parent.EndLayerGuid = group.EndLayerGuid;
+            }
+
+            if (parent.Parent != null)
+            {
+                ApplyBoundsToParents(parent.Parent, parent, oldStart, oldEnd);
+            }
+        }
+
         private Guid? FindBoundLayer(Guid layerGuid, int parentFolderTopIndex, int parentFolderBottomIndex, bool above)
         {
             return GetNextLayerGuid(
@@ -310,7 +339,11 @@ namespace PixiEditor.Models.Layers
 
                 if (folder.Subfolders.Count > 0)
                 {
-                    return GetGroupByGuid(folderGuid, folder.Subfolders);
+                    var guid = GetGroupByGuid(folderGuid, folder.Subfolders);
+                    if(guid != null)
+                    {
+                        return guid;
+                    }
                 }
             }
 

+ 1 - 1
PixiEditor/Views/UserControls/LayerGroupControl.xaml.cs

@@ -96,7 +96,7 @@ namespace PixiEditor.Views.UserControls
 
                 Layer tempLayer = new("_temp");
                 document.Layers.Insert(indexOfReferenceLayer, tempLayer);
-                document.MoveFolderInStructure(group, tempLayer.LayerGuid, above); //TODO fix
+                document.MoveFolderInStructure(group, tempLayer.LayerGuid, above);
                 document.Layers.Remove(tempLayer);
             }
         }

+ 1 - 1
PixiEditor/Views/UserControls/LayersManager.xaml

@@ -50,7 +50,7 @@
                 </TreeView.ItemsPanel>
                 <TreeView.Resources>
                     <HierarchicalDataTemplate DataType="{x:Type layers:LayerGroup}" ItemsSource="{Binding Items}">
-                        <local:LayerGroupControl GroupName="{Binding Name}" LayersViewModel="{Binding LayerCommandsViewModel, ElementName=layersManager}" GroupGuid="{Binding GroupGuid}" GroupData="{Binding StructureData}" MouseMove="LayerFolder_MouseMove"/>
+                        <local:LayerGroupControl GroupName="{Binding Name}" LayersViewModel="{Binding LayerCommandsViewModel, ElementName=layersManager}" GroupGuid="{Binding GroupGuid}" GroupData="{Binding StructureData}" MouseMove="LayerGroup_MouseMove"/>
                     </HierarchicalDataTemplate>
                     <DataTemplate DataType="{x:Type layers:Layer}">
                         <local:LayerStructureItemContainer                             

+ 1 - 1
PixiEditor/Views/UserControls/LayersManager.xaml.cs

@@ -67,7 +67,7 @@ namespace PixiEditor.Views.UserControls
             }
         }
 
-        private void LayerFolder_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
+        private void LayerGroup_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
         {
             if (sender is LayerGroupControl container && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
             {