Node *VisualScriptYieldSignal::_get_base_node() const { #ifdef TOOLS_ENABLED Ref<Script> script = get_visual_script(); if (!script.is_valid()) return NULL; MainLoop *main_loop = OS::get_singleton()->get_main_loop(); SceneTree *scene_tree = Object::cast_to<SceneTree>(main_loop); if (!scene_tree) return NULL; Node *edited_scene = scene_tree->get_edited_scene_root(); if (!edited_scene) return NULL; Node *script_node = _find_script_node(edited_scene, edited_scene, script); if (!script_node) return NULL; if (!script_node->has_node(base_path)) return NULL; Node *path_to = script_node->get_node(base_path); return path_to; #else return NULL; #endif }
static Node* _find_script_node(Node* p_edited_scene,Node* p_current_node,const Ref<Script> &script) { if (p_edited_scene!=p_current_node && p_current_node->get_owner()!=p_edited_scene) return NULL; Ref<Script> scr = p_current_node->get_script(); if (scr.is_valid() && scr==script) return p_current_node; for(int i=0;i<p_current_node->get_child_count();i++) { Node *n = _find_script_node(p_edited_scene,p_current_node->get_child(i),script); if (n) return n; } return NULL; }
void ScriptTextEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){ Dictionary d = p_data; if (d.has("type") && String(d["type"])=="resource") { Ref<Resource> res = d["resource"]; if (!res.is_valid()) { return; } if (res->get_path().is_resource_file()) { EditorNode::get_singleton()->show_warning("Only resources from filesystem can be dropped."); return; } code_editor->get_text_edit()->insert_text_at_cursor(res->get_path()); } if (d.has("type") && String(d["type"])=="files") { Array files = d["files"]; String text_to_drop; for(int i=0;i<files.size();i++) { if (i>0) text_to_drop+=","; text_to_drop+="\""+String(files[i]).c_escape()+"\""; } code_editor->get_text_edit()->insert_text_at_cursor(text_to_drop); } if (d.has("type") && String(d["type"])=="nodes") { Node* sn = _find_script_node(get_tree()->get_edited_scene_root(),get_tree()->get_edited_scene_root(),script); if (!sn) { EditorNode::get_singleton()->show_warning("Can't drop nodes because script '"+get_name()+"' is not used in this scene."); return; } Array nodes = d["nodes"]; String text_to_drop; for(int i=0;i<nodes.size();i++) { if (i>0) text_to_drop+=","; NodePath np = nodes[i]; Node *node = get_node(np); if (!node) { continue; } String path = sn->get_path_to(node); text_to_drop+="\""+path.c_escape()+"\""; } code_editor->get_text_edit()->insert_text_at_cursor(text_to_drop); } }