Moved subscene creation from scene menu to an icon on the scene dock

Based on @Fiona's PR #2220.
The previous "subscene" concept is also renamed to "new scene", as those subscene are just like regular scenes.
This commit is contained in:
Rémi Verschelde 2015-11-27 21:42:48 +01:00
parent ed4738fbed
commit 20efb48101
5 changed files with 126 additions and 139 deletions

View file

@ -1162,75 +1162,6 @@ void EditorNode::_dialog_action(String p_file) {
save_translatable_strings(p_file);
} break;
case FILE_SAVE_SUBSCENE: {
List<Node*> selection = editor_selection->get_selected_node_list();
if (selection.size()!=1) {
current_option=-1;
//confirmation->get_cancel()->hide();
accept->get_ok()->set_text("I see..");
accept->set_text("This operation requieres a single selected node.");
accept->popup_centered_minsize();
break;
}
Node *base = selection.front()->get();
Map<Node*,Node*> reown;
reown[editor_data.get_edited_scene_root()]=base;
Node *copy = base->duplicate_and_reown(reown);
if (copy) {
Ref<PackedScene> sdata = memnew( PackedScene );
Error err = sdata->pack(copy);
memdelete(copy);
if (err!=OK) {
current_option=-1;
//accept->get_cancel()->hide();
accept->get_ok()->set_text("I see..");
accept->set_text("Couldn't save subscene. Likely dependencies (instances) couldn't be satisfied.");
accept->popup_centered_minsize();
return;
}
int flg=0;
if (EditorSettings::get_singleton()->get("on_save/compress_binary_resources"))
flg|=ResourceSaver::FLAG_COMPRESS;
if (EditorSettings::get_singleton()->get("on_save/save_paths_as_relative"))
flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
err = ResourceSaver::save(p_file,sdata,flg);
if (err!=OK) {
current_option=-1;
//confirmation->get_cancel()->hide();
accept->get_ok()->set_text("I see..");
accept->set_text("Error saving scene.");
accept->popup_centered_minsize();
break;
}
//EditorFileSystem::get_singleton()->update_file(p_file,sdata->get_type());
} else {
current_option=-1;
//confirmation->get_cancel()->hide();
accept->get_ok()->set_text("I see..");
accept->set_text("Error duplicating scene to save it.");
accept->popup_centered_minsize();
break;
}
} break;
case FILE_SAVE_SCENE:
case FILE_SAVE_AS_SCENE: {
@ -2141,70 +2072,6 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) {
file->set_title("Save Translatable Strings");
file->popup_centered_ratio();
} break;
case FILE_SAVE_SUBSCENE: {
Node *scene = editor_data.get_edited_scene_root();
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 scene.");
accept->popup_centered_minsize();
break;
}
List<Node*> selection = editor_selection->get_selected_node_list();
if (selection.size()!=1) {
current_option=-1;
//confirmation->get_cancel()->hide();
accept->get_ok()->set_text("I see..");
accept->set_text("This operation requieres a single selected node.");
accept->popup_centered_minsize();
break;
}
Node *tocopy = selection.front()->get();
if (tocopy!=editor_data.get_edited_scene_root() && tocopy->get_filename()!="") {
current_option=-1;
//confirmation->get_cancel()->hide();
accept->get_ok()->set_text("I see..");
accept->set_text("This operation can't be done on instanced scenes.");
accept->popup_centered_minsize();
break;
}
file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
List<String> extensions;
Ref<PackedScene> sd = memnew( PackedScene );
ResourceSaver::get_recognized_extensions(sd,&extensions);
file->clear_filters();
for(int i=0;i<extensions.size();i++) {
file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
}
String existing;
if (extensions.size()) {
existing="new_scene."+extensions.front()->get().to_lower();
}
file->set_current_path(existing);
file->popup_centered_ratio();
file->set_title("Save Sub-Scene As..");
} break;
case FILE_SAVE_OPTIMIZED: {
Node *scene = editor_data.get_edited_scene_root();
@ -4972,7 +4839,6 @@ EditorNode::EditorNode() {
pm_export->set_name("Export");
p->add_child(pm_export);
p->add_submenu_item("Convert To..","Export");
pm_export->add_item("Subscene..",FILE_SAVE_SUBSCENE);
pm_export->add_item("Translatable Strings..",FILE_DUMP_STRINGS);
pm_export->add_separator();
pm_export->add_item("MeshLibrary..",FILE_EXPORT_MESH_LIBRARY);

View file

@ -99,13 +99,12 @@ typedef void (*EditorNodeInitCallback)();
class EditorNode : public Node {
OBJ_TYPE( EditorNode, Node );
enum {
HISTORY_SIZE=64
HISTORY_SIZE=64
};
enum MenuOptions {
FILE_NEW_SCENE,
FILE_NEW_INHERITED_SCENE,
FILE_OPEN_SCENE,
@ -118,7 +117,6 @@ class EditorNode : public Node {
FILE_EXPORT_MESH_LIBRARY,
FILE_EXPORT_TILESET,
FILE_SAVE_OPTIMIZED,
FILE_SAVE_SUBSCENE,
FILE_DUMP_STRINGS,
FILE_OPEN_RECENT,
FILE_OPEN_OLD_SCENE,

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

View file

@ -35,6 +35,7 @@
#include "tools/editor/plugins/canvas_item_editor_plugin.h"
#include "script_editor_debugger.h"
#include "tools/editor/plugins/script_editor_plugin.h"
#include "core/io/resource_saver.h"
#include "multi_node_edit.h"
void SceneTreeDock::_unhandled_key_input(InputEvent p_event) {
@ -485,7 +486,54 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
delete_dialog->popup_centered_minsize();
}
} break;
case TOOL_NEW_SCENE_FROM: {
Node *scene = editor_data->get_edited_scene_root();
if (!scene) {
accept->get_ok()->set_text("I see..");
accept->set_text("This operation can't be done without a scene.");
accept->popup_centered_minsize();
break;
}
List<Node*> selection = editor_selection->get_selected_node_list();
if (selection.size()!=1) {
accept->get_ok()->set_text("I see..");
accept->set_text("This operation requires a single selected node.");
accept->popup_centered_minsize();
break;
}
Node *tocopy = selection.front()->get();
if (tocopy!=editor_data->get_edited_scene_root() && tocopy->get_filename()!="") {
accept->get_ok()->set_text("I see..");
accept->set_text("This operation can't be done on instanced scenes.");
accept->popup_centered_minsize();
break;
}
new_scene_from_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
List<String> extensions;
Ref<PackedScene> sd = memnew( PackedScene );
ResourceSaver::get_recognized_extensions(sd,&extensions);
new_scene_from_dialog->clear_filters();
for(int i=0;i<extensions.size();i++) {
new_scene_from_dialog->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
}
String existing;
if (extensions.size()) {
existing="new_scene."+extensions.front()->get().to_lower();
}
new_scene_from_dialog->set_current_path(existing);
new_scene_from_dialog->popup_centered_ratio();
new_scene_from_dialog->set_title("Save New Scene As..");
} break;
@ -520,6 +568,7 @@ void SceneTreeDock::_notification(int p_what) {
"MoveDown",
"Duplicate",
"Reparent",
"CreateNewSceneFrom",
"MultiNodeEdit",
"Remove",
};
@ -1103,6 +1152,7 @@ void SceneTreeDock::_update_tool_buttons() {
tool_buttons[TOOL_DUPLICATE]->set_disabled(disable_root);
tool_buttons[TOOL_REPARENT]->set_disabled(disable_root);
tool_buttons[TOOL_ERASE]->set_disabled(disable);
tool_buttons[TOOL_NEW_SCENE_FROM]->set_disabled(disable_root);
tool_buttons[TOOL_MULTI_EDIT]->set_disabled(EditorNode::get_singleton()->get_editor_selection()->get_selection().size()<2);
@ -1284,6 +1334,59 @@ void SceneTreeDock::_import_subscene() {
*/
}
void SceneTreeDock::_new_scene_from(String p_file) {
List<Node*> selection = editor_selection->get_selected_node_list();
if (selection.size()!=1) {
accept->get_ok()->set_text("I see..");
accept->set_text("This operation requires a single selected node.");
accept->popup_centered_minsize();
return;
}
Node *base = selection.front()->get();
Map<Node*,Node*> reown;
reown[editor_data->get_edited_scene_root()]=base;
Node *copy = base->duplicate_and_reown(reown);
if (copy) {
Ref<PackedScene> sdata = memnew( PackedScene );
Error err = sdata->pack(copy);
memdelete(copy);
if (err!=OK) {
accept->get_ok()->set_text("I see..");
accept->set_text("Couldn't save new scene. Likely dependencies (instances) couldn't be satisfied.");
accept->popup_centered_minsize();
return;
}
int flg=0;
if (EditorSettings::get_singleton()->get("on_save/compress_binary_resources"))
flg|=ResourceSaver::FLAG_COMPRESS;
if (EditorSettings::get_singleton()->get("on_save/save_paths_as_relative"))
flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
err = ResourceSaver::save(p_file,sdata,flg);
if (err!=OK) {
accept->get_ok()->set_text("I see..");
accept->set_text("Error saving scene.");
accept->popup_centered_minsize();
return;
}
} else {
accept->get_ok()->set_text("I see..");
accept->set_text("Error duplicating scene to save it.");
accept->popup_centered_minsize();
return;
}
}
void SceneTreeDock::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_tool_selected"),&SceneTreeDock::_tool_selected);
@ -1301,6 +1404,7 @@ void SceneTreeDock::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_node_prerenamed"),&SceneTreeDock::_node_prerenamed);
ObjectTypeDB::bind_method(_MD("_import_subscene"),&SceneTreeDock::_import_subscene);
ObjectTypeDB::bind_method(_MD("_selection_changed"),&SceneTreeDock::_selection_changed);
ObjectTypeDB::bind_method(_MD("_new_scene_from"),&SceneTreeDock::_new_scene_from);
ObjectTypeDB::bind_method(_MD("instance"),&SceneTreeDock::instance);
}
@ -1403,6 +1507,12 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec
hbc_bottom->add_spacer();
tb = memnew( ToolButton );
tb->connect("pressed",this,"_tool_selected",make_binds(TOOL_NEW_SCENE_FROM, false));
tb->set_tooltip("Create New Scene From Node(s)");
hbc_bottom->add_child(tb);
tool_buttons[TOOL_NEW_SCENE_FROM]=tb;
tb = memnew( ToolButton );
tb->connect("pressed",this,"_tool_selected",make_binds(TOOL_MULTI_EDIT, false));
tb->set_tooltip("Multi-Edit Selected Nodes");
@ -1423,12 +1533,15 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec
groups_editor = memnew( GroupsEditor );
add_child(groups_editor);
groups_editor->set_undo_redo(&editor_data->get_undo_redo());
connect_dialog = memnew( ConnectionsDialog(p_editor) );
add_child(connect_dialog);
connect_dialog->set_undoredo(&editor_data->get_undo_redo());
script_create_dialog = memnew( ScriptCreateDialog );
add_child(script_create_dialog);
script_create_dialog->connect("script_created",this,"_script_created");
reparent_dialog = memnew( ReparentDialog );
add_child(reparent_dialog);
reparent_dialog->connect("reparent",this,"_node_reparent");
@ -1444,10 +1557,16 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec
delete_dialog = memnew( ConfirmationDialog );
add_child(delete_dialog);
delete_dialog->connect("confirmed",this,"_delete_confirm");
import_subscene_dialog = memnew( EditorSubScene );
add_child(import_subscene_dialog);
import_subscene_dialog->connect("subscene_selected",this,"_import_subscene");
new_scene_from_dialog = memnew( EditorFileDialog );
new_scene_from_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
add_child(new_scene_from_dialog);
new_scene_from_dialog->connect("file_selected",this,"_new_scene_from");
first_enter=true;

View file

@ -62,6 +62,7 @@ class SceneTreeDock : public VBoxContainer {
TOOL_MOVE_DOWN,
TOOL_DUPLICATE,
TOOL_REPARENT,
TOOL_NEW_SCENE_FROM,
TOOL_MULTI_EDIT,
TOOL_ERASE,
TOOL_BUTTON_MAX
@ -90,6 +91,7 @@ class SceneTreeDock : public VBoxContainer {
ReparentDialog *reparent_dialog;
EditorFileDialog *file;
EditorSubScene *import_subscene_dialog;
EditorFileDialog *new_scene_from_dialog;
bool first_enter;
@ -119,6 +121,8 @@ class SceneTreeDock : public VBoxContainer {
void _import_subscene();
void _new_scene_from(String p_file);
bool _validate_no_foreign();
void _selection_changed();