Node *SceneTreeDock::_duplicate(Node *p_node, Map<Node*,Node*> &duplimap) { Node *node=NULL; if (p_node->get_filename()!="") { //an instance Ref<PackedScene> sd = ResourceLoader::load( p_node->get_filename() ); ERR_FAIL_COND_V(!sd.is_valid(),NULL); node = sd->instance(); ERR_FAIL_COND_V(!node,NULL); node->generate_instance_state(); } else { Object *obj = ObjectTypeDB::instance(p_node->get_type()); ERR_FAIL_COND_V(!obj,NULL); node = obj->cast_to<Node>(); if (!node) memdelete(obj); ERR_FAIL_COND_V(!node,NULL); } List<PropertyInfo> plist; p_node->get_property_list(&plist); for(List<PropertyInfo>::Element *E=plist.front();E;E=E->next()) { if (!(E->get().usage&PROPERTY_USAGE_STORAGE)) continue; String name = E->get().name; node->set( name, p_node->get(name) ); } node->set_name(p_node->get_name()); duplimap[p_node]=node; for(int i=0;i<p_node->get_child_count();i++) { Node *child = p_node->get_child(i); if (p_node->get_owner()!=child->get_owner()) continue; //don't bother with not in-scene nodes. Node *dup = _duplicate(child,duplimap); if (!dup) { memdelete(node); return NULL; } node->add_child(dup); } return node; }
Hello_ptr Hello::_narrow(::CORBA::AbstractBase_ptr p) { if(!::CORBA::is_nil(p)) { Hello_ptr v = dynamic_cast< Hello_ptr >(p); if(v) return _duplicate(v); ::CORBA::Object_var obj = p -> _to_object(); return _narrow(obj); } return _nil(); }
Hello_ptr Hello::_unchecked_narrow(::CORBA::Object_ptr p) { if(!::CORBA::is_nil(p)) { Hello_ptr v = dynamic_cast< Hello_ptr >(p); if(v) return _duplicate(v); OBProxy_Hello* val = new OBProxy_Hello; val -> _OB_copyFrom(p); return val; } return _nil(); }
void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { current_option=p_tool; switch(p_tool) { case TOOL_NEW: { create_dialog->popup_centered_ratio(); } break; case TOOL_INSTANCE: { Node *scene = edited_scene; if (!scene) { current_option=-1; //confirmation->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done without a tree root."); accept->popup_centered(Size2(300,70));; break; } file->set_mode(FileDialog::MODE_OPEN_FILE); List<String> extensions; ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions); file->clear_filters(); for(int i=0;i<extensions.size();i++) { file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper()); } //file->set_current_path(current_path); file->popup_centered_ratio(); } break; case TOOL_REPLACE: { create_dialog->popup_centered_ratio(); } break; case TOOL_CONNECT: { Node *current = scene_tree->get_selected(); if (!current) break; connect_dialog->popup_centered_ratio(); connect_dialog->set_node(current); } break; case TOOL_GROUP: { Node *current = scene_tree->get_selected(); if (!current) break; groups_editor->set_current(current); groups_editor->popup_centered_ratio(); } break; case TOOL_SCRIPT: { Node *selected = scene_tree->get_selected(); if (!selected) break; Ref<Script> existing = selected->get_script(); if (existing.is_valid()) editor->push_item(existing.ptr()); else { String path = selected->get_filename(); script_create_dialog->config(selected->get_type(),path); script_create_dialog->popup_centered(Size2(300,290)); //script_create_dialog->popup_centered_minsize(); } } break; case TOOL_MOVE_UP: case TOOL_MOVE_DOWN: { if (!scene_tree->get_selected()) break; if (scene_tree->get_selected()==edited_scene) { current_option=-1; //accept->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done on the tree root."); accept->popup_centered(Size2(300,70));; break; } Node * node=scene_tree->get_selected(); ERR_FAIL_COND(!node->get_parent()); int current_pos = node->get_index(); int next_pos = current_pos + ((p_tool==TOOL_MOVE_DOWN)?1:-1); if (next_pos< 0 || next_pos>=node->get_parent()->get_child_count()) break; // invalid position editor_data->get_undo_redo().create_action("Move Node In Parent"); editor_data->get_undo_redo().add_do_method(node->get_parent(),"move_child",node,next_pos); editor_data->get_undo_redo().add_undo_method(node->get_parent(),"move_child",node,current_pos); editor_data->get_undo_redo().commit_action(); } break; case TOOL_DUPLICATE: { if (!edited_scene) break; if (editor_selection->is_selected(edited_scene)) { current_option=-1; //accept->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done on the tree root."); accept->popup_centered(Size2(300,70));; break; } List<Node*> selection = editor_selection->get_selected_node_list(); List<Node*> reselect; editor_data->get_undo_redo().create_action("Duplicate Node(s)"); editor_data->get_undo_redo().add_do_method(editor_selection,"clear"); Node *dupsingle=NULL; for (List<Node*>::Element *E=selection.front();E;E=E->next()) { Node *node = E->get(); Node *parent = node->get_parent(); List<Node*> owned; node->get_owned_by(node->get_owner(),&owned); Map<Node*,Node*> duplimap; Node * dup = _duplicate(node,duplimap); ERR_CONTINUE(!dup); if (selection.size()==1) dupsingle=dup; String name = node->get_name(); String nums; for(int i=name.length()-1;i>=0;i--) { CharType n=name[i]; if (n>='0' && n<='9') { nums=String::chr(name[i])+nums; } else { break; } } int num=nums.to_int(); if (num<2) num=2; else num++; name=name.substr(0,name.length()-nums.length()).strip_edges(); String attempt=name+" "+itos(num); while(parent->has_node(attempt)) { num++; attempt=name+" "+itos(num); } dup->set_name(attempt); editor_data->get_undo_redo().add_do_method(parent,"add_child",dup); for (List<Node*>::Element *F=owned.front();F;F=F->next()) { if (!duplimap.has(F->get())) { continue; } Node *d=duplimap[F->get()]; editor_data->get_undo_redo().add_do_method(d,"set_owner",node->get_owner()); } editor_data->get_undo_redo().add_do_method(editor_selection,"add_node",dup); editor_data->get_undo_redo().add_undo_method(parent,"remove_child",dup); editor_data->get_undo_redo().add_do_reference(dup); //parent->add_child(dup); //reselect.push_back(dup); } editor_data->get_undo_redo().commit_action(); if (dupsingle) editor->push_item(dupsingle); } break; case TOOL_REPARENT: { if (!scene_tree->get_selected()) break; if (editor_selection->is_selected(edited_scene)) { current_option=-1; //confirmation->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done on the tree root."); accept->popup_centered(Size2(300,70));; break; } List<Node*> nodes = editor_selection->get_selected_node_list(); Set<Node*> nodeset; for(List<Node*>::Element *E=nodes.front();E;E=E->next()) { nodeset.insert(E->get()); } reparent_dialog->popup_centered_ratio(); reparent_dialog->set_current( nodeset ); } break; case TOOL_ERASE: { List<Node*> remove_list = editor_selection->get_selected_node_list(); if (remove_list.empty()) return; if (p_confirm_override) { _delete_confirm(); // hack, force 2d editor viewport to refresh after deletion if (CanvasItemEditor *editor = CanvasItemEditor::get_singleton()) editor->get_viewport_control()->update(); } else { delete_dialog->set_text("Delete Node(s)?"); delete_dialog->popup_centered(Size2(200,80)); } } break; } }
CORBA::AbstractBase_ptr CORBA::AbstractBase::_narrow(CORBA::AbstractBase_ptr ab) { return _duplicate(ab); }
void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { current_option=p_tool; switch(p_tool) { case TOOL_NEW: { //if (!_validate_no_foreign()) // break; create_dialog->popup_centered_ratio(); } break; case TOOL_INSTANCE: { Node *scene = edited_scene; if (!scene) { current_option=-1; //confirmation->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done without a tree root."); accept->popup_centered_minsize(); break; } //if (!_validate_no_foreign()) // break; file->set_mode(EditorFileDialog::MODE_OPEN_FILE); List<String> extensions; ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions); file->clear_filters(); for(int i=0;i<extensions.size();i++) { file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper()); } //file->set_current_path(current_path); file->popup_centered_ratio(); } break; case TOOL_REPLACE: { create_dialog->popup_centered_ratio(); } break; case TOOL_CONNECT: { Node *current = scene_tree->get_selected(); if (!current) break; //if (!_validate_no_foreign()) // break; connect_dialog->popup_centered_ratio(); connect_dialog->set_node(current); } break; case TOOL_GROUP: { Node *current = scene_tree->get_selected(); if (!current) break; //if (!_validate_no_foreign()) // break; groups_editor->set_current(current); groups_editor->popup_centered_ratio(); } break; case TOOL_SCRIPT: { Node *selected = scene_tree->get_selected(); if (!selected) break; //if (!_validate_no_foreign()) // break; Ref<Script> existing = selected->get_script(); if (existing.is_valid()) editor->push_item(existing.ptr()); else { String path = selected->get_filename(); script_create_dialog->config(selected->get_type(),path); script_create_dialog->popup_centered(Size2(300,290)); //script_create_dialog->popup_centered_minsize(); } } break; case TOOL_MOVE_UP: case TOOL_MOVE_DOWN: { if (!scene_tree->get_selected()) break; if (scene_tree->get_selected()==edited_scene) { current_option=-1; //accept->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done on the tree root."); accept->popup_centered_minsize(); break; } if (!_validate_no_foreign()) break; bool MOVING_DOWN = (p_tool == TOOL_MOVE_DOWN); bool MOVING_UP = !MOVING_DOWN; Node *common_parent = scene_tree->get_selected()->get_parent(); List<Node*> selection = editor_selection->get_selected_node_list(); selection.sort_custom<Node::Comparator>(); // sort by index if (MOVING_DOWN) selection.invert(); int lowest_id = common_parent->get_child_count() - 1; int highest_id = 0; for (List<Node*>::Element *E = selection.front(); E; E = E->next()) { int index = E->get()->get_index(); if (index > highest_id) highest_id = index; if (index < lowest_id) lowest_id = index; if (E->get()->get_parent() != common_parent) common_parent = NULL; } if (!common_parent || (MOVING_DOWN && highest_id >= common_parent->get_child_count() - MOVING_DOWN) || (MOVING_UP && lowest_id == 0)) break; // one or more nodes can not be moved if (selection.size() == 1) editor_data->get_undo_redo().create_action("Move Node In Parent"); if (selection.size() > 1) editor_data->get_undo_redo().create_action("Move Nodes In Parent"); for (int i = 0; i < selection.size(); i++) { Node *top_node = selection[i]; Node *bottom_node = selection[selection.size() - 1 - i]; ERR_FAIL_COND(!top_node->get_parent()); ERR_FAIL_COND(!bottom_node->get_parent()); int top_node_pos = top_node->get_index(); int bottom_node_pos = bottom_node->get_index(); int top_node_pos_next = top_node_pos + (MOVING_DOWN ? 1 : -1); int bottom_node_pos_next = bottom_node_pos + (MOVING_DOWN ? 1 : -1); editor_data->get_undo_redo().add_do_method(top_node->get_parent(), "move_child", top_node, top_node_pos_next); editor_data->get_undo_redo().add_undo_method(bottom_node->get_parent(), "move_child", bottom_node, bottom_node_pos); } editor_data->get_undo_redo().commit_action(); } break; case TOOL_DUPLICATE: { if (!edited_scene) break; if (editor_selection->is_selected(edited_scene)) { current_option=-1; //accept->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done on the tree root."); accept->popup_centered_minsize(); break; } if (!_validate_no_foreign()) break; List<Node*> selection = editor_selection->get_selected_node_list(); List<Node*> reselect; editor_data->get_undo_redo().create_action("Duplicate Node(s)"); editor_data->get_undo_redo().add_do_method(editor_selection,"clear"); Node *dupsingle=NULL; for (List<Node*>::Element *E=selection.front();E;E=E->next()) { Node *node = E->get(); Node *parent = node->get_parent(); List<Node*> owned; node->get_owned_by(node->get_owner(),&owned); Map<Node*,Node*> duplimap; Node * dup = _duplicate(node,duplimap); ERR_CONTINUE(!dup); if (selection.size()==1) dupsingle=dup; String name = node->get_name(); String nums; for(int i=name.length()-1;i>=0;i--) { CharType n=name[i]; if (n>='0' && n<='9') { nums=String::chr(name[i])+nums; } else { break; } } int num=nums.to_int(); if (num<1) num=1; else num++; String nnsep = _get_name_num_separator(); name = name.substr(0,name.length()-nums.length()).strip_edges(); if ( name.substr(name.length()-nnsep.length(),nnsep.length()) == nnsep) { name = name.substr(0,name.length()-nnsep.length()); } String attempt = (name + nnsep + itos(num)).strip_edges(); while(parent->has_node(attempt)) { num++; attempt = (name + nnsep + itos(num)).strip_edges(); } dup->set_name(attempt); editor_data->get_undo_redo().add_do_method(parent,"add_child",dup); for (List<Node*>::Element *F=owned.front();F;F=F->next()) { if (!duplimap.has(F->get())) { continue; } Node *d=duplimap[F->get()]; editor_data->get_undo_redo().add_do_method(d,"set_owner",node->get_owner()); } editor_data->get_undo_redo().add_do_method(editor_selection,"add_node",dup); editor_data->get_undo_redo().add_undo_method(parent,"remove_child",dup); editor_data->get_undo_redo().add_do_reference(dup); ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger(); editor_data->get_undo_redo().add_do_method(sed,"live_debug_duplicate_node",edited_scene->get_path_to(node),attempt); editor_data->get_undo_redo().add_undo_method(sed,"live_debug_remove_node",NodePath(String(edited_scene->get_path_to(parent))+"/"+attempt)); //parent->add_child(dup); //reselect.push_back(dup); } editor_data->get_undo_redo().commit_action(); if (dupsingle) editor->push_item(dupsingle); } break; case TOOL_REPARENT: { if (!scene_tree->get_selected()) break; if (editor_selection->is_selected(edited_scene)) { current_option=-1; //confirmation->get_cancel()->hide(); accept->get_ok()->set_text("I see.."); accept->set_text("This operation can't be done on the tree root."); accept->popup_centered_minsize(); break; } if (!_validate_no_foreign()) break; List<Node*> nodes = editor_selection->get_selected_node_list(); Set<Node*> nodeset; for(List<Node*>::Element *E=nodes.front();E;E=E->next()) { nodeset.insert(E->get()); } reparent_dialog->popup_centered_ratio(); reparent_dialog->set_current( nodeset ); } break; case TOOL_MULTI_EDIT: { Node*root=EditorNode::get_singleton()->get_edited_scene(); if (!root) break; Ref<MultiNodeEdit> mne = memnew( MultiNodeEdit ); for (const Map<Node*,Object*>::Element *E=EditorNode::get_singleton()->get_editor_selection()->get_selection().front();E;E=E->next()) { mne->add_node(root->get_path_to(E->key())); } EditorNode::get_singleton()->push_item(mne.ptr()); } break; case TOOL_ERASE: { List<Node*> remove_list = editor_selection->get_selected_node_list(); if (remove_list.empty()) return; if (!_validate_no_foreign()) break; if (p_confirm_override) { _delete_confirm(); // hack, force 2d editor viewport to refresh after deletion if (CanvasItemEditor *editor = CanvasItemEditor::get_singleton()) editor->get_viewport_control()->update(); } else { delete_dialog->set_text("Delete Node(s)?"); delete_dialog->popup_centered_minsize(); } } break; } }