From d813078e91062f031520ec55d8745a81b4519171 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 14 Apr 2023 12:55:40 -0500 Subject: [PATCH 1/2] Made it so the visuals of dragging an actor will only show between the nodes and on the node. --- Source/Editor/GUI/Tree/Tree.cs | 5 +++++ Source/Editor/GUI/Tree/TreeNode.cs | 7 ++++--- Source/Editor/SceneGraph/GUI/ActorTreeNode.cs | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Source/Editor/GUI/Tree/Tree.cs b/Source/Editor/GUI/Tree/Tree.cs index ff99f6506..3a9780ed9 100644 --- a/Source/Editor/GUI/Tree/Tree.cs +++ b/Source/Editor/GUI/Tree/Tree.cs @@ -40,6 +40,11 @@ namespace FlaxEditor.GUI.Tree private Margin _margin; private bool _autoSize = true; + /// + /// The TreeNode that is being dragged over. This could have a value when not dragging. + /// + public TreeNode DraggedOverNode = null; + /// /// Action fired when tree nodes selection gets changed. /// diff --git a/Source/Editor/GUI/Tree/TreeNode.cs b/Source/Editor/GUI/Tree/TreeNode.cs index f2c8e2d6a..cd4fc9647 100644 --- a/Source/Editor/GUI/Tree/TreeNode.cs +++ b/Source/Editor/GUI/Tree/TreeNode.cs @@ -659,7 +659,7 @@ namespace FlaxEditor.GUI.Tree Render2D.DrawText(TextFont.GetFont(), _text, textRect, _cachedTextColor, TextAlignment.Near, TextAlignment.Center); // Draw drag and drop effect - if (IsDragOver) + if (IsDragOver && _tree.DraggedOverNode == this) { Color dragOverColor = style.BackgroundSelected * 0.6f; Rectangle rect; @@ -669,10 +669,10 @@ namespace FlaxEditor.GUI.Tree rect = textRect; break; case DragItemPositioning.Above: - rect = new Rectangle(textRect.X, textRect.Y - DefaultDragInsertPositionMargin - DefaultNodeOffsetY, textRect.Width, DefaultDragInsertPositionMargin * 2.0f); + rect = new Rectangle(textRect.X, textRect.Top - DefaultDragInsertPositionMargin - DefaultNodeOffsetY - _margin.Top, textRect.Width, DefaultDragInsertPositionMargin * 2.0f); break; case DragItemPositioning.Below: - rect = new Rectangle(textRect.X, textRect.Bottom - DefaultDragInsertPositionMargin, textRect.Width, DefaultDragInsertPositionMargin * 2.0f); + rect = new Rectangle(textRect.X, textRect.Bottom + _margin.Bottom - DefaultDragInsertPositionMargin, textRect.Width, DefaultDragInsertPositionMargin * 2.0f); break; default: rect = Rectangle.Empty; @@ -922,6 +922,7 @@ namespace FlaxEditor.GUI.Tree if (result == DragDropEffect.None) { UpdateDrawPositioning(ref location); + _tree.DraggedOverNode = this; // Check if mouse is over header _isDragOverHeader = TestHeaderHit(ref location); diff --git a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs index 6b6ea2f20..af81cdb98 100644 --- a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs +++ b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs @@ -706,6 +706,8 @@ namespace FlaxEditor.SceneGraph.GUI { DragData data; var tree = ParentTree; + if (tree.Selection.Count == 1) + Select(); // Check if this node is selected if (tree.Selection.Contains(this)) From 62a335fab0126aef8906551ee7c2551caacce4dd Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 14 Apr 2023 13:34:43 -0500 Subject: [PATCH 2/2] Fix bug of re-parenting actors if children and parent actors are selected --- Source/Editor/SceneGraph/GUI/ActorTreeNode.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs index af81cdb98..db05749b9 100644 --- a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs +++ b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs @@ -717,6 +717,11 @@ namespace FlaxEditor.SceneGraph.GUI for (var i = 0; i < tree.Selection.Count; i++) { var e = tree.Selection[i]; + + // Skip if parent is already selected to keep correct parenting + if (tree.Selection.Contains(e.Parent)) + continue; + if (e is ActorTreeNode node && node.ActorNode.CanDrag) actors.Add(node.ActorNode); }