diff options
author | Juan Linietsky <reduzio@gmail.com> | 2017-09-14 10:38:59 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2017-09-14 10:39:47 -0300 |
commit | 7e3c5043c1a676c69a3b81bbfb3ac95997f1ab1c (patch) | |
tree | 93d9eb8d3b212644cc18ce9ee356dabd88961df8 | |
parent | 8c08f2380d30e300f4f80dd292e9ff83f7bb84fd (diff) |
Warn the user that changes to resources will be lost when editing imported or instanced resources from scenes.
-rw-r--r-- | editor/editor_node.cpp | 52 | ||||
-rw-r--r-- | editor/editor_node.h | 4 |
2 files changed, 56 insertions, 0 deletions
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 3735c30578..d0474825d7 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -254,6 +254,7 @@ void EditorNode::_notification(int p_what) { get_tree()->get_root()->set_as_audio_listener_2d(false); get_tree()->set_auto_accept_quit(false); get_tree()->connect("files_dropped", this, "_dropped_files"); + property_editable_warning->set_icon(gui_base->get_icon("NodeWarning","EditorIcons")); } if (p_what == NOTIFICATION_EXIT_TREE) { @@ -1387,6 +1388,11 @@ static bool overrides_external_editor(Object *p_object) { return script->get_language()->overrides_external_editor(); } +void EditorNode::_property_editable_warning_pressed() { + + property_editable_warning_dialog->popup_centered_minsize(); +} + void EditorNode::_edit_current() { uint32_t current = editor_history.get_current(); @@ -1398,6 +1404,9 @@ void EditorNode::_edit_current() { this->current = current_obj; editor_path->update_path(); + String editable_warning; //none by default + property_editable_warning->hide(); //hide by default + if (!current_obj) { scene_tree_dock->set_selected(NULL); @@ -1425,6 +1434,22 @@ void EditorNode::_edit_current() { node_dock->set_node(NULL); object_menu->set_disabled(false); EditorNode::get_singleton()->get_import_dock()->set_edit_path(current_res->get_path()); + + int subr_idx = current_res->get_path().find("::"); + if (subr_idx!=-1) { + String base_path=current_res->get_path().substr(0,subr_idx); + if (FileAccess::exists(base_path+".import")) { + editable_warning=TTR("This resource belongs to a scene that was imported, so it's not editable.\nPlease read the documentation relevant to importing scenes to better understand this workflow."); + } else { + if (!get_edited_scene() || get_edited_scene()->get_filename()!=base_path) { + editable_warning=TTR("This resource belongs to a scene that was instanced or inherited.\nChanges to it will not be kept when saving the current scene."); + } + } + } else if (current_res->get_path().is_resource_file()){ + if (FileAccess::exists(current_res->get_path()+".import")) { + editable_warning=TTR("This resource was imported, so it's not editable. Change it's settings in the import panel and re-import."); + } + } } else if (is_node) { Node *current_node = Object::cast_to<Node>(current_obj); @@ -1440,12 +1465,25 @@ void EditorNode::_edit_current() { } object_menu->get_popup()->clear(); + if (get_edited_scene() && get_edited_scene()->get_filename()!=String()) { + String source_scene = get_edited_scene()->get_filename(); + if (FileAccess::exists(source_scene+".import")) { + editable_warning=TTR("This scene was imported, so changes to it will not be kept.\nInstancing it or inheriting will allow making changes to it.\nPlease read the documentation relevant to importing scenes to better understand this workflow."); + } + } + } else { property_editor->edit(current_obj); node_dock->set_node(NULL); } + if (editable_warning!=String()) { + property_editable_warning->show(); //hide by default + property_editable_warning_dialog->set_text(editable_warning); + + } + /* Take care of PLUGIN EDITOR */ EditorPlugin *main_plugin = editor_data.get_editor(current_obj); @@ -4471,6 +4509,9 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_clear_undo_history", &EditorNode::_clear_undo_history); ClassDB::bind_method("_dropped_files", &EditorNode::_dropped_files); ClassDB::bind_method("_toggle_distraction_free_mode", &EditorNode::_toggle_distraction_free_mode); + ClassDB::bind_method("_property_editable_warning_pressed", &EditorNode::_property_editable_warning_pressed); + + ClassDB::bind_method(D_METHOD("get_gui_base"), &EditorNode::get_gui_base); ClassDB::bind_method(D_METHOD("_bottom_panel_switch"), &EditorNode::_bottom_panel_switch); @@ -5232,6 +5273,15 @@ EditorNode::EditorNode() { search_bar->add_child(clear_button); clear_button->connect("pressed", this, "_clear_search_box"); + property_editable_warning = memnew (Button); + property_editable_warning->set_text(TTR("Changes my be lost!")); + prop_editor_base->add_child(property_editable_warning); + property_editable_warning_dialog = memnew( AcceptDialog ); + gui_base->add_child(property_editable_warning_dialog); + property_editable_warning->hide(); + property_editable_warning->connect("pressed",this,"_property_editable_warning_pressed"); + + property_editor = memnew(PropertyEditor); property_editor->set_autoclear(true); property_editor->set_show_categories(true); @@ -5244,6 +5294,7 @@ EditorNode::EditorNode() { property_editor->hide_top_label(); property_editor->register_text_enter(search_box); + Button *property_editable_warning; prop_editor_base->add_child(property_editor); property_editor->set_undo_redo(&editor_data.get_undo_redo()); @@ -5251,6 +5302,7 @@ EditorNode::EditorNode() { dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(import_dock); import_dock->set_name(TTR("Import")); + bool use_single_dock_column = (OS::get_singleton()->get_screen_size(OS::get_singleton()->get_current_screen()).x < 1200); node_dock = memnew(NodeDock); diff --git a/editor/editor_node.h b/editor/editor_node.h index ea74bcbd9d..5c6c5be4c8 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -262,6 +262,9 @@ private: Button *property_forward; SceneTreeDock *scene_tree_dock; PropertyEditor *property_editor; + Button *property_editable_warning; + AcceptDialog *property_editable_warning_dialog; + void _property_editable_warning_pressed(); NodeDock *node_dock; ImportDock *import_dock; VBoxContainer *prop_editor_vb; @@ -606,6 +609,7 @@ private: void _license_tree_selected(); + protected: void _notification(int p_what); static void _bind_methods(); |