diff options
Diffstat (limited to 'editor/scene_tree_dock.cpp')
-rw-r--r-- | editor/scene_tree_dock.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 94bd3e16d3..d0f1fbfae7 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -149,7 +149,8 @@ void SceneTreeDock::input(const Ref<InputEvent> &p_event) { void SceneTreeDock::shortcut_input(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); - if (get_viewport()->gui_get_focus_owner() && get_viewport()->gui_get_focus_owner()->is_text_field()) { + Control *focus_owner = get_viewport()->gui_get_focus_owner(); + if (focus_owner && focus_owner->is_text_field()) { return; } @@ -158,7 +159,11 @@ void SceneTreeDock::shortcut_input(const Ref<InputEvent> &p_event) { } if (ED_IS_SHORTCUT("scene_tree/rename", p_event)) { - _tool_selected(TOOL_RENAME); + // Prevent renaming if a button is focused + // to avoid conflict with Enter shortcut on macOS + if (!focus_owner || !Object::cast_to<BaseButton>(focus_owner)) { + _tool_selected(TOOL_RENAME); + } #ifdef MODULE_REGEX_ENABLED } else if (ED_IS_SHORTCUT("scene_tree/batch_rename", p_event)) { _tool_selected(TOOL_BATCH_RENAME); @@ -985,6 +990,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { undo_redo->add_do_method(root, "set_scene_file_path", String()); undo_redo->add_do_method(node, "set_owner", (Object *)nullptr); undo_redo->add_do_method(root, "set_owner", node); + undo_redo->add_do_method(node, "set_unique_name_in_owner", false); _node_replace_owner(root, root, node, MODE_DO); undo_redo->add_undo_method(root, "set_scene_file_path", root->get_scene_file_path()); @@ -995,6 +1001,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { undo_redo->add_undo_method(node->get_parent(), "move_child", node, node->get_index(false)); undo_redo->add_undo_method(root, "set_owner", (Object *)nullptr); undo_redo->add_undo_method(node, "set_owner", root); + undo_redo->add_undo_method(node, "set_unique_name_in_owner", node->is_unique_name_in_owner()); _node_replace_owner(root, root, root, MODE_UNDO); undo_redo->add_do_method(scene_tree, "update_tree"); @@ -2276,6 +2283,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V Vector<StringName> former_names; int inc = 0; + bool need_edit = false; for (int ni = 0; ni < p_nodes.size(); ni++) { // No undo implemented for this yet. @@ -2296,7 +2304,11 @@ 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) { + 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 { undo_redo->add_do_method(node->get_parent(), "remove_child", node); undo_redo->add_do_method(new_parent, "add_child", node, true); } @@ -2401,6 +2413,10 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V perform_node_renames(nullptr, &path_renames); undo_redo->commit_action(); + + if (need_edit) { + EditorNode::get_singleton()->edit_current(); + } } void SceneTreeDock::_script_created(Ref<Script> p_script) { |