@ -142,91 +142,107 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) {
Ref < InputEventMouseButton > mb = p_event ;
if ( rb_pressing & & mb . is_valid ( ) & &
! mb - > is_pressed ( ) & &
mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( mb . is_valid ( ) ) {
if ( rb_hover ! = - 1 ) {
//pressed
emit_signal ( " right_button_pressed " , rb_hover ) ;
if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_WHEEL_UP & & ! mb - > get_command ( ) ) {
if ( scrolling_enabled & & buttons_visible ) {
if ( offset > 0 ) {
offset - - ;
update ( ) ;
}
}
}
rb_pressing = false ;
update ( ) ;
}
if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_WHEEL_DOWN & & ! mb - > get_command ( ) ) {
if ( scrolling_enabled & & buttons_visible ) {
if ( missing_right ) {
offset + + ;
update ( ) ;
}
}
}
if ( rb_pressing & & ! mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( cb_pressing & & mb . is_valid ( ) & &
! mb - > is_pressed ( ) & &
mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( rb_hover ! = - 1 ) {
//pressed
emit_signal ( " right_button_pressed " , rb_hover ) ;
}
if ( cb_hover ! = - 1 ) {
//pressed
emit_signal ( " tab_close " , cb_hover ) ;
rb_pressing = false ;
update ( ) ;
}
cb_pressing = false ;
update ( ) ;
}
if ( cb_pressing & & ! mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( mb . is_valid ( ) & &
mb - > is_pressed ( ) & &
mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( cb_hover ! = - 1 ) {
//pressed
emit_signal ( " tab_close " , cb_hover ) ;
}
// clicks
Point2 pos ( mb - > get_position ( ) . x , mb - > get_position ( ) . y ) ;
cb_pressing = false ;
update ( ) ;
}
if ( buttons_visible ) {
if ( mb- > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
Ref < Texture > incr = get_icon ( " increment " ) ;
Ref< Texture > decr = get_icon ( " decrement " ) ;
// clicks
Point2 pos ( mb - > get_position ( ) . x , mb - > get_position ( ) . y ) ;
int limit = get_size ( ) . width - incr - > get_width ( ) - decr - > get_width ( ) ;
if ( buttons_visible ) {
if ( pos . x > limit + decr - > get_width ( ) ) {
if ( missing_right ) {
offset + + ;
update ( ) ;
}
return ;
} else if ( pos . x > limit ) {
if ( offset > 0 ) {
offset - - ;
update ( ) ;
Ref < Texture > incr = get_icon ( " increment " ) ;
Ref < Texture > decr = get_icon ( " decrement " ) ;
int limit = get_size ( ) . width - incr - > get_width ( ) - decr - > get_width ( ) ;
if ( pos . x > limit + decr - > get_width ( ) ) {
if ( missing_right ) {
offset + + ;
update ( ) ;
}
return ;
} else if ( pos . x > limit ) {
if ( offset > 0 ) {
offset - - ;
update ( ) ;
}
return ;
}
return ;
}
}
int found = - 1 ;
for ( int i = 0 ; i < tabs . size ( ) ; i + + ) {
int found = - 1 ;
for ( int i = 0 ; i < tabs . size ( ) ; i + + ) {
if ( i < offset )
continue ;
if ( i < offset )
continue ;
if ( tabs [ i ] . rb_rect . has_point ( pos ) ) {
rb_pressing = true ;
update ( ) ;
return ;
}
if ( tabs [ i ] . rb_rect . has_point ( pos ) ) {
rb_pressing = true ;
update ( ) ;
return ;
}
if ( tabs [ i ] . cb_rect . has_point ( pos ) ) {
cb_pressing = true ;
update ( ) ;
return ;
}
if ( tabs [ i ] . cb_rect . has_point ( pos ) ) {
cb_pressing = true ;
update ( ) ;
return ;
}
if ( pos . x > = tabs [ i ] . ofs_cache & & pos . x < tabs [ i ] . ofs_cache + tabs [ i ] . size_cache ) {
if ( ! tabs [ i ] . disabled ) {
found = i ;
if ( pos . x > = tabs [ i ] . ofs_cache & & pos . x < tabs [ i ] . ofs_cache + tabs [ i ] . size_cache ) {
if ( ! tabs [ i ] . disabled ) {
found = i ;
}
break ;
}
break ;
}
}
if ( found ! = - 1 ) {
if ( found ! = - 1 ) {
set_current_tab ( found ) ;
emit_signal ( " tab_clicked " , found ) ;
set_current_tab ( found ) ;
emit_signal ( " tab_clicked " , found ) ;
}
}
}
}
@ -440,6 +456,14 @@ int Tabs::get_hovered_tab() const {
return hover ;
}
int Tabs : : get_tab_offset ( ) const {
return offset ;
}
bool Tabs : : get_offset_buttons_visible ( ) const {
return buttons_visible ;
}
void Tabs : : set_tab_title ( int p_tab , const String & p_title ) {
ERR_FAIL_INDEX ( p_tab , tabs . size ( ) ) ;
@ -484,6 +508,7 @@ void Tabs::set_tab_right_button(int p_tab, const Ref<Texture> &p_right_button) {
ERR_FAIL_INDEX ( p_tab , tabs . size ( ) ) ;
tabs [ p_tab ] . right_button = p_right_button ;
_update_cache ( ) ;
update ( ) ;
minimum_size_changed ( ) ;
}
@ -783,6 +808,14 @@ void Tabs::set_min_width(int p_width) {
min_width = p_width ;
}
void Tabs : : set_scrolling_enabled ( bool p_enabled ) {
scrolling_enabled = p_enabled ;
}
bool Tabs : : get_scrolling_enabled ( ) const {
return scrolling_enabled ;
}
void Tabs : : _bind_methods ( ) {
ClassDB : : bind_method ( D_METHOD ( " _gui_input " ) , & Tabs : : _gui_input ) ;
@ -799,11 +832,15 @@ void Tabs::_bind_methods() {
ClassDB : : bind_method ( D_METHOD ( " add_tab " , " title " , " icon " ) , & Tabs : : add_tab , DEFVAL ( " " ) , DEFVAL ( Ref < Texture > ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " set_tab_align " , " align " ) , & Tabs : : set_tab_align ) ;
ClassDB : : bind_method ( D_METHOD ( " get_tab_align " ) , & Tabs : : get_tab_align ) ;
ClassDB : : bind_method ( D_METHOD ( " get_tab_offset " ) , & Tabs : : get_tab_offset ) ;
ClassDB : : bind_method ( D_METHOD ( " get_offset_buttons_visible " ) , & Tabs : : get_offset_buttons_visible ) ;
ClassDB : : bind_method ( D_METHOD ( " ensure_tab_visible " , " idx " ) , & Tabs : : ensure_tab_visible ) ;
ClassDB : : bind_method ( D_METHOD ( " get_tab_rect " , " tab_idx " ) , & Tabs : : get_tab_rect ) ;
ClassDB : : bind_method ( D_METHOD ( " move_tab " , " from " , " to " ) , & Tabs : : move_tab ) ;
ClassDB : : bind_method ( D_METHOD ( " set_tab_close_display_policy " , " policy " ) , & Tabs : : set_tab_close_display_policy ) ;
ClassDB : : bind_method ( D_METHOD ( " get_tab_close_display_policy " ) , & Tabs : : get_tab_close_display_policy ) ;
ClassDB : : bind_method ( D_METHOD ( " set_scrolling_enabled " , " enabled " ) , & Tabs : : set_scrolling_enabled ) ;
ClassDB : : bind_method ( D_METHOD ( " get_scrolling_enabled " ) , & Tabs : : get_scrolling_enabled ) ;
ADD_SIGNAL ( MethodInfo ( " tab_changed " , PropertyInfo ( Variant : : INT , " tab " ) ) ) ;
ADD_SIGNAL ( MethodInfo ( " right_button_pressed " , PropertyInfo ( Variant : : INT , " tab " ) ) ) ;
@ -814,6 +851,7 @@ void Tabs::_bind_methods() {
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " current_tab " , PROPERTY_HINT_RANGE , " -1,4096,1 " , PROPERTY_USAGE_EDITOR ) , " set_current_tab " , " get_current_tab " ) ;
ADD_PROPERTYNZ ( PropertyInfo ( Variant : : INT , " tab_close_display_policy " , PROPERTY_HINT_ENUM , " Show Never,Show Active Only,Show Always " ) , " set_tab_close_display_policy " , " get_tab_close_display_policy " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " scrolling_enabled " ) , " set_scrolling_enabled " , " get_scrolling_enabled " ) ;
BIND_ENUM_CONSTANT ( ALIGN_LEFT ) ;
BIND_ENUM_CONSTANT ( ALIGN_CENTER ) ;
@ -841,4 +879,5 @@ Tabs::Tabs() {
max_drawn_tab = 0 ;
min_width = 0 ;
scrolling_enabled = true ;
}