int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv ) { scrollbar * sb = scrollbar_create ( NULL, "scrollbar" ); widget_resize ( WIDGET (sb), 10, 100); scrollbar_set_handle ( NULL, 10213); scrollbar_set_max_value ( NULL, 10 ); scrollbar_set_handle_length ( NULL , 1000); scrollbar_set_max_value ( sb, 10000); TASSERTE ( sb->length, 10000 ); scrollbar_set_handle_length ( sb, 10); TASSERTE ( sb->pos_length, 10 ); scrollbar_set_handle ( sb , 5000 ); TASSERTE ( sb->pos, 5000 ); scrollbar_set_handle ( sb , 15000 ); TASSERTE ( sb->pos, 10000 ); scrollbar_set_handle ( sb , UINT32_MAX ); TASSERTE ( sb->pos, 10000 ); scrollbar_set_handle_length ( sb, 15000); TASSERTE ( sb->pos_length, 10000 ); scrollbar_set_handle_length ( sb, 0); TASSERTE ( sb->pos_length, 1 ); guint cl = scrollbar_scroll_get_line ( sb, 10 ); TASSERTE ( cl, 1010); cl = scrollbar_scroll_get_line ( sb, 20 ); TASSERTE ( cl, 2020); cl = scrollbar_scroll_get_line ( sb, 0 ); TASSERTE ( cl, 0); cl = scrollbar_scroll_get_line ( sb, 99 ); TASSERTE ( cl, 9999); scrollbar_set_handle_length ( sb, 1000); cl = scrollbar_scroll_get_line ( sb, 10 ); TASSERTE ( cl, 555); cl = scrollbar_scroll_get_line ( sb, 20 ); TASSERTE ( cl, 1666); cl = scrollbar_scroll_get_line ( sb, 0 ); TASSERTE ( cl, 0); cl = scrollbar_scroll_get_line ( sb, 99 ); TASSERTE ( cl, 9999); widget_free( WIDGET (sb ) ); }
static void listview_draw ( widget *wid, cairo_t *draw ) { unsigned int offset = 0; listview *lv = (listview *) wid; if ( lv->scroll_type == LISTVIEW_SCROLL_CONTINIOUS ) { offset = scroll_continious ( lv ); } else { offset = scroll_per_page ( lv ); } // Set these all together to make sure they update consistently. scrollbar_set_max_value ( lv->scrollbar, lv->req_elements ); scrollbar_set_handle_length ( lv->scrollbar, lv->cur_columns * lv->max_rows ); if ( lv->reverse ) { scrollbar_set_handle ( lv->scrollbar, lv->req_elements - lv->selected - 1 ); } else { scrollbar_set_handle ( lv->scrollbar, lv->selected ); } lv->last_offset = offset; int spacing_vert = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL ); int spacing_hori = distance_get_pixel ( lv->spacing, ORIENTATION_HORIZONTAL ); int left_offset = widget_padding_get_left ( wid ); int top_offset = widget_padding_get_top ( wid ); if ( lv->scrollbar->widget.index == 0 ) { left_offset += spacing_hori + lv->scrollbar->widget.w; } if ( lv->cur_elements > 0 && lv->max_rows > 0 ) { // Set new x/y possition. unsigned int max = MIN ( lv->cur_elements, lv->req_elements - offset ); if ( lv->rchanged ) { unsigned int width = lv->widget.w - spacing_hori * ( lv->cur_columns - 1 ); width -= widget_padding_get_padding_width ( wid ); if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) ) { width -= spacing_hori; width -= widget_get_width ( WIDGET ( lv->scrollbar ) ); } unsigned int element_width = ( width ) / lv->cur_columns; for ( unsigned int i = 0; i < max; i++ ) { unsigned int ex = left_offset + ( ( i ) / lv->max_rows ) * ( element_width + spacing_hori ); if ( lv->reverse ) { unsigned int ey = wid->h - ( widget_padding_get_bottom ( wid ) + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert ) ) - lv->element_height; textbox_moveresize ( lv->boxes[i], ex, ey, element_width, lv->element_height ); } else { unsigned int ey = top_offset + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert ); textbox_moveresize ( lv->boxes[i], ex, ey, element_width, lv->element_height ); } update_element ( lv, i, i + offset, TRUE ); widget_draw ( WIDGET ( lv->boxes[i] ), draw ); } lv->rchanged = FALSE; } else { for ( unsigned int i = 0; i < max; i++ ) { update_element ( lv, i, i + offset, FALSE ); widget_draw ( WIDGET ( lv->boxes[i] ), draw ); } } } widget_draw ( WIDGET ( lv->scrollbar ), draw ); }