Make hovered tabs be drawn with the unselected's width at minimum

This commit is contained in:
Michael Alexsander 2023-09-26 14:12:08 -03:00
parent 43b9e89a07
commit decae848a8
No known key found for this signature in database
GPG Key ID: A9C91EE110F4EABA
4 changed files with 13 additions and 6 deletions

View File

@ -414,6 +414,7 @@
</theme_item> </theme_item>
<theme_item name="tab_hovered" data_type="style" type="StyleBox"> <theme_item name="tab_hovered" data_type="style" type="StyleBox">
The style of the currently hovered tab. Does not apply to the selected tab. The style of the currently hovered tab. Does not apply to the selected tab.
[b]Note:[/b] This style will be drawn with the same width as [theme_item tab_unselected] at minimum.
</theme_item> </theme_item>
<theme_item name="tab_selected" data_type="style" type="StyleBox"> <theme_item name="tab_selected" data_type="style" type="StyleBox">
The style of the currently selected tab. The style of the currently selected tab.

View File

@ -318,6 +318,7 @@
</theme_item> </theme_item>
<theme_item name="tab_hovered" data_type="style" type="StyleBox"> <theme_item name="tab_hovered" data_type="style" type="StyleBox">
The style of the currently hovered tab. The style of the currently hovered tab.
[b]Note:[/b] This style will be drawn with the same width as [theme_item tab_unselected] at minimum.
</theme_item> </theme_item>
<theme_item name="tab_selected" data_type="style" type="StyleBox"> <theme_item name="tab_selected" data_type="style" type="StyleBox">
The style of the currently selected tab. The style of the currently selected tab.

View File

@ -948,7 +948,7 @@ void TabBar::_update_hover() {
} }
} }
void TabBar::_update_cache() { void TabBar::_update_cache(bool p_update_hover) {
if (tabs.is_empty()) { if (tabs.is_empty()) {
buttons_visible = false; buttons_visible = false;
return; return;
@ -1011,7 +1011,9 @@ void TabBar::_update_cache() {
buttons_visible = offset > 0 || missing_right; buttons_visible = offset > 0 || missing_right;
if (tab_alignment == ALIGNMENT_LEFT) { if (tab_alignment == ALIGNMENT_LEFT) {
if (p_update_hover) {
_update_hover(); _update_hover();
}
return; return;
} }
@ -1029,8 +1031,10 @@ void TabBar::_update_cache() {
} }
} }
if (p_update_hover) {
_update_hover(); _update_hover();
} }
}
void TabBar::_on_mouse_exited() { void TabBar::_on_mouse_exited() {
rb_hover = -1; rb_hover = -1;
@ -1039,7 +1043,7 @@ void TabBar::_on_mouse_exited() {
highlight_arrow = -1; highlight_arrow = -1;
dragging_valid_tab = false; dragging_valid_tab = false;
_update_cache(); _update_cache(false);
queue_redraw(); queue_redraw();
} }
@ -1373,7 +1377,8 @@ int TabBar::get_tab_width(int p_idx) const {
style = theme_cache.tab_disabled_style; style = theme_cache.tab_disabled_style;
} else if (current == p_idx) { } else if (current == p_idx) {
style = theme_cache.tab_selected_style; style = theme_cache.tab_selected_style;
} else if (hover == p_idx) { // Use the unselected style's width if the hovered one is shorter, to avoid an infinite loop when switching tabs with the mouse.
} else if (hover == p_idx && theme_cache.tab_hovered_style->get_minimum_size().width >= theme_cache.tab_unselected_style->get_minimum_size().width) {
style = theme_cache.tab_hovered_style; style = theme_cache.tab_hovered_style;
} else { } else {
style = theme_cache.tab_unselected_style; style = theme_cache.tab_unselected_style;

View File

@ -148,7 +148,7 @@ private:
void _ensure_no_over_offset(); void _ensure_no_over_offset();
void _update_hover(); void _update_hover();
void _update_cache(); void _update_cache(bool p_update_hover = true);
void _on_mouse_exited(); void _on_mouse_exited();