فهرست منبع

Added delete group context option

flabbet 4 سال پیش
والد
کامیت
a21a316136

+ 1 - 2
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -37,8 +37,7 @@ namespace PixiEditor.Models.DataHolders
             get => layerStructure;
             set
             {
-                layerStructure = value;
-                RaisePropertyChanged(nameof(LayerStructure));
+                SetProperty(ref layerStructure, value);
             }
         }
 

+ 47 - 14
PixiEditor/Models/Layers/LayerStructure.cs

@@ -222,6 +222,53 @@ namespace PixiEditor.Models.Layers
             LayerStructureChanged?.Invoke(this, EventArgs.Empty);
         }
 
+        public List<Guid> GetLayersInOrder(FolderData folder)
+        {
+            List<Guid> layerGuids = new();
+            int minIndex = folder.BottomIndex;
+            int maxIndex = folder.TopIndex;
+
+            for (int i = minIndex; i <= maxIndex; i++)
+            {
+                layerGuids.Add(Owner.Layers[i].LayerGuid);
+            }
+
+            return layerGuids;
+        }
+
+        /// <summary>
+        /// Gets all layers inside group, including nested groups.
+        /// </summary>
+        /// <param name="group">Group to get layers from.</param>
+        /// <returns>List of layer guids.</returns>
+        public List<Guid> GetGroupLayerGuids(GuidStructureItem group)
+        {
+            Layer layerTop = Owner.Layers.First(x => x.LayerGuid == group.EndLayerGuid);
+            Layer layerBottom = Owner.Layers.First(x => x.LayerGuid == group.StartLayerGuid);
+
+            int indexTop = Owner.Layers.IndexOf(layerTop);
+            int indexBottom = Owner.Layers.IndexOf(layerBottom);
+
+            return GetLayersInOrder(new FolderData(indexTop, indexBottom));
+        }
+
+        /// <summary>
+        /// Gets all layers inside group, including nested groups.
+        /// </summary>
+        /// <param name="group">Group to get layers from.</param>
+        /// <returns>List of layers.</returns>
+        public List<Layer> GetGroupLayers(GuidStructureItem group)
+        {
+            List<Layer> layers = new();
+            var layerGuids = GetGroupLayerGuids(group);
+            foreach (var layerGuid in layerGuids)
+            {
+                layers.Add(Owner.Layers.First(x => x.LayerGuid == layerGuid));
+            }
+
+            return layers;
+        }
+
         private void Group_GroupsChanged(object sender, EventArgs e)
         {
             LayerStructureChanged?.Invoke(this, EventArgs.Empty);
@@ -312,20 +359,6 @@ namespace PixiEditor.Models.Layers
             }
         }
 
-        private List<Guid> GetLayersInOrder(FolderData folder)
-        {
-            List<Guid> layerGuids = new ();
-            int minIndex = folder.BottomIndex;
-            int maxIndex = folder.TopIndex;
-
-            for (int i = minIndex; i <= maxIndex; i++)
-            {
-                layerGuids.Add(Owner.Layers[i].LayerGuid);
-            }
-
-            return layerGuids;
-        }
-
 #nullable disable
         private GuidStructureItem GetGroupByLayer(Guid layerGuid, IEnumerable<GuidStructureItem> folders)
         {

+ 18 - 0
PixiEditor/ViewModels/SubViewModels/Main/LayersViewModel.cs

@@ -16,6 +16,8 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public RelayCommand NewGroupCommand { get; set; }
 
+        public RelayCommand DeleteGroupCommand { get; set; }
+
         public RelayCommand DeleteLayersCommand { get; set; }
 
         public RelayCommand RenameLayerCommand { get; set; }
@@ -46,9 +48,25 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             MergeWithAboveCommand = new RelayCommand(MergeWithAbove, CanMergeWithAbove);
             MergeWithBelowCommand = new RelayCommand(MergeWithBelow, CanMergeWithBelow);
             RenameGroupCommand = new RelayCommand(RenameGroup);
+            DeleteGroupCommand = new RelayCommand(DeleteGroup);
             Owner.BitmapManager.DocumentChanged += BitmapManager_DocumentChanged;
         }
 
+        public void DeleteGroup(object parameter)
+        {
+            if (parameter is Guid guid)
+            {
+                var group = Owner.BitmapManager.ActiveDocument?.LayerStructure.GetGroupByGuid(guid);
+                var layers = Owner.BitmapManager.ActiveDocument?.LayerStructure.GetGroupLayers(group);
+                foreach (var layer in layers)
+                {
+                    layer.IsActive = true;
+                }
+
+                Owner.BitmapManager.ActiveDocument?.RemoveActiveLayers();
+            }
+        }
+
         public void RenameGroup(object parameter)
         {
             if (parameter is Guid guid)

+ 4 - 0
PixiEditor/Views/UserControls/LayerGroupControl.xaml

@@ -43,6 +43,10 @@
                                      Command="{Binding PlacementTarget.Tag.LayersViewModel.RenameGroupCommand, 
                                             RelativeSource={RelativeSource AncestorType=ContextMenu}}" CommandParameter="{Binding PlacementTarget.Tag.GroupGuid, RelativeSource={RelativeSource AncestorType=ContextMenu}}">
                 </MenuItem>
+                <MenuItem Header="Delete"
+                                     Command="{Binding PlacementTarget.Tag.LayersViewModel.DeleteGroupCommand, 
+                                            RelativeSource={RelativeSource AncestorType=ContextMenu}}" CommandParameter="{Binding PlacementTarget.Tag.GroupGuid, RelativeSource={RelativeSource AncestorType=ContextMenu}}">
+                </MenuItem>
             </ContextMenu>
         </Border.ContextMenu>
     </Border>