diff options
author | volzhs <volzhs@gmail.com> | 2016-11-10 01:29:15 +0900 |
---|---|---|
committer | volzhs <volzhs@gmail.com> | 2016-11-11 05:06:39 +0900 |
commit | 1880238c3e54f57a14361d2c347387edebc6391b (patch) | |
tree | 3d2b0e8852e85af132084b50a856f57f3d6275b8 /tools | |
parent | 22542bc7679829579d82eef99163a33dd78f1736 (diff) |
Can create or load script on Attach script dialog
Diffstat (limited to 'tools')
-rw-r--r-- | tools/editor/scene_tree_dock.cpp | 73 | ||||
-rw-r--r-- | tools/editor/scene_tree_dock.h | 5 | ||||
-rw-r--r-- | tools/editor/script_create_dialog.cpp | 124 | ||||
-rw-r--r-- | tools/editor/script_create_dialog.h | 4 |
4 files changed, 100 insertions, 106 deletions
diff --git a/tools/editor/scene_tree_dock.cpp b/tools/editor/scene_tree_dock.cpp index b9cce34454..990d14196e 100644 --- a/tools/editor/scene_tree_dock.cpp +++ b/tools/editor/scene_tree_dock.cpp @@ -80,11 +80,8 @@ void SceneTreeDock::_unhandled_key_input(InputEvent p_event) { else if (ED_IS_SHORTCUT("scene_tree/duplicate", p_event)) { _tool_selected(TOOL_DUPLICATE); } - else if (ED_IS_SHORTCUT("scene_tree/add_script", p_event)) { - _tool_selected(TOOL_CREATE_SCRIPT); - } - else if (ED_IS_SHORTCUT("scene_tree/load_script", p_event)) { - _tool_selected(TOOL_LOAD_SCRIPT); + else if (ED_IS_SHORTCUT("scene_tree/attach_script", p_event)) { + _tool_selected(TOOL_ATTACH_SCRIPT); } else if(ED_IS_SHORTCUT("scene_tree/clear_script", p_event)) { _tool_selected(TOOL_CLEAR_SCRIPT); @@ -272,24 +269,6 @@ void SceneTreeDock::_replace_with_branch_scene(const String& p_file,Node* base) scene_tree->set_selected(instanced_scene); } - -void SceneTreeDock::_file_selected(String p_file) { - RES p_script = ResourceLoader::load(p_file, "Script"); - if (p_script.is_null()) { - accept->get_ok()->set_text(TTR("Ugh")); - accept->set_text(vformat(TTR("Error loading script from %s"), p_file)); - accept->popup_centered_minsize(); - return; - } - - Node *selected = scene_tree->get_selected(); - if (!selected) - return; - selected->set_script(p_script.get_ref_ptr()); - editor->push_item(p_script.operator->()); - file_dialog->hide(); -} - bool SceneTreeDock::_cyclical_dependency_exists(const String& p_target_scene_path, Node* p_desired_node) { int childCount = p_desired_node->get_child_count(); @@ -382,22 +361,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { //groups_editor->set_current(current); //groups_editor->popup_centered_ratio(); } break; - case TOOL_LOAD_SCRIPT: { - Node *selected = scene_tree->get_selected(); - if (!selected) - break; - - file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE); - - List<String> extensions; - ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); - file_dialog->clear_filters(); - for (List<String>::Element *E = extensions.front(); E; E = E->next()) - file_dialog->add_filter("*." + E->get() + " ; " + E->get().to_upper()); - - file_dialog->popup_centered_ratio(); - } break; - case TOOL_CREATE_SCRIPT: { + case TOOL_ATTACH_SCRIPT: { Node *selected = scene_tree->get_selected(); if (!selected) @@ -725,7 +689,6 @@ void SceneTreeDock::_notification(int p_what) { button_add->set_icon(get_icon("Add","EditorIcons")); button_instance->set_icon(get_icon("Instance","EditorIcons")); button_create_script->set_icon(get_icon("ScriptCreate","EditorIcons")); - button_load_script->set_icon(get_icon("Script", "EditorIcons")); button_clear_script->set_icon(get_icon("Remove", "EditorIcons")); @@ -1359,17 +1322,14 @@ void SceneTreeDock::_selection_changed() { if (selection_size==1) { if(EditorNode::get_singleton()->get_editor_selection()->get_selection().front()->key()->get_script().is_null()) { button_create_script->show(); - button_load_script->show(); button_clear_script->hide(); } else { button_create_script->hide(); - button_load_script->hide(); button_clear_script->show(); } } else { button_create_script->hide(); - button_load_script->hide(); button_clear_script->hide(); } @@ -1823,8 +1783,7 @@ void SceneTreeDock::_tree_rmb(const Vector2& p_menu_pos) { //menu->add_icon_item(get_icon("Groups","EditorIcons"),TTR("Edit Groups"),TOOL_GROUP); //menu->add_icon_item(get_icon("Connect","EditorIcons"),TTR("Edit Connections"),TOOL_CONNECT); menu->add_separator(); - menu->add_icon_shortcut(get_icon("ScriptCreate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_script"), TOOL_CREATE_SCRIPT); - menu->add_icon_shortcut(get_icon("Script", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/load_script"), TOOL_LOAD_SCRIPT); + menu->add_icon_shortcut(get_icon("ScriptCreate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/attach_script"), TOOL_ATTACH_SCRIPT); menu->add_icon_shortcut(get_icon("Remove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/clear_script"), TOOL_CLEAR_SCRIPT); menu->add_separator(); } @@ -1884,7 +1843,7 @@ void SceneTreeDock::_focus_node() { void SceneTreeDock::open_script_dialog(Node* p_for_node) { scene_tree->set_selected(p_for_node,false); - _tool_selected(TOOL_CREATE_SCRIPT); + _tool_selected(TOOL_ATTACH_SCRIPT); } void SceneTreeDock::_bind_methods() { @@ -1913,7 +1872,6 @@ void SceneTreeDock::_bind_methods() { ObjectTypeDB::bind_method(_MD("_tree_rmb"),&SceneTreeDock::_tree_rmb); ObjectTypeDB::bind_method(_MD("_filter_changed"),&SceneTreeDock::_filter_changed); ObjectTypeDB::bind_method(_MD("_focus_node"),&SceneTreeDock::_focus_node); - ObjectTypeDB::bind_method(_MD("_file_selected"), &SceneTreeDock::_file_selected); ObjectTypeDB::bind_method(_MD("instance"),&SceneTreeDock::instance); @@ -1937,8 +1895,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec ED_SHORTCUT("scene_tree/add_child_node",TTR("Add Child Node"), KEY_MASK_CMD|KEY_A); ED_SHORTCUT("scene_tree/instance_scene",TTR("Instance Child Scene")); ED_SHORTCUT("scene_tree/change_node_type", TTR("Change Type")); - ED_SHORTCUT("scene_tree/add_script", TTR("Add Script")); - ED_SHORTCUT("scene_tree/load_script", TTR("Load Script")); + ED_SHORTCUT("scene_tree/attach_script", TTR("Attach Script")); ED_SHORTCUT("scene_tree/clear_script", TTR("Clear Script")); ED_SHORTCUT("scene_tree/move_up", TTR("Move Up"), KEY_MASK_CMD | KEY_UP); ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KEY_MASK_CMD | KEY_DOWN); @@ -1976,20 +1933,13 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec tb = memnew( ToolButton ); - tb->connect("pressed",this,"_tool_selected",make_binds(TOOL_CREATE_SCRIPT, false)); - tb->set_tooltip(TTR("Create a new script for the selected node.")); - tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/add_script")); + tb->connect("pressed",this,"_tool_selected",make_binds(TOOL_ATTACH_SCRIPT, false)); + tb->set_tooltip(TTR("Attach a new or existing script for the selected node.")); + tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/attach_script")); filter_hbc->add_child(tb); button_create_script=tb; tb = memnew(ToolButton); - tb->connect("pressed", this, "_tool_selected", make_binds(TOOL_LOAD_SCRIPT, false)); - tb->set_tooltip(TTR("Load a script for the selected node.")); - tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/load_script")); - filter_hbc->add_child(tb); - button_load_script = tb; - - tb = memnew(ToolButton); tb->connect("pressed", this, "_tool_selected", make_binds(TOOL_CLEAR_SCRIPT, false)); tb->set_tooltip(TTR("Clear a script for the selected node.")); tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/clear_script")); @@ -2023,11 +1973,6 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec add_child(create_dialog); create_dialog->connect("create",this,"_create"); - file_dialog = memnew(EditorFileDialog); - add_child(file_dialog); - file_dialog->hide(); - file_dialog->connect("file_selected", this, "_file_selected"); - //groups_editor = memnew( GroupsEditor ); //add_child(groups_editor); //groups_editor->set_undo_redo(&editor_data->get_undo_redo()); diff --git a/tools/editor/scene_tree_dock.h b/tools/editor/scene_tree_dock.h index 86fe3bb136..f1b366a4c5 100644 --- a/tools/editor/scene_tree_dock.h +++ b/tools/editor/scene_tree_dock.h @@ -58,8 +58,7 @@ class SceneTreeDock : public VBoxContainer { TOOL_REPLACE, TOOL_CONNECT, TOOL_GROUP, - TOOL_CREATE_SCRIPT, - TOOL_LOAD_SCRIPT, + TOOL_ATTACH_SCRIPT, TOOL_CLEAR_SCRIPT, TOOL_MOVE_UP, TOOL_MOVE_DOWN, @@ -77,12 +76,10 @@ class SceneTreeDock : public VBoxContainer { int current_option; CreateDialog *create_dialog; - EditorFileDialog *file_dialog; ToolButton *button_add; ToolButton *button_instance; ToolButton *button_create_script; - ToolButton *button_load_script; ToolButton *button_clear_script; SceneTreeEditor *scene_tree; diff --git a/tools/editor/script_create_dialog.cpp b/tools/editor/script_create_dialog.cpp index 62d5c7cd84..d7fc87167b 100644 --- a/tools/editor/script_create_dialog.cpp +++ b/tools/editor/script_create_dialog.cpp @@ -96,8 +96,20 @@ void ScriptCreateDialog::_class_name_changed(const String& p_name) { void ScriptCreateDialog::ok_pressed() { - if (class_name->is_editable() && !_validate(class_name->get_text())) { + if (create_new){ + _create_new(); + } else { + _load_exist(); + } + + create_new=true; + _update_controls(); + +} + +void ScriptCreateDialog::_create_new() { + if (class_name->is_editable() && !_validate(class_name->get_text())) { alert->set_text(TTR("Class name is invalid!")); alert->popup_centered_minsize(); return; @@ -105,21 +117,14 @@ void ScriptCreateDialog::ok_pressed() { if (!_validate(parent_name->get_text())) { alert->set_text(TTR("Parent class name is invalid!")); alert->popup_centered_minsize(); - return; - } - String cname; if (class_name->is_editable()) cname=class_name->get_text(); - - - Ref<Script> scr = ScriptServer::get_language( language_menu->get_selected() )->get_template(cname,parent_name->get_text()); - //scr->set_source_code(text); String selected_language = language_menu->get_item_text(language_menu->get_selected()); editor_settings->set_last_selected_language(selected_language); @@ -127,34 +132,40 @@ void ScriptCreateDialog::ok_pressed() { if (cname!="") scr->set_name(cname); - if (!internal->is_pressed()) { - - String lpath = Globals::get_singleton()->localize_path(file_path->get_text()); scr->set_path(lpath); if (!path_valid) { - alert->set_text(TTR("Invalid path!")); alert->popup_centered_minsize(); return; - } Error err = ResourceSaver::save(lpath,scr,ResourceSaver::FLAG_CHANGE_PATH); if (err!=OK) { - alert->set_text(TTR("Could not create script in filesystem.")); alert->popup_centered_minsize(); return; } - //scr->set_path(lpath); - //EditorFileSystem::get_singleton()->update_file(lpath,scr->get_type()); + } + hide(); + emit_signal("script_created",scr); + +} +void ScriptCreateDialog::_load_exist() { + + String path=file_path->get_text(); + RES p_script = ResourceLoader::load(path, "Script"); + if (p_script.is_null()) { + alert->get_ok()->set_text(TTR("Ugh")); + alert->set_text(vformat(TTR("Error loading script from %s"), path)); + alert->popup_centered_minsize(); + return; } hide(); - emit_signal("script_created",scr); + emit_signal("script_created",p_script.get_ref_ptr()); } @@ -166,10 +177,35 @@ void ScriptCreateDialog::_lang_changed(int l) { } else { class_name->set_editable(false); } - if (file_path->get_text().basename()==initial_bp) { - file_path->set_text(initial_bp+"."+ScriptServer::get_language( l )->get_extension()); - _path_changed(file_path->get_text()); + + String selected_ext="."+ScriptServer::get_language( l )->get_extension(); + String path=file_path->get_text(); + String extension=""; + if (path.find(".")>=0) { + extension=path.extension(); + } + + if (extension.length()==0) { + // add extension if none + path+=selected_ext; + _path_changed(path); + } else { + // change extension by selected language + List<String> extensions; + // get all possible extensions for script + for (int l=0;l<language_menu->get_item_count();l++) { + ScriptServer::get_language( l )->get_recognized_extensions(&extensions); + } + + for(List<String>::Element *E=extensions.front();E;E=E->next()) { + if (E->get().nocasecmp_to(extension)==0) { + path=path.basename()+selected_ext; + _path_changed(path); + break; + } + } } + file_path->set_text(path); _class_name_changed(class_name->get_text()); } @@ -191,8 +227,10 @@ void ScriptCreateDialog::_browse_path() { file_browse->clear_filters(); List<String> extensions; - int l=language_menu->get_selected(); - ScriptServer::get_language( l )->get_recognized_extensions(&extensions); + // get all possible extensions for script + for (int l=0;l<language_menu->get_item_count();l++) { + ScriptServer::get_language( l )->get_recognized_extensions(&extensions); + } for(List<String>::Element *E=extensions.front();E;E=E->next()) { file_browse->add_filter("*."+E->get()); @@ -246,49 +284,57 @@ void ScriptCreateDialog::_path_changed(const String& p_path) { memdelete(d); } - - FileAccess *f = FileAccess::create(FileAccess::ACCESS_RESOURCES); - - if (f->file_exists(p)) { - - path_error_label->set_text(TTR("File exists")); - path_error_label->add_color_override("font_color",Color(1,0.4,0.0,0.8)); - memdelete(f); - return; - } - + create_new=!f->file_exists(p); memdelete(f); String extension=p.extension(); List<String> extensions; - int l=language_menu->get_selected(); - ScriptServer::get_language( l )->get_recognized_extensions(&extensions); + // get all possible extensions for script + for (int l=0;l<language_menu->get_item_count();l++) { + ScriptServer::get_language( l )->get_recognized_extensions(&extensions); + } bool found=false; + int index=0; for(List<String>::Element *E=extensions.front();E;E=E->next()) { if (E->get().nocasecmp_to(extension)==0) { + language_menu->select(index); // change Language option by extension found=true; break; } + index++; } if (!found) { - path_error_label->set_text(TTR("Invalid extension")); path_error_label->add_color_override("font_color",Color(1,0.4,0.0,0.8)); return; } + _update_controls(); - path_error_label->set_text(TTR("Valid path")); path_error_label->add_color_override("font_color",Color(0,1.0,0.8,0.8)); path_valid=true; } +void ScriptCreateDialog::_update_controls() { + + if (create_new) { + path_error_label->set_text(TTR("Create new script")); + get_ok()->set_text(TTR("Create")); + } else { + path_error_label->set_text(TTR("Load existing script")); + get_ok()->set_text(TTR("Load")); + } + parent_name->set_editable(create_new); + internal->set_disabled(!create_new); + +} + void ScriptCreateDialog::_bind_methods() { @@ -376,7 +422,7 @@ ScriptCreateDialog::ScriptCreateDialog() { set_size(Size2(200,150)); set_hide_on_ok(false); - set_title(TTR("Create Node Script")); + set_title(TTR("Attach Node Script")); file_browse = memnew( EditorFileDialog ); file_browse->connect("file_selected",this,"_file_selected"); @@ -385,4 +431,6 @@ ScriptCreateDialog::ScriptCreateDialog() { alert = memnew( AcceptDialog ); add_child(alert); _lang_changed(0); + + create_new=true; } diff --git a/tools/editor/script_create_dialog.h b/tools/editor/script_create_dialog.h index c71ea16d39..77e5a9fddd 100644 --- a/tools/editor/script_create_dialog.h +++ b/tools/editor/script_create_dialog.h @@ -50,6 +50,7 @@ class ScriptCreateDialog : public ConfirmationDialog { VBoxContainer *path_vb; AcceptDialog *alert; bool path_valid; + bool create_new; String initial_bp; EditorSettings *editor_settings; @@ -62,6 +63,9 @@ class ScriptCreateDialog : public ConfirmationDialog { void _browse_path(); void _file_selected(const String& p_file); virtual void ok_pressed(); + void _create_new(); + void _load_exist(); + void _update_controls(); protected: static void _bind_methods(); |