summaryrefslogtreecommitdiff
path: root/scene/gui
diff options
context:
space:
mode:
authorRay Koopa <raykoopa@users.noreply.github.com>2017-02-27 19:07:50 +0100
committerRay Koopa <raykoopa@users.noreply.github.com>2017-02-27 19:07:50 +0100
commit5cf063ca9de6cefb30f20f161efa74e2b192e5f7 (patch)
tree085e8f90436ca85420f8d20b508b1df93477f4a3 /scene/gui
parent55ce8e6ce929f6ff58f9fed8a0a547883deaccb8 (diff)
Add disabled tabs
Diffstat (limited to 'scene/gui')
-rw-r--r--scene/gui/tab_container.cpp41
-rw-r--r--scene/gui/tab_container.h3
-rw-r--r--scene/gui/tabs.cpp42
-rw-r--r--scene/gui/tabs.h4
4 files changed, 78 insertions, 12 deletions
diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp
index f5dc48a2b1..1707676da2 100644
--- a/scene/gui/tab_container.cpp
+++ b/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);
diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h
index e880a3b752..67f631f866 100644
--- a/scene/gui/tab_container.h
+++ b/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;
diff --git a/scene/gui/tabs.cpp b/scene/gui/tabs.cpp
index ae282165c2..4e07a495ed 100644
--- a/scene/gui/tabs.cpp
+++ b/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);
diff --git a/scene/gui/tabs.h b/scene/gui/tabs.h
index 9ba32297dc..83dcce2613 100644
--- a/scene/gui/tabs.h
+++ b/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;