-Improved tab visibility, fixes #3314
This commit is contained in:
@ -243,6 +243,10 @@ void Tabs::_notification(int p_what) {
|
|||||||
hover=-1;
|
hover=-1;
|
||||||
update();
|
update();
|
||||||
} break;
|
} break;
|
||||||
|
case NOTIFICATION_RESIZED: {
|
||||||
|
|
||||||
|
_ensure_no_over_offset();
|
||||||
|
} break;
|
||||||
case NOTIFICATION_DRAW: {
|
case NOTIFICATION_DRAW: {
|
||||||
|
|
||||||
RID ci = get_canvas_item();
|
RID ci = get_canvas_item();
|
||||||
@ -587,6 +591,8 @@ void Tabs::remove_tab(int p_idx) {
|
|||||||
|
|
||||||
//emit_signal("tab_changed",current);
|
//emit_signal("tab_changed",current);
|
||||||
|
|
||||||
|
_ensure_no_over_offset();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -645,6 +651,39 @@ int Tabs::get_tab_width(int p_idx) const {
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Tabs::_ensure_no_over_offset() {
|
||||||
|
|
||||||
|
if (!is_inside_tree())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Ref<Texture> incr = get_icon("increment");
|
||||||
|
Ref<Texture> decr = get_icon("decrement");
|
||||||
|
|
||||||
|
int limit=get_size().width-incr->get_width()-decr->get_width();
|
||||||
|
|
||||||
|
while(offset>0) {
|
||||||
|
|
||||||
|
int total_w=0;
|
||||||
|
for(int i=0;i<tabs.size();i++) {
|
||||||
|
|
||||||
|
if (i<offset-1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
total_w+=get_tab_width(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (total_w < limit) {
|
||||||
|
offset--;
|
||||||
|
update();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Tabs::ensure_tab_visible(int p_idx) {
|
void Tabs::ensure_tab_visible(int p_idx) {
|
||||||
|
|
||||||
if (!is_inside_tree())
|
if (!is_inside_tree())
|
||||||
@ -652,6 +691,8 @@ void Tabs::ensure_tab_visible(int p_idx) {
|
|||||||
|
|
||||||
ERR_FAIL_INDEX(p_idx,tabs.size());
|
ERR_FAIL_INDEX(p_idx,tabs.size());
|
||||||
|
|
||||||
|
_ensure_no_over_offset();
|
||||||
|
|
||||||
if (p_idx<=offset) {
|
if (p_idx<=offset) {
|
||||||
offset=p_idx;
|
offset=p_idx;
|
||||||
update();
|
update();
|
||||||
|
|||||||
@ -88,6 +88,7 @@ private:
|
|||||||
int hover; // hovered tab
|
int hover; // hovered tab
|
||||||
|
|
||||||
int get_tab_width(int p_idx) const;
|
int get_tab_width(int p_idx) const;
|
||||||
|
void _ensure_no_over_offset();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user