diff options
Diffstat (limited to 'editor/scene_tree_dock.cpp')
-rw-r--r-- | editor/scene_tree_dock.cpp | 103 |
1 files changed, 79 insertions, 24 deletions
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 7187da851e..bcab0c2883 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -37,15 +37,16 @@ #include "core/os/keyboard.h" #include "editor/debugger/editor_debugger_node.h" #include "editor/editor_feature_profile.h" +#include "editor/editor_file_system.h" #include "editor/editor_main_screen.h" #include "editor/editor_node.h" #include "editor/editor_paths.h" -#include "editor/editor_quick_open.h" #include "editor/editor_settings.h" #include "editor/editor_string_names.h" #include "editor/editor_undo_redo_manager.h" #include "editor/filesystem_dock.h" #include "editor/gui/editor_file_dialog.h" +#include "editor/gui/editor_quick_open_dialog.h" #include "editor/inspector_dock.h" #include "editor/multi_node_edit.h" #include "editor/node_dock.h" @@ -73,8 +74,8 @@ void SceneTreeDock::_nodes_drag_begin() { pending_click_select = nullptr; } -void SceneTreeDock::_quick_open() { - instantiate_scenes(quick_open->get_selected_files(), scene_tree->get_selected()); +void SceneTreeDock::_quick_open(const String &p_file_path) { + instantiate_scenes({ p_file_path }, scene_tree->get_selected()); } void SceneTreeDock::_inspect_hovered_node() { @@ -88,6 +89,8 @@ void SceneTreeDock::_inspect_hovered_node() { tree_item_inspected = item; tree_item_inspected->set_custom_color(0, get_theme_color(SNAME("accent_color"), EditorStringName(Editor))); } + EditorSelectionHistory *editor_history = EditorNode::get_singleton()->get_editor_selection_history(); + editor_history->add_object(node_hovered_now->get_instance_id()); InspectorDock::get_inspector_singleton()->edit(node_hovered_now); InspectorDock::get_inspector_singleton()->propagate_notification(NOTIFICATION_DRAG_BEGIN); // Enable inspector drag preview after it updated. InspectorDock::get_singleton()->update(node_hovered_now); @@ -133,14 +136,6 @@ void SceneTreeDock::input(const Ref<InputEvent> &p_event) { _push_item(pending_click_select); pending_click_select = nullptr; } - - if (mb->is_released()) { - if (tree_item_inspected) { - tree_item_inspected->clear_custom_color(0); - tree_item_inspected = nullptr; - } - _reset_hovering_timer(); - } } if (tree_clicked && get_viewport()->gui_is_dragging()) { @@ -436,6 +431,22 @@ void SceneTreeDock::_replace_with_branch_scene(const String &p_file, Node *base) instantiated_scene->set_unique_name_in_owner(base->is_unique_name_in_owner()); + Node2D *copy_2d = Object::cast_to<Node2D>(instantiated_scene); + Node2D *base_2d = Object::cast_to<Node2D>(base); + if (copy_2d && base_2d) { + copy_2d->set_position(base_2d->get_position()); + copy_2d->set_rotation(base_2d->get_rotation()); + copy_2d->set_scale(base_2d->get_scale()); + } + + Node3D *copy_3d = Object::cast_to<Node3D>(instantiated_scene); + Node3D *base_3d = Object::cast_to<Node3D>(base); + if (copy_3d && base_3d) { + copy_3d->set_position(base_3d->get_position()); + copy_3d->set_rotation(base_3d->get_rotation()); + copy_3d->set_scale(base_3d->get_scale()); + } + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); undo_redo->create_action(TTR("Replace with Branch Scene")); @@ -599,8 +610,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { break; } - quick_open->popup_dialog("PackedScene", true); - quick_open->set_title(TTR("Instantiate Child Scene")); + EditorNode::get_singleton()->get_quick_open_dialog()->popup_dialog({ "PackedScene" }, callable_mp(this, &SceneTreeDock::_quick_open)); if (!p_confirm_override) { emit_signal(SNAME("add_node_used")); } @@ -1702,13 +1712,30 @@ void SceneTreeDock::_notification(int p_what) { case NOTIFICATION_DRAG_END: { _reset_hovering_timer(); - if (select_node_hovered_at_end_of_drag && !hovered_but_reparenting) { - Node *node_inspected = Object::cast_to<Node>(InspectorDock::get_inspector_singleton()->get_edited_object()); - if (node_inspected) { + if (tree_item_inspected) { + tree_item_inspected->clear_custom_color(0); + 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<Node *> full_selection = editor_selection->get_full_selected_node_list(); editor_selection->clear(); - editor_selection->add_node(node_inspected); - scene_tree->set_selected(node_inspected); - select_node_hovered_at_end_of_drag = false; + for (Node *E : full_selection) { + editor_selection->add_node(E); + } + return; + } + if (select_node_hovered_at_end_of_drag) { + Node *node_inspected = Object::cast_to<Node>(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; + } } } hovered_but_reparenting = false; @@ -3259,6 +3286,36 @@ void SceneTreeDock::_new_scene_from(const String &p_file) { // Root node cannot ever be unique name in its own Scene! copy->set_unique_name_in_owner(false); + const Dictionary dict = new_scene_from_dialog->get_selected_options(); + bool reset_position = dict.get(TTR("Reset Position"), true); + bool reset_scale = dict.get(TTR("Reset Scale"), false); + bool reset_rotation = dict.get(TTR("Reset Rotation"), false); + + Node2D *copy_2d = Object::cast_to<Node2D>(copy); + if (copy_2d != nullptr) { + if (reset_position) { + copy_2d->set_position(Vector2(0, 0)); + } + if (reset_rotation) { + copy_2d->set_rotation(0); + } + if (reset_scale) { + copy_2d->set_scale(Size2(1, 1)); + } + } + Node3D *copy_3d = Object::cast_to<Node3D>(copy); + if (copy_3d != nullptr) { + if (reset_position) { + copy_3d->set_position(Vector3(0, 0, 0)); + } + if (reset_rotation) { + copy_3d->set_rotation(Vector3(0, 0, 0)); + } + if (reset_scale) { + copy_3d->set_scale(Vector3(0, 0, 0)); + } + } + Ref<PackedScene> sdata = memnew(PackedScene); Error err = sdata->pack(copy); memdelete(copy); @@ -4598,7 +4655,6 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec scene_tree->connect("files_dropped", callable_mp(this, &SceneTreeDock::_files_dropped)); scene_tree->connect("script_dropped", callable_mp(this, &SceneTreeDock::_script_dropped)); scene_tree->connect("nodes_dragged", callable_mp(this, &SceneTreeDock::_nodes_drag_begin)); - scene_tree->connect(SceneStringName(mouse_exited), callable_mp(this, &SceneTreeDock::_reset_hovering_timer)); scene_tree->get_scene_tree()->connect(SceneStringName(gui_input), callable_mp(this, &SceneTreeDock::_scene_tree_gui_input)); scene_tree->get_scene_tree()->connect("item_icon_double_clicked", callable_mp(this, &SceneTreeDock::_focus_node)); @@ -4638,10 +4694,6 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec accept = memnew(AcceptDialog); add_child(accept); - quick_open = memnew(EditorQuickOpen); - add_child(quick_open); - quick_open->connect("quick_open", callable_mp(this, &SceneTreeDock::_quick_open)); - set_process_shortcut_input(true); delete_dialog = memnew(ConfirmationDialog); @@ -4668,6 +4720,9 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec new_scene_from_dialog = memnew(EditorFileDialog); new_scene_from_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); + new_scene_from_dialog->add_option(TTR("Reset Position"), Vector<String>(), true); + new_scene_from_dialog->add_option(TTR("Reset Rotation"), Vector<String>(), false); + new_scene_from_dialog->add_option(TTR("Reset Scale"), Vector<String>(), false); add_child(new_scene_from_dialog); new_scene_from_dialog->connect("file_selected", callable_mp(this, &SceneTreeDock::_new_scene_from)); |