|
@@ -20,6 +20,7 @@ namespace PixiEditor.Views.Layers;
|
|
#nullable enable
|
|
#nullable enable
|
|
internal partial class LayersManager : UserControl
|
|
internal partial class LayersManager : UserControl
|
|
{
|
|
{
|
|
|
|
+ public const string LayersDataName = "PixiEditor.LayersData";
|
|
public DocumentViewModel ActiveDocument => DataContext is LayersDockViewModel vm ? vm.ActiveDocument : null;
|
|
public DocumentViewModel ActiveDocument => DataContext is LayersDockViewModel vm ? vm.ActiveDocument : null;
|
|
private readonly IBrush? highlightColor;
|
|
private readonly IBrush? highlightColor;
|
|
|
|
|
|
@@ -31,7 +32,7 @@ internal partial class LayersManager : UserControl
|
|
{
|
|
{
|
|
highlightColor = value as IBrush;
|
|
highlightColor = value as IBrush;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
dropBorder.AddHandler(DragDrop.DragEnterEvent, Grid_DragEnter);
|
|
dropBorder.AddHandler(DragDrop.DragEnterEvent, Grid_DragEnter);
|
|
dropBorder.AddHandler(DragDrop.DragLeaveEvent, Grid_DragLeave);
|
|
dropBorder.AddHandler(DragDrop.DragLeaveEvent, Grid_DragLeave);
|
|
dropBorder.AddHandler(DragDrop.DropEvent, Grid_Drop);
|
|
dropBorder.AddHandler(DragDrop.DropEvent, Grid_Drop);
|
|
@@ -67,7 +68,8 @@ internal partial class LayersManager : UserControl
|
|
if (e.Source is LayerControl container && isLeftPressed && Equals(e.Pointer.Captured, container))
|
|
if (e.Source is LayerControl container && isLeftPressed && Equals(e.Pointer.Captured, container))
|
|
{
|
|
{
|
|
DataObject data = new();
|
|
DataObject data = new();
|
|
- data.Set(LayerControl.LayerControlDataName, container);
|
|
|
|
|
|
+ Guid[] selectedGuids = container.Layer.Document.GetSelectedMembersInOrder().ToArray();
|
|
|
|
+ data.Set(LayersDataName, selectedGuids);
|
|
Dispatcher.UIThread.InvokeAsync(() => DragDrop.DoDragDrop(e, data, DragDropEffects.Move));
|
|
Dispatcher.UIThread.InvokeAsync(() => DragDrop.DoDragDrop(e, data, DragDropEffects.Move));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -77,6 +79,16 @@ internal partial class LayersManager : UserControl
|
|
if (sender is not LayerControl)
|
|
if (sender is not LayerControl)
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
+ if (e is { Source: LayerControl layerControl, InitialPressMouseButton: MouseButton.Left } &&
|
|
|
|
+ !e.KeyModifiers.HasFlag(KeyModifiers.Control) && !e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
|
|
|
+ {
|
|
|
|
+ if (layerControl.Layer is not null)
|
|
|
|
+ {
|
|
|
|
+ layerControl.Layer.Document.Operations.SetSelectedMember(layerControl.Layer.Id);
|
|
|
|
+ layerControl.Layer.Document.Operations.ClearSoftSelectedMembers();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
e.Pointer.Capture(null);
|
|
e.Pointer.Capture(null);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -108,7 +120,8 @@ internal partial class LayersManager : UserControl
|
|
isLeftPressed && Equals(e.Pointer.Captured, container))
|
|
isLeftPressed && Equals(e.Pointer.Captured, container))
|
|
{
|
|
{
|
|
DataObject data = new();
|
|
DataObject data = new();
|
|
- data.Set(FolderControl.FolderControlDataName, container);
|
|
|
|
|
|
+ Guid[] selectedGuids = container.Folder.Document.GetSelectedMembersInOrder().ToArray();
|
|
|
|
+ data.Set(LayersDataName, selectedGuids);
|
|
Dispatcher.UIThread.InvokeAsync(() => DragDrop.DoDragDrop(e, data, DragDropEffects.Move));
|
|
Dispatcher.UIThread.InvokeAsync(() => DragDrop.DoDragDrop(e, data, DragDropEffects.Move));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -118,6 +131,16 @@ internal partial class LayersManager : UserControl
|
|
if (sender is not FolderControl folderControl)
|
|
if (sender is not FolderControl folderControl)
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
+ if (e is { Source: FolderControl layerControl, InitialPressMouseButton: MouseButton.Left } &&
|
|
|
|
+ !e.KeyModifiers.HasFlag(KeyModifiers.Control) && !e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
|
|
|
+ {
|
|
|
|
+ if (layerControl.Folder is not null)
|
|
|
|
+ {
|
|
|
|
+ layerControl.Folder.Document.Operations.SetSelectedMember(layerControl.Folder.Id);
|
|
|
|
+ layerControl.Folder.Document.Operations.ClearSoftSelectedMembers();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
e.Pointer.Capture(null);
|
|
e.Pointer.Capture(null);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -141,12 +164,19 @@ internal partial class LayersManager : UserControl
|
|
}
|
|
}
|
|
|
|
|
|
dropBorder.BorderBrush = Brushes.Transparent;
|
|
dropBorder.BorderBrush = Brushes.Transparent;
|
|
- Guid? droppedGuid = LayerControl.ExtractMemberGuid(e.Data);
|
|
|
|
-
|
|
|
|
- if (droppedGuid is not null && ActiveDocument is not null)
|
|
|
|
|
|
+ Guid[]? droppedGuids = LayerControl.ExtractMemberGuids(e.Data);
|
|
|
|
+ if (droppedGuids != null)
|
|
{
|
|
{
|
|
- ActiveDocument.Operations.MoveStructureMember((Guid)droppedGuid,
|
|
|
|
- ActiveDocument.NodeGraph.StructureTree.Members[^1].Id, StructureMemberPlacement.Below);
|
|
|
|
|
|
+ using var block = ActiveDocument.Operations.StartChangeBlock();
|
|
|
|
+ Guid lastMovedMember = ActiveDocument.NodeGraph.StructureTree.Members[^1].Id;
|
|
|
|
+
|
|
|
|
+ foreach (Guid memberGuid in droppedGuids)
|
|
|
|
+ {
|
|
|
|
+ ActiveDocument.Operations.MoveStructureMember(memberGuid, lastMovedMember,
|
|
|
|
+ StructureMemberPlacement.Below);
|
|
|
|
+ lastMovedMember = memberGuid;
|
|
|
|
+ }
|
|
|
|
+
|
|
e.Handled = true;
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -163,7 +193,7 @@ internal partial class LayersManager : UserControl
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- var member = LayerControl.ExtractMemberGuid(e.Data);
|
|
|
|
|
|
+ var member = LayerControl.ExtractMemberGuids(e.Data);
|
|
|
|
|
|
if (member == null)
|
|
if (member == null)
|
|
{
|
|
{
|
|
@@ -221,7 +251,7 @@ internal partial class LayersManager : UserControl
|
|
member.Document.Operations.AddSoftSelectedMember(member.Id);
|
|
member.Document.Operations.AddSoftSelectedMember(member.Id);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
- else
|
|
|
|
|
|
+ else if (!ActiveDocument.SelectedMembers.Contains(memberVM.Id))
|
|
{
|
|
{
|
|
ActiveDocument.Operations.SetSelectedMember(memberVM.Id);
|
|
ActiveDocument.Operations.SetSelectedMember(memberVM.Id);
|
|
ActiveDocument.Operations.ClearSoftSelectedMembers();
|
|
ActiveDocument.Operations.ClearSoftSelectedMembers();
|
|
@@ -233,7 +263,7 @@ internal partial class LayersManager : UserControl
|
|
{
|
|
{
|
|
if (matches == 2)
|
|
if (matches == 2)
|
|
return 2;
|
|
return 2;
|
|
-
|
|
|
|
|
|
+
|
|
var reversed = root.Reverse();
|
|
var reversed = root.Reverse();
|
|
foreach (var child in reversed)
|
|
foreach (var child in reversed)
|
|
{
|
|
{
|