Jelajahi Sumber

Added folderIndex, drag n drop WIP

flabbet 4 tahun lalu
induk
melakukan
301dabecb2

+ 0 - 2
PixiEditor/Helpers/Converters/LayersToStructuredLayersConverter.cs

@@ -1,8 +1,6 @@
 using System;
 using System.Collections.Generic;
-using System.Collections.ObjectModel;
 using System.Globalization;
-using System.Linq;
 using System.Windows.Data;
 using PixiEditor.Models.Layers;
 

+ 20 - 0
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -117,6 +117,26 @@ namespace PixiEditor.Models.DataHolders
                 "Move layer"));
         }
 
+        public void MoveFolderInStructure(Guid folder, Guid referenceLayer, bool above = false)
+        {
+            var args = new object[] { layerGuid, referenceLayer, above };
+
+            Layer layer = Layers.First(x => x.LayerGuid == layerGuid);
+
+            int oldIndex = Layers.IndexOf(layer);
+
+            Guid? oldLayerFolder = LayerStructure.GetFolderByLayer(layerGuid)?.FolderGuid;
+
+            MoveLayerInStructureProcess(args);
+
+            UndoManager.AddUndoChange(new Change(
+                ReverseMoveLayerInStructureProcess,
+                new object[] { oldIndex, layerGuid, oldLayerFolder },
+                MoveLayerInStructureProcess,
+                args,
+                "Move layer"));
+        }
+
         public void AddNewLayer(string name, WriteableBitmap bitmap, bool setAsActive = true)
         {
             AddNewLayer(name, bitmap.PixelWidth, bitmap.PixelHeight, setAsActive);

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

@@ -49,12 +49,13 @@ namespace PixiEditor.Models.Layers
             }
         }
 
-        public GuidStructureItem(string name, IEnumerable<Guid> children, IEnumerable<GuidStructureItem> subfolders)
+        public GuidStructureItem(string name, IEnumerable<Guid> children, IEnumerable<GuidStructureItem> subfolders, int index)
         {
             Name = name;
             LayerGuids = new ObservableCollection<Guid>(children);
             Subfolders = new ObservableCollection<GuidStructureItem>(subfolders);
             FolderGuid = Guid.NewGuid();
+            FolderDisplayIndex = index;
         }
 
         public GuidStructureItem(string name)
@@ -63,6 +64,7 @@ namespace PixiEditor.Models.Layers
             LayerGuids = new ObservableCollection<Guid>();
             Subfolders = new ObservableCollection<GuidStructureItem>();
             FolderGuid = Guid.NewGuid();
+            FolderDisplayIndex = 0;
         }
     }
 }

+ 17 - 4
PixiEditor/Models/Layers/LayerFolder.cs

@@ -43,24 +43,37 @@ namespace PixiEditor.Models.Layers
             }
         }
 
+        private int displayIndex;
+
+        public int DisplayIndex
+        {
+            get => displayIndex;
+            set
+            {
+                displayIndex = value;
+                RaisePropertyChanged(nameof(DisplayIndex));
+            }
+        }
+
         private void UpdateIsExpandedInDocument(bool value)
         {
             var folder = ViewModelMain.Current.BitmapManager.ActiveDocument.LayerStructure.GetFolderByGuid(FolderGuid);
-            if(folder != null)
+            if (folder != null)
             {
                 folder.IsExpanded = value;
             }
         }
 
-        public LayerFolder(IEnumerable<Layer> layers, IEnumerable<LayerFolder> subfolders, string name)
-            : this(layers, subfolders, name, Guid.NewGuid()) { }
+        public LayerFolder(IEnumerable<Layer> layers, IEnumerable<LayerFolder> subfolders, string name, int index)
+            : this(layers, subfolders, name, Guid.NewGuid(), index) { }
 
-        public LayerFolder(IEnumerable<Layer> layers, IEnumerable<LayerFolder> subfolders, string name, Guid guid)
+        public LayerFolder(IEnumerable<Layer> layers, IEnumerable<LayerFolder> subfolders, string name, Guid guid, int index)
         {
             Layers = new ObservableCollection<Layer>(layers);
             Subfolders = new ObservableCollection<LayerFolder>(subfolders);
             Name = name;
             FolderGuid = guid;
+            DisplayIndex = index;
         }
     }
 }

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

@@ -21,8 +21,13 @@ namespace PixiEditor.Models.Layers
                 return;
             }
 
-            RootDirectoryItems.AddRange(ParseFolders(structure.Folders, layers));
             RootDirectoryItems.AddRange(layers.Where(x => !layersInStructure.Contains(x)));
+
+            foreach (var folder in ParseFolders(structure.Folders, layers))
+            {
+                RootDirectoryItems.Insert(folder.DisplayIndex, folder);
+            }
+
             layersInStructure.Clear();
         }
 
@@ -54,7 +59,8 @@ namespace PixiEditor.Models.Layers
                 subFolders = ParseFolders(structureItem.Subfolders, layers);
             }
 
-            LayerFolder folder = new (structureItemLayers, subFolders, structureItem.Name, structureItem.FolderGuid)
+            LayerFolder folder = new (structureItemLayers, subFolders, structureItem.Name, 
+                structureItem.FolderGuid, structureItem.FolderDisplayIndex)
             {
                 IsExpanded = structureItem.IsExpanded
             };

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

@@ -4,7 +4,7 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:PixiEditor.Views.UserControls" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:behaviors="clr-namespace:PixiEditor.Helpers.Behaviours" xmlns:userControls="clr-namespace:PixiEditor.Views"
-             mc:Ignorable="d" Focusable="True" MouseMove="FolderControl_MouseMove"
+             mc:Ignorable="d" Focusable="True"
              d:DesignHeight="60" d:DesignWidth="250" Name="folderControl">
     <Border BorderThickness="0 0 0 0.5" BorderBrush="Gray" MinWidth="60" Focusable="True" >
         <i:Interaction.Behaviors>

+ 0 - 5
PixiEditor/Views/UserControls/LayerFolder.xaml.cs

@@ -82,10 +82,5 @@ namespace PixiEditor.Views.UserControls
 
             }
         }
-
-        private void FolderControl_MouseMove(object sender, MouseEventArgs e)
-        {
-
-        }
     }
 }

+ 8 - 0
PixiEditor/Views/UserControls/LayerItem.xaml.cs

@@ -167,6 +167,14 @@ namespace PixiEditor.Views
 
                 data.LayerCommandsViewModel.Owner.BitmapManager.ActiveDocument.MoveLayerInStructure(layer, LayerGuid, above);
             }
+
+            if (e.Data.GetDataPresent("PixiEditor.Views.UserControls.LayerFolder"))
+            {
+                var data = (LayerFolder)e.Data.GetData("PixiEditor.Views.UserControls.LayerFolder");
+                Guid layer = data.FolderGuid;
+
+                data.LayersViewModel.Owner.BitmapManager.ActiveDocument.MoveLayerInStructure(layer, LayerGuid, above);
+            }
         }
 
         private void Grid_Drop_Top(object sender, DragEventArgs e)

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

@@ -50,7 +50,7 @@
                 </TreeView.ItemsPanel>
                 <TreeView.Resources>
                     <HierarchicalDataTemplate DataType="{x:Type layers:LayerFolder}" ItemsSource="{Binding Items}">
-                        <local:LayerFolder FolderName="{Binding Name}" LayersViewModel="{Binding LayerCommandsViewModel, ElementName=layersManager}" FolderGuid="{Binding FolderGuid}" />
+                        <local:LayerFolder FolderName="{Binding Name}" LayersViewModel="{Binding LayerCommandsViewModel, ElementName=layersManager}" FolderGuid="{Binding FolderGuid}" MouseMove="LayerFolder_MouseMove"/>
                     </HierarchicalDataTemplate>
                     <DataTemplate DataType="{x:Type layers:Layer}">
                         <local:LayerStructureItemContainer                             

+ 8 - 0
PixiEditor/Views/UserControls/LayersManager.xaml.cs

@@ -66,5 +66,13 @@ namespace PixiEditor.Views.UserControls
                 DragDrop.DoDragDrop(container, container, DragDropEffects.Move);
             }
         }
+
+        private void LayerFolder_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
+        {
+            if (sender is LayerFolder container && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
+            {
+                DragDrop.DoDragDrop(container, container, DragDropEffects.Move);
+            }
+        }
     }
 }