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
*/
unsigned int scrollbar_scroll ( const scrollbar *sb, int y );
guint scrollbar_scroll_get_line ( const scrollbar *sb, int y );
/*@}*/
#endif // ROFI_SCROLLBAR_H

View file

@ -46,23 +46,27 @@ static int scrollbar_get_desired_height ( widget *wid )
// TODO
// 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 ) {
if ( y >= sb->widget.y && y <= ( sb->widget.y + sb->widget.h ) ) {
y -= sb->widget.border.top.distance;
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 handle = sb->widget.h - r;
double sec = ( ( r ) / (double) ( sb->length - 1 ) );
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 );
unsigned int sel = ( ( y ) / sec );
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 )
{

View file

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