/*************************************************************************/ /* theme_editor_plugin.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* http://www.godotengine.org */ /*************************************************************************/ /* Copyright (c) 2007-2016 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 "version.h" #include "theme_editor_plugin.h" #include "os/file_access.h" void ThemeEditor::edit(const Ref<Theme>& p_theme) { theme=p_theme; main_vb->set_theme(p_theme); } void ThemeEditor::_propagate_redraw(Control *p_at) { p_at->notification(NOTIFICATION_THEME_CHANGED); p_at->minimum_size_changed(); p_at->update(); for(int i=0;i<p_at->get_child_count();i++) { Control *a = p_at->get_child(i)->cast_to<Control>(); if (a) _propagate_redraw(a); } } void ThemeEditor::_refresh_interval() { _propagate_redraw(main_vb); } void ThemeEditor::_type_menu_cbk(int p_option) { type_edit->set_text( type_menu->get_popup()->get_item_text(p_option) ); } void ThemeEditor::_name_menu_about_to_show() { String fromtype=type_edit->get_text(); List<StringName> names; if (popup_mode==POPUP_ADD) { switch(type_select->get_selected()) { case 0: Theme::get_default()->get_icon_list(fromtype,&names); break; case 1: Theme::get_default()->get_stylebox_list(fromtype,&names); break; case 2: Theme::get_default()->get_font_list(fromtype,&names); break; case 3: Theme::get_default()->get_color_list(fromtype,&names); break; case 4: Theme::get_default()->get_constant_list(fromtype,&names); break; } } else if (popup_mode==POPUP_REMOVE) { theme->get_icon_list(fromtype,&names); theme->get_stylebox_list(fromtype,&names); theme->get_font_list(fromtype,&names); theme->get_color_list(fromtype,&names); theme->get_constant_list(fromtype,&names); } name_menu->get_popup()->clear(); for(List<StringName>::Element *E=names.front();E;E=E->next()) { name_menu->get_popup()->add_item(E->get()); } } void ThemeEditor::_name_menu_cbk(int p_option) { name_edit->set_text( name_menu->get_popup()->get_item_text(p_option) ); } struct _TECategory { template<class T> struct RefItem { Ref<T> item; StringName name; bool operator<(const RefItem<T>& p) const { return item->get_instance_ID() < p.item->get_instance_ID(); } }; template<class T> struct Item { T item; String name; bool operator<(const Item<T>& p) const { return name < p.name; } }; Set<RefItem<StyleBox> > stylebox_items; Set<RefItem<Font> > font_items; Set<RefItem<Texture> > icon_items; Set<Item<Color> > color_items; Set<Item<int> > constant_items; }; void ThemeEditor::_save_template_cbk(String fname) { String filename = file_dialog->get_current_path(); Map<String,_TECategory> categories; //fill types List<StringName> type_list; Theme::get_default()->get_type_list(&type_list); for (List<StringName>::Element *E=type_list.front();E;E=E->next()) { categories.insert(E->get(),_TECategory()); } //fill default theme for(Map<String,_TECategory>::Element *E=categories.front();E;E=E->next() ) { _TECategory &tc = E->get(); List<StringName> stylebox_list; Theme::get_default()->get_stylebox_list(E->key(),&stylebox_list); for (List<StringName>::Element *F=stylebox_list.front();F;F=F->next()) { _TECategory::RefItem<StyleBox> it; it.name=F->get(); it.item=Theme::get_default()->get_stylebox(F->get(),E->key()); tc.stylebox_items.insert(it); } List<StringName> font_list; Theme::get_default()->get_font_list(E->key(),&font_list); for (List<StringName>::Element *F=font_list.front();F;F=F->next()) { _TECategory::RefItem<Font> it; it.name=F->get(); it.item=Theme::get_default()->get_font(F->get(),E->key()); tc.font_items.insert(it); } List<StringName> icon_list; Theme::get_default()->get_icon_list(E->key(),&icon_list); for (List<StringName>::Element *F=icon_list.front();F;F=F->next()) { _TECategory::RefItem<Texture> it; it.name=F->get(); it.item=Theme::get_default()->get_icon(F->get(),E->key()); tc.icon_items.insert(it); } List<StringName> color_list; Theme::get_default()->get_color_list(E->key(),&color_list); for (List<StringName>::Element *F=color_list.front();F;F=F->next()) { _TECategory::Item<Color> it; it.name=F->get(); it.item=Theme::get_default()->get_color(F->get(),E->key()); tc.color_items.insert(it); } List<StringName> constant_list; Theme::get_default()->get_constant_list(E->key(),&constant_list); for (List<StringName>::Element *F=constant_list.front();F;F=F->next()) { _TECategory::Item<int> it; it.name=F->get(); it.item=Theme::get_default()->get_constant(F->get(),E->key()); tc.constant_items.insert(it); } } FileAccess *file = FileAccess::open(filename,FileAccess::WRITE); if (!file) { ERR_EXPLAIN("Can't save theme to file: "+filename); return; } file->store_line("; ******************* "); file->store_line("; Template Theme File "); file->store_line("; ******************* "); file->store_line("; "); file->store_line("; Theme Syntax: "); file->store_line("; ------------- "); file->store_line("; "); file->store_line("; Must be placed in section [theme]"); file->store_line("; "); file->store_line("; Type.item = [value] "); file->store_line("; "); file->store_line("; [value] examples:"); file->store_line("; "); file->store_line("; Type.item = 6 ; numeric constant. "); file->store_line("; Type.item = #FF00FF ; HTML color "); file->store_line("; Type.item = #55FF00FF ; HTML color with alpha 55."); file->store_line("; Type.item = icon(image.png) ; icon in a png file (relative to theme file)."); file->store_line("; Type.item = font(font.xres) ; font in a resource (relative to theme file)."); file->store_line("; Type.item = sbox(stylebox.xres) ; stylebox in a resource (relative to theme file)."); file->store_line("; Type.item = sboxf(2,#FF00FF) ; flat stylebox with margin 2."); file->store_line("; Type.item = sboxf(2,#FF00FF,#FFFFFF) ; flat stylebox with margin 2 and border."); file->store_line("; Type.item = sboxf(2,#FF00FF,#FFFFFF,#000000) ; flat stylebox with margin 2, light & dark borders."); file->store_line("; Type.item = sboxt(base.png,2,2,2,2) ; textured stylebox with 3x3 stretch and stretch margins."); file->store_line("; -Additionally, 4 extra integers can be added to sboxf and sboxt to specify custom padding of contents:"); file->store_line("; Type.item = sboxt(base.png,2,2,2,2,5,4,2,4) ;"); file->store_line("; -Order for all is always left, top, right, bottom."); file->store_line("; "); file->store_line("; Special values:"); file->store_line("; Type.item = default ; use the value in the default theme (must exist there)."); file->store_line("; Type.item = @somebutton_color ; reference to a library value previously defined."); file->store_line("; "); file->store_line("; Library Syntax: "); file->store_line("; --------------- "); file->store_line("; "); file->store_line("; Must be placed in section [library], but usage is optional."); file->store_line("; "); file->store_line("; item = [value] ; same as Theme, but assign to library."); file->store_line("; "); file->store_line("; examples:"); file->store_line("; "); file->store_line("; [library]"); file->store_line("; "); file->store_line("; default_button_color = #FF00FF"); file->store_line("; "); file->store_line("; [theme]"); file->store_line("; "); file->store_line("; Button.color = @default_button_color ; used reference."); file->store_line("; "); file->store_line("; ******************* "); file->store_line("; "); file->store_line("; Template Generated Using: "+String(VERSION_MKSTRING)); file->store_line("; "); file->store_line("; "); file->store_line(""); file->store_line("[library]"); file->store_line(""); file->store_line("; place library stuff here"); file->store_line(""); file->store_line("[theme]"); file->store_line(""); file->store_line(""); //write default theme for(Map<String,_TECategory>::Element *E=categories.front();E;E=E->next() ) { _TECategory &tc = E->get(); String underline="; "; for(int i=0;i<E->key().length();i++) underline+="*"; file->store_line(""); file->store_line(underline); file->store_line("; "+E->key()); file->store_line(underline); if (tc.stylebox_items.size()) file->store_line("\n; StyleBox Items:\n"); for (Set<_TECategory::RefItem<StyleBox> >::Element *F=tc.stylebox_items.front();F;F=F->next()) { file->store_line(E->key()+"."+F->get().name+" = default"); } if (tc.font_items.size()) file->store_line("\n; Font Items:\n"); for (Set<_TECategory::RefItem<Font> >::Element *F=tc.font_items.front();F;F=F->next()) { file->store_line(E->key()+"."+F->get().name+" = default"); } if (tc.icon_items.size()) file->store_line("\n; Icon Items:\n"); for (Set<_TECategory::RefItem<Texture> >::Element *F=tc.icon_items.front();F;F=F->next()) { file->store_line(E->key()+"."+F->get().name+" = default"); } if (tc.color_items.size()) file->store_line("\n; Color Items:\n"); for (Set<_TECategory::Item<Color> >::Element *F=tc.color_items.front();F;F=F->next()) { file->store_line(E->key()+"."+F->get().name+" = default"); } if (tc.constant_items.size()) file->store_line("\n; Constant Items:\n"); for (Set<_TECategory::Item<int> >::Element *F=tc.constant_items.front();F;F=F->next()) { file->store_line(E->key()+"."+F->get().name+" = default"); } } file->close(); memdelete(file); } void ThemeEditor::_dialog_cbk() { switch(popup_mode) { case POPUP_ADD: { switch(type_select->get_selected()) { case 0: theme->set_icon(name_edit->get_text(),type_edit->get_text(),Ref<Texture>()); break; case 1: theme->set_stylebox(name_edit->get_text(),type_edit->get_text(),Ref<StyleBox>()); break; case 2: theme->set_font(name_edit->get_text(),type_edit->get_text(),Ref<Font>()); break; case 3: theme->set_color(name_edit->get_text(),type_edit->get_text(),Color()); break; case 4: theme->set_constant(name_edit->get_text(),type_edit->get_text(),0); break; } } break; case POPUP_CLASS_ADD: { StringName fromtype = type_edit->get_text(); List<StringName> names; { names.clear(); Theme::get_default()->get_icon_list(fromtype,&names); for(List<StringName>::Element *E=names.front();E;E=E->next()) { theme->set_icon(E->get(),fromtype,Theme::get_default()->get_icon(E->get(),fromtype)); } } { names.clear(); Theme::get_default()->get_stylebox_list(fromtype,&names); for(List<StringName>::Element *E=names.front();E;E=E->next()) { theme->set_stylebox(E->get(),fromtype,Theme::get_default()->get_stylebox(E->get(),fromtype)); } } { names.clear(); Theme::get_default()->get_font_list(fromtype,&names); for(List<StringName>::Element *E=names.front();E;E=E->next()) { theme->set_font(E->get(),fromtype,Theme::get_default()->get_font(E->get(),fromtype)); } } { names.clear(); Theme::get_default()->get_color_list(fromtype,&names); for(List<StringName>::Element *E=names.front();E;E=E->next()) { theme->set_color(E->get(),fromtype,Theme::get_default()->get_color(E->get(),fromtype)); } } { names.clear(); Theme::get_default()->get_constant_list(fromtype,&names); for(List<StringName>::Element *E=names.front();E;E=E->next()) { theme->set_constant(E->get(),fromtype,Theme::get_default()->get_constant(E->get(),fromtype)); } } } break; case POPUP_REMOVE: { switch(type_select->get_selected()) { case 0: theme->clear_icon(name_edit->get_text(),type_edit->get_text()); break; case 1: theme->clear_stylebox(name_edit->get_text(),type_edit->get_text()); break; case 2: theme->clear_font(name_edit->get_text(),type_edit->get_text()); break; case 3: theme->clear_color(name_edit->get_text(),type_edit->get_text()); break; case 4: theme->clear_constant(name_edit->get_text(),type_edit->get_text()); break; } } break; } } void ThemeEditor::_theme_menu_cbk(int p_option) { if (p_option==POPUP_CREATE_TEMPLATE) { file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE); file_dialog->set_current_path("custom.theme"); file_dialog->popup_centered_ratio(); return; } Ref<Theme> base_theme; type_select->show(); type_select_label->show(); name_select_label->show(); name_edit->show(); name_menu->show(); if (p_option==POPUP_ADD) {//add add_del_dialog->set_title("Add Item"); add_del_dialog->get_ok()->set_text("Add"); add_del_dialog->popup_centered(Size2(490,85)); base_theme=Theme::get_default(); } else if (p_option==POPUP_CLASS_ADD) {//add add_del_dialog->set_title("Add All Items"); add_del_dialog->get_ok()->set_text("Add All"); add_del_dialog->popup_centered(Size2(240,85)); base_theme=Theme::get_default(); type_select->hide(); name_select_label->hide(); type_select_label->hide(); name_edit->hide(); name_menu->hide(); } else if (p_option==POPUP_REMOVE) { add_del_dialog->set_title("Remove Item"); add_del_dialog->get_ok()->set_text("Remove"); add_del_dialog->popup_centered(Size2(490,85)); base_theme=theme; } popup_mode=p_option; ERR_FAIL_COND( theme.is_null() ); List<StringName> types; base_theme->get_type_list(&types); type_menu->get_popup()->clear();; if (p_option==0 || p_option==1) {//add List<StringName> new_types; theme->get_type_list(&new_types); //uh kind of sucks for(List<StringName>::Element *F=new_types.front();F;F=F->next()) { bool found=false; for(List<StringName>::Element *E=types.front();E;E=E->next()) { if (E->get()==F->get()) { found=true; break; } } if (!found) types.push_back(F->get()); } } types.sort(); for(List<StringName>::Element *E=types.front();E;E=E->next()) { type_menu->get_popup()->add_item( E->get() ); } } void ThemeEditor::_notification(int p_what) { if (p_what==NOTIFICATION_PROCESS) { time_left-=get_process_delta_time(); if (time_left<0) { time_left=1.5; _refresh_interval(); } } } void ThemeEditor::_bind_methods() { ObjectTypeDB::bind_method("_type_menu_cbk",&ThemeEditor::_type_menu_cbk); ObjectTypeDB::bind_method("_name_menu_about_to_show",&ThemeEditor::_name_menu_about_to_show); ObjectTypeDB::bind_method("_name_menu_cbk",&ThemeEditor::_name_menu_cbk); ObjectTypeDB::bind_method("_theme_menu_cbk",&ThemeEditor::_theme_menu_cbk); ObjectTypeDB::bind_method("_dialog_cbk",&ThemeEditor::_dialog_cbk); ObjectTypeDB::bind_method("_save_template_cbk",&ThemeEditor::_save_template_cbk); } ThemeEditor::ThemeEditor() { time_left=0; Panel * panel = memnew( Panel ); add_child(panel); panel->set_area_as_parent_rect(0); panel->set_margin(MARGIN_TOP,25); main_vb= memnew( VBoxContainer ); panel->add_child(main_vb); main_vb->set_area_as_parent_rect(4); HBoxContainer *hb_menu = memnew(HBoxContainer); main_vb->add_child(hb_menu); theme_menu = memnew( MenuButton ); theme_menu->set_text("Theme"); theme_menu->get_popup()->add_item("Add Item",POPUP_ADD); theme_menu->get_popup()->add_item("Add Class Items",POPUP_CLASS_ADD); theme_menu->get_popup()->add_item("Remove Item",POPUP_REMOVE); theme_menu->get_popup()->add_separator(); theme_menu->get_popup()->add_item("Create Template",POPUP_CREATE_TEMPLATE); hb_menu->add_child(theme_menu); theme_menu->get_popup()->connect("item_pressed", this,"_theme_menu_cbk"); HBoxContainer *main_hb = memnew( HBoxContainer ); main_vb->add_child(main_hb); VBoxContainer *first_vb = memnew( VBoxContainer); first_vb->set_h_size_flags(SIZE_EXPAND_FILL); main_hb->add_child(first_vb); // main_panel->add_child(panel); // panel->set_area_as_parent_rect(); // panel->set_margin( MARGIN_TOP,20 ); first_vb->add_child(memnew( Label("Label") )); first_vb->add_child(memnew( Button("Button")) ); ToolButton *tb = memnew( ToolButton ); tb->set_text("ToolButton"); first_vb->add_child(tb ); CheckButton *cb = memnew( CheckButton ); cb->set_text("CheckButton"); first_vb->add_child(cb ); CheckBox *cbx = memnew( CheckBox ); cbx->set_text("CheckBox"); first_vb->add_child(cbx ); ButtonGroup *bg = memnew( ButtonGroup ); bg->set_v_size_flags(SIZE_EXPAND_FILL); VBoxContainer *gbvb = memnew( VBoxContainer ); gbvb->set_v_size_flags(SIZE_EXPAND_FILL); CheckBox *rbx1 = memnew( CheckBox ); rbx1->set_text("CheckBox Radio1"); rbx1->set_pressed(true); gbvb->add_child(rbx1); CheckBox *rbx2 = memnew( CheckBox ); rbx2->set_text("CheckBox Radio2"); gbvb->add_child(rbx2); bg->add_child(gbvb); first_vb->add_child(bg); MenuButton* test_menu_button = memnew( MenuButton ); test_menu_button->set_text("MenuButton"); test_menu_button->get_popup()->add_item("Item"); test_menu_button->get_popup()->add_separator(); test_menu_button->get_popup()->add_check_item("Check Item"); test_menu_button->get_popup()->add_check_item("Checked Item"); test_menu_button->get_popup()->set_item_checked(2,true); first_vb->add_child(test_menu_button); OptionButton *test_option_button = memnew( OptionButton ); test_option_button->add_item("OptionButton"); test_option_button->add_separator(); test_option_button->add_item("Has"); test_option_button->add_item("Many"); test_option_button->add_item("Options"); first_vb->add_child(test_option_button); ColorPickerButton *cpb = memnew( ColorPickerButton ); first_vb->add_child(cpb ); first_vb->add_child( memnew( HSeparator )); first_vb->add_child( memnew( HSlider )); first_vb->add_child( memnew( HScrollBar )); first_vb->add_child( memnew( SpinBox )); ProgressBar *pb=memnew( ProgressBar ); pb->set_val(50); first_vb->add_child( pb); Panel *pn=memnew( Panel ); pn->set_custom_minimum_size(Size2(40,40)); first_vb->add_child( pn); first_vb->add_constant_override("separation",10); VBoxContainer *second_vb = memnew( VBoxContainer ); second_vb->set_h_size_flags(SIZE_EXPAND_FILL); main_hb->add_child(second_vb); second_vb->add_constant_override("separation",10); LineEdit *le = memnew( LineEdit ); le->set_text("LineEdit"); second_vb->add_child(le); TextEdit *te = memnew( TextEdit ); te->set_text("TextEdit"); //te->set_v_size_flags(SIZE_EXPAND_FILL); te->set_custom_minimum_size(Size2(0,160)); second_vb->add_child(te); Tree *test_tree = memnew(Tree); second_vb->add_child(test_tree); test_tree->set_custom_minimum_size(Size2(0,160)); TreeItem *item = test_tree->create_item(); item->set_editable(0,true); item->set_text(0,"Tree"); item = test_tree->create_item( test_tree->get_root() ); item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); item->set_editable(0,true); item->set_text(0,"check"); item = test_tree->create_item( test_tree->get_root() ); item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); item->set_editable(0,true); item->set_range_config(0,0,20,0.1); item->set_range(0,2); item = test_tree->create_item( test_tree->get_root() ); item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); item->set_editable(0,true); item->set_text(0,"Have,Many,Several,Options!"); item->set_range(0,2); VBoxContainer *third_vb = memnew( VBoxContainer ); third_vb->set_h_size_flags(SIZE_EXPAND_FILL); third_vb->add_constant_override("separation",10); main_hb->add_child(third_vb); HBoxContainer *vhb = memnew( HBoxContainer ); vhb->set_custom_minimum_size(Size2(0,160)); vhb->add_child(memnew(VSeparator)); vhb->add_child(memnew(VSlider)); vhb->add_child(memnew(VScrollBar)); third_vb->add_child(vhb); TabContainer *tc = memnew( TabContainer ); third_vb->add_child(tc); tc->set_custom_minimum_size(Size2(0,160)); Control *tcc = memnew( Control ); tcc->set_name("Tab 1"); tc->add_child(tcc); tcc = memnew( Control ); tcc->set_name("Tab 2"); tc->add_child(tcc); tcc = memnew( Control ); tcc->set_name("Tab 3"); tc->add_child(tcc); main_hb->add_constant_override("separation",20); /* test_h_scroll = memnew( HScrollBar ); test_h_scroll->set_pos( Point2( 25, 225 ) ); test_h_scroll->set_size( Point2( 150, 5 ) ); panel->add_child(test_h_scroll); line_edit = memnew( LineEdit ); line_edit->set_pos( Point2( 25, 275 ) ); line_edit->set_size( Point2( 150, 5 ) ); line_edit->set_text("Line Edit"); panel->add_child(line_edit); test_v_scroll = memnew( VScrollBar ); test_v_scroll->set_pos( Point2( 200, 25 ) ); test_v_scroll->set_size( Point2( 5, 150 ) ); panel->add_child(test_v_scroll); test_tree = memnew(Tree); test_tree->set_pos( Point2( 300, 25 ) ); test_tree->set_size( Point2( 200, 200 ) ); panel->add_child(test_tree); TreeItem *item = test_tree->create_item(); item->set_editable(0,true); item->set_text(0,"root"); item = test_tree->create_item( test_tree->get_root() ); item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); item->set_editable(0,true); item->set_text(0,"check"); item = test_tree->create_item( test_tree->get_root() ); item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); item->set_editable(0,true); item->set_range_config(0,0,20,0.1); item->set_range(0,2); item = test_tree->create_item( test_tree->get_root() ); item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); item->set_editable(0,true); item->set_text(0,"Have,Many,Several,Options!"); item->set_range(0,2); Button *fd_button= memnew( Button ); fd_button->set_pos(Point2(300,275)); fd_button->set_text("Open File Dialog"); panel->add_child(fd_button); test_file_dialog = memnew( EditorFileDialog ); panel->add_child(test_file_dialog); fd_button->connect("pressed", this,"_open_file_dialog"); */ add_del_dialog = memnew(ConfirmationDialog); add_del_dialog->hide(); add_child(add_del_dialog); Label *l = memnew( Label ); l->set_pos( Point2(5,5) ); l->set_text("Type:"); add_del_dialog->add_child(l); dtype_select_label=l; type_edit = memnew( LineEdit ); type_edit->set_pos(Point2(5,25)); type_edit->set_size(Point2(150,5)); add_del_dialog->add_child(type_edit); type_menu = memnew( MenuButton ); type_menu->set_pos(Point2(160,25)); type_menu->set_size(Point2(30,5)); type_menu->set_text(".."); add_del_dialog->add_child(type_menu); type_menu->get_popup()->connect("item_pressed", this,"_type_menu_cbk"); l = memnew( Label ); l->set_pos( Point2(200,5) ); l->set_text("Name:"); add_del_dialog->add_child(l); name_select_label=l; name_edit = memnew( LineEdit ); name_edit->set_pos(Point2(200,25)); name_edit->set_size(Point2(150,5)); add_del_dialog->add_child(name_edit); name_menu = memnew( MenuButton ); name_menu->set_pos(Point2(360,25)); name_menu->set_size(Point2(30,5)); name_menu->set_text(".."); add_del_dialog->add_child(name_menu); name_menu->get_popup()->connect("about_to_show", this,"_name_menu_about_to_show"); name_menu->get_popup()->connect("item_pressed", this,"_name_menu_cbk"); type_select_label= memnew( Label ); type_select_label->set_pos( Point2(400,5) ); type_select_label->set_text("Data Type:"); add_del_dialog->add_child(type_select_label); type_select = memnew( OptionButton ); type_select->add_item("Icon"); type_select->add_item("Style"); type_select->add_item("Font"); type_select->add_item("Color"); type_select->add_item("Constant"); type_select->set_pos( Point2( 400,25 ) ); type_select->set_size( Point2( 80,5 ) ); add_del_dialog->add_child(type_select); add_del_dialog->get_ok()->connect("pressed", this,"_dialog_cbk"); file_dialog = memnew( EditorFileDialog ); file_dialog->add_filter("*.theme ; Theme File"); add_child(file_dialog); file_dialog->connect("file_selected",this,"_save_template_cbk"); //MenuButton *name_menu; //LineEdit *name_edit; } void ThemeEditorPlugin::edit(Object *p_node) { if (p_node && p_node->cast_to<Theme>()) { theme_editor->show(); theme_editor->edit( p_node->cast_to<Theme>() ); } else { theme_editor->edit( Ref<Theme>() ); theme_editor->hide(); } } bool ThemeEditorPlugin::handles(Object *p_node) const{ return p_node->is_type("Theme"); } void ThemeEditorPlugin::make_visible(bool p_visible){ if (p_visible) { theme_editor->set_process(true); button->show(); } else { theme_editor->set_process(false); if (theme_editor->is_visible()) EditorNode::get_singleton()->hide_bottom_panel(); button->hide(); } } ThemeEditorPlugin::ThemeEditorPlugin(EditorNode *p_node) { editor=p_node; theme_editor = memnew( ThemeEditor ); theme_editor->set_custom_minimum_size(Size2(0,500)); // p_node->get_viewport()->add_child(theme_editor); button=EditorNode::get_singleton()->add_bottom_panel_item("Theme",theme_editor); button->hide(); }