You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-27 15:57:02 +00:00
Ability to drag script files from Filesystem dock to SceneTree dock.
Allows to attach scripts by dragging them onto the target Node.
(cherry picked from commit a3944e66da)
This commit is contained in:
committed by
Rémi Verschelde
parent
1038c1f856
commit
5033fc92f4
@@ -1730,6 +1730,15 @@ void SceneTreeDock::_files_dropped(Vector<String> p_files,NodePath p_to,int p_ty
|
||||
_perform_instance_scenes(p_files,node,to_pos);
|
||||
}
|
||||
|
||||
void SceneTreeDock::_script_dropped(String p_file, NodePath p_to) {
|
||||
Ref<Script> scr = ResourceLoader::load(p_file);
|
||||
ERR_FAIL_COND(!scr.is_valid());
|
||||
Node *n = get_node(p_to);
|
||||
if (n) {
|
||||
n->set_script(scr.get_ref_ptr());
|
||||
}
|
||||
}
|
||||
|
||||
void SceneTreeDock::_nodes_dragged(Array p_nodes,NodePath p_to,int p_type) {
|
||||
|
||||
Vector<Node*> nodes;
|
||||
@@ -1845,6 +1854,7 @@ void SceneTreeDock::_bind_methods() {
|
||||
ObjectTypeDB::bind_method(_MD("_new_scene_from"),&SceneTreeDock::_new_scene_from);
|
||||
ObjectTypeDB::bind_method(_MD("_nodes_dragged"),&SceneTreeDock::_nodes_dragged);
|
||||
ObjectTypeDB::bind_method(_MD("_files_dropped"),&SceneTreeDock::_files_dropped);
|
||||
ObjectTypeDB::bind_method(_MD("_script_dropped"),&SceneTreeDock::_script_dropped);
|
||||
ObjectTypeDB::bind_method(_MD("_tree_rmb"),&SceneTreeDock::_tree_rmb);
|
||||
ObjectTypeDB::bind_method(_MD("_filter_changed"),&SceneTreeDock::_filter_changed);
|
||||
|
||||
@@ -1920,6 +1930,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec
|
||||
scene_tree->connect("open_script",this,"_script_open_request");
|
||||
scene_tree->connect("nodes_rearranged",this,"_nodes_dragged");
|
||||
scene_tree->connect("files_dropped",this,"_files_dropped");
|
||||
scene_tree->connect("script_dropped",this,"_script_dropped");
|
||||
|
||||
scene_tree->set_undo_redo(&editor_data->get_undo_redo());
|
||||
scene_tree->set_editor_selection(editor_selection);
|
||||
|
||||
@@ -143,6 +143,7 @@ class SceneTreeDock : public VBoxContainer {
|
||||
|
||||
void _nodes_dragged(Array p_nodes,NodePath p_to,int p_type);
|
||||
void _files_dropped(Vector<String> p_files,NodePath p_to,int p_type);
|
||||
void _script_dropped(String p_file, NodePath p_to);
|
||||
|
||||
void _tree_rmb(const Vector2& p_menu_pos);
|
||||
|
||||
|
||||
@@ -971,6 +971,10 @@ Variant SceneTreeEditor::get_drag_data_fw(const Point2& p_point,Control* p_from)
|
||||
return drag_data;
|
||||
}
|
||||
|
||||
bool SceneTreeEditor::_is_script_type(const StringName &p_type) const {
|
||||
return (script_types->find(p_type));
|
||||
}
|
||||
|
||||
bool SceneTreeEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const {
|
||||
|
||||
if (!can_rename)
|
||||
@@ -998,9 +1002,13 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_da
|
||||
if (files.size()==0)
|
||||
return false; //weird
|
||||
|
||||
if (_is_script_type(EditorFileSystem::get_singleton()->get_file_type(files[0]))) {
|
||||
tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
|
||||
return true;
|
||||
}
|
||||
|
||||
for(int i=0;i<files.size();i++) {
|
||||
String file = files[0];
|
||||
String file = files[i];
|
||||
String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
|
||||
if (ftype!="PackedScene")
|
||||
return false;
|
||||
@@ -1044,7 +1052,15 @@ void SceneTreeEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,C
|
||||
|
||||
if (String(d["type"])=="files") {
|
||||
|
||||
emit_signal("files_dropped",d["files"],np,section);
|
||||
Vector<String> files = d["files"];
|
||||
|
||||
|
||||
String ftype = EditorFileSystem::get_singleton()->get_file_type(files[0]);
|
||||
if (_is_script_type(ftype)) {
|
||||
emit_signal("script_dropped", files[0],np);
|
||||
} else {
|
||||
emit_signal("files_dropped",files,np,section);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1112,6 +1128,7 @@ void SceneTreeEditor::_bind_methods() {
|
||||
ADD_SIGNAL( MethodInfo("node_changed") );
|
||||
ADD_SIGNAL( MethodInfo("nodes_rearranged",PropertyInfo(Variant::ARRAY,"paths"),PropertyInfo(Variant::NODE_PATH,"to_path"),PropertyInfo(Variant::INT,"type") ) );
|
||||
ADD_SIGNAL( MethodInfo("files_dropped",PropertyInfo(Variant::STRING_ARRAY,"files"),PropertyInfo(Variant::NODE_PATH,"to_path"),PropertyInfo(Variant::INT,"type") ) );
|
||||
ADD_SIGNAL( MethodInfo("script_dropped",PropertyInfo(Variant::STRING,"file"),PropertyInfo(Variant::NODE_PATH,"to_path")));
|
||||
ADD_SIGNAL( MethodInfo("rmb_pressed",PropertyInfo(Variant::VECTOR2,"pos")) ) ;
|
||||
|
||||
ADD_SIGNAL( MethodInfo("open") );
|
||||
@@ -1208,12 +1225,16 @@ SceneTreeEditor::SceneTreeEditor(bool p_label,bool p_can_rename, bool p_can_open
|
||||
update_timer->set_wait_time(0.5);
|
||||
add_child(update_timer);
|
||||
|
||||
script_types = memnew(List<StringName>);
|
||||
ObjectTypeDB::get_inheriters_from("Script", script_types);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
SceneTreeEditor::~SceneTreeEditor() {
|
||||
|
||||
memdelete(script_types);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -137,6 +137,9 @@ class SceneTreeEditor : public Control {
|
||||
|
||||
Timer* update_timer;
|
||||
|
||||
List<StringName> *script_types;
|
||||
bool _is_script_type(const StringName &p_type) const;
|
||||
|
||||
public:
|
||||
|
||||
void set_filter(const String& p_filter);
|
||||
|
||||
Reference in New Issue
Block a user