1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2025-01-27 15:25:24 -05:00

scrollbar: Rework scrollbar_scroll_get_line to work on relative y

Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
Quentin Glidic 2017-05-30 12:41:44 +02:00
parent 685d4f0e13
commit 823a45f711
No known key found for this signature in database
GPG key ID: AC203F96E2C34BB7
3 changed files with 27 additions and 23 deletions

View file

@ -88,7 +88,7 @@ void scrollbar_set_max_value ( scrollbar *sb, unsigned int max );
* *
* Calculate the position of the click relative to the max value of bar * Calculate the position of the click relative to the max value of bar
*/ */
unsigned int scrollbar_scroll ( const scrollbar *sb, int y ); guint scrollbar_scroll_get_line ( const scrollbar *sb, int y );
/*@}*/ /*@}*/
#endif // ROFI_SCROLLBAR_H #endif // ROFI_SCROLLBAR_H

View file

@ -46,23 +46,27 @@ static int scrollbar_get_desired_height ( widget *wid )
// TODO // TODO
// This should behave more like a real scrollbar. // This should behave more like a real scrollbar.
unsigned int scrollbar_scroll ( const scrollbar *sb, int y ) guint scrollbar_scroll_get_line ( const scrollbar *sb, int y )
{ {
if ( sb != NULL ) { y -= sb->widget.border.top.distance;
if ( y >= sb->widget.y && y <= ( sb->widget.y + sb->widget.h ) ) { if ( y < 0 ) {
return 0;
}
if ( y > sb->widget.h ) {
return sb->length - 1;
}
short r = ( sb->length * sb->widget.h ) / ( (double) ( sb->length + sb->pos_length ) ); short r = ( sb->length * sb->widget.h ) / ( (double) ( sb->length + sb->pos_length ) );
short handle = sb->widget.h - r; short handle = sb->widget.h - r;
double sec = ( ( r ) / (double) ( sb->length - 1 ) ); double sec = ( ( r ) / (double) ( sb->length - 1 ) );
short half_handle = handle / 2; short half_handle = handle / 2;
y -= sb->widget.y + half_handle; y -= half_handle;
y = MIN ( MAX ( 0, y ), sb->widget.h - 2 * half_handle ); y = MIN ( MAX ( 0, y ), sb->widget.h - 2 * half_handle );
unsigned int sel = ( ( y ) / sec ); unsigned int sel = ( ( y ) / sec );
return MIN ( sel, sb->length - 1 ); return MIN ( sel, sb->length - 1 );
} }
}
return 0;
}
static gboolean scrollbar_trigger_action ( widget *wid, MouseBindingMouseDefaultAction action, G_GNUC_UNUSED gint x, gint y, G_GNUC_UNUSED void *user_data ) static gboolean scrollbar_trigger_action ( widget *wid, MouseBindingMouseDefaultAction action, G_GNUC_UNUSED gint x, gint y, G_GNUC_UNUSED void *user_data )
{ {

View file

@ -103,22 +103,22 @@ int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv )
TASSERTE ( sb->pos_length, 1 ); TASSERTE ( sb->pos_length, 1 );
unsigned int cl = scrollbar_scroll ( sb, 10 ); guint cl = scrollbar_scroll_get_line ( sb, 10 );
TASSERTE ( cl, 1010); TASSERTE ( cl, 1010);
cl = scrollbar_scroll ( sb, 20 ); cl = scrollbar_scroll_get_line ( sb, 20 );
TASSERTE ( cl, 2020); TASSERTE ( cl, 2020);
cl = scrollbar_scroll ( sb, 0 ); cl = scrollbar_scroll_get_line ( sb, 0 );
TASSERTE ( cl, 0); TASSERTE ( cl, 0);
cl = scrollbar_scroll ( sb, 99 ); cl = scrollbar_scroll_get_line ( sb, 99 );
TASSERTE ( cl, 9999); TASSERTE ( cl, 9999);
scrollbar_set_handle_length ( sb, 1000); scrollbar_set_handle_length ( sb, 1000);
cl = scrollbar_scroll ( sb, 10 ); cl = scrollbar_scroll_get_line ( sb, 10 );
TASSERTE ( cl, 555); TASSERTE ( cl, 555);
cl = scrollbar_scroll ( sb, 20 ); cl = scrollbar_scroll_get_line ( sb, 20 );
TASSERTE ( cl, 1666); TASSERTE ( cl, 1666);
cl = scrollbar_scroll ( sb, 0 ); cl = scrollbar_scroll_get_line ( sb, 0 );
TASSERTE ( cl, 0); TASSERTE ( cl, 0);
cl = scrollbar_scroll ( sb, 99 ); cl = scrollbar_scroll_get_line ( sb, 99 );
TASSERTE ( cl, 9999); TASSERTE ( cl, 9999);
widget_free( WIDGET (sb ) ); widget_free( WIDGET (sb ) );