Add option to draw all tabs in front
This commit is contained in:
parent
c574b4d086
commit
814f9015f8
3 changed files with 34 additions and 2 deletions
|
@ -149,6 +149,9 @@
|
||||||
<member name="tabs_visible" type="bool" setter="set_tabs_visible" getter="are_tabs_visible" default="true">
|
<member name="tabs_visible" type="bool" setter="set_tabs_visible" getter="are_tabs_visible" default="true">
|
||||||
If [code]true[/code], tabs are visible. If [code]false[/code], tabs' content and titles are hidden.
|
If [code]true[/code], tabs are visible. If [code]false[/code], tabs' content and titles are hidden.
|
||||||
</member>
|
</member>
|
||||||
|
<member name="all_tabs_in_front" type="bool" setter="set_all_tabs_in_front" getter="is_all_tabs_in_front" default="false">
|
||||||
|
If [code]true[/code], all tabs are drawn in front of the panel. If [code]false[/code], inactive tabs are drawn behind the panel.
|
||||||
|
</member>
|
||||||
<member name="use_hidden_tabs_for_min_size" type="bool" setter="set_use_hidden_tabs_for_min_size" getter="get_use_hidden_tabs_for_min_size" default="false">
|
<member name="use_hidden_tabs_for_min_size" type="bool" setter="set_use_hidden_tabs_for_min_size" getter="get_use_hidden_tabs_for_min_size" default="false">
|
||||||
If [code]true[/code], children [Control] nodes that are hidden have their minimum size take into account in the total, instead of only the currently visible one.
|
If [code]true[/code], children [Control] nodes that are hidden have their minimum size take into account in the total, instead of only the currently visible one.
|
||||||
</member>
|
</member>
|
||||||
|
|
|
@ -415,6 +415,11 @@ void TabContainer::_notification(int p_what) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (all_tabs_in_front) {
|
||||||
|
// Draw the tab area.
|
||||||
|
panel->draw(canvas, Rect2(0, header_height, size.width, size.height - header_height));
|
||||||
|
}
|
||||||
|
|
||||||
// Draw unselected tabs in back
|
// Draw unselected tabs in back
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int x_current = 0;
|
int x_current = 0;
|
||||||
|
@ -446,8 +451,10 @@ void TabContainer::_notification(int p_what) {
|
||||||
last_tab_cache = index;
|
last_tab_cache = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!all_tabs_in_front) {
|
||||||
// Draw the tab area.
|
// Draw the tab area.
|
||||||
panel->draw(canvas, Rect2(0, header_height, size.width, size.height - header_height));
|
panel->draw(canvas, Rect2(0, header_height, size.width, size.height - header_height));
|
||||||
|
}
|
||||||
|
|
||||||
// Draw selected tab in front. only draw selected tab when it's in visible range.
|
// Draw selected tab in front. only draw selected tab when it's in visible range.
|
||||||
if (tabs.size() > 0 && current - first_tab_cache < tab_widths.size() && current >= first_tab_cache) {
|
if (tabs.size() > 0 && current - first_tab_cache < tab_widths.size() && current >= first_tab_cache) {
|
||||||
|
@ -1017,6 +1024,20 @@ bool TabContainer::are_tabs_visible() const {
|
||||||
return tabs_visible;
|
return tabs_visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TabContainer::set_all_tabs_in_front(bool p_in_front) {
|
||||||
|
if (p_in_front == all_tabs_in_front) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
all_tabs_in_front = p_in_front;
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TabContainer::is_all_tabs_in_front() const {
|
||||||
|
return all_tabs_in_front;
|
||||||
|
}
|
||||||
|
|
||||||
Control *TabContainer::_get_tab(int p_idx) const {
|
Control *TabContainer::_get_tab(int p_idx) const {
|
||||||
return get_tab_control(p_idx);
|
return get_tab_control(p_idx);
|
||||||
}
|
}
|
||||||
|
@ -1208,6 +1229,8 @@ void TabContainer::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("get_tab_align"), &TabContainer::get_tab_align);
|
ClassDB::bind_method(D_METHOD("get_tab_align"), &TabContainer::get_tab_align);
|
||||||
ClassDB::bind_method(D_METHOD("set_tabs_visible", "visible"), &TabContainer::set_tabs_visible);
|
ClassDB::bind_method(D_METHOD("set_tabs_visible", "visible"), &TabContainer::set_tabs_visible);
|
||||||
ClassDB::bind_method(D_METHOD("are_tabs_visible"), &TabContainer::are_tabs_visible);
|
ClassDB::bind_method(D_METHOD("are_tabs_visible"), &TabContainer::are_tabs_visible);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_all_tabs_in_front", "is_front"), &TabContainer::set_all_tabs_in_front);
|
||||||
|
ClassDB::bind_method(D_METHOD("is_all_tabs_in_front"), &TabContainer::is_all_tabs_in_front);
|
||||||
ClassDB::bind_method(D_METHOD("set_tab_title", "tab_idx", "title"), &TabContainer::set_tab_title);
|
ClassDB::bind_method(D_METHOD("set_tab_title", "tab_idx", "title"), &TabContainer::set_tab_title);
|
||||||
ClassDB::bind_method(D_METHOD("get_tab_title", "tab_idx"), &TabContainer::get_tab_title);
|
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"), &TabContainer::set_tab_icon);
|
ClassDB::bind_method(D_METHOD("set_tab_icon", "tab_idx", "icon"), &TabContainer::set_tab_icon);
|
||||||
|
@ -1234,6 +1257,7 @@ void TabContainer::_bind_methods() {
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "tab_align", PROPERTY_HINT_ENUM, "Left,Center,Right"), "set_tab_align", "get_tab_align");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "tab_align", PROPERTY_HINT_ENUM, "Left,Center,Right"), "set_tab_align", "get_tab_align");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "current_tab", PROPERTY_HINT_RANGE, "-1,4096,1", PROPERTY_USAGE_EDITOR), "set_current_tab", "get_current_tab");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "current_tab", PROPERTY_HINT_RANGE, "-1,4096,1", PROPERTY_USAGE_EDITOR), "set_current_tab", "get_current_tab");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "tabs_visible"), "set_tabs_visible", "are_tabs_visible");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "tabs_visible"), "set_tabs_visible", "are_tabs_visible");
|
||||||
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "all_tabs_in_front"), "set_all_tabs_in_front", "is_all_tabs_in_front");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "drag_to_rearrange_enabled"), "set_drag_to_rearrange_enabled", "get_drag_to_rearrange_enabled");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "drag_to_rearrange_enabled"), "set_drag_to_rearrange_enabled", "get_drag_to_rearrange_enabled");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_hidden_tabs_for_min_size"), "set_use_hidden_tabs_for_min_size", "get_use_hidden_tabs_for_min_size");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_hidden_tabs_for_min_size"), "set_use_hidden_tabs_for_min_size", "get_use_hidden_tabs_for_min_size");
|
||||||
|
|
||||||
|
@ -1253,6 +1277,7 @@ TabContainer::TabContainer() {
|
||||||
previous = 0;
|
previous = 0;
|
||||||
align = ALIGN_CENTER;
|
align = ALIGN_CENTER;
|
||||||
tabs_visible = true;
|
tabs_visible = true;
|
||||||
|
all_tabs_in_front = false;
|
||||||
drag_to_rearrange_enabled = false;
|
drag_to_rearrange_enabled = false;
|
||||||
tabs_rearrange_group = -1;
|
tabs_rearrange_group = -1;
|
||||||
use_hidden_tabs_for_min_size = false;
|
use_hidden_tabs_for_min_size = false;
|
||||||
|
|
|
@ -52,6 +52,7 @@ private:
|
||||||
int current;
|
int current;
|
||||||
int previous;
|
int previous;
|
||||||
bool tabs_visible;
|
bool tabs_visible;
|
||||||
|
bool all_tabs_in_front;
|
||||||
bool buttons_visible_cache;
|
bool buttons_visible_cache;
|
||||||
bool menu_hovered;
|
bool menu_hovered;
|
||||||
int highlight_arrow;
|
int highlight_arrow;
|
||||||
|
@ -94,6 +95,9 @@ public:
|
||||||
void set_tabs_visible(bool p_visible);
|
void set_tabs_visible(bool p_visible);
|
||||||
bool are_tabs_visible() const;
|
bool are_tabs_visible() const;
|
||||||
|
|
||||||
|
void set_all_tabs_in_front(bool p_is_front);
|
||||||
|
bool is_all_tabs_in_front() const;
|
||||||
|
|
||||||
void set_tab_title(int p_tab, const String &p_title);
|
void set_tab_title(int p_tab, const String &p_title);
|
||||||
String get_tab_title(int p_tab) const;
|
String get_tab_title(int p_tab) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue