Quellcode durchsuchen

Now deleting selected layers removes them all

flabbet vor 4 Jahren
Ursprung
Commit
87b836d871

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

@@ -4,6 +4,7 @@ using System.Collections.ObjectModel;
 using System.Linq;
 using System.Windows;
 using System.Windows.Media.Imaging;
+using GalaSoft.MvvmLight.Messaging;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Layers;
@@ -166,6 +167,32 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
+        public void RemoveLayer(Layer layer)
+        {
+            RemoveLayer(Layers.IndexOf(layer));
+        }
+
+        public void RemoveActiveLayers()
+        {
+            if (Layers.Count == 0 || !Layers.Any(x => x.IsActive))
+            {
+                return;
+            }
+
+            Layer[] layers = Layers.Where(x => x.IsActive).ToArray();
+            int firstIndex = Layers.IndexOf(layers[0]);
+
+            object[] guidArgs = new object[] { layers.Select(x => x.LayerGuid).ToArray() };
+
+            StorageBasedChange change = new StorageBasedChange(this, layers);
+
+            RemoveLayersProcess(guidArgs);
+
+            InjectRemoveActiveLayersUndo(guidArgs, change);
+
+            SetNextLayerAsActive(firstIndex);
+        }
+
         public Layer MergeLayers(Layer[] layersToMerge, bool nameOfLast, int index)
         {
             if (layersToMerge == null || layersToMerge.Length < 2)
@@ -196,7 +223,7 @@ namespace PixiEditor.Models.DataHolders
             }
 
             Layers.Remove(layersToMerge[^1]);
-            // Insert new layer and remove old
+
             Layers.Insert(index, mergedLayer);
 
             SetActiveLayer(Layers.IndexOf(mergedLayer));
@@ -229,6 +256,35 @@ namespace PixiEditor.Models.DataHolders
             return layer;
         }
 
+        private void InjectRemoveActiveLayersUndo(object[] guidArgs, StorageBasedChange change)
+        {
+            Action<Layer[], UndoLayer[]> undoAction = RestoreLayersProcess;
+            Action<object[]> redoAction = RemoveLayersProcess;
+
+            if (Layers.Count == 0)
+            {
+                Layer layer = new Layer("Base Layer");
+                Layers.Add(layer);
+                undoAction = (Layer[] layers, UndoLayer[] undoData) =>
+                {
+                    Layers.RemoveAt(0);
+                    RestoreLayersProcess(layers, undoData);
+                };
+                redoAction = (object[] args) =>
+                {
+                    RemoveLayersProcess(args);
+                    Layers.Add(layer);
+                };
+            }
+
+            UndoManager.AddUndoChange(
+            change.ToChange(
+                undoAction,
+                redoAction,
+                guidArgs,
+                "Remove layers"));
+        }
+
         private void MergeLayersProcess(object[] args)
         {
             if (args.Length > 0
@@ -320,5 +376,18 @@ namespace PixiEditor.Models.DataHolders
                 }
             }
         }
+
+        private void RemoveLayersProcess(object[] parameters)
+        {
+            if (parameters != null && parameters.Length > 0 && parameters[0] is IEnumerable<Guid> layerGuids)
+            {
+                object[] args = new object[1];
+                foreach (var guid in layerGuids)
+                {
+                    args[0] = guid;
+                    RemoveLayerProcess(args);
+                }
+            }
+        }
     }
 }

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

@@ -12,7 +12,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public RelayCommand NewLayerCommand { get; set; }
 
-        public RelayCommand DeleteLayerCommand { get; set; }
+        public RelayCommand DeleteLayersCommand { get; set; }
 
         public RelayCommand RenameLayerCommand { get; set; }
 
@@ -31,7 +31,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
         {
             SetActiveLayerCommand = new RelayCommand(SetActiveLayer);
             NewLayerCommand = new RelayCommand(NewLayer, CanCreateNewLayer);
-            DeleteLayerCommand = new RelayCommand(DeleteLayer, CanDeleteLayer);
+            DeleteLayersCommand = new RelayCommand(DeleteLayer, CanDeleteLayer);
             MoveToBackCommand = new RelayCommand(MoveLayerToBack, CanMoveToBack);
             MoveToFrontCommand = new RelayCommand(MoveLayerToFront, CanMoveToFront);
             RenameLayerCommand = new RelayCommand(RenameLayer);
@@ -52,7 +52,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public bool CanCreateNewLayer(object parameter)
         {
-            return Owner.BitmapManager.ActiveDocument != null && Owner.BitmapManager.ActiveDocument.Layers.Count > 0;
+            return Owner.BitmapManager.ActiveDocument != null;
         }
 
         public void SetActiveLayer(object parameter)
@@ -74,7 +74,15 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public void DeleteLayer(object parameter)
         {
-            Owner.BitmapManager.ActiveDocument.RemoveLayer((int)parameter);
+            int index = (int)parameter;
+            if (!Owner.BitmapManager.ActiveDocument.Layers[index].IsActive)
+            {
+                Owner.BitmapManager.ActiveDocument.RemoveLayer(index);
+            }
+            else
+            {
+                Owner.BitmapManager.ActiveDocument.RemoveActiveLayers();
+            }
         }
 
         public bool CanDeleteLayer(object property)

+ 1 - 1
PixiEditor/Views/MainWindow.xaml

@@ -331,7 +331,7 @@
                                                                 <vws:LayerItem.ContextMenu>
                                                                     <ContextMenu>
                                                                         <MenuItem Header="Delete"
-                                                                                  Command="{Binding LayersSubViewModel.DeleteLayerCommand, Source={StaticResource ViewModelMain}}"
+                                                                                  Command="{Binding LayersSubViewModel.DeleteLayersCommand, Source={StaticResource ViewModelMain}}"
                                                                                   CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},
                                 Path=(ItemsControl.AlternationIndex)}" />
                                                                         <MenuItem Header="Rename"