From 86e80c6b80937d23268f396b98134b7375487929 Mon Sep 17 00:00:00 2001 From: AeioMuch <75151379+AeioMuch@users.noreply.github.com> Date: Fri, 20 Feb 2026 16:08:30 +0100 Subject: [PATCH] Fix select the edited node when dropping --- editor/docks/scene_tree_dock.cpp | 56 +++++++++++++------------------- editor/docks/scene_tree_dock.h | 3 +- 2 files changed, 23 insertions(+), 36 deletions(-) diff --git a/editor/docks/scene_tree_dock.cpp b/editor/docks/scene_tree_dock.cpp index 37743a5298..54c53a3c06 100644 --- a/editor/docks/scene_tree_dock.cpp +++ b/editor/docks/scene_tree_dock.cpp @@ -72,6 +72,7 @@ void SceneTreeDock::_nodes_drag_begin() { pending_click_select = nullptr; + edited_object_at_drag_start = InspectorDock::get_inspector_singleton()->get_edited_object(); } void SceneTreeDock::_quick_open(const String &p_file_path) { @@ -96,7 +97,6 @@ void SceneTreeDock::_inspect_hovered_node() { return; } - select_node_hovered_at_end_of_drag = true; TreeItem *item = tree->get_item_with_metadata(node_hovered_now->get_path()); _restore_treeitem_custom_color(tree_item_inspected); @@ -1819,30 +1819,31 @@ void SceneTreeDock::_notification(int p_what) { if (tree_item_inspected) { _restore_treeitem_custom_color(tree_item_inspected); tree_item_inspected = nullptr; - } else { - return; } - if (!hovered_but_reparenting) { - InspectorDock *inspector_dock = InspectorDock::get_singleton(); - if (!inspector_dock->get_rect().has_point(inspector_dock->get_local_mouse_position())) { - List full_selection = editor_selection->get_full_selected_node_list(); - editor_selection->clear(); - for (Node *E : full_selection) { - editor_selection->add_node(E); - } + + InspectorDock *inspector_dock = InspectorDock::get_singleton(); + if (!inspector_dock->get_rect().has_point(inspector_dock->get_local_mouse_position())) { + Node *node_edited = Object::cast_to(InspectorDock::get_inspector_singleton()->get_edited_object()); + if (editor_selection->get_full_selected_node_list().size() == 1 && !editor_selection->is_selected(node_edited)) { + Node *node_selected = scene_tree->get_selected(); + EditorNode::get_singleton()->push_node_item(node_selected); return; } - if (select_node_hovered_at_end_of_drag) { - Node *node_inspected = Object::cast_to(InspectorDock::get_inspector_singleton()->get_edited_object()); - if (node_inspected) { - editor_selection->clear(); - editor_selection->add_node(node_inspected); - scene_tree->set_selected(node_inspected); - select_node_hovered_at_end_of_drag = false; - } + if (edited_object_at_drag_start) { + EditorSelectionHistory *editor_history = EditorNode::get_singleton()->get_editor_selection_history(); + editor_history->add_object(edited_object_at_drag_start->get_instance_id()); + InspectorDock::get_inspector_singleton()->edit(edited_object_at_drag_start); + InspectorDock::get_singleton()->update(edited_object_at_drag_start); } + return; + } + + Node *node_edited = Object::cast_to(InspectorDock::get_inspector_singleton()->get_edited_object()); + if (node_edited) { + editor_selection->clear(); + editor_selection->add_node(node_edited); + scene_tree->set_selected(node_edited); } - hovered_but_reparenting = false; } break; } } @@ -2456,9 +2457,6 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V return; // Position and parent didn't change. } - // Prevent selecting the hovered node and keep the reparented node(s) selected instead. - hovered_but_reparenting = true; - Node *validate = p_new_parent; while (validate) { ERR_FAIL_COND_MSG(p_nodes.has(validate), "Selection changed at some point. Can't reparent."); @@ -2475,7 +2473,6 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V Vector former_names; int inc = 0; - bool need_edit = false; for (int ni = 0; ni < p_nodes.size(); ni++) { // No undo implemented for this yet. @@ -2496,11 +2493,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V inc--; // If the child will generate a gap when moved, adjust. } - if (same_parent) { - // When node is reparented to the same parent, EditorSelection does not change. - // After hovering another node, the inspector has to be manually updated in this case. - need_edit = select_node_hovered_at_end_of_drag; - } else { + if (!same_parent) { undo_redo->add_do_method(node->get_parent(), "remove_child", node); undo_redo->add_do_method(p_new_parent, "add_child", node, true); } @@ -2616,11 +2609,6 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V undo_redo->add_undo_method(editor_selection, "add_node", E); } - if (need_edit) { - EditorNode::get_singleton()->edit_current(); - editor_selection->clear(); - } - undo_redo->commit_action(); } diff --git a/editor/docks/scene_tree_dock.h b/editor/docks/scene_tree_dock.h index e5ad32ae92..b765e29c1d 100644 --- a/editor/docks/scene_tree_dock.h +++ b/editor/docks/scene_tree_dock.h @@ -242,8 +242,7 @@ class SceneTreeDock : public EditorDock { TreeItem *tree_item_inspected = nullptr; Node *node_hovered_now = nullptr; Node *node_hovered_previously = nullptr; - bool select_node_hovered_at_end_of_drag = false; - bool hovered_but_reparenting = false; + Object *edited_object_at_drag_start = nullptr; virtual void input(const Ref &p_event) override; virtual void shortcut_input(const Ref &p_event) override;