diff --git a/Source/Editor/Modules/SceneEditingModule.cs b/Source/Editor/Modules/SceneEditingModule.cs index 970ca8e99..3b982d7ad 100644 --- a/Source/Editor/Modules/SceneEditingModule.cs +++ b/Source/Editor/Modules/SceneEditingModule.cs @@ -534,6 +534,38 @@ namespace FlaxEditor.Modules Delete(); } + /// + /// Create parent for selected actors. + /// + public void CreateParentForSelectedActors() + { + Actor actor = new EmptyActor(); + Editor.SceneEditing.Spawn(actor, null, false); + List selection = Editor.SceneEditing.Selection; + for (int i = 0; i < selection.Count; i++) + { + if (selection[i] is ActorNode node) + { + if (node.ParentNode != node.ParentScene) // if parent node is not Scene + { + if (selection.Contains(node.ParentNode)) + { + return; // if parent and child nodes selected together, don't touch child nodes + } + else + { // put created node as child of the Parent Node of node + int parentOrder = node.Actor.OrderInParent; + actor.Parent = node.Actor.Parent; + actor.OrderInParent = parentOrder; + } + } + node.Actor.Parent = actor; + } + } + Editor.SceneEditing.Select(actor); + Editor.Scene.GetActorNode(actor).TreeNode.StartRenaming(Editor.Windows.SceneWin, Editor.Windows.SceneWin.SceneTreePanel); + } + /// /// Duplicates the selected objects. Supports undo/redo. /// diff --git a/Source/Editor/Modules/UIModule.cs b/Source/Editor/Modules/UIModule.cs index 3386d411c..7920d5de4 100644 --- a/Source/Editor/Modules/UIModule.cs +++ b/Source/Editor/Modules/UIModule.cs @@ -50,6 +50,7 @@ namespace FlaxEditor.Modules private ContextMenuButton _menuEditCut; private ContextMenuButton _menuEditCopy; private ContextMenuButton _menuEditPaste; + private ContextMenuButton _menuCreateParentForSelectedActors; private ContextMenuButton _menuEditDelete; private ContextMenuButton _menuEditDuplicate; private ContextMenuButton _menuEditSelectAll; @@ -549,6 +550,8 @@ namespace FlaxEditor.Modules _menuEditCopy = cm.AddButton("Copy", inputOptions.Copy, Editor.SceneEditing.Copy); _menuEditPaste = cm.AddButton("Paste", inputOptions.Paste, Editor.SceneEditing.Paste); cm.AddSeparator(); + _menuCreateParentForSelectedActors = cm.AddButton("Create parent for selected actors", Editor.SceneEditing.CreateParentForSelectedActors); + cm.AddSeparator(); _menuEditDelete = cm.AddButton("Delete", inputOptions.Delete, Editor.SceneEditing.Delete); _menuEditDuplicate = cm.AddButton("Duplicate", inputOptions.Duplicate, Editor.SceneEditing.Duplicate); cm.AddSeparator(); @@ -858,6 +861,7 @@ namespace FlaxEditor.Modules _menuEditCut.Enabled = hasSthSelected; _menuEditCopy.Enabled = hasSthSelected; _menuEditPaste.Enabled = canEditScene; + _menuCreateParentForSelectedActors.Enabled = canEditScene && hasSthSelected; _menuEditDelete.Enabled = hasSthSelected; _menuEditDuplicate.Enabled = hasSthSelected; _menuEditSelectAll.Enabled = Level.IsAnySceneLoaded; diff --git a/Source/Editor/Windows/SceneTreeWindow.ContextMenu.cs b/Source/Editor/Windows/SceneTreeWindow.ContextMenu.cs index 0c8e0f283..fa4abfeca 100644 --- a/Source/Editor/Windows/SceneTreeWindow.ContextMenu.cs +++ b/Source/Editor/Windows/SceneTreeWindow.ContextMenu.cs @@ -132,6 +132,13 @@ namespace FlaxEditor.Windows b = contextMenu.AddButton("Cut", inputOptions.Cut, Editor.SceneEditing.Cut); b.Enabled = canEditScene; + // Create a new hierarchy from selected actors + + contextMenu.AddSeparator(); + + b = contextMenu.AddButton("Create parent for selected actors", Editor.SceneEditing.CreateParentForSelectedActors); + b.Enabled = canEditScene && hasSthSelected; + // Prefab options contextMenu.AddSeparator(); diff --git a/Source/Editor/Windows/SceneTreeWindow.cs b/Source/Editor/Windows/SceneTreeWindow.cs index 63ba7b960..e4af43dee 100644 --- a/Source/Editor/Windows/SceneTreeWindow.cs +++ b/Source/Editor/Windows/SceneTreeWindow.cs @@ -23,6 +23,8 @@ namespace FlaxEditor.Windows /// public partial class SceneTreeWindow : SceneEditorWindow { + public Panel SceneTreePanel => _sceneTreePanel; + private TextBox _searchBox; private Tree _tree; private Panel _sceneTreePanel;