diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 5c08482aa4cf..09c14cd1c5d0 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -89,8 +89,14 @@ void SceneTreeDock::_unhandled_key_input(Ref p_event) { _tool_selected(TOOL_NEW); } else if (ED_IS_SHORTCUT("scene_tree/instance_scene", p_event)) { _tool_selected(TOOL_INSTANCE); - } else if (ED_IS_SHORTCUT("scene_tree/expand_collapse_all", p_event)) { - _tool_selected(TOOL_EXPAND_COLLAPSE); + } else if (ED_IS_SHORTCUT("scene_tree/expand_all", p_event)) { + _tool_selected(TOOL_EXPAND_ALL); + } else if (ED_IS_SHORTCUT("scene_tree/collapse_all", p_event)) { + _tool_selected(TOOL_COLLAPSE_ALL); + } else if (ED_IS_SHORTCUT("scene_tree/collapse_all_inactive", p_event)) { + _tool_selected(TOOL_COLLAPSE_INACTIVE); + } else if (ED_IS_SHORTCUT("scene_tree/expand_collapse_descendants", p_event)) { + _tool_selected(TOOL_EXPAND_COLLAPSE_DESCENDANTS); } else if (ED_IS_SHORTCUT("scene_tree/change_node_type", p_event)) { _tool_selected(TOOL_REPLACE); } else if (ED_IS_SHORTCUT("scene_tree/duplicate", p_event)) { @@ -389,21 +395,29 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { quick_open->set_title(TTR("Instance Child Scene")); } break; - case TOOL_EXPAND_COLLAPSE: { + case TOOL_EXPAND_ALL: { - if (!scene_tree->get_selected()) - break; + Tree *tree = scene_tree->get_scene_tree(); + tree->set_collapsed_all(false, false); + + } break; + case TOOL_COLLAPSE_ALL: { Tree *tree = scene_tree->get_scene_tree(); - TreeItem *selected_item = tree->get_selected(); + tree->set_collapsed_all(true, false); - if (!selected_item) - selected_item = tree->get_root(); + } break; + case TOOL_COLLAPSE_INACTIVE: { - bool collapsed = _is_collapsed_recursive(selected_item); - _set_collapsed_recursive(selected_item, !collapsed); + Tree *tree = scene_tree->get_scene_tree(); + tree->set_collapsed_all(true, true); - tree->ensure_cursor_is_visible(); + } break; + case TOOL_EXPAND_COLLAPSE_DESCENDANTS: { + + Tree *tree = scene_tree->get_scene_tree(); + TreeItem *selected_item = (!tree->get_selected()) ? tree->get_root() : tree->get_selected(); + selected_item->toggle_collapsed_all_descendants(); } break; case TOOL_REPLACE: { @@ -1024,17 +1038,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } } -void SceneTreeDock::_node_collapsed(Object *p_obj) { - - TreeItem *ti = Object::cast_to(p_obj); - if (!ti) - return; - - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { - _set_collapsed_recursive(ti, ti->is_collapsed()); - } -} - void SceneTreeDock::_notification(int p_what) { switch (p_what) { @@ -1066,7 +1069,6 @@ void SceneTreeDock::_notification(int p_what) { filter->set_clear_button_enabled(true); EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", this, "_selection_changed"); - scene_tree->get_scene_tree()->connect("item_collapsed", this, "_node_collapsed"); // create_root_dialog HBoxContainer *top_row = memnew(HBoxContainer); @@ -1666,52 +1668,6 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V editor_data->get_undo_redo().commit_action(); } -bool SceneTreeDock::_is_collapsed_recursive(TreeItem *p_item) const { - - bool is_branch_collapsed = false; - - List needs_check; - needs_check.push_back(p_item); - - while (!needs_check.empty()) { - - TreeItem *item = needs_check.back()->get(); - needs_check.pop_back(); - - TreeItem *child = item->get_children(); - is_branch_collapsed = item->is_collapsed() && child; - - if (is_branch_collapsed) { - break; - } - while (child) { - needs_check.push_back(child); - child = child->get_next(); - } - } - return is_branch_collapsed; -} - -void SceneTreeDock::_set_collapsed_recursive(TreeItem *p_item, bool p_collapsed) { - - List to_collapse; - to_collapse.push_back(p_item); - - while (!to_collapse.empty()) { - - TreeItem *item = to_collapse.back()->get(); - to_collapse.pop_back(); - - item->set_collapsed(p_collapsed); - - TreeItem *child = item->get_children(); - while (child) { - to_collapse.push_back(child); - child = child->get_next(); - } - } -} - void SceneTreeDock::_script_created(Ref