Browse Source

Merge branch 'master' of https://github.com/okamstudio/godot

Juan Linietsky 10 years ago
parent
commit
37af8b4136

+ 3 - 0
bin/tests/test_gui.cpp

@@ -109,6 +109,9 @@ public:
 		frame->set_anchor( MARGIN_RIGHT, Control::ANCHOR_END );
 		frame->set_anchor( MARGIN_BOTTOM, Control::ANCHOR_END );
 		frame->set_end( Point2(0,0) );
+
+		Ref<Theme> t = memnew( Theme );
+		frame->set_theme(t);
 		
 		get_root()->add_child( frame );
 

+ 3 - 0
core/reference.h

@@ -294,6 +294,9 @@ public:
 		reference=NULL;
 	}
 
+	void instance() {
+		ref( memnew( T ));
+	}
 
 	Ref() {
 

+ 11 - 1
main/main.cpp

@@ -98,6 +98,9 @@ static int video_driver_idx=-1;
 static int audio_driver_idx=-1;
 static String locale;
 
+static bool init_maximized=false;
+static int init_screen=-1;
+
 static String unescape_cmdline(const String& p_str) {
 
 	return p_str.replace("%20"," ");
@@ -384,7 +387,7 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 		} else if (I->get()=="-e" || I->get()=="-editor") { // fonud editor
 
 			editor=true;
-
+			init_maximized=true;
 		} else if (I->get()=="-nowindow") { // fullscreen
 
 			OS::get_singleton()->set_no_window_mode(true);
@@ -789,6 +792,13 @@ Error Main::setup2() {
 	show_logo=false;
 #endif
 
+	if (init_screen!=-1) {
+		OS::get_singleton()->set_current_screen(init_screen);
+	}
+	if (init_maximized) {
+		OS::get_singleton()->set_window_maximized(true);
+	}
+
 	if (show_logo) { //boot logo!
 		String boot_logo_path=GLOBAL_DEF("application/boot_splash",String());
 		bool boot_logo_scale=GLOBAL_DEF("application/boot_splash_fullsize",true);

+ 5 - 2
scene/gui/control.cpp

@@ -548,15 +548,18 @@ void Control::_notification(int p_notification) {
 			Control * parent = get_parent()->cast_to<Control>();
 
 			//make children reference them theme
-			if (parent && data.theme.is_null() && parent->data.theme_owner)
+
+			if (parent && data.theme.is_null() && parent->data.theme_owner) {
 				_propagate_theme_changed(parent->data.theme_owner);
+			}
 
 		} break;
 		case NOTIFICATION_UNPARENTED: {
 
 			//make children unreference the theme
-			if (data.theme.is_null() && data.theme_owner)
+			if (data.theme.is_null() && data.theme_owner) {
 				_propagate_theme_changed(NULL);
+			}
 
 		} break;
 		 case NOTIFICATION_MOVED_IN_PARENT: {

+ 42 - 0
scene/gui/popup.cpp

@@ -84,6 +84,48 @@ void Popup::_fix_size() {
 }
 
 
+void Popup::set_as_minsize() {
+
+	Size2 total_minsize;
+
+	for(int i=0;i<get_child_count();i++) {
+
+		Control *c=get_child(i)->cast_to<Control>();
+		if (!c)
+			continue;
+		if (c->is_hidden())
+			continue;
+
+		Size2 minsize = c->get_combined_minimum_size();
+
+		for(int j=0;j<2;j++) {
+
+			Margin m_beg = Margin(0+j);
+			Margin m_end = Margin(2+j);
+
+			float margin_begin = c->get_margin(m_beg);
+			float margin_end = c->get_margin(m_end);
+			AnchorType anchor_begin = c->get_anchor(m_beg);
+			AnchorType anchor_end = c->get_anchor(m_end);
+
+			if (anchor_begin == ANCHOR_BEGIN)
+				minsize[j]+=margin_begin;
+			if (anchor_end == ANCHOR_END)
+				minsize[j]+=margin_end;
+
+		}
+
+		print_line(String(c->get_type())+": "+minsize);
+
+		total_minsize.width = MAX( total_minsize.width, minsize.width );
+		total_minsize.height = MAX( total_minsize.height, minsize.height );
+	}
+
+	set_size(total_minsize);
+
+}
+
+
 void Popup::popup_centered_minsize(const Size2& p_minsize) {
 
 

+ 1 - 0
scene/gui/popup.h

@@ -62,6 +62,7 @@ public:
 	void popup_centered_ratio(float p_screen_ratio=0.75);
 	void popup_centered(const Size2& p_size=Size2());
 	void popup_centered_minsize(const Size2& p_minsize=Size2());
+	void set_as_minsize();
 	virtual void popup();
 
 	

+ 3 - 0
scene/gui/split_container.cpp

@@ -345,6 +345,7 @@ void SplitContainer::_input_event(const InputEvent& p_event) {
 
 			expand_ofs=drag_ofs+((vertical?mm.y:mm.x)-drag_from);
 			queue_sort();
+			emit_signal("dragged",get_split_offset());
 		}
 	}
 
@@ -431,11 +432,13 @@ void SplitContainer::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("set_dragger_visible","visible"),&SplitContainer::set_dragger_visible);
 	ObjectTypeDB::bind_method(_MD("is_dragger_visible"),&SplitContainer::is_dragger_visible);
 
+	ADD_SIGNAL( MethodInfo("dragged",PropertyInfo(Variant::INT,"offset")));
 
 	ADD_PROPERTY( PropertyInfo(Variant::INT,"split/offset"),_SCS("set_split_offset"),_SCS("get_split_offset"));
 	ADD_PROPERTY( PropertyInfo(Variant::INT,"split/collapsed"),_SCS("set_collapsed"),_SCS("is_collapsed"));
 	ADD_PROPERTY( PropertyInfo(Variant::INT,"split/dragger_visible"),_SCS("set_dragger_visible"),_SCS("is_dragger_visible"));
 
+
 }
 
 SplitContainer::SplitContainer(bool p_vertical) {

+ 105 - 15
scene/gui/tab_container.cpp

@@ -88,7 +88,22 @@ void TabContainer::_input_event(const InputEvent& p_event) {
 		Ref<Font> font = get_font("font");
 		Ref<Texture> incr = get_icon("increment");
 		Ref<Texture> decr = get_icon("decrement");
+		Ref<Texture> menu = get_icon("menu");
+		Ref<Texture> menu_hl = get_icon("menu_hl");
 
+		if (popup && pos.x>get_size().width-menu->get_width()) {
+
+
+			emit_signal("pre_popup_pressed");
+			Vector2 pp_pos = get_global_pos();
+			pp_pos.x+=get_size().width;
+			pp_pos.x-=popup->get_size().width;
+			pp_pos.y+=menu->get_height();
+
+			popup->set_global_pos( pp_pos );
+			popup->popup();;
+			return;
+		}
 		pos.x-=tabs_ofs_cache;
 
 		int idx=0;
@@ -116,17 +131,17 @@ void TabContainer::_input_event(const InputEvent& p_event) {
 			String s = c->has_meta("_tab_name")?String(XL_MESSAGE(String(c->get_meta("_tab_name")))):String(c->get_name());
 			int tab_width=font->get_string_size(s).width;
 
-            if (c->has_meta("_tab_icon")) {
-                Ref<Texture> icon = c->get_meta("_tab_icon");
-                if (icon.is_valid()) {
-                    tab_width+=icon->get_width();
-                    if (s!="")
-                        tab_width+=get_constant("hseparation");
+			if (c->has_meta("_tab_icon")) {
+				Ref<Texture> icon = c->get_meta("_tab_icon");
+				if (icon.is_valid()) {
+					tab_width+=icon->get_width();
+					if (s!="")
+						tab_width+=get_constant("hseparation");
 
-                }
-            }
+				}
+			}
 
-            if (idx==current) {
+			if (idx==current) {
 
 				tab_width+=tab_fg->get_minimum_size().width;
 			} else {
@@ -163,7 +178,7 @@ void TabContainer::_input_event(const InputEvent& p_event) {
 
 		if (found!=-1) {
 
-			set_current_tab(found);			
+			set_current_tab(found);
 		}
 	}
 
@@ -194,7 +209,9 @@ void TabContainer::_notification(int p_what) {
 			Ref<Texture> incr = get_icon("increment");
 			Ref<Texture> incr_hl = get_icon("increment_hilite");
 			Ref<Texture> decr = get_icon("decrement");
-			Ref<Texture> decr_hl = get_icon("decrement_hilite");
+			Ref<Texture> decr_hl = get_icon("decrement_hilite");			
+			Ref<Texture> menu = get_icon("menu");
+			Ref<Texture> menu_hl = get_icon("menu_hl");
 			Ref<Font> font = get_font("font");
 			Color color_fg = get_color("font_color_fg");
 			Color color_bg = get_color("font_color_bg");
@@ -209,6 +226,7 @@ void TabContainer::_notification(int p_what) {
 			Size2 top_size = Size2( size.width, top_margin );
 
 
+
 			int w=0;
 			int idx=0;
 			for(int i=0;i<get_child_count();i++) {
@@ -227,7 +245,7 @@ void TabContainer::_notification(int p_what) {
 					if (icon.is_valid()) {
 						w+=icon->get_width();
 						if (s!="")
-                            w+=get_constant("hseparation");
+						     w+=get_constant("hseparation");
 
 					}
 				}
@@ -245,14 +263,18 @@ void TabContainer::_notification(int p_what) {
 
 			int ofs;
 			int limit=get_size().width;
+			if (popup) {
+				top_size.width-=menu->get_width();
+				limit-=menu->get_width();
+			}
 
 
-			if (w<=get_size().width) {
+			if (w<=limit) {
 				switch(align) {
 
 					case ALIGN_LEFT: ofs = side_margin; break;
-					case ALIGN_CENTER: ofs = (int(top_size.width) - w)/2; break;
-					case ALIGN_RIGHT: ofs = int(top_size.width) - w - side_margin; break;
+					case ALIGN_CENTER: ofs = (int(limit) - w)/2; break;
+					case ALIGN_RIGHT: ofs = int(limit) - w - side_margin; break;
 				};
 
 				tab_display_ofs=0;
@@ -364,6 +386,15 @@ void TabContainer::_notification(int p_what) {
 				incr->draw(ci,Point2(limit+incr->get_width(),vofs),Color(1,1,1,notdone?1.0:0.5));
 			}
 
+			if (popup) {
+				int from = get_size().width-menu->get_width();
+
+				if (mouse_x_cache > from)
+					menu_hl->draw(get_canvas_item(),Size2(from,0));
+				else
+					menu->draw(get_canvas_item(),Size2(from,0));
+			}
+
 			panel->draw(ci, Rect2( 0, top_size.height, size.width, size.height-top_size.height));
 
 		} break;
@@ -465,6 +496,48 @@ int TabContainer::get_current_tab() const {
 	return current;
 }
 
+Control* TabContainer::get_tab_control(int p_idx) const {
+
+	int idx=0;
+
+
+	for(int i=0;i<get_child_count();i++) {
+
+		Control *c = get_child(i)->cast_to<Control>();
+		if (!c)
+			continue;
+		if (c->is_set_as_toplevel())
+			continue;
+		if (idx==p_idx) {
+			return c;
+
+		}
+		idx++;
+	}
+
+	return NULL;
+}
+Control* TabContainer::get_current_tab_control() const {
+
+	int idx=0;
+
+
+	for(int i=0;i<get_child_count();i++) {
+
+		Control *c = get_child(i)->cast_to<Control>();
+		if (!c)
+			continue;
+		if (c->is_set_as_toplevel())
+			continue;
+		if (idx==current) {
+			return c;
+
+		}
+		idx++;
+	}
+
+	return NULL;
+}
 
 void TabContainer::remove_child_notify(Node *p_child) {
 
@@ -635,12 +708,25 @@ Size2 TabContainer::get_minimum_size() const {
 	return ms;
 }
 
+void TabContainer::set_popup(Node *p_popup) {
+	ERR_FAIL_NULL(p_popup);
+	popup=p_popup->cast_to<Popup>();
+	update();
+}
+
+Popup* TabContainer::get_popup() const {
+	return popup;
+}
+
+
 void TabContainer::_bind_methods() {
 
 	ObjectTypeDB::bind_method(_MD("_input_event"),&TabContainer::_input_event);
 	ObjectTypeDB::bind_method(_MD("get_tab_count"),&TabContainer::get_tab_count);
 	ObjectTypeDB::bind_method(_MD("set_current_tab","tab_idx"),&TabContainer::set_current_tab);
 	ObjectTypeDB::bind_method(_MD("get_current_tab"),&TabContainer::get_current_tab);
+	ObjectTypeDB::bind_method(_MD("get_current_tab_control:Control"),&TabContainer::get_current_tab_control);
+	ObjectTypeDB::bind_method(_MD("get_tab_control:Control","idx"),&TabContainer::get_tab_control);
 	ObjectTypeDB::bind_method(_MD("set_tab_align","align"),&TabContainer::set_tab_align);
 	ObjectTypeDB::bind_method(_MD("get_tab_align"),&TabContainer::get_tab_align);
 	ObjectTypeDB::bind_method(_MD("set_tabs_visible","visible"),&TabContainer::set_tabs_visible);
@@ -649,10 +735,13 @@ void TabContainer::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("get_tab_title","tab_idx"),&TabContainer::get_tab_title);
 	ObjectTypeDB::bind_method(_MD("set_tab_icon","tab_idx","icon:Texture"),&TabContainer::set_tab_icon);
 	ObjectTypeDB::bind_method(_MD("get_tab_icon:Texture","tab_idx"),&TabContainer::get_tab_icon);
+	ObjectTypeDB::bind_method(_MD("set_popup","popup:Popup"),&TabContainer::set_popup);
+	ObjectTypeDB::bind_method(_MD("get_popup:Popup"),&TabContainer::get_popup);
 
 	ObjectTypeDB::bind_method(_MD("_child_renamed_callback"),&TabContainer::_child_renamed_callback);
 
 	ADD_SIGNAL(MethodInfo("tab_changed",PropertyInfo(Variant::INT,"tab")));
+	ADD_SIGNAL(MethodInfo("pre_popup_pressed"));
 
 	ADD_PROPERTY( PropertyInfo(Variant::INT, "tab_align", PROPERTY_HINT_ENUM,"Left,Center,Right"), _SCS("set_tab_align"), _SCS("get_tab_align") );
 	ADD_PROPERTY( PropertyInfo(Variant::INT, "current_tab", PROPERTY_HINT_RANGE,"-1,4096,1",PROPERTY_USAGE_EDITOR), _SCS("set_current_tab"), _SCS("get_current_tab") );
@@ -669,5 +758,6 @@ TabContainer::TabContainer() {
 	mouse_x_cache=0;
 	align=ALIGN_CENTER;
 	tabs_visible=true;
+	popup=NULL;
 
 }

+ 10 - 1
scene/gui/tab_container.h

@@ -31,7 +31,7 @@
 
 
 #include "scene/gui/control.h"
-
+#include "scene/gui/popup.h"
 class TabContainer : public Control {
 
 	OBJ_TYPE( TabContainer, Control );
@@ -55,6 +55,8 @@ private:
 	TabAlign align;
 	Control *_get_tab(int idx) const;
 	int _get_top_margin() const;
+	Popup *popup;
+
 
 protected:
 
@@ -85,10 +87,17 @@ public:
 	void set_current_tab(int p_current);
 	int get_current_tab() const;
 
+	Control* get_tab_control(int p_idx) const;
+	Control* get_current_tab_control() const;
+
 	virtual Size2 get_minimum_size() const;
 
 	virtual void get_translatable_strings(List<String> *p_strings) const;
 
+	void set_popup(Node *p_popup);
+	Popup* get_popup() const;
+
+
 	TabContainer();
 };
 

+ 1 - 1
scene/main/node.cpp

@@ -641,6 +641,7 @@ void Node::_add_child_nocheck(Node* p_child,const StringName& p_name) {
 	p_child->data.pos=data.children.size();
 	data.children.push_back( p_child );
 	p_child->data.parent=this;
+	p_child->notification(NOTIFICATION_PARENTED);
 
 	if (data.tree) {
 		p_child->_set_tree(data.tree);
@@ -649,7 +650,6 @@ void Node::_add_child_nocheck(Node* p_child,const StringName& p_name) {
 	/* Notify */
 	//recognize childs created in this node constructor
 	p_child->data.parent_owned=data.in_constructor;
-	p_child->notification(NOTIFICATION_PARENTED);
 	add_child_notify(p_child);
 
 

+ 2 - 0
scene/resources/default_theme/default_theme.cpp

@@ -655,6 +655,8 @@ void make_default_theme() {
 	t->set_icon("increment_hilite","TabContainer",make_icon( scroll_button_right_hl_png));
 	t->set_icon("decrement","TabContainer",make_icon( scroll_button_left_png));
 	t->set_icon("decrement_hilite","TabContainer",make_icon( scroll_button_left_hl_png));
+	t->set_icon("menu","TabContainer",make_icon( tab_menu_png));
+	t->set_icon("menu_hilite","TabContainer",make_icon( tab_menu_hl_png));
 
 	t->set_font("font","TabContainer", default_font );
 

BIN
scene/resources/default_theme/tab_menu.png


BIN
scene/resources/default_theme/tab_menu_hl.png


File diff suppressed because it is too large
+ 10 - 0
scene/resources/default_theme/theme_data.h


+ 5 - 0
tools/editor/create_dialog.cpp

@@ -230,6 +230,11 @@ void CreateDialog::_notification(int p_what) {
 		connect("confirmed",this,"_confirmed");
 		_update_search();
 	}
+	if (p_what==NOTIFICATION_EXIT_TREE) {
+
+		disconnect("confirmed",this,"_confirmed");
+
+	}
 
 	if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
 

+ 481 - 35
tools/editor/editor_node.cpp

@@ -54,7 +54,7 @@
 #include "register_exporters.h"
 #include "bind/core_bind.h"
 #include "io/zip_io.h"
-
+#include "io/config_file.h"
 
 // plugins
 #include "plugins/sprite_frames_editor_plugin.h"
@@ -1377,7 +1377,7 @@ void EditorNode::_edit_current() {
 		object_menu->set_disabled(false);
 
 		resources_dock->add_resource(Ref<Resource>(current_res));
-		top_pallete->set_current_tab(1);
+		//top_pallete->set_current_tab(1);
 	}
 
 
@@ -1394,7 +1394,7 @@ void EditorNode::_edit_current() {
 		scene_tree_dock->set_selected(current_node);
 		object_menu->get_popup()->clear();
 
-		top_pallete->set_current_tab(0);
+		//top_pallete->set_current_tab(0);
 
 	}
 
@@ -2908,7 +2908,7 @@ Error EditorNode::load_scene(const String& p_scene) {
 	prev_scene->set_disabled(previous_scenes.size()==0);
 	opening_prev=false;
 
-	top_pallete->set_current_tab(0); //always go to scene
+	//top_pallete->set_current_tab(0); //always go to scene
 
 	push_item(new_scene);
 
@@ -2981,15 +2981,15 @@ void EditorNode::_update_keying() {
 void EditorNode::_close_messages() {
 
 //	left_split->set_dragger_visible(false);
-	old_split_ofs = left_split->get_split_offset();
-	left_split->set_split_offset(0);
+	old_split_ofs = center_split->get_split_offset();
+	center_split->set_split_offset(0);
 //	scene_root_parent->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_END,0);
 }
 
 void EditorNode::_show_messages() {
 
 //	left_split->set_dragger_visible(true);
-	left_split->set_split_offset(old_split_ofs);
+	center_split->set_split_offset(old_split_ofs);
 //	scene_root_parent->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_END,log->get_margin(MARGIN_TOP));
 
 }
@@ -3334,6 +3334,17 @@ void EditorNode::_bind_methods() {
 
 	ObjectTypeDB::bind_method("_sources_changed",&EditorNode::_sources_changed);
 	ObjectTypeDB::bind_method("_fs_changed",&EditorNode::_fs_changed);
+	ObjectTypeDB::bind_method("_dock_select_draw",&EditorNode::_dock_select_draw);
+	ObjectTypeDB::bind_method("_dock_select_input",&EditorNode::_dock_select_input);
+	ObjectTypeDB::bind_method("_dock_pre_popup",&EditorNode::_dock_pre_popup);
+	ObjectTypeDB::bind_method("_dock_split_dragged",&EditorNode::_dock_split_dragged);
+	ObjectTypeDB::bind_method("_save_docks",&EditorNode::_save_docks);
+	ObjectTypeDB::bind_method("_dock_popup_exit",&EditorNode::_dock_popup_exit);
+	ObjectTypeDB::bind_method("_dock_move_left",&EditorNode::_dock_move_left);
+	ObjectTypeDB::bind_method("_dock_move_right",&EditorNode::_dock_move_right);
+
+
+
 
 	ObjectTypeDB::bind_method(_MD("add_editor_import_plugin", "plugin"), &EditorNode::add_editor_import_plugin);
 	ObjectTypeDB::bind_method(_MD("remove_editor_import_plugin", "plugin"), &EditorNode::remove_editor_import_plugin);
@@ -3414,6 +3425,329 @@ void EditorNode::show_warning(const String& p_text) {
 	warning->popup_centered_minsize();
 }
 
+void EditorNode::_dock_select_input(const InputEvent& p_input) {
+
+	if (p_input.type==InputEvent::MOUSE_BUTTON || p_input.type==InputEvent::MOUSE_MOTION) {
+
+		Vector2 point(p_input.mouse_motion.x,p_input.mouse_motion.y);
+
+		int nrect = -1;
+		for(int i=0;i<DOCK_SLOT_MAX;i++) {
+			if (dock_select_rect[i].has_point(point)) {
+				nrect=i;
+				break;
+			}
+		}
+
+
+		if (nrect!=dock_select_rect_over) {
+			dock_select->update();
+			dock_select_rect_over=nrect;
+
+		}
+
+
+		if (nrect==-1)
+			return;
+
+		if (p_input.type==InputEvent::MOUSE_BUTTON && p_input.mouse_button.button_index==1 && p_input.mouse_button.pressed && dock_popup_selected!=nrect) {
+			Control *dock = dock_slot[dock_popup_selected]->get_current_tab_control();
+			if (dock) {
+				dock_slot[dock_popup_selected]->remove_child(dock);
+			}
+			if (dock_slot[dock_popup_selected]->get_tab_count()==0) {
+				dock_slot[dock_popup_selected]->hide();
+
+			} else  {
+
+				dock_slot[dock_popup_selected]->set_current_tab(0);
+			}
+
+			print_line("performing reparent");
+			dock_slot[nrect]->add_child(dock);
+			dock_popup_selected=nrect;
+			dock_slot[nrect]->set_current_tab(dock_slot[nrect]->get_tab_count()-1);
+			dock_slot[nrect]->show();
+			dock_select->update();
+
+			VSplitContainer*splits[DOCK_SLOT_MAX/2]={
+				left_l_vsplit,
+				left_r_vsplit,
+				right_l_vsplit,
+				right_r_vsplit,
+			};
+
+			for(int i=0;i<4;i++) {
+				bool in_use = dock_slot[i*2+0]->get_tab_count() || dock_slot[i*2+1]->get_tab_count();
+				if (in_use)
+					splits[i]->show();
+				else
+					splits[i]->hide();
+			}
+
+			_save_docks();
+		}
+	}
+}
+
+void EditorNode::_dock_popup_exit() {
+
+	dock_select_rect_over=-1;
+	dock_select->update();
+}
+
+void EditorNode::_dock_pre_popup(int p_which) {
+	
+
+	dock_popup_selected=p_which;
+}
+
+void EditorNode::_dock_move_left() {
+
+	if (dock_popup_selected<0 || dock_popup_selected>=DOCK_SLOT_MAX)
+		return;
+	Control *current = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab() );
+	Control *prev = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab()-1 );
+	if (!current || !prev)
+		return;
+	dock_slot[dock_popup_selected]->move_child(current,prev->get_index());
+	dock_slot[dock_popup_selected]->set_current_tab( dock_slot[dock_popup_selected]->get_current_tab()-1 );
+	dock_select->update();
+	_save_docks();
+
+
+}
+
+void EditorNode::_dock_move_right() {
+
+	Control *current = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab() );
+	Control *next = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab()+1 );
+	if (!current || !next)
+		return;
+	dock_slot[dock_popup_selected]->move_child(next,current->get_index());
+	dock_slot[dock_popup_selected]->set_current_tab( dock_slot[dock_popup_selected]->get_current_tab()+1 );
+	dock_select->update();
+	_save_docks();
+}
+
+void EditorNode::_dock_select_draw(){
+	Size2 s = dock_select->get_size();
+	s.y/=2.0;
+	s.x/=6.0;
+
+	Color used=Color(0.6,0.6,0.6,0.8);
+	Color used_selected=Color(0.8,0.8,0.8,0.8);
+	Color tab_selected=Color(1,1,1,1);
+	Color unused=used;
+	unused.a=0.4;
+	Color unusable=unused;
+	unusable.a=0.1;
+
+	Rect2 unr(s.x*2,0,s.x*2,s.y*2);
+	unr.pos+=Vector2(2,5);
+	unr.size-=Vector2(4,7);
+
+	dock_select->draw_rect(unr,unusable);
+
+	dock_tab_move_left->set_disabled(true);
+	dock_tab_move_right->set_disabled(true);
+
+	if (dock_popup_selected!=-1 && dock_slot[dock_popup_selected]->get_tab_count()) {
+
+		dock_tab_move_left->set_disabled(dock_slot[dock_popup_selected]->get_current_tab()==0);
+		dock_tab_move_right->set_disabled(dock_slot[dock_popup_selected]->get_current_tab()>=dock_slot[dock_popup_selected]->get_tab_count()-1);
+	}
+
+	for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+		Vector2 ofs;
+
+		switch(i) {
+			case DOCK_SLOT_LEFT_UL: {
+
+			} break;
+			case DOCK_SLOT_LEFT_BL: {
+				ofs.y+=s.y;
+			} break;
+			case DOCK_SLOT_LEFT_UR: {
+				ofs.x+=s.x;
+			} break;
+			case DOCK_SLOT_LEFT_BR: {
+				ofs+=s;
+			} break;
+			case DOCK_SLOT_RIGHT_UL: {
+				ofs.x+=s.x*4;
+			} break;
+			case DOCK_SLOT_RIGHT_BL: {
+				ofs.x+=s.x*4;
+				ofs.y+=s.y;
+
+			} break;
+			case DOCK_SLOT_RIGHT_UR: {
+				ofs.x+=s.x*4;
+				ofs.x+=s.x;
+
+			} break;
+			case DOCK_SLOT_RIGHT_BR: {
+				ofs.x+=s.x*4;
+				ofs+=s;
+
+			} break;
+		}
+
+		Rect2 r(ofs,s);
+		dock_select_rect[i]=r;
+		r.pos+=Vector2(2,5);
+		r.size-=Vector2(4,7);
+
+
+		if (i==dock_select_rect_over) {
+			dock_select->draw_rect(r,used_selected);
+		} else if (dock_slot[i]->get_child_count()==0) {
+			dock_select->draw_rect(r,unused);
+		} else {
+
+			dock_select->draw_rect(r,used);
+		}
+
+		for(int j=0;j<MIN(3,dock_slot[i]->get_child_count());j++) {
+			int xofs = (r.size.width/3)*j;
+			Color c = used;
+			if (i==dock_popup_selected && (dock_slot[i]->get_current_tab()>3 || dock_slot[i]->get_current_tab()==j))
+				c=tab_selected;
+			dock_select->draw_rect(Rect2(2+ofs.x+xofs,ofs.y,r.size.width/3-1,3),c);
+		}
+
+	}
+}
+
+void EditorNode::_save_docks() {
+
+	Ref<ConfigFile> config;
+	config.instance();
+
+	for(int i=0;i<DOCK_SLOT_MAX;i++) {
+		String names;
+		for(int j=0;j<dock_slot[i]->get_tab_count();j++) {
+			String name = dock_slot[i]->get_tab_control(j)->get_name();
+			if (names!="")
+				names+=",";
+			names+=name;
+		}
+
+		if (names!="") {
+			config->set_value("docks","dock_"+itos(i+1),names);
+		}
+	}
+
+	VSplitContainer*splits[DOCK_SLOT_MAX/2]={
+		left_l_vsplit,
+		left_r_vsplit,
+		right_l_vsplit,
+		right_r_vsplit,
+	};
+
+	for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+
+		if (splits[i]->is_visible()) {
+			config->set_value("docks","dock_split_"+itos(i+1),splits[i]->get_split_offset());
+		}
+	}
+
+
+	config->save(EditorSettings::get_singleton()->get_project_settings_path().plus_file("editor_layout.cfg"));
+
+}
+
+void EditorNode::_dock_split_dragged(int ofs) {
+
+	dock_drag_timer->start();
+}
+
+void EditorNode::_load_docks() {
+
+	Ref<ConfigFile> config;
+	config.instance();
+	Error err = config->load(EditorSettings::get_singleton()->get_project_settings_path().plus_file("editor_layout.cfg"));
+	if (err!=OK) {
+		return; //no config
+	}
+
+	for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+		if (!config->has_section_key("docks","dock_"+itos(i+1)))
+			continue;
+
+		Vector<String> names = String(config->get_value("docks","dock_"+itos(i+1))).split(",");
+
+		for(int j=0;j<names.size();j++) {
+
+			String name=names[j];
+			//find it, in a horribly inefficient way
+			int atidx=-1;
+			Control *node=NULL;
+			for(int k=0;k<DOCK_SLOT_MAX;k++) {
+				if (!dock_slot[k]->has_node(name))
+					continue;
+				node=dock_slot[k]->get_node(name)->cast_to<Control>();
+				if (!node)
+					continue;
+				atidx=k;
+				break;
+			}
+			if (atidx==-1) //well, it's not anywhere
+				continue;
+
+			if (atidx==j) {
+				node->raise();
+				continue;
+			}
+
+
+			dock_slot[atidx]->remove_child(node);
+
+			if (dock_slot[atidx]->get_tab_count()==0) {
+				dock_slot[atidx]->hide();
+
+			}
+			dock_slot[i]->add_child(node);
+			dock_slot[i]->show();
+		}
+
+	}
+
+	VSplitContainer*splits[DOCK_SLOT_MAX/2]={
+		left_l_vsplit,
+		left_r_vsplit,
+		right_l_vsplit,
+		right_r_vsplit,
+	};
+
+	for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+
+		if (!config->has_section_key("docks","dock_split_"+itos(i+1)))
+			continue;
+
+		int ofs = config->get_value("docks","dock_split_"+itos(i+1));
+		splits[i]->set_split_offset(ofs);
+	}
+
+	for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+		bool in_use = dock_slot[i*2+0]->get_tab_count() || dock_slot[i*2+1]->get_tab_count();
+		if (in_use)
+			splits[i]->show();
+		else
+			splits[i]->hide();
+	}
+
+	for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+		if (!dock_slot[i]->is_hidden() && dock_slot[i]->get_tab_count()) {
+			dock_slot[i]->set_current_tab(0);
+		}
+	}
+
+}
 
 EditorNode::EditorNode() {
 
@@ -3515,18 +3849,124 @@ EditorNode::EditorNode() {
 	menu_hb = memnew( HBoxContainer );
 	main_vbox->add_child(menu_hb);
 
-	main_split = memnew( HSplitContainer );
-	main_vbox->add_child(main_split);
-	main_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
-
+	//left
+	left_l_hsplit = memnew( HSplitContainer );
+	main_vbox->add_child(left_l_hsplit);
+
+	left_l_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+	left_l_vsplit = memnew( VSplitContainer );
+	left_l_hsplit->add_child(left_l_vsplit);
+	dock_slot[DOCK_SLOT_LEFT_UL]=memnew( TabContainer );
+	left_l_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_UL]);
+	dock_slot[DOCK_SLOT_LEFT_BL]=memnew( TabContainer );
+	left_l_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_BL]);
+	left_l_vsplit->hide();
+	dock_slot[DOCK_SLOT_LEFT_UL]->hide();
+	dock_slot[DOCK_SLOT_LEFT_BL]->hide();
+
+	left_r_hsplit = memnew( HSplitContainer );
+	left_l_hsplit->add_child(left_r_hsplit);
+	left_r_vsplit = memnew( VSplitContainer );
+	left_r_hsplit->add_child(left_r_vsplit);
+	dock_slot[DOCK_SLOT_LEFT_UR]=memnew( TabContainer );
+	left_r_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_UR]);
+	dock_slot[DOCK_SLOT_LEFT_BR]=memnew( TabContainer );
+	left_r_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_BR]);
+	//left_r_vsplit->hide();
+	//dock_slot[DOCK_SLOT_LEFT_UR]->hide();
+	//dock_slot[DOCK_SLOT_LEFT_BR]->hide();
+
+
+	main_hsplit = memnew( HSplitContainer );
+	left_r_hsplit->add_child(main_hsplit);
+	//main_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+	center_split = memnew( VSplitContainer );
+	main_hsplit->add_child(center_split);
+	center_split->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+	center_split->set_collapsed(false);
+
+	right_hsplit = memnew( HSplitContainer );
+	main_hsplit->add_child(right_hsplit);
+
+	right_l_vsplit = memnew( VSplitContainer );
+	right_hsplit->add_child(right_l_vsplit);
+	dock_slot[DOCK_SLOT_RIGHT_UL]=memnew( TabContainer );
+	right_l_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_UL]);
+	dock_slot[DOCK_SLOT_RIGHT_BL]=memnew( TabContainer );
+	right_l_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_BL]);
+
+	right_r_vsplit = memnew( VSplitContainer );
+	right_hsplit->add_child(right_r_vsplit);
+	dock_slot[DOCK_SLOT_RIGHT_UR]=memnew( TabContainer );
+	right_r_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_UR]);
+	dock_slot[DOCK_SLOT_RIGHT_BR]=memnew( TabContainer );
+	right_r_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_BR]);
+	right_r_vsplit->hide();
+	//dock_slot[DOCK_SLOT_RIGHT_UL]->hide();
+	//dock_slot[DOCK_SLOT_RIGHT_BL]->hide();
+
+	left_l_vsplit->connect("dragged",this,"_dock_split_dragged");
+	left_r_vsplit->connect("dragged",this,"_dock_split_dragged");
+	right_l_vsplit->connect("dragged",this,"_dock_split_dragged");
+	right_r_vsplit->connect("dragged",this,"_dock_split_dragged");
+
+
+	dock_select_popoup = memnew( PopupPanel );
+	gui_base->add_child(dock_select_popoup);
+	VBoxContainer *dock_vb = memnew( VBoxContainer );
+	dock_select_popoup->add_child(dock_vb);
+
+	HBoxContainer *dock_hb = memnew( HBoxContainer);
+	dock_tab_move_left = memnew( ToolButton );
+	dock_tab_move_left->set_icon(theme->get_icon("Back","EditorIcons"));
+	dock_tab_move_left->set_focus_mode(Control::FOCUS_NONE);
+	dock_tab_move_left->connect("pressed",this,"_dock_move_left");
+	//dock_tab_move_left->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+	dock_hb->add_child(dock_tab_move_left);
+	dock_hb->add_spacer();
+	dock_tab_move_right = memnew( ToolButton );
+	dock_tab_move_right->set_icon(theme->get_icon("Forward","EditorIcons"));
+	dock_tab_move_right->set_focus_mode(Control::FOCUS_NONE);
+	dock_tab_move_right->connect("pressed",this,"_dock_move_right");
+
+	//dock_tab_move_right->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+	dock_hb->add_child(dock_tab_move_right);
+	dock_vb->add_child(dock_hb);
+
+	dock_select = memnew( Control );
+	dock_select->set_custom_minimum_size(Size2(128,64));
+	dock_select->connect("input_event",this,"_dock_select_input");
+	dock_select->connect("draw",this,"_dock_select_draw");
+	dock_select->connect("mouse_exit",this,"_dock_popup_exit");
+	dock_select->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+	dock_vb->add_child(dock_select);
+
+
+	dock_select_popoup->set_child_rect(dock_vb);
+	dock_select_popoup->set_as_minsize();
+	dock_select_rect_over=-1;
+	dock_popup_selected=-1;
+	//dock_select_popoup->set_(Size2(20,20));
+
+	for(int i=0;i<DOCK_SLOT_MAX;i++) {
+		dock_slot[i]->set_custom_minimum_size(Size2(250,250));
+		dock_slot[i]->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+		dock_slot[i]->set_popup(dock_select_popoup);
+		dock_slot[i]->connect("pre_popup_pressed",this,"_dock_pre_popup",varray(i));
+
+		//dock_slot[i]->set_tab_align(TabContainer::ALIGN_LEFT);
+	}
 
-	left_split = memnew( VSplitContainer );
-	main_split->add_child(left_split);
-	left_split->set_h_size_flags(Control::SIZE_EXPAND_FILL);
-	left_split->set_collapsed(false);
+	dock_drag_timer = memnew( Timer );
+	add_child(dock_drag_timer);
+	dock_drag_timer->set_wait_time(0.5);
+	dock_drag_timer->set_one_shot(true);
+	dock_drag_timer->connect("timeout",this,"_save_docks");
 
 	top_split = memnew( VSplitContainer );
-	left_split->add_child(top_split);
+	center_split->add_child(top_split);
 	top_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	top_split->set_collapsed(true);
 
@@ -3895,45 +4335,47 @@ EditorNode::EditorNode() {
 
 
 
-	editor_hsplit = memnew( HSplitContainer );
-	main_split->add_child(editor_hsplit);
-	editor_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+	//editor_hsplit = memnew( HSplitContainer );
+	//main_split->add_child(editor_hsplit);
+	//editor_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 
-	editor_vsplit = memnew( VSplitContainer );
-	editor_hsplit->add_child(editor_vsplit);
+	//editor_vsplit = memnew( VSplitContainer );
+	//editor_hsplit->add_child(editor_vsplit);
 
-	top_pallete = memnew( TabContainer );
+	//top_pallete = memnew( TabContainer );
 	scene_tree_dock = memnew( SceneTreeDock(this,scene_root,editor_selection,editor_data) );
 	scene_tree_dock->set_name("Scene");
-	top_pallete->add_child(scene_tree_dock);
+	//top_pallete->add_child(scene_tree_dock);
+	dock_slot[DOCK_SLOT_LEFT_UR]->add_child(scene_tree_dock);
 
 	resources_dock = memnew( ResourcesDock(this) );
 	resources_dock->set_name("Resources");
-	top_pallete->add_child(resources_dock);
-	top_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+	//top_pallete->add_child(resources_dock);
+	dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(resources_dock);
+	//top_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 
-	Control *editor_spacer = memnew( Control );
+	/*Control *editor_spacer = memnew( Control );
 	editor_spacer->set_custom_minimum_size(Size2(260,200));
 	editor_spacer->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	editor_vsplit->add_child( editor_spacer );
 	editor_spacer->add_child( top_pallete );
-	top_pallete->set_area_as_parent_rect();
+	top_pallete->set_area_as_parent_rect();*/
 
 
-	prop_pallete = memnew( TabContainer );
+	//prop_pallete = memnew( TabContainer );
 
-	prop_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+	//prop_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 
-	editor_spacer = memnew( Control );
+	/*editor_spacer = memnew( Control );
 	editor_spacer->set_custom_minimum_size(Size2(260,200));
 	editor_spacer->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	editor_vsplit->add_child( editor_spacer );
 	editor_spacer->add_child( prop_pallete );
-	prop_pallete->set_area_as_parent_rect();
+	prop_pallete->set_area_as_parent_rect();*/
 
 	VBoxContainer *prop_editor_base = memnew( VBoxContainer );
 	prop_editor_base->set_name("Inspector"); // Properties?
-	prop_pallete->add_child(prop_editor_base);
+	dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(prop_editor_base);
 
 	HBoxContainer *prop_editor_hb = memnew( HBoxContainer );
 	prop_editor_base->add_child(prop_editor_hb);
@@ -3975,14 +4417,15 @@ EditorNode::EditorNode() {
 
 	scenes_dock = memnew( ScenesDock(this) );
 	scenes_dock->set_name("FileSystem");
-	prop_pallete->add_child(scenes_dock);
+	dock_slot[DOCK_SLOT_LEFT_BR]->add_child(scenes_dock);
+	//prop_pallete->add_child(scenes_dock);
 	scenes_dock->connect("open",this,"open_request");
 	scenes_dock->connect("instance",this,"_instance_request");
 
 
 
 	log = memnew( EditorLog );
-	left_split->add_child(log);
+	center_split->add_child(log);
 	log->connect("close_request",this,"_close_messages");
 	log->connect("show_request",this,"_show_messages");
 	//left_split->set_dragger_visible(false);
@@ -3998,7 +4441,7 @@ EditorNode::EditorNode() {
 
 
 	animation_vb->add_child(animation_editor);
-	left_split->connect("resized",this,"_vp_resized");
+	center_split->connect("resized",this,"_vp_resized");
 
 
 	animation_editor->hide();
@@ -4403,12 +4846,15 @@ EditorNode::EditorNode() {
 	Node::set_human_readable_collision_renaming(true);
 
 
+
+
 //	Ref<ImageTexture> it = gui_base->get_icon("logo","Icons");
 //	OS::get_singleton()->set_icon( it->get_data() );
 
 	for(int i=0;i<_init_callbacks.size();i++)
 		_init_callbacks[i]();
 
+	_load_docks();
 }
 
 

+ 54 - 7
tools/editor/editor_node.h

@@ -94,6 +94,8 @@
 
 typedef void (*EditorNodeInitCallback)();
 
+
+
 class EditorNode : public Node {
 
 	OBJ_TYPE( EditorNode, Node );
@@ -168,7 +170,17 @@ class EditorNode : public Node {
 		OBJECT_METHOD_BASE=500
 	};
 
-
+	enum DockSlot {
+		DOCK_SLOT_LEFT_UL,
+		DOCK_SLOT_LEFT_BL,
+		DOCK_SLOT_LEFT_UR,
+		DOCK_SLOT_LEFT_BR,
+		DOCK_SLOT_RIGHT_UL,
+		DOCK_SLOT_RIGHT_BL,
+		DOCK_SLOT_RIGHT_UR,
+		DOCK_SLOT_RIGHT_BR,
+		DOCK_SLOT_MAX
+	};
 
 
 	Node *edited_scene; //scene being edited
@@ -179,8 +191,22 @@ class EditorNode : public Node {
 	Control* scene_root_parent;
 	Control *gui_base;
 	VBoxContainer *main_vbox;
-	HSplitContainer *main_split;
-	VSplitContainer *left_split;
+
+
+
+	HSplitContainer *left_l_hsplit;
+	VSplitContainer *left_l_vsplit;
+	HSplitContainer *left_r_hsplit;
+	VSplitContainer *left_r_vsplit;
+	HSplitContainer *main_hsplit;
+	HSplitContainer *right_hsplit;
+	VSplitContainer *right_l_vsplit;
+	VSplitContainer *right_r_vsplit;
+
+	VSplitContainer *center_split;
+
+
+
 	int old_split_ofs;
 	VSplitContainer *top_split;
 	HBoxContainer *bottom_hb;
@@ -190,8 +216,9 @@ class EditorNode : public Node {
 	TextureButton *anim_close;
 	Panel *menu_panel;
 
-	HSplitContainer *editor_hsplit;
-	VSplitContainer *editor_vsplit;
+
+	//HSplitContainer *editor_hsplit;
+	//VSplitContainer *editor_vsplit;
 	HBoxContainer *menu_hb;
 	Control *viewport;
 	MenuButton *file_menu;
@@ -249,8 +276,8 @@ class EditorNode : public Node {
 	String current_path;
 	MenuButton *update_menu;
 	ToolButton *sources_button;
-	TabContainer *prop_pallete;
-	TabContainer *top_pallete;
+	//TabContainer *prop_pallete;
+	//TabContainer *top_pallete;
 	String defer_load_scene;
 	String defer_translatable;
 	String defer_optimize;
@@ -277,6 +304,16 @@ class EditorNode : public Node {
 	ProgressDialog *progress_dialog;
 	BackgroundProgress *progress_hb;
 
+	TabContainer *dock_slot[DOCK_SLOT_MAX];
+	Rect2 dock_select_rect[DOCK_SLOT_MAX];
+	int dock_select_rect_over;
+	PopupPanel *dock_select_popoup;
+	Control *dock_select;
+	ToolButton *dock_tab_move_left;
+	ToolButton *dock_tab_move_right;
+	int dock_popup_selected;
+	Timer *dock_drag_timer;
+
 	String _tmp_import_path;
 
 	EditorImportExport *editor_import_export;
@@ -417,6 +454,16 @@ class EditorNode : public Node {
 
 	bool _find_scene_in_use(Node* p_node,const String& p_path) const;
 
+	void _dock_select_input(const InputEvent& p_input);
+	void _dock_move_left();
+	void _dock_move_right();
+	void _dock_select_draw();
+	void _dock_pre_popup(int p_which);
+	void _dock_split_dragged(int ofs);
+	void _dock_popup_exit();
+
+	void _save_docks();
+	void _load_docks();
 
 protected:
 	void _notification(int p_what);

+ 3 - 0
tools/editor/groups_editor.cpp

@@ -39,6 +39,9 @@ void GroupsEditor::_notification(int p_what) {
 	if (p_what==NOTIFICATION_ENTER_TREE) {
 		connect("confirmed", this,"_close");
 	}	
+	if (p_what==NOTIFICATION_EXIT_TREE) {
+		disconnect("confirmed", this,"_close");
+	}
 }
 
 void GroupsEditor::_close() {

BIN
tools/editor/icons/icon_back_disabled.png


BIN
tools/editor/icons/icon_tab_menu.png


+ 1 - 0
tools/editor/property_editor.cpp

@@ -1915,6 +1915,7 @@ void PropertyEditor::_notification(int p_what) {
 	}
 	if (p_what==NOTIFICATION_EXIT_TREE) {
 
+		get_tree()->disconnect("node_removed",this,"_node_removed");
 		edit(NULL);
 	}
 

+ 5 - 0
tools/editor/reparent_dialog.cpp

@@ -41,6 +41,11 @@ void ReparentDialog::_notification(int p_what) {
 		connect("confirmed", this,"_reparent");
 	}
 
+	if (p_what==NOTIFICATION_EXIT_TREE)	{
+
+		disconnect("confirmed", this,"_reparent");
+	}
+
 	if (p_what==NOTIFICATION_DRAW) {
 		
 		//RID ci = get_canvas_item();

+ 14 - 11
tools/editor/scene_tree_dock.cpp

@@ -471,8 +471,18 @@ void SceneTreeDock::_notification(int p_what) {
 
 	switch(p_what) {
 
-		case NOTIFICATION_ENTER_TREE: {
+		case NOTIFICATION_READY: {
+
+			if (!first_enter)
+				break;
+			first_enter=false;
 
+			CanvasItemEditorPlugin *canvas_item_plugin =  editor_data->get_editor("2D")->cast_to<CanvasItemEditorPlugin>();
+			if (canvas_item_plugin) {
+				canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", scene_tree, "_update_tree");
+				canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", scene_tree, "_update_tree");
+				scene_tree->connect("node_changed", canvas_item_plugin->get_canvas_item_editor()->get_viewport_control(), "update");
+			}
 			static const char* button_names[TOOL_BUTTON_MAX]={
 				"New",
 				"Add",
@@ -487,19 +497,12 @@ void SceneTreeDock::_notification(int p_what) {
 				"Remove",
 			};
 
+
+
 			for(int i=0;i<TOOL_BUTTON_MAX;i++)
 				tool_buttons[i]->set_icon(get_icon(button_names[i],"EditorIcons"));
 
 		} break;
-		case NOTIFICATION_READY: {
-
-			CanvasItemEditorPlugin *canvas_item_plugin =  editor_data->get_editor("2D")->cast_to<CanvasItemEditorPlugin>();
-			if (canvas_item_plugin) {
-				canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", scene_tree, "_update_tree");
-				canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", scene_tree, "_update_tree");
-				scene_tree->connect("node_changed", canvas_item_plugin->get_canvas_item_editor()->get_viewport_control(), "update");
-			}
-		} break;
 	}
 }
 
@@ -1367,7 +1370,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec
 	add_child(import_subscene_dialog);
 	import_subscene_dialog->connect("subscene_selected",this,"_import_subscene");
 
-
+	first_enter=true;
 
 
 }

+ 1 - 0
tools/editor/scene_tree_dock.h

@@ -90,6 +90,7 @@ class SceneTreeDock : public VBoxContainer {
 	EditorFileDialog *file;
 	EditorSubScene *import_subscene_dialog;
 
+	bool first_enter;
 
 	void _create();
 	Node *scene_root;

+ 6 - 0
tools/editor/scene_tree_editor.cpp

@@ -498,6 +498,7 @@ void SceneTreeEditor::_notification(int p_what) {
 
 		get_tree()->disconnect("tree_changed",this,"_tree_changed");
 		get_tree()->disconnect("node_removed",this,"_node_removed");
+		tree->disconnect("item_collapsed",this,"_cell_collapsed");
 		_update_tree();
 	}
 
@@ -809,6 +810,11 @@ void SceneTreeDialog::_notification(int p_what) {
 	if (p_what==NOTIFICATION_ENTER_TREE) {
 		connect("confirmed", this,"_select");
 
+	}
+
+	if (p_what==NOTIFICATION_EXIT_TREE) {
+		disconnect("confirmed", this,"_select");
+
 	}
 	if (p_what==NOTIFICATION_DRAW) {
 

Some files were not shown because too many files changed in this diff