Browse Source

Merge pull request #7517 from RayKoopa/gui_disabled_tabs

Add feature to disable tabs in TabContainer and Tabs control.
Rémi Verschelde 8 years ago
parent
commit
4c98d1791f

+ 36 - 5
scene/gui/tab_container.cpp

@@ -39,8 +39,9 @@ int TabContainer::_get_top_margin() const {
 	// Respect the minimum tab height.
 	Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
 	Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
+	Ref<StyleBox> tab_disabled = get_stylebox("tab_disabled");
 
-	int tab_height = MAX(tab_bg->get_minimum_size().height, tab_fg->get_minimum_size().height);
+	int tab_height = MAX(MAX(tab_bg->get_minimum_size().height, tab_fg->get_minimum_size().height), tab_disabled->get_minimum_size().height);
 
 	// Font height or higher icon wins.
 	Ref<Font> font = get_font("font");
@@ -117,7 +118,9 @@ void TabContainer::_gui_input(const InputEvent& p_event) {
 		for (int i = first_tab_cache; i <= last_tab_cache; i++) {
 			int tab_width = _get_tab_width(i);
 			if (pos.x < tab_width) {
-				set_current_tab(i);
+				if (!get_tab_disabled(i)) {
+					set_current_tab(i);
+				}
 				break;
 			}
 			pos.x -= tab_width;
@@ -144,6 +147,7 @@ void TabContainer::_notification(int p_what) {
 			Vector<Control*> tabs = _get_tabs();
 			Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
 			Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
+			Ref<StyleBox> tab_disabled = get_stylebox("tab_disabled");
 			Ref<Texture> increment = get_icon("increment");
 			Ref<Texture> decrement = get_icon("decrement");
 			Ref<Texture> menu = get_icon("menu");
@@ -151,6 +155,7 @@ void TabContainer::_notification(int p_what) {
 			Ref<Font> font = get_font("font");
 			Color font_color_fg = get_color("font_color_fg");
 			Color font_color_bg = get_color("font_color_bg");
+			Color font_color_disabled = get_color("font_color_disabled");
 			int side_margin = get_constant("side_margin");
 			int icon_text_distance = get_constant("hseparation");
 
@@ -210,7 +215,10 @@ void TabContainer::_notification(int p_what) {
 			for (int i = 0; i < tab_widths.size(); i++) {
 				Ref<StyleBox> tab_style;
 				Color font_color;
-				if (i + first_tab_cache == current) {
+				if (get_tab_disabled(i + first_tab_cache)) {
+					tab_style = tab_disabled;
+					font_color = font_color_disabled;
+				} else if (i + first_tab_cache == current) {
 					tab_style = tab_fg;
 					font_color = font_color_fg;
 				} else {
@@ -313,7 +321,10 @@ int TabContainer::_get_tab_width(int p_index) const {
 	// Respect a minimum size.
 	Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
 	Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
-	if (p_index == current) {
+	Ref<StyleBox> tab_disabled = get_stylebox("tab_disabled");
+	if (get_tab_disabled(p_index)) {
+		width += tab_disabled->get_minimum_size().width;
+	} else if (p_index == current) {
 		width += tab_fg->get_minimum_size().width;
 	} else {
 		width += tab_bg->get_minimum_size().width;
@@ -533,6 +544,23 @@ Ref<Texture> TabContainer::get_tab_icon(int p_tab) const {
 		return Ref<Texture>();
 }
 
+void TabContainer::set_tab_disabled(int p_tab, bool p_enabled) {
+
+	Control *child = _get_tab(p_tab);
+	ERR_FAIL_COND(!child);
+	child->set_meta("_tab_disabled", p_enabled);
+	update();
+}
+bool TabContainer::get_tab_disabled(int p_tab) const {
+
+	Control *child = _get_tab(p_tab);
+	ERR_FAIL_COND_V(!child, false);
+	if (child->has_meta("_tab_disabled"))
+		return child->get_meta("_tab_disabled");
+	else
+		return false;
+}
+
 void TabContainer::get_translatable_strings(List<String> *p_strings) const {
 
 	Vector<Control*> tabs = _get_tabs();
@@ -570,9 +598,10 @@ Size2 TabContainer::get_minimum_size() const {
 
 	Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
 	Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
+	Ref<StyleBox> tab_disabled = get_stylebox("tab_disabled");
 	Ref<Font> font = get_font("font");
 
-	ms.y += MAX(tab_bg->get_minimum_size().y, tab_fg->get_minimum_size().y);
+	ms.y += MAX(MAX(tab_bg->get_minimum_size().y, tab_fg->get_minimum_size().y), tab_disabled->get_minimum_size().y);
 	ms.y += font->get_height();
 
 	Ref<StyleBox> sb = get_stylebox("panel");
@@ -608,6 +637,8 @@ void TabContainer::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_tab_title", "tab_idx"), &TabContainer::get_tab_title);
 	ClassDB::bind_method(D_METHOD("set_tab_icon", "tab_idx", "icon:Texture"), &TabContainer::set_tab_icon);
 	ClassDB::bind_method(D_METHOD("get_tab_icon:Texture", "tab_idx"), &TabContainer::get_tab_icon);
+	ClassDB::bind_method(D_METHOD("set_tab_disabled", "tab_idx", "disabled"), &TabContainer::set_tab_disabled);
+	ClassDB::bind_method(D_METHOD("get_tab_disabled", "tab_idx"), &TabContainer::get_tab_disabled);
 	ClassDB::bind_method(D_METHOD("set_popup", "popup:Popup"), &TabContainer::set_popup);
 	ClassDB::bind_method(D_METHOD("get_popup:Popup"), &TabContainer::get_popup);
 

+ 3 - 0
scene/gui/tab_container.h

@@ -85,6 +85,9 @@ public:
 	void set_tab_icon(int p_tab,const Ref<Texture>& p_icon);
 	Ref<Texture> get_tab_icon(int p_tab) const;
 
+	void set_tab_disabled(int p_tab, bool p_disabled);
+	bool get_tab_disabled(int p_tab) const;
+
 	int get_tab_count() const;
 	void set_current_tab(int p_current);
 	int get_current_tab() const;

+ 35 - 7
scene/gui/tabs.cpp

@@ -34,9 +34,10 @@ Size2 Tabs::get_minimum_size() const {
 
 	Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
 	Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
+	Ref<StyleBox> tab_disabled = get_stylebox("tab_disabled");
 	Ref<Font> font = get_font("font");
 
-	Size2 ms(0, MAX(tab_bg->get_minimum_size().height, tab_fg->get_minimum_size().height)+font->get_height());
+	Size2 ms(0, MAX(MAX(tab_bg->get_minimum_size().height, tab_fg->get_minimum_size().height), tab_disabled->get_minimum_size().height)+font->get_height());
 
 	for(int i=0;i<tabs.size();i++) {
 
@@ -49,7 +50,9 @@ Size2 Tabs::get_minimum_size() const {
 
 		ms.width+=font->get_string_size(tabs[i].text).width;
 
-		if (current==i)
+		if (tabs[i].disabled)
+			ms.width += tab_disabled->get_minimum_size().width;
+		else if (current==i)
 			ms.width+=tab_fg->get_minimum_size().width;
 		else
 			ms.width+=tab_bg->get_minimum_size().width;
@@ -111,7 +114,7 @@ void Tabs::_gui_input(const InputEvent& p_event) {
 				hover_buttons = i;
 				break;
 			}
-			else if (tabs[i].cb_rect.has_point(pos)) {
+			else if (!tabs[i].disabled && tabs[i].cb_rect.has_point(pos)) {
 				cb_hover=i;
 				rb_hover=-1;
 				hover_buttons = i;
@@ -206,7 +209,9 @@ void Tabs::_gui_input(const InputEvent& p_event) {
 			}
 
 			if (pos.x >=tabs[i].ofs_cache && pos.x<tabs[i].ofs_cache+tabs[i].size_cache) {
-				found=i;
+				if (!tabs[i].disabled) {
+					found = i;
+				}
 				break;
 			}
 		}
@@ -242,9 +247,11 @@ void Tabs::_notification(int p_what) {
 
 			Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
 			Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
+			Ref<StyleBox> tab_disabled = get_stylebox("tab_disabled");
 			Ref<Font> font = get_font("font");
 			Color color_fg = get_color("font_color_fg");
 			Color color_bg = get_color("font_color_bg");
+			Color color_disabled = get_color("font_color_disabled");
 			Ref<Texture> close=get_icon("close");
 
 			int h = get_size().height;
@@ -301,7 +308,10 @@ void Tabs::_notification(int p_what) {
 				Ref<StyleBox> sb;
 				Color col;
 
-				if (i==current) {
+				if (tabs[i].disabled) {
+					sb = tab_disabled;
+					col = color_disabled;
+				} else if (i == current) {
 					sb=tab_fg;
 					col=color_fg;
 				} else {
@@ -366,7 +376,7 @@ void Tabs::_notification(int p_what) {
 					cb_rect.pos.x=w;
 					cb_rect.pos.y=sb->get_margin(MARGIN_TOP)+((sb_rect.size.y-sb_ms.y)-(cb_rect.size.y))/2;
 
-					if (cb_hover==i) {
+					if (!tabs[i].disabled && cb_hover == i) {
 						if (cb_pressing)
 							get_stylebox("button_pressed")->draw(ci,cb_rect);
 						else
@@ -463,6 +473,18 @@ Ref<Texture> Tabs::get_tab_icon(int p_tab) const{
 }
 
 
+void Tabs::set_tab_disabled(int p_tab, bool p_disabled) {
+	
+	ERR_FAIL_INDEX(p_tab, tabs.size());
+	tabs[p_tab].disabled = p_disabled;
+	update();
+}
+bool Tabs::get_tab_disabled(int p_tab) const {
+	
+	ERR_FAIL_INDEX_V(p_tab, tabs.size(), false);
+	return tabs[p_tab].disabled;
+}
+
 void Tabs::set_tab_right_button(int p_tab,const Ref<Texture>& p_right_button){
 
 	ERR_FAIL_INDEX(p_tab,tabs.size());
@@ -484,6 +506,7 @@ void Tabs::add_tab(const String& p_str,const Ref<Texture>& p_icon) {
 	Tab t;
 	t.text=p_str;
 	t.icon=p_icon;
+	t.disabled = false;
 
 	tabs.push_back(t);
 
@@ -534,6 +557,7 @@ int Tabs::get_tab_width(int p_idx) const {
 
 	Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
 	Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
+	Ref<StyleBox> tab_disabled = get_stylebox("tab_disabled");
 	Ref<Font> font = get_font("font");
 
 
@@ -549,7 +573,9 @@ int Tabs::get_tab_width(int p_idx) const {
 
 	x+=font->get_string_size(tabs[p_idx].text).width;
 
-	if (current==p_idx)
+	if (tabs[p_idx].disabled)
+		x += tab_disabled->get_minimum_size().width;
+	else if (current==p_idx)
 		x+=tab_fg->get_minimum_size().width;
 	else
 		x+=tab_bg->get_minimum_size().width;
@@ -657,6 +683,8 @@ void Tabs::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_tab_title","tab_idx"),&Tabs::get_tab_title);
 	ClassDB::bind_method(D_METHOD("set_tab_icon","tab_idx","icon:Texture"),&Tabs::set_tab_icon);
 	ClassDB::bind_method(D_METHOD("get_tab_icon:Texture","tab_idx"),&Tabs::get_tab_icon);
+	ClassDB::bind_method(D_METHOD("set_tab_disabled", "tab_idx", "disabled"), &Tabs::set_tab_disabled);
+	ClassDB::bind_method(D_METHOD("get_tab_disabled", "tab_idx"), &Tabs::get_tab_disabled);
 	ClassDB::bind_method(D_METHOD("remove_tab","tab_idx"),&Tabs::remove_tab);
 	ClassDB::bind_method(D_METHOD("add_tab","title","icon:Texture"),&Tabs::add_tab);
 	ClassDB::bind_method(D_METHOD("set_tab_align","align"),&Tabs::set_tab_align);

+ 4 - 0
scene/gui/tabs.h

@@ -57,6 +57,7 @@ private:
 		String text;
 		Ref<Texture> icon;
 		int ofs_cache;
+		bool disabled;
 		int size_cache;
 		int x_cache;
 		int x_size_cache;
@@ -105,6 +106,9 @@ public:
 
 	void set_tab_icon(int p_tab,const Ref<Texture>& p_icon);
 	Ref<Texture> get_tab_icon(int p_tab) const;
+		
+	void set_tab_disabled(int p_tab, bool p_disabled);
+	bool get_tab_disabled(int p_tab) const;
 
 	void set_tab_right_button(int p_tab,const Ref<Texture>& p_right_button);
 	Ref<Texture> get_tab_right_button(int p_tab) const;

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

@@ -750,6 +750,7 @@ void fill_default_theme(Ref<Theme>& t, const Ref<Font> & default_font, const Ref
 
 	t->set_stylebox("tab_fg","TabContainer", sb_expand( make_stylebox( tab_current_png,4,4,4,1,16,4,16,4),2,2,2,2) );
 	t->set_stylebox("tab_bg","TabContainer", sb_expand( make_stylebox( tab_behind_png,5,5,5,1,16,6,16,4),3,0,3,3) );
+	t->set_stylebox("tab_disabled", "TabContainer", sb_expand(make_stylebox(tab_disabled_png, 5, 5, 5, 1, 16, 6, 16, 4), 3, 0, 3, 3));
 	t->set_stylebox("panel","TabContainer", tc_sb );
 
 	t->set_icon("increment","TabContainer",make_icon( scroll_button_right_png));
@@ -763,6 +764,7 @@ void fill_default_theme(Ref<Theme>& t, const Ref<Font> & default_font, const Ref
 
 	t->set_color("font_color_fg","TabContainer", control_font_color_hover );
 	t->set_color("font_color_bg","TabContainer", control_font_color_low );
+	t->set_color("font_color_disabled", "TabContainer", control_font_color_disabled);
 
 	t->set_constant("side_margin","TabContainer", 8 *scale);
 	t->set_constant("top_margin","TabContainer", 24 *scale);
@@ -776,6 +778,7 @@ void fill_default_theme(Ref<Theme>& t, const Ref<Font> & default_font, const Ref
 
 	t->set_stylebox("tab_fg","Tabs", sb_expand( make_stylebox( tab_current_png,4,3,4,1,16,3,16,2),2,2,2,2) );
 	t->set_stylebox("tab_bg","Tabs", sb_expand( make_stylebox( tab_behind_png,5,4,5,1,16,5,16,2),3,3,3,3) );
+	t->set_stylebox("tab_disabled", "Tabs", sb_expand(make_stylebox(tab_disabled_png, 5, 4, 5, 1, 16, 5, 16, 2), 3, 3, 3, 3));
 	t->set_stylebox("panel","Tabs",tc_sb );
 	t->set_stylebox("button_pressed","Tabs", make_stylebox( button_pressed_png,4,4,4,4) );
 	t->set_stylebox("button","Tabs", make_stylebox( button_normal_png,4,4,4,4) );
@@ -790,6 +793,7 @@ void fill_default_theme(Ref<Theme>& t, const Ref<Font> & default_font, const Ref
 
 	t->set_color("font_color_fg","Tabs", control_font_color_hover );
 	t->set_color("font_color_bg","Tabs", control_font_color_low );
+	t->set_color("font_color_disabled", "Tabs", control_font_color_disabled);
 
 	t->set_constant("top_margin","Tabs", 24 *scale);
 	t->set_constant("label_valign_fg","Tabs", 0 *scale);

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


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