diff options
| author | James McLean <jrimclean@gmail.com> | 2015-06-21 23:15:58 -0400 | 
|---|---|---|
| committer | James McLean <jrimclean@gmail.com> | 2015-06-21 23:15:58 -0400 | 
| commit | 4e3ec18f7e0794900974f70de4e293838d48c9fe (patch) | |
| tree | 52048d583a1881a8056a6cd50aab2f6e833eb241 | |
| parent | 86c87ee66ab8601f081c89e8d85c75003b50ff78 (diff) | |
| parent | 37af8b413674936518a2ebe180f9e7bfcd5795bb (diff) | |
Merge branch 'master' of github.com:okamstudio/godot into development
26 files changed, 777 insertions, 74 deletions
diff --git a/bin/tests/test_gui.cpp b/bin/tests/test_gui.cpp index 8822febdeb..c404623872 100644 --- a/bin/tests/test_gui.cpp +++ b/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 ); diff --git a/core/reference.h b/core/reference.h index 544da41044..65f31f78f3 100644 --- a/core/reference.h +++ b/core/reference.h @@ -294,6 +294,9 @@ public:  		reference=NULL;  	} +	void instance() { +		ref( memnew( T )); +	}  	Ref() { diff --git a/main/main.cpp b/main/main.cpp index a00538a6ae..15f969f466 100644 --- a/main/main.cpp +++ b/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); diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index 22559c238c..2367c03e99 100644 --- a/scene/gui/control.cpp +++ b/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: { diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index c73af74426..5ce7e2e0d3 100644 --- a/scene/gui/popup.cpp +++ b/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) { diff --git a/scene/gui/popup.h b/scene/gui/popup.h index c2de6c8cf7..6c72a3c82b 100644 --- a/scene/gui/popup.h +++ b/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(); diff --git a/scene/gui/split_container.cpp b/scene/gui/split_container.cpp index d02c833be9..d7ee7a6b86 100644 --- a/scene/gui/split_container.cpp +++ b/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) { diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 1db4998a27..3ed182c017 100644 --- a/scene/gui/tab_container.cpp +++ b/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;  } diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h index 43314b026d..602d248b46 100644 --- a/scene/gui/tab_container.h +++ b/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();  }; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index ab530866bb..2530e3a36f 100644 --- a/scene/main/node.cpp +++ b/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); diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index 2267cc9e2f..9a9048e3e5 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/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 ); diff --git a/scene/resources/default_theme/tab_menu.png b/scene/resources/default_theme/tab_menu.png Binary files differnew file mode 100644 index 0000000000..c5659da11b --- /dev/null +++ b/scene/resources/default_theme/tab_menu.png diff --git a/scene/resources/default_theme/tab_menu_hl.png b/scene/resources/default_theme/tab_menu_hl.png Binary files differnew file mode 100644 index 0000000000..6f68502c07 --- /dev/null +++ b/scene/resources/default_theme/tab_menu_hl.png diff --git a/scene/resources/default_theme/theme_data.h b/scene/resources/default_theme/theme_data.h index 8bd0a66271..291931a015 100644 --- a/scene/resources/default_theme/theme_data.h +++ b/scene/resources/default_theme/theme_data.h @@ -379,6 +379,16 @@ static const unsigned char tab_current_png[]={  }; +static const unsigned char tab_menu_png[]={ +0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdf,0x6,0xd,0x3,0x2c,0x7,0xf7,0x85,0x69,0x73,0x0,0x0,0x0,0x1d,0x69,0x54,0x58,0x74,0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x0,0x0,0x0,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,0x7,0x0,0x0,0x0,0x54,0x49,0x44,0x41,0x54,0x38,0xcb,0xed,0x92,0xb1,0xd,0xc0,0x20,0x10,0x3,0x8f,0xec,0x63,0x65,0xff,0x2d,0x40,0x1e,0xe8,0xd3,0x50,0x24,0xd1,0x83,0x48,0x97,0x2,0xb7,0xb6,0x4f,0xd6,0xeb,0x61,0xeb,0x67,0xb2,0x5d,0xbe,0x66,0x4a,0x12,0x88,0x19,0x40,0xd2,0xa3,0x73,0x24,0x99,0x6,0x64,0x90,0xe8,0x1e,0xd3,0x5,0x7d,0x45,0x3,0x74,0xf3,0x3,0xb0,0xa4,0x73,0x9,0xf0,0x82,0x30,0x2a,0xaf,0x1c,0xb5,0xda,0xae,0xfb,0xbd,0xe6,0xba,0x0,0x22,0x30,0x1e,0x2c,0xd7,0x21,0xa8,0x0,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82 +}; + + +static const unsigned char tab_menu_hl_png[]={ +0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdf,0x6,0xd,0x3,0x2c,0x15,0x4,0x3c,0x18,0x3b,0x0,0x0,0x0,0x1d,0x69,0x54,0x58,0x74,0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x0,0x0,0x0,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,0x7,0x0,0x0,0x0,0x58,0x49,0x44,0x41,0x54,0x38,0xcb,0x63,0x60,0x18,0x5,0x83,0xc,0xbc,0x7c,0xf9,0x92,0x91,0x54,0x35,0x8c,0x58,0x14,0xfc,0xc7,0x67,0x80,0xb8,0xb8,0x38,0x8a,0x1e,0x26,0x2c,0x6a,0x2e,0x32,0x30,0x30,0x60,0x33,0xe4,0x3f,0x54,0x8e,0x1,0xaf,0xb,0xa0,0xae,0xb8,0xc8,0xc0,0xc0,0xa0,0x8b,0x24,0xff,0x9f,0x81,0x81,0xe1,0xb2,0xb8,0xb8,0xb8,0x3e,0x51,0x6,0xa0,0x19,0xc2,0x80,0x4b,0x33,0x31,0x81,0x7a,0xe1,0xe5,0xcb,0x97,0x17,0x46,0x93,0x17,0x7e,0x0,0x0,0xa,0x9a,0x1f,0x34,0xff,0x99,0xf7,0x75,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82 +}; + +  static const unsigned char toggle_off_png[]={  0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0xa2,0x9d,0x7e,0x84,0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0x26,0x0,0x26,0x0,0x26,0x59,0xf,0xde,0x74,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xde,0x9,0x14,0x17,0x2,0x16,0xe9,0x0,0x17,0x60,0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x57,0x81,0xe,0x17,0x0,0x0,0x2,0x45,0x49,0x44,0x41,0x54,0x68,0x81,0xed,0x99,0x5f,0x4f,0xd3,0x50,0x18,0x87,0x9f,0xb3,0x96,0xb5,0xcc,0x3a,0xa6,0xac,0x6d,0xa,0x91,0x84,0x5b,0x8d,0x7e,0x21,0x60,0x2c,0x5c,0x1a,0x63,0xe2,0x27,0x31,0x31,0xc6,0x4b,0x32,0xa7,0x7e,0x20,0x84,0x6b,0x6f,0xc,0x90,0x6d,0x32,0xca,0x6c,0xb0,0x24,0x75,0xc7,0x8b,0xba,0xb9,0x35,0xdd,0x84,0xec,0xe0,0x26,0xed,0x73,0xd7,0xf7,0xed,0xce,0x7b,0x7e,0xbf,0xbe,0x67,0x7f,0xde,0x41,0x4e,0x4e,0xa6,0x11,0x89,0xeb,0x12,0x50,0x1,0x2c,0x40,0x4b,0xc9,0xff,0xaf,0x48,0xe0,0x27,0x10,0x0,0x3e,0x70,0x39,0x48,0xe8,0x89,0x1b,0x2b,0xc0,0x33,0xe0,0x11,0x60,0x72,0xb7,0xc,0x8,0x81,0xaf,0xc0,0x67,0xa6,0x18,0x60,0x1,0x1b,0x4f,0x1e,0x3f,0x7d,0x6d,0x57,0xed,0x65,0x40,0x48,0x64,0xfc,0x72,0x95,0x8,0x10,0x8,0x74,0x5d,0x67,0x69,0x49,0x47,0xd3,0x92,0xdb,0x50,0x4b,0x14,0x45,0xf2,0xf8,0xe4,0xf8,0xc7,0xe1,0xd1,0xc1,0x2b,0xe0,0xcb,0x68,0x2e,0x59,0x59,0x7,0xc,0xbb,0x6a,0x97,0xce,0xba,0x67,0x4,0x41,0x80,0xec,0xf7,0x91,0x8a,0x1d,0x10,0x8,0x44,0xa1,0x80,0x51,0x2c,0x52,0x2a,0xdd,0xa3,0x58,0x2c,0x2a,0x5d,0x3f,0x89,0x69,0x9a,0x62,0x7d,0x6d,0xbd,0x74,0x78,0x74,0x60,0x90,0xd0,0x9c,0x66,0xbd,0x0,0x8,0x82,0xef,0x54,0x2a,0xf,0x70,0x6c,0x7,0xa1,0xf8,0x24,0x48,0x24,0xed,0x4e,0x1b,0xdf,0x3f,0xc7,0x30,0x4c,0xa5,0x6b,0xa7,0x11,0x86,0x21,0x96,0x65,0x41,0xca,0x91,0x4e,0xed,0x3d,0x29,0x25,0xb2,0x2f,0x71,0x1d,0x97,0x30,0xc,0x39,0x6d,0x9d,0x2a,0xdd,0x90,0xe7,0x7a,0xb8,0x8e,0xcb,0x79,0xb7,0xab,0xbc,0xbb,0x6e,0x4a,0x61,0x52,0x62,0x70,0xf6,0x55,0x8b,0x87,0xdf,0x6b,0x4a,0xe6,0x2e,0x1e,0xa6,0x18,0x90,0x15,0x32,0x6f,0xc0,0xed,0x7e,0xfe,0xcc,0x80,0x65,0x59,0xd4,0xf7,0x6a,0x63,0xb1,0xc6,0x7e,0x93,0x20,0x8,0x78,0xf1,0xf2,0xf9,0x58,0xfc,0xed,0x9b,0x77,0xa9,0xb1,0xeb,0xb0,0xb0,0x6,0xc,0xc4,0x7f,0x78,0xff,0x9,0x80,0x9d,0xdd,0x2d,0xea,0x7b,0xb5,0xa1,0xb0,0x34,0x81,0xd7,0x15,0x3d,0xca,0xc2,0x1a,0x0,0xd0,0x6c,0x7c,0xa4,0xd7,0xeb,0x1,0xb1,0x11,0x3b,0xbb,0x5b,0xc3,0xdc,0xe8,0x13,0x1f,0x8,0x4f,0x8b,0xfd,0x8d,0x85,0x36,0x60,0x1a,0xaa,0x3a,0x60,0xa1,0xdf,0x4,0x6b,0xf5,0x6d,0xca,0xe5,0x32,0xe5,0x72,0x79,0xec,0xe9,0xab,0x24,0x69,0x80,0x9,0xac,0xdc,0x4a,0xa5,0x1b,0xd2,0xd8,0x6f,0x2,0xb1,0x9,0xb5,0xfa,0xf6,0x58,0x6c,0x6,0x56,0x88,0x35,0xe,0x49,0x1e,0x81,0x10,0xb8,0x98,0xb5,0x8a,0xa,0x82,0x20,0x98,0xd8,0xd2,0x33,0xb4,0xff,0x5,0xb1,0xc6,0x21,0xb,0x7d,0x4,0xfe,0x5,0xb9,0x1,0xf3,0xde,0xc0,0xbc,0x99,0x68,0x80,0x88,0xa7,0x16,0x78,0xae,0xa7,0xbc,0xa8,0xe7,0x7a,0xc3,0xa1,0xc8,0xbc,0x49,0xfd,0x1e,0x20,0x84,0x40,0x14,0x4,0xad,0x76,0xb,0xc7,0x76,0xd8,0xdc,0xd8,0x54,0x5a,0x54,0x22,0x69,0xb5,0x5b,0x88,0x82,0x98,0xbb,0x9,0x69,0x6,0x48,0x0,0xcb,0xba,0x8f,0xef,0xfb,0xb7,0xf2,0x9b,0xfd,0xcf,0x44,0xc8,0x40,0xd3,0x34,0xa5,0x6b,0xa7,0x61,0x9a,0x26,0x51,0x14,0x41,0xca,0x70,0x2f,0x69,0x40,0x4,0x5c,0x75,0xbe,0x75,0x2e,0xed,0xaa,0xbd,0xbc,0xfa,0x70,0xf5,0x4e,0xcd,0x4,0x81,0x2b,0x62,0x8d,0xa3,0x5b,0x19,0x63,0x8d,0x6c,0x4c,0x85,0x4f,0x6,0x89,0xcc,0xff,0x2f,0x90,0x93,0x93,0x93,0x6d,0x7e,0x1,0x6b,0xe,0xc1,0xdb,0xd6,0xe0,0xc4,0xba,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82  }; diff --git a/tools/editor/create_dialog.cpp b/tools/editor/create_dialog.cpp index f5bef2580d..c0f35a4ac2 100644 --- a/tools/editor/create_dialog.cpp +++ b/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) { diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp index 688604ecfd..373c8aba73 100644 --- a/tools/editor/editor_node.cpp +++ b/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();  } diff --git a/tools/editor/editor_node.h b/tools/editor/editor_node.h index 365dff84ee..2ef9332c84 100644 --- a/tools/editor/editor_node.h +++ b/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); diff --git a/tools/editor/groups_editor.cpp b/tools/editor/groups_editor.cpp index ed76f54562..2e82854014 100644 --- a/tools/editor/groups_editor.cpp +++ b/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() { diff --git a/tools/editor/icons/icon_back_disabled.png b/tools/editor/icons/icon_back_disabled.png Binary files differnew file mode 100644 index 0000000000..31aab496e2 --- /dev/null +++ b/tools/editor/icons/icon_back_disabled.png diff --git a/tools/editor/icons/icon_tab_menu.png b/tools/editor/icons/icon_tab_menu.png Binary files differnew file mode 100644 index 0000000000..29edd02f01 --- /dev/null +++ b/tools/editor/icons/icon_tab_menu.png diff --git a/tools/editor/plugins/canvas_item_editor_plugin.cpp b/tools/editor/plugins/canvas_item_editor_plugin.cpp index 74b8202dc0..f2738f0a62 100644 --- a/tools/editor/plugins/canvas_item_editor_plugin.cpp +++ b/tools/editor/plugins/canvas_item_editor_plugin.cpp @@ -175,11 +175,21 @@ void CanvasItemEditor::_unhandled_key_input(const InputEvent& p_ev) {  						Vector2 offset = n2d->edit_get_pivot();  						Vector2 gpos = n2d->get_global_pos(); +						Vector2 motion_ofs = gpos-mouse_pos;  						undo_redo->add_do_method(n2d,"set_global_pos",mouse_pos); -						undo_redo->add_do_method(n2d,"edit_set_pivot",offset+(gpos-mouse_pos)); +						undo_redo->add_do_method(n2d,"edit_set_pivot",offset+n2d->get_global_transform().affine_inverse().basis_xform(motion_ofs));  						undo_redo->add_undo_method(n2d,"set_global_pos",gpos);  						undo_redo->add_undo_method(n2d,"edit_set_pivot",offset); +						for(int i=0;i<n2d->get_child_count();i++) { +							Node2D *n2dc = n2d->get_child(i)->cast_to<Node2D>(); +							if (!n2dc) +								continue; + +							undo_redo->add_do_method(n2dc,"set_global_pos",n2dc->get_global_pos()); +							undo_redo->add_undo_method(n2dc,"set_global_pos",n2dc->get_global_pos()); + +						}  					} diff --git a/tools/editor/property_editor.cpp b/tools/editor/property_editor.cpp index 98e0df77f7..a7636f517f 100644 --- a/tools/editor/property_editor.cpp +++ b/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);  	} diff --git a/tools/editor/reparent_dialog.cpp b/tools/editor/reparent_dialog.cpp index d35316f67f..6d0c5b867e 100644 --- a/tools/editor/reparent_dialog.cpp +++ b/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(); diff --git a/tools/editor/scene_tree_dock.cpp b/tools/editor/scene_tree_dock.cpp index 432f60fa53..49cbebdb43 100644 --- a/tools/editor/scene_tree_dock.cpp +++ b/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;  } diff --git a/tools/editor/scene_tree_dock.h b/tools/editor/scene_tree_dock.h index 34e8a00739..4baa4ef37b 100644 --- a/tools/editor/scene_tree_dock.h +++ b/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; diff --git a/tools/editor/scene_tree_editor.cpp b/tools/editor/scene_tree_editor.cpp index 94eea969fe..fd841028a2 100644 --- a/tools/editor/scene_tree_editor.cpp +++ b/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();  	} @@ -810,6 +811,11 @@ void SceneTreeDialog::_notification(int p_what) {  		connect("confirmed", this,"_select");  	} + +	if (p_what==NOTIFICATION_EXIT_TREE) { +		disconnect("confirmed", this,"_select"); + +	}  	if (p_what==NOTIFICATION_DRAW) {  		RID ci = get_canvas_item();  |