diff options
author | Ray Koopa <raykoopa@users.noreply.github.com> | 2017-02-27 19:07:50 +0100 |
---|---|---|
committer | Ray Koopa <raykoopa@users.noreply.github.com> | 2017-02-27 19:07:50 +0100 |
commit | 5cf063ca9de6cefb30f20f161efa74e2b192e5f7 (patch) | |
tree | 085e8f90436ca85420f8d20b508b1df93477f4a3 /scene/gui | |
parent | 55ce8e6ce929f6ff58f9fed8a0a547883deaccb8 (diff) |
Add disabled tabs
Diffstat (limited to 'scene/gui')
-rw-r--r-- | scene/gui/tab_container.cpp | 41 | ||||
-rw-r--r-- | scene/gui/tab_container.h | 3 | ||||
-rw-r--r-- | scene/gui/tabs.cpp | 42 | ||||
-rw-r--r-- | scene/gui/tabs.h | 4 |
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; |