Implement Scene Unique Nodes
This commit is contained in:
@ -1122,6 +1122,28 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case TOOL_TOGGLE_SCENE_UNIQUE_NAME: {
|
||||
List<Node *> selection = editor_selection->get_selected_node_list();
|
||||
List<Node *>::Element *e = selection.front();
|
||||
if (e) {
|
||||
UndoRedo *undo_redo = &editor_data->get_undo_redo();
|
||||
Node *node = e->get();
|
||||
bool enabled = node->is_unique_name_in_owner();
|
||||
if (!enabled && get_tree()->get_edited_scene_root()->get_node_or_null(UNIQUE_NODE_PREFIX + String(node->get_name())) != nullptr) {
|
||||
accept->set_text(TTR("Another node already uses this unique name in the scene."));
|
||||
accept->popup_centered();
|
||||
return;
|
||||
}
|
||||
if (!enabled) {
|
||||
undo_redo->create_action(TTR("Enable Scene Unique Name"));
|
||||
} else {
|
||||
undo_redo->create_action(TTR("Disable Scene Unique Name"));
|
||||
}
|
||||
undo_redo->add_do_method(node, "set_unique_name_in_owner", !enabled);
|
||||
undo_redo->add_undo_method(node, "set_unique_name_in_owner", enabled);
|
||||
undo_redo->commit_action();
|
||||
}
|
||||
} break;
|
||||
case TOOL_CREATE_2D_SCENE:
|
||||
case TOOL_CREATE_3D_SCENE:
|
||||
case TOOL_CREATE_USER_INTERFACE:
|
||||
@ -1353,8 +1375,17 @@ void SceneTreeDock::_node_replace_owner(Node *p_base, Node *p_node, Node *p_root
|
||||
UndoRedo *undo_redo = &editor_data->get_undo_redo();
|
||||
switch (p_mode) {
|
||||
case MODE_BIDI: {
|
||||
bool is_unique = p_node->is_unique_name_in_owner() && p_base->get_node_or_null(UNIQUE_NODE_PREFIX + String(p_node->get_name())) != nullptr;
|
||||
if (is_unique) {
|
||||
// Will create a unique name conflict. Disable before setting owner.
|
||||
undo_redo->add_do_method(p_node, "set_unique_name_in_owner", false);
|
||||
}
|
||||
undo_redo->add_do_method(p_node, "set_owner", p_root);
|
||||
undo_redo->add_undo_method(p_node, "set_owner", p_base);
|
||||
if (is_unique) {
|
||||
// Will create a unique name conflict. Enable after setting owner.
|
||||
undo_redo->add_undo_method(p_node, "set_unique_name_in_owner", true);
|
||||
}
|
||||
|
||||
} break;
|
||||
case MODE_DO: {
|
||||
@ -2753,6 +2784,12 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
|
||||
menu->add_icon_shortcut(get_icon("ScriptExtend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/extend_script"), TOOL_EXTEND_SCRIPT);
|
||||
}
|
||||
}
|
||||
if (selection[0]->get_owner() == EditorNode::get_singleton()->get_edited_scene()) {
|
||||
// Only for nodes owned by the edited scene root.
|
||||
menu->add_separator();
|
||||
menu->add_icon_check_item(get_icon("SceneUniqueName", "EditorIcons"), TTR("Access as Scene Unique Name"), TOOL_TOGGLE_SCENE_UNIQUE_NAME);
|
||||
menu->set_item_checked(menu->get_item_index(TOOL_TOGGLE_SCENE_UNIQUE_NAME), selection[0]->is_unique_name_in_owner());
|
||||
}
|
||||
if (existing_script.is_valid() && exisiting_script_removable) {
|
||||
add_separator = true;
|
||||
menu->add_icon_shortcut(get_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/detach_script"), TOOL_DETACH_SCRIPT);
|
||||
|
||||
Reference in New Issue
Block a user