Merge pull request #2873 from neikeq/editor_layouts

Editor layouts menu
This commit is contained in:
Juan Linietsky 2015-12-08 17:09:38 -03:00
commit c26f66abde
4 changed files with 317 additions and 21 deletions

View file

@ -0,0 +1,59 @@
/*************************************************************************/
/* editor_node.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2015 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "editor_layout_dialog.h"
#include "object_type_db.h"
void EditorLayoutDialog::clear_layout_name() {
layout_name->clear();
}
void EditorLayoutDialog::ok_pressed() {
if (layout_name->get_text()!="") {
emit_signal("layout_selected", layout_name->get_text());
}
}
void EditorLayoutDialog::_bind_methods() {
ADD_SIGNAL(MethodInfo("layout_selected",PropertyInfo( Variant::STRING,"layout_name")));
}
EditorLayoutDialog::EditorLayoutDialog()
{
layout_name = memnew( LineEdit );
layout_name->set_margin(MARGIN_TOP,5);
layout_name->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,5);
layout_name->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5);
add_child(layout_name);
move_child(layout_name, get_label()->get_index()+1);
}

View file

@ -0,0 +1,53 @@
/*************************************************************************/
/* editor_layout_dialog.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2015 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#ifndef EDITOR_LAYOUT_DIALOG_H
#define EDITOR_LAYOUT_DIALOG_H
#include "scene/gui/dialogs.h"
#include "scene/gui/line_edit.h"
class EditorLayoutDialog : public ConfirmationDialog {
OBJ_TYPE( EditorLayoutDialog, ConfirmationDialog );
LineEdit *layout_name;
protected:
static void _bind_methods();
virtual void ok_pressed();
public:
void clear_layout_name();
EditorLayoutDialog();
};
#endif // EDITOR_LAYOUT_DIALOG_H

View file

@ -543,7 +543,6 @@ void EditorNode::save_resource_as(const Ref<Resource>& p_resource) {
} }
void EditorNode::_menu_option(int p_option) { void EditorNode::_menu_option(int p_option) {
_menu_option_confirm(p_option,false); _menu_option_confirm(p_option,false);
@ -1409,6 +1408,69 @@ void EditorNode::_dialog_action(String p_file) {
save_resource_in_path(current_res,p_file); save_resource_in_path(current_res,p_file);
} break;
case SETTINGS_LAYOUT_SAVE: {
if (p_file.empty())
return;
if (p_file=="Default") {
confirm_error->set_text("Cannot overwrite default layout!");
confirm_error->popup_centered_minsize();
return;
}
Ref<ConfigFile> config;
config.instance();
Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
if (err!=OK && err!=ERR_FILE_NOT_FOUND) {
return; //no config
}
_save_docks_to_config(config, p_file);
config->save(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
layout_dialog->hide();
_update_layouts_menu();
} break;
case SETTINGS_LAYOUT_DELETE: {
if (p_file.empty())
return;
if (p_file=="Default") {
confirm_error->set_text("Cannot delete default layout!");
confirm_error->popup_centered_minsize();
return;
}
Ref<ConfigFile> config;
config.instance();
Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
if (err!=OK) {
return; //no config
}
if (!config->has_section(p_file)) {
confirm_error->set_text("Layout name not found!");
confirm_error->popup_centered_minsize();
return;
}
// erase
List<String> keys;
config->get_section_keys(p_file, &keys);
for (List<String>::Element *E=keys.front();E;E=E->next()) {
config->set_value(p_file, E->get(), Variant());
}
config->save(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
layout_dialog->hide();
_update_layouts_menu();
} break; } break;
default: { //save scene? default: { //save scene?
@ -4033,6 +4095,9 @@ void EditorNode::_bind_methods() {
ObjectTypeDB::bind_method("_dock_move_left",&EditorNode::_dock_move_left); ObjectTypeDB::bind_method("_dock_move_left",&EditorNode::_dock_move_left);
ObjectTypeDB::bind_method("_dock_move_right",&EditorNode::_dock_move_right); ObjectTypeDB::bind_method("_dock_move_right",&EditorNode::_dock_move_right);
ObjectTypeDB::bind_method("_layout_menu_option",&EditorNode::_layout_menu_option);
ObjectTypeDB::bind_method("_layout_dialog_action",&EditorNode::_dialog_action);
ObjectTypeDB::bind_method("set_current_scene",&EditorNode::set_current_scene); ObjectTypeDB::bind_method("set_current_scene",&EditorNode::set_current_scene);
ObjectTypeDB::bind_method("set_current_version",&EditorNode::set_current_version); ObjectTypeDB::bind_method("set_current_version",&EditorNode::set_current_version);
ObjectTypeDB::bind_method("_scene_tab_changed",&EditorNode::_scene_tab_changed); ObjectTypeDB::bind_method("_scene_tab_changed",&EditorNode::_scene_tab_changed);
@ -4327,6 +4392,15 @@ void EditorNode::_save_docks() {
Ref<ConfigFile> config; Ref<ConfigFile> config;
config.instance(); config.instance();
_save_docks_to_config(config, "docks");
editor_data.get_plugin_window_layout(config);
config->save(EditorSettings::get_singleton()->get_project_settings_path().plus_file("editor_layout.cfg"));
}
void EditorNode::_save_docks_to_config(Ref<ConfigFile> p_layout, const String& p_section) {
for(int i=0;i<DOCK_SLOT_MAX;i++) { for(int i=0;i<DOCK_SLOT_MAX;i++) {
String names; String names;
for(int j=0;j<dock_slot[i]->get_tab_count();j++) { for(int j=0;j<dock_slot[i]->get_tab_count();j++) {
@ -4337,7 +4411,7 @@ void EditorNode::_save_docks() {
} }
if (names!="") { if (names!="") {
config->set_value("docks","dock_"+itos(i+1),names); p_layout->set_value(p_section,"dock_"+itos(i+1),names);
} }
} }
@ -4351,7 +4425,7 @@ void EditorNode::_save_docks() {
for(int i=0;i<DOCK_SLOT_MAX/2;i++) { for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
if (splits[i]->is_visible()) { if (splits[i]->is_visible()) {
config->set_value("docks","dock_split_"+itos(i+1),splits[i]->get_split_offset()); p_layout->set_value(p_section,"dock_split_"+itos(i+1),splits[i]->get_split_offset());
} }
} }
@ -4365,13 +4439,9 @@ void EditorNode::_save_docks() {
for(int i=0;i<4;i++) { for(int i=0;i<4;i++) {
config->set_value("docks","dock_hsplit_"+itos(i+1),h_splits[i]->get_split_offset()); p_layout->set_value(p_section,"dock_hsplit_"+itos(i+1),h_splits[i]->get_split_offset());
} }
editor_data.get_plugin_window_layout(config);
config->save(EditorSettings::get_singleton()->get_project_settings_path().plus_file("editor_layout.cfg"));
} }
void EditorNode::save_layout() { void EditorNode::save_layout() {
@ -4393,12 +4463,19 @@ void EditorNode::_load_docks() {
return; //no config return; //no config
} }
_load_docks_from_config(config, "docks");
editor_data.set_plugin_window_layout(config);
}
void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String& p_section) {
for(int i=0;i<DOCK_SLOT_MAX;i++) { for(int i=0;i<DOCK_SLOT_MAX;i++) {
if (!config->has_section_key("docks","dock_"+itos(i+1))) if (!p_layout->has_section_key(p_section,"dock_"+itos(i+1)))
continue; continue;
Vector<String> names = String(config->get_value("docks","dock_"+itos(i+1))).split(","); Vector<String> names = String(p_layout->get_value(p_section,"dock_"+itos(i+1))).split(",");
for(int j=0;j<names.size();j++) { for(int j=0;j<names.size();j++) {
@ -4418,7 +4495,7 @@ void EditorNode::_load_docks() {
if (atidx==-1) //well, it's not anywhere if (atidx==-1) //well, it's not anywhere
continue; continue;
if (atidx==j) { if (atidx==i) {
node->raise(); node->raise();
continue; continue;
} }
@ -4433,7 +4510,6 @@ void EditorNode::_load_docks() {
dock_slot[i]->add_child(node); dock_slot[i]->add_child(node);
dock_slot[i]->show(); dock_slot[i]->show();
} }
} }
VSplitContainer*splits[DOCK_SLOT_MAX/2]={ VSplitContainer*splits[DOCK_SLOT_MAX/2]={
@ -4445,14 +4521,14 @@ void EditorNode::_load_docks() {
for(int i=0;i<DOCK_SLOT_MAX/2;i++) { for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
if (!config->has_section_key("docks","dock_split_"+itos(i+1))) if (!p_layout->has_section_key(p_section,"dock_split_"+itos(i+1)))
continue; continue;
int ofs = config->get_value("docks","dock_split_"+itos(i+1)); int ofs = p_layout->get_value(p_section,"dock_split_"+itos(i+1));
splits[i]->set_split_offset(ofs); splits[i]->set_split_offset(ofs);
} }
HSplitContainer *h_splits[4]={ HSplitContainer*h_splits[4]={
left_l_hsplit, left_l_hsplit,
left_r_hsplit, left_r_hsplit,
main_hsplit, main_hsplit,
@ -4460,9 +4536,9 @@ void EditorNode::_load_docks() {
}; };
for(int i=0;i<4;i++) { for(int i=0;i<4;i++) {
if (!config->has_section_key("docks","dock_hsplit_"+itos(i+1))) if (!p_layout->has_section_key(p_section,"dock_hsplit_"+itos(i+1)))
continue; continue;
int ofs = config->get_value("docks","dock_hsplit_"+itos(i+1)); int ofs = p_layout->get_value(p_section,"dock_hsplit_"+itos(i+1));
h_splits[i]->set_split_offset(ofs); h_splits[i]->set_split_offset(ofs);
} }
@ -4480,8 +4556,78 @@ void EditorNode::_load_docks() {
dock_slot[i]->set_current_tab(0); dock_slot[i]->set_current_tab(0);
} }
} }
}
editor_data.set_plugin_window_layout(config);
void EditorNode::_update_layouts_menu() {
editor_layouts->clear();
editor_layouts->set_size(Vector2());
editor_layouts->add_item("Save Layout", SETTINGS_LAYOUT_SAVE);
editor_layouts->add_item("Delete Layout", SETTINGS_LAYOUT_DELETE);
editor_layouts->add_separator();
editor_layouts->add_item("Default", SETTINGS_LAYOUT_DEFAULT);
Ref<ConfigFile> config;
config.instance();
Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
if (err!=OK) {
return; //no config
}
List<String> layouts;
config.ptr()->get_sections(&layouts);
for (List<String>::Element *E=layouts.front();E;E=E->next()) {
String layout=E->get();
if (layout!="Default")
editor_layouts->add_item(layout);
}
}
void EditorNode::_layout_menu_option(int p_id) {
switch (p_id) {
case SETTINGS_LAYOUT_SAVE: {
current_option=p_id;
layout_dialog->clear_layout_name();
layout_dialog->set_title("Save Layout");
layout_dialog->get_ok()->set_text("Save");
layout_dialog->popup_centered();
} break;
case SETTINGS_LAYOUT_DELETE: {
current_option=p_id;
layout_dialog->clear_layout_name();
layout_dialog->set_title("Delete Layout");
layout_dialog->get_ok()->set_text("Delete");
layout_dialog->popup_centered();
} break;
case SETTINGS_LAYOUT_DEFAULT: {
_load_docks_from_config(default_theme, "docks");
_save_docks();
} break;
default: {
Ref<ConfigFile> config;
config.instance();
Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
if (err!=OK) {
return; //no config
}
int idx=editor_layouts->get_item_index(p_id);
_load_docks_from_config(config, editor_layouts->get_item_text(idx));
_save_docks();
}
}
} }
@ -5237,17 +5383,29 @@ EditorNode::EditorNode() {
right_menu_hb->add_child( settings_menu ); right_menu_hb->add_child( settings_menu );
p=settings_menu->get_popup(); p=settings_menu->get_popup();
//p->add_item("Export Settings",SETTINGS_EXPORT_PREFERENCES); //p->add_item("Export Settings",SETTINGS_EXPORT_PREFERENCES);
p->add_item("Editor Settings",SETTINGS_PREFERENCES); p->add_item("Editor Settings",SETTINGS_PREFERENCES);
//p->add_item("Optimization Presets",SETTINGS_OPTIMIZED_PRESETS); //p->add_item("Optimization Presets",SETTINGS_OPTIMIZED_PRESETS);
p->add_separator(); p->add_separator();
editor_layouts = memnew( PopupMenu );
editor_layouts->set_name("Layouts");
p->add_child(editor_layouts);
editor_layouts->connect("item_pressed",this,"_layout_menu_option");
p->add_submenu_item("Editor Layout", "Layouts");
p->add_separator();
p->add_check_item("Show Animation",SETTINGS_SHOW_ANIMATION,KEY_MASK_CMD+KEY_N); p->add_check_item("Show Animation",SETTINGS_SHOW_ANIMATION,KEY_MASK_CMD+KEY_N);
p->add_separator(); p->add_separator();
p->add_item("Install Export Templates",SETTINGS_LOAD_EXPORT_TEMPLATES); p->add_item("Install Export Templates",SETTINGS_LOAD_EXPORT_TEMPLATES);
p->add_separator(); p->add_separator();
p->add_item("About",SETTINGS_ABOUT); p->add_item("About",SETTINGS_ABOUT);
layout_dialog = memnew( EditorLayoutDialog );
gui_base->add_child(layout_dialog);
layout_dialog->set_hide_on_ok(false);
layout_dialog->set_size(Size2(175, 70));
confirm_error = memnew( AcceptDialog );
layout_dialog->add_child(confirm_error);
layout_dialog->connect("layout_selected", this,"_layout_dialog_action");
sources_button = memnew( ToolButton ); sources_button = memnew( ToolButton );
right_menu_hb->add_child(sources_button); right_menu_hb->add_child(sources_button);
@ -5434,7 +5592,19 @@ EditorNode::EditorNode() {
scenes_dock->connect("open",this,"open_request"); scenes_dock->connect("open",this,"open_request");
scenes_dock->connect("instance",this,"_instance_request"); scenes_dock->connect("instance",this,"_instance_request");
const String docks_section = "docks";
default_theme.instance();
default_theme->set_value(docks_section, "dock_3", "Scene");
default_theme->set_value(docks_section, "dock_4", "FileSystem");
default_theme->set_value(docks_section, "dock_5", "Inspector");
for(int i=0;i<DOCK_SLOT_MAX/2;i++)
default_theme->set_value(docks_section, "dock_hsplit_"+itos(i+1), 0);
for(int i=0;i<DOCK_SLOT_MAX/2;i++)
default_theme->set_value(docks_section, "dock_split_"+itos(i+1), 0);
_update_layouts_menu();
log = memnew( EditorLog ); log = memnew( EditorLog );
center_split->add_child(log); center_split->add_child(log);
@ -5743,7 +5913,7 @@ EditorNode::EditorNode() {
resource_preview->add_preview_generator( Ref<EditorMeshPreviewPlugin>( memnew(EditorMeshPreviewPlugin ))); resource_preview->add_preview_generator( Ref<EditorMeshPreviewPlugin>( memnew(EditorMeshPreviewPlugin )));
circle_step_msec=OS::get_singleton()->get_ticks_msec(); circle_step_msec=OS::get_singleton()->get_ticks_msec();
circle_step_frame=OS::get_singleton()->get_frames_drawn();; circle_step_frame=OS::get_singleton()->get_frames_drawn();
circle_step=0; circle_step=0;
_rebuild_import_menu(); _rebuild_import_menu();

View file

@ -76,6 +76,7 @@
#include "editor_reimport_dialog.h" #include "editor_reimport_dialog.h"
#include "import_settings.h" #include "import_settings.h"
#include "tools/editor/editor_plugin.h" #include "tools/editor/editor_plugin.h"
#include "tools/editor/editor_layout_dialog.h"
#include "fileserver/editor_file_server.h" #include "fileserver/editor_file_server.h"
#include "editor_resource_preview.h" #include "editor_resource_preview.h"
@ -167,6 +168,9 @@ class EditorNode : public Node {
SETTINGS_EXPORT_PREFERENCES, SETTINGS_EXPORT_PREFERENCES,
SETTINGS_PREFERENCES, SETTINGS_PREFERENCES,
SETTINGS_OPTIMIZED_PRESETS, SETTINGS_OPTIMIZED_PRESETS,
SETTINGS_LAYOUT_SAVE,
SETTINGS_LAYOUT_DELETE,
SETTINGS_LAYOUT_DEFAULT,
SETTINGS_SHOW_ANIMATION, SETTINGS_SHOW_ANIMATION,
SETTINGS_LOAD_EXPORT_TEMPLATES, SETTINGS_LOAD_EXPORT_TEMPLATES,
SETTINGS_HELP, SETTINGS_HELP,
@ -284,6 +288,11 @@ class EditorNode : public Node {
AcceptDialog *about; AcceptDialog *about;
AcceptDialog *warning; AcceptDialog *warning;
Ref<ConfigFile> default_theme;
PopupMenu *editor_layouts;
EditorLayoutDialog *layout_dialog;
AcceptDialog *confirm_error;
//OptimizedPresetsDialog *optimized_presets; //OptimizedPresetsDialog *optimized_presets;
EditorSettingsDialog *settings_config_dialog; EditorSettingsDialog *settings_config_dialog;
RunSettingsDialog *run_settings_dialog; RunSettingsDialog *run_settings_dialog;
@ -523,13 +532,18 @@ class EditorNode : public Node {
void _save_docks(); void _save_docks();
void _load_docks(); void _load_docks();
void _save_docks_to_config(Ref<ConfigFile> p_layout, const String& p_section);
void _load_docks_from_config(Ref<ConfigFile> p_layout, const String& p_section);
void _update_layouts_menu();
void _layout_menu_option(int p_idx);
void _toggle_search_bar(bool p_pressed); void _toggle_search_bar(bool p_pressed);
void _clear_search_box(); void _clear_search_box();
protected: protected:
void _notification(int p_what); void _notification(int p_what);
static void _bind_methods(); static void _bind_methods();
public: public:
enum EditorTable { enum EditorTable {