Ver código fonte

Fixed merge layers and shift selection

flabbet 4 anos atrás
pai
commit
48e39c9e14

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

@@ -115,6 +115,37 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
+        public void ToggleLayer(int index)
+        {
+            Layer layer = Layers[index];
+            layer.IsActive = !layer.IsActive;
+        }
+
+        public void SelectLayersRange(int index)
+        {
+            DeselectAllExcept(ActiveLayer);
+            int firstIndex = Layers.IndexOf(ActiveLayer);
+
+            int startIndex = Math.Min(index, firstIndex);
+            for (int i = startIndex; i <= startIndex + Math.Abs(index - firstIndex); i++)
+            {
+                Layers[i].IsActive = true;
+            }
+        }
+
+        public void DeselectAllExcept(Layer exceptLayer)
+        {
+            foreach (var layer in Layers)
+            {
+                if (layer == exceptLayer)
+                {
+                    continue;
+                }
+
+                layer.IsActive = false;
+            }
+        }
+
         public void RemoveLayer(int layerIndex)
         {
             if (Layers.Count == 0)
@@ -154,21 +185,21 @@ namespace PixiEditor.Models.DataHolders
                 name = layersToMerge[0].Name;
             }
 
-            Layer mergedLayer = null;
+            Layer mergedLayer = layersToMerge[0];
 
             for (int i = 0; i < layersToMerge.Length - 1; i++)
             {
-                Layer firstLayer = layersToMerge[i];
+                Layer firstLayer = mergedLayer;
                 Layer secondLayer = layersToMerge[i + 1];
                 mergedLayer = firstLayer.MergeWith(secondLayer, name, Width, Height);
+                Layers.Remove(layersToMerge[i]);
+            }
 
-                // Insert new layer and remove old
-                Layers.Insert(index, mergedLayer);
-                Layers.Remove(firstLayer);
-                Layers.Remove(secondLayer);
+            Layers.Remove(layersToMerge[^1]);
+            // Insert new layer and remove old
+            Layers.Insert(index, mergedLayer);
 
-                SetActiveLayer(Layers.IndexOf(mergedLayer));
-            }
+            SetActiveLayer(Layers.IndexOf(mergedLayer));
 
             return mergedLayer;
         }

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

@@ -60,20 +60,11 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             int index = (int)parameter;
             if (Keyboard.IsKeyDown(Key.LeftCtrl))
             {
-                Layer layer = Owner.BitmapManager.ActiveDocument.Layers[index];
-                layer.IsActive = !layer.IsActive;
+                Owner.BitmapManager.ActiveDocument.ToggleLayer(index);
             }
-            else if (Keyboard.IsKeyDown(Key.LeftShift) 
-                && Owner.BitmapManager.ActiveDocument.Layers.Any(x => x.IsActive))
-                {
-                int firstIndex = Owner.BitmapManager.ActiveDocument.Layers.IndexOf(
-                    Owner.BitmapManager.ActiveDocument.Layers.First(x => x.IsActive));
-
-                int increment = index < firstIndex ? -1 : 1;
-                for (int i = firstIndex; i <= Math.Abs(firstIndex - index); i += increment)
-                {
-                    Owner.BitmapManager.ActiveDocument.Layers[i].IsActive = true //TODO finish shift select
-                }
+            else if (Keyboard.IsKeyDown(Key.LeftShift) && Owner.BitmapManager.ActiveDocument.Layers.Any(x => x.IsActive))
+            {
+                Owner.BitmapManager.ActiveDocument.SelectLayersRange(index);
             }
             else
             {

+ 1 - 0
PixiEditor/Views/MainWindow.xaml

@@ -346,6 +346,7 @@
                                                                                   Command="{Binding LayersSubViewModel.MoveToBackCommand, Source={StaticResource ViewModelMain}}"
                                                                                   CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},
                                 Path=(ItemsControl.AlternationIndex)}" />
+                                                                        <Separator/>
                                                                         <MenuItem Header="Merge selected"
                                                                                   Command="{Binding LayersSubViewModel.MergeSelectedCommand, Source={StaticResource ViewModelMain}}"/>
                                                                         <MenuItem Header="Merge with above"