Prevent 'Change Type' on nodes from an instanced scene

(cherry picked from commit e28cc34db8)
This commit is contained in:
hilfazer 2021-02-22 20:18:14 +01:00 committed by Rémi Verschelde
parent ad204f9b95
commit 8a7d0d3ce0
2 changed files with 35 additions and 1 deletions

View File

@ -521,6 +521,14 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
break; break;
} }
if (!_validate_no_foreign()) {
break;
}
if (!_validate_no_instance()) {
break;
}
Node *selected = scene_tree->get_selected(); Node *selected = scene_tree->get_selected();
if (!selected && !editor_selection->get_selected_node_list().empty()) if (!selected && !editor_selection->get_selected_node_list().empty())
selected = editor_selection->get_selected_node_list().front()->get(); selected = editor_selection->get_selected_node_list().front()->get();
@ -1635,6 +1643,20 @@ bool SceneTreeDock::_validate_no_foreign() {
return true; return true;
} }
bool SceneTreeDock::_validate_no_instance() {
List<Node *> selection = editor_selection->get_selected_node_list();
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
if (E->get() != edited_scene && E->get()->get_filename() != "") {
accept->set_text(TTR("This operation can't be done on instanced scenes."));
accept->popup_centered();
return false;
}
}
return true;
}
void SceneTreeDock::_node_reparent(NodePath p_path, bool p_keep_global_xform) { void SceneTreeDock::_node_reparent(NodePath p_path, bool p_keep_global_xform) {
Node *new_parent = scene_root->get_node(p_path); Node *new_parent = scene_root->get_node(p_path);
@ -2632,7 +2654,18 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
if (full_selection.size() == 1) { if (full_selection.size() == 1) {
menu->add_icon_shortcut(get_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/rename"), TOOL_RENAME); menu->add_icon_shortcut(get_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/rename"), TOOL_RENAME);
} }
bool can_replace = true;
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
if (E->get() != edited_scene && (E->get()->get_owner() != edited_scene || E->get()->get_filename() != "")) {
can_replace = false;
break;
}
}
if (can_replace) {
menu->add_icon_shortcut(get_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE); menu->add_icon_shortcut(get_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE);
}
if (scene_tree->get_selected() != edited_scene) { if (scene_tree->get_selected() != edited_scene) {
menu->add_separator(); menu->add_separator();

View File

@ -211,6 +211,7 @@ class SceneTreeDock : public VBoxContainer {
void _new_scene_from(String p_file); void _new_scene_from(String p_file);
bool _validate_no_foreign(); bool _validate_no_foreign();
bool _validate_no_instance();
void _selection_changed(); void _selection_changed();
void _update_script_button(); void _update_script_button();
Node *_get_selection_group_tail(Node *p_node, List<Node *> p_list); Node *_get_selection_group_tail(Node *p_node, List<Node *> p_list);