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

Moving items inside nested groups works

flabbet 4 жил өмнө
parent
commit
a983cb202a

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

@@ -105,13 +105,11 @@ namespace PixiEditor.Models.DataHolders
 
             int oldIndex = Layers.IndexOf(layer);
 
-            Guid? oldLayerFolder = LayerStructure.GetFolderByLayer(layerGuid)?.FolderGuid;
-
             MoveLayerInStructureProcess(args);
 
             UndoManager.AddUndoChange(new Change(
                 ReverseMoveLayerInStructureProcess,
-                new object[] { oldIndex, layerGuid, oldLayerFolder },
+                new object[] { oldIndex, layerGuid },
                 MoveLayerInStructureProcess,
                 args,
                 "Move layer"));
@@ -358,9 +356,20 @@ namespace PixiEditor.Models.DataHolders
         {
             int indexTo = (int)props[0];
             Guid layerGuid = (Guid)props[1];
-            Guid? folder = (Guid?)props[2];
+
+            Guid layerAtOldIndex = Layers[indexTo].LayerGuid;
+
+            var startFolder = LayerStructure.GetGroupByLayer(layerGuid);
+
+            LayerStructure.PreMoveReassignBounds(startFolder, layerGuid);
 
             Layers.Move(Layers.IndexOf(Layers.First(x => x.LayerGuid == layerGuid)), indexTo);
+
+            var newFolder = LayerStructure.GetGroupByLayer(layerAtOldIndex);
+
+            LayerStructure.PostMoveReassignBounds(newFolder, layerGuid);
+
+            RaisePropertyChanged(nameof(LayerStructure));
         }
 
         private void InjectRemoveActiveLayersUndo(object[] guidArgs, StorageBasedChange change)
@@ -459,7 +468,7 @@ namespace PixiEditor.Models.DataHolders
             bool above = (bool)parameter[2];
 
             GuidStructureItem folder = LayerStructure.GetFolderByGuid(folderGuid);
-            GuidStructureItem referenceLayerFolder = LayerStructure.GetFolderByLayer(referenceLayerGuid);
+            GuidStructureItem referenceLayerFolder = LayerStructure.GetGroupByLayer(referenceLayerGuid);
 
             Layer referenceLayer = Layers.First(x => x.LayerGuid == referenceLayerGuid);
 
@@ -475,7 +484,7 @@ namespace PixiEditor.Models.DataHolders
 
             int newIndex = CalculateNewIndex(layerIndex, above, oldIndex);
 
-            LayerStructure.MoveFolder(folderGuid, folder.Parent, newIndex);
+            LayerStructure.MoveGroup(folderGuid, folder.Parent, newIndex);
 
             ReassignParent(folder, referenceLayerFolder);
 
@@ -527,13 +536,13 @@ 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);
+            var startFolder = LayerStructure.GetGroupByLayer(layer);
 
             LayerStructure.PreMoveReassignBounds(startFolder, layer);
 
             Layers.Move(oldIndex, newIndex);
 
-            var newFolder = LayerStructure.GetFolderByLayer(referenceLayer);
+            var newFolder = LayerStructure.GetGroupByLayer(referenceLayer);
 
             LayerStructure.PostMoveReassignBounds(newFolder, layer);
 

+ 3 - 1
PixiEditor/Models/Layers/GuidStructureItem.cs

@@ -78,12 +78,14 @@ namespace PixiEditor.Models.Layers
             EndLayerGuid = endLayerGuid;
         }
 
-        public GuidStructureItem(string name)
+        public GuidStructureItem(string name, Guid layer)
         {
             Name = name;
             Subfolders = new ObservableCollection<GuidStructureItem>();
             FolderGuid = Guid.NewGuid();
             Parent = null;
+            StartLayerGuid = layer;
+            EndLayerGuid = layer;
         }
     }
 }

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

@@ -17,13 +17,28 @@ namespace PixiEditor.Models.Layers
             return GetFolderByGuid(folderGuid, Folders);
         }
 
-        public GuidStructureItem GetFolderByLayer(Guid layerGuid)
+        public GuidStructureItem GetGroupByLayer(Guid layerGuid)
         {
-            return GetFolderByLayer(layerGuid, Folders);
+            return GetGroupByLayer(layerGuid, Folders);
+        }
+
+        public void AddNewGroup(string groupName, Guid childLayer)
+        {
+            var parent = GetGroupByLayer(childLayer);
+            GuidStructureItem group = new (groupName, childLayer);
+            if (parent == null)
+            {
+                Folders.Add(group);
+            }
+            else
+            {
+                group.Parent = parent;
+                parent.Subfolders.Add(group);
+            }
         }
 
 #nullable enable
-        public void MoveFolder(Guid folderGuid, GuidStructureItem? parentFolder, int newIndex)
+        public void MoveGroup(Guid folderGuid, GuidStructureItem? parentFolder, int newIndex)
         {
             var folder = GetFolderByGuid(folderGuid);
             bool reverseOrder = true;
@@ -47,7 +62,7 @@ namespace PixiEditor.Models.Layers
 
             List<Guid> layersInOrder = GetLayersInOrder(new FolderData(folderTopIndex, folderBottomIndex));
 
-            MoveLayersInFolder(layersInOrder, difference, reverseOrder);
+            MoveLayersInGroup(layersInOrder, difference, reverseOrder);
         }
 
         public void PostMoveReassignBounds(GuidStructureItem? parentFolder, Guid layerGuid)
@@ -74,6 +89,11 @@ namespace PixiEditor.Models.Layers
                 {
                     parentFolder.StartLayerGuid = layerGuid;
                 }
+
+                if (parentFolder.Parent != null)
+                {
+                    PostMoveReassignBounds(parentFolder.Parent, layerGuid);
+                }
             }
         }
 
@@ -105,6 +125,11 @@ namespace PixiEditor.Models.Layers
                         parentFolder.StartLayerGuid = folder.StartLayerGuid;
                     }
                 }
+
+                if (parentFolder.Parent != null)
+                {
+                    PostMoveReassignBounds(parentFolder.Parent, parentFolder);
+                }
             }
         }
 
@@ -121,6 +146,11 @@ namespace PixiEditor.Models.Layers
                 {
                     parentFolder.StartLayerGuid = FindBoundLayer(parentFolder, layer, true);
                 }
+
+                if (parentFolder.Parent != null)
+                {
+                    PreMoveReassignBounds(parentFolder.Parent, layer);
+                }
             }
         }
 
@@ -137,6 +167,11 @@ namespace PixiEditor.Models.Layers
                 {
                     parentFolder.StartLayerGuid = FindBoundLayer(parentFolder, (Guid)folder.EndLayerGuid, true);
                 }
+
+                if (parentFolder.Parent != null)
+                {
+                    PreMoveReassignBounds(parentFolder.Parent, parentFolder);
+                }
             }
         }
 
@@ -177,7 +212,7 @@ namespace PixiEditor.Models.Layers
             return allLayers[newIndex];
         }
 
-        private void MoveLayersInFolder(List<Guid> layers, int moveBy, bool reverseOrder)
+        private void MoveLayersInGroup(List<Guid> layers, int moveBy, bool reverseOrder)
         {
             List<Guid> layerGuids = reverseOrder ? layers.Reverse<Guid>().ToList() : layers;
 
@@ -205,21 +240,22 @@ namespace PixiEditor.Models.Layers
         }
 
 #nullable disable
-        private GuidStructureItem GetFolderByLayer(Guid layerGuid, IEnumerable<GuidStructureItem> folders)
+        private GuidStructureItem GetGroupByLayer(Guid layerGuid, IEnumerable<GuidStructureItem> folders)
         {
             foreach (var folder in folders)
             {
                 int topIndex = Owner.Layers.IndexOf(Owner.Layers.First(x => x.LayerGuid == folder.EndLayerGuid));
                 int bottomIndex = Owner.Layers.IndexOf(Owner.Layers.First(x => x.LayerGuid == folder.StartLayerGuid));
                 var layers = GetLayersInOrder(new FolderData(topIndex, bottomIndex));
-                if (layers.Contains(layerGuid))
+
+                if (folder.Subfolders.Count > 0)
                 {
-                    return folder;
+                    return GetGroupByLayer(layerGuid, folder.Subfolders);
                 }
 
-                if (folder.Subfolders.Count > 0)
+                if (layers.Contains(layerGuid))
                 {
-                    return GetFolderByLayer(layerGuid, folder.Subfolders);
+                    return folder;
                 }
             }
 

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

@@ -36,6 +36,7 @@ namespace PixiEditor.Models.Layers
             LayerFolder currentFolder = null;
             List<LayerFolder> foldersAtIndex = new ();
             Stack<LayerFolder> unfinishedFolders = new ();
+
             for (int i = 0; i < layers.Count; i++)
             {
                 if (currentFolder != null && layers[i].LayerGuid == currentFolder.StructureData.EndLayerGuid)
@@ -67,7 +68,10 @@ namespace PixiEditor.Models.Layers
                         foldersAtIndex[j] = parsedFolders.First(x => x.StructureData.StartLayerGuid == layers[i].LayerGuid);
                         foldersAtIndex[j].DisplayIndex = RootDirectoryItems.Count;
                         foldersAtIndex[j].TopIndex = CalculateTopIndex(folder.DisplayIndex, folder.StructureData, layers);
-                        currentFolder = foldersAtIndex[j];
+                        if (foldersAtIndex[j].StructureData.EndLayerGuid != layers[i].LayerGuid)
+                        {
+                            currentFolder = foldersAtIndex[j];
+                        }
                     }
                 }
 
@@ -128,7 +132,7 @@ namespace PixiEditor.Models.Layers
 
             structureItemLayers.Reverse();
 
-            LayerFolder folder = new(structureItemLayers, subFolders, structureItem.Name,
+            LayerFolder folder = new (structureItemLayers, subFolders, structureItem.Name,
                 structureItem.FolderGuid, displayIndex, displayIndex + structureItemLayers.Count - 1, structureItem)
             {
                 IsExpanded = structureItem.IsExpanded

+ 0 - 14
PixiEditor/ViewModels/SubViewModels/Main/FileViewModel.cs

@@ -109,20 +109,6 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             }
 
             Owner.ResetProgramStateValues();
-
-            Owner.BitmapManager.ActiveDocument.AddNewLayer("Test");
-            Owner.BitmapManager.ActiveDocument.AddNewLayer("Test1");
-            Owner.BitmapManager.ActiveDocument.AddNewLayer("Test1 sub1");
-            Owner.BitmapManager.ActiveDocument.AddNewLayer("Test1 sub2");
-            Owner.BitmapManager.ActiveDocument.LayerStructure.Folders.Add(
-                new GuidStructureItem("Folder 1",
-                Owner.BitmapManager.ActiveDocument.Layers[1].LayerGuid,
-                Owner.BitmapManager.ActiveDocument.Layers[4].LayerGuid, Array.Empty<GuidStructureItem>(), null));
-
-            Owner.BitmapManager.ActiveDocument.LayerStructure.Folders[0].Subfolders.Add(
-                new GuidStructureItem("Subfolder 1", Owner.BitmapManager.ActiveDocument.Layers[3].LayerGuid,
-                Owner.BitmapManager.ActiveDocument.Layers[4].LayerGuid, Array.Empty<GuidStructureItem>(),
-                Owner.BitmapManager.ActiveDocument.LayerStructure.Folders[0]));
         }
 
         /// <summary>

+ 10 - 4
PixiEditor/ViewModels/SubViewModels/Main/LayersViewModel.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Linq;
+using System.Security.RightsManagement;
 using System.Windows.Input;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Controllers;
@@ -13,7 +14,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public RelayCommand NewLayerCommand { get; set; }
 
-        public RelayCommand NewFolderCommand { get; set; }
+        public RelayCommand NewGroupCommand { get; set; }
 
         public RelayCommand DeleteLayersCommand { get; set; }
 
@@ -34,7 +35,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
         {
             SetActiveLayerCommand = new RelayCommand(SetActiveLayer);
             NewLayerCommand = new RelayCommand(NewLayer, CanCreateNewLayer);
-            NewFolderCommand = new RelayCommand(NewFolder, CanCreateNewLayer);
+            NewGroupCommand = new RelayCommand(NewGroup, CanCreateNewLayer);
             DeleteLayersCommand = new RelayCommand(DeleteLayer, CanDeleteLayer);
             MoveToBackCommand = new RelayCommand(MoveLayerToBack, CanMoveToBack);
             MoveToFrontCommand = new RelayCommand(MoveLayerToFront, CanMoveToFront);
@@ -45,9 +46,14 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             Owner.BitmapManager.DocumentChanged += BitmapManager_DocumentChanged;
         }
 
-        public void NewFolder(object parameter)
+        public void NewGroup(object parameter)
         {
-            Owner.BitmapManager.ActiveDocument?.LayerStructure.Folders.Add(new GuidStructureItem("New Folder"));
+            Owner.BitmapManager.ActiveDocument?.LayerStructure.AddNewGroup("New Folder", Owner.BitmapManager.ActiveLayer.LayerGuid);
+        }
+
+        public bool CanAddNewGroup(object property)
+        {
+            return CanCreateNewLayer(property) && Owner.BitmapManager.ActiveLayer != null;
         }
 
         public bool CanMergeSelected(object obj)

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

@@ -25,7 +25,7 @@
         <Button Grid.Row="0" Command="{Binding LayerCommandsViewModel.NewLayerCommand, ElementName=layersManager}" Height="30" Content="New Layer"
                                             HorizontalAlignment="Stretch" Margin="5"
                                             Style="{StaticResource DarkRoundButton}" />
-        <Button Grid.Row="0" Command="{Binding LayerCommandsViewModel.NewFolderCommand, ElementName=layersManager}" Height="30" Content="New Folder"
+        <Button Grid.Row="0" Command="{Binding LayerCommandsViewModel.NewGroupCommand, ElementName=layersManager}" Height="30" Content="New Folder"
                                             HorizontalAlignment="Stretch" Margin="5"
                                             Style="{StaticResource DarkRoundButton}" />
         </StackPanel>