rt-thread/components/rtgui/widgets/scrollbar.c

791 lines
19 KiB
C

/*
* File : scrollbar.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
*
*/
#include <stdlib.h>
#include <rtgui/dc.h>
#include <rtgui/widgets/scrollbar.h>
static void _rtgui_scrollbar_constructor(rtgui_scrollbar_t *bar)
{
/* set event handler */
rtgui_object_set_event_handler(RTGUI_OBJECT(bar), rtgui_scrollbar_event_handler);
bar->status = 0;
bar->value = 0;
bar->thumb_w = 16;
bar->thumb_len = 16;
bar->widget_link = RT_NULL;
bar->on_scroll = RT_NULL;
bar->orient = RTGUI_HORIZONTAL;
/* set gc */
RTGUI_WIDGET_TEXTALIGN(bar) = RTGUI_ALIGN_CENTER;
}
static void _rtgui_scrollbar_destructor(rtgui_scrollbar_t *bar)
{
}
rt_uint32_t _rtgui_scrollbar_get_length(rtgui_scrollbar_t *bar)
{
rtgui_rect_t rect;
rt_uint32_t result;
rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect);
if(bar->orient & RTGUI_VERTICAL)
result = rtgui_rect_height(rect) - 2*rtgui_rect_width(rect) - bar->thumb_len;
else
result = rtgui_rect_width(rect) - 2*rtgui_rect_height(rect) - bar->thumb_len;
return result;
}
rt_uint32_t get_scrollbar_pos(rtgui_scrollbar_t* bar)
{
double pos,ftmp;
rt_uint32_t result;
/* calculate thumb position */
pos = bar->value;
ftmp = _rtgui_scrollbar_get_length(bar);
pos *= ftmp;
ftmp = bar->count;
pos /= ftmp;
result = pos;
return result;
}
DEFINE_CLASS_TYPE(scrollbar, "scrollbar",
RTGUI_WIDGET_TYPE,
_rtgui_scrollbar_constructor,
_rtgui_scrollbar_destructor,
sizeof(struct rtgui_scrollbar));
rtgui_scrollbar_t* rtgui_scrollbar_create(rtgui_container_t *container,int left,int top,int w,int len,int orient)
{
rtgui_scrollbar_t* bar;
RT_ASSERT(container != RT_NULL);
bar = (rtgui_scrollbar_t *)rtgui_widget_create(RTGUI_SCROLLBAR_TYPE);
if(bar != RT_NULL)
{
rtgui_rect_t rect;
rtgui_widget_get_rect(RTGUI_WIDGET(container), &rect);
rtgui_widget_rect_to_device(RTGUI_WIDGET(container),&rect);
rect.x1 += left;
rect.y1 += top;
bar->thumb_w = w;
if(orient == RTGUI_VERTICAL)
{
rect.x2 = rect.x1+w;
rect.y2 = rect.y1+len;
}
else
{
rect.x2 = rect.x1+len;
rect.y2 = rect.y1+w;
}
rtgui_widget_set_rect(RTGUI_WIDGET(bar), &rect);
bar->orient = orient;
rtgui_container_add_child(container, RTGUI_WIDGET(bar));
}
return bar;
}
void rtgui_scrollbar_destroy(rtgui_scrollbar_t* bar)
{
rtgui_widget_destroy(RTGUI_WIDGET(bar));
}
const static rt_uint8_t _up_arrow[] = {0x10, 0x38, 0x7C, 0xFE};
const static rt_uint8_t _down_arrow[] = {0xFE,0x7C, 0x38, 0x10};
const static rt_uint8_t _left_arrow[] = {0x10, 0x30, 0x70, 0xF0, 0x70, 0x30, 0x10};
const static rt_uint8_t _right_arrow[] = {0x80, 0xC0, 0xE0, 0xF0, 0xE0, 0xC0, 0x80};
void rtgui_scrollbar_ondraw(rtgui_scrollbar_t* bar)
{
/* draw scroll bar */
rtgui_rect_t rect, btn_rect, thum_rect, arrow_rect;
struct rtgui_dc* dc;
rtgui_color_t bc;
RT_ASSERT(bar != RT_NULL);
/* begin drawing */
dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(bar));
if(dc == RT_NULL)return;
bc = RTGUI_DC_BC(dc);
/* begin drawing */
rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect);
RTGUI_DC_BC(dc) = white;
rtgui_dc_fill_rect(dc,&rect);
RTGUI_DC_BC(dc) = bc;
if(bar->orient == RTGUI_VERTICAL)
{
btn_rect = rect;
btn_rect.y2 = btn_rect.y1 + (rect.x2 - rect.x1);
rtgui_dc_fill_rect(dc,&btn_rect);
/* draw up button */
if(bar->status & SBS_UPARROW)
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
else
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
/* draw up arrow */
arrow_rect.x1 = 0; arrow_rect.y1 = 0;
arrow_rect.x2 = 7; arrow_rect.y2 = 4;
rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER);
rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _up_arrow);
/* draw thumb */
rtgui_scrollbar_get_thumb_rect(bar, &thum_rect);
rtgui_dc_fill_rect(dc,&thum_rect);
rtgui_dc_draw_border(dc, &thum_rect, RTGUI_BORDER_RAISE);
/* draw down button */
btn_rect.y1 = rect.y2 - (rect.x2 - rect.x1);
btn_rect.y2 = rect.y2;
rtgui_dc_fill_rect(dc,&btn_rect);
if(bar->status & SBS_DOWNARROW)
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
else
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
/* draw down arrow */
arrow_rect.x1 = 0;
arrow_rect.y1 = 0;
arrow_rect.x2 = 7;
arrow_rect.y2 = 4;
rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER);
rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _down_arrow);
}
else
{
btn_rect = rect;
btn_rect.x2 = btn_rect.x1 + (rect.y2 - rect.y1);
rtgui_dc_fill_rect(dc,&btn_rect);
/* draw left button */
if(bar->status & SBS_LEFTARROW)
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
else
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
arrow_rect.x1 = 0;
arrow_rect.y1 = 0;
arrow_rect.x2 = 4;
arrow_rect.y2 = 7;
rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER);
rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _left_arrow);
/* draw thumb */
if(RTGUI_WIDGET_IS_ENABLE(bar))
{
rtgui_scrollbar_get_thumb_rect(bar, &thum_rect);
rtgui_dc_fill_rect(dc,&thum_rect);
rtgui_dc_draw_border(dc, &thum_rect, RTGUI_BORDER_RAISE);
}
btn_rect.x1 = rect.x2 - (rect.y2-rect.y1);
btn_rect.x2 = rect.x2;
rtgui_dc_fill_rect(dc,&btn_rect);
/* draw right button */
if(bar->status & SBS_RIGHTARROW)
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
else
rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
arrow_rect.x1 = 0;
arrow_rect.y1 = 0;
arrow_rect.x2 = 4;
arrow_rect.y2 = 7;
rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER);
rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _right_arrow);
}
rtgui_dc_end_drawing(dc);
}
void rtgui_scrollbar_get_thumb_rect(rtgui_scrollbar_t *bar, rtgui_rect_t *erect)
{
rtgui_rect_t rect;
rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect);
if(bar->orient & RTGUI_VERTICAL)
{
/* vertical scroll bar */
erect->x1 = rect.x1;
erect->x2 = rect.x2;
erect->y1 = rect.y1 + rtgui_rect_width(rect) + get_scrollbar_pos(bar);
erect->y2 = erect->y1 + bar->thumb_len;
}
else
{
/* horizontal scroll bar */
erect->x1 = rect.x1 + rtgui_rect_height(rect) + get_scrollbar_pos(bar);
erect->x2 = erect->x1 + bar->thumb_len;
erect->y1 = rect.y1;
erect->y2 = rect.y2;
}
}
static rtgui_point_t sbar_mouse_move_size;
static void _rtgui_scrollbar_on_mouseclick(rtgui_scrollbar_t *bar, rtgui_event_t * event)
{
rtgui_rect_t btn_rect, bar_rect,rect;
rt_uint32_t pos;
struct rtgui_event_mouse *mouse = (struct rtgui_event_mouse*)event;
RT_ASSERT(bar != RT_NULL);
/* get value */
pos = get_scrollbar_pos(bar);
rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect);
rtgui_widget_rect_to_device(RTGUI_WIDGET(bar),&rect);
if(bar->orient == RTGUI_VERTICAL)
{
/* arrange vertical */
/* get up arrow button rect */
btn_rect.x1 = rect.x1;
btn_rect.x2 = rect.x2;
btn_rect.y1 = rect.y1;
btn_rect.y2 = rect.y1 + rtgui_rect_width(rect);
if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
{
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
bar->status |= SBS_UPARROW;
if(bar->value==0)
{
rtgui_scrollbar_ondraw(bar);
return;
}
/* line step */
bar->value -= bar->line_step;
if(bar->value < 0) bar->value = 0;
}
else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
{
bar->status = 0;
}
goto __exit;
}
/* click on the thumb chunk, be going to dragging */
rtgui_scrollbar_get_thumb_rect(bar, &bar_rect);
rtgui_widget_rect_to_device(RTGUI_WIDGET(bar),&bar_rect);
if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
{
/* on thumb */
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
/* changed status into drag */
bar->status |= SBS_VERTTHUMB;
sbar_mouse_move_size.x = mouse->x;
sbar_mouse_move_size.y = mouse->y;
}
else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
{
bar->status = 0;
}
goto __exit;
}
else
{
/* click on space without thumb */
/* get bar rect */
bar_rect.y1 = rect.y1 + rtgui_rect_width(rect);
bar_rect.y2 = rect.y2 - rtgui_rect_width(rect);
if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
{
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
/* page step */
if(mouse->y < bar_rect.y1 + pos)
{
bar->status |= SBS_UPSPACE;
bar->value -= bar->page_step;
if(bar->value < 0) bar->value = 0;
}
else if(mouse->y > pos + bar->thumb_len)
{
bar->status |= SBS_DOWNSPACE;
bar->value += bar->page_step;
if(bar->value > bar->count) bar->value = bar->count;
}
}
goto __exit;
}
}
/* likewise foregoing */
/* get down arrow button rect */
bar_rect.x1 = rect.x1;
bar_rect.x2 = rect.x2;
btn_rect.y1 = rect.y2 - rtgui_rect_width(rect);
btn_rect.y2 = rect.y2;
if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
{
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
bar->status |= SBS_DOWNARROW;
if(bar->value==bar->count)
{
rtgui_scrollbar_ondraw(bar);
return;
}
/* line step */
bar->value += bar->line_step;
if(bar->value > bar->count) bar->value = bar->count;
}
else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
bar->status = 0;
goto __exit;
}
}
else
{
/* get left arrow button rect */
btn_rect.x1 = rect.x1;
btn_rect.x2 = rect.x1 + rtgui_rect_height(rect);
btn_rect.y1 = rect.y1;
btn_rect.y2 = rect.y2;
if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
{
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
bar->status |= SBS_LEFTARROW;
if(bar->value==0)
{
rtgui_scrollbar_ondraw(bar);
return;
}
/* line step */
bar->value -= bar->line_step;
if(bar->value < 0) bar->value = 0;
}
else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
bar->status = 0;
goto __exit;
}
rtgui_scrollbar_get_thumb_rect(bar, &bar_rect);
rtgui_widget_rect_to_device(RTGUI_WIDGET(bar),&bar_rect);
if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
{
/* on the thumb */
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
bar->status |= SBS_HORZTHUMB;
sbar_mouse_move_size.x = mouse->x;
sbar_mouse_move_size.y = mouse->y;
}
else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
{
bar->status = 0;
}
goto __exit;
}
else
{
/* get bar rect */
bar_rect.x1 = rect.x1 + rtgui_rect_height(rect);
bar_rect.x2 = rect.x2 - rtgui_rect_height(rect);
bar_rect.y1 = rect.y1;
bar_rect.y2 = rect.y2;
if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
{
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
/* page step */
if(mouse->x < bar_rect.x1 + pos)
{
bar->status |= SBS_LEFTSPACE;
bar->value -= bar->page_step;
if(bar->value < 0) bar->value = 0;
}
else if(mouse->x > pos + bar->thumb_len)
{
bar->status |= SBS_RIGHTSPACE;
bar->value += bar->page_step;
if(bar->value > bar->count) bar->value = bar->count;
}
}
else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
{
bar->status = 0;
}
goto __exit;
}
}
/* get right arrow button rect */
btn_rect.x1 = rect.x2 - rtgui_rect_height(rect);
btn_rect.x2 = rect.x2;
bar_rect.y1 = rect.y1;
bar_rect.y2 = rect.y2;
if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
{
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
bar->status |= SBS_RIGHTARROW;
if(bar->value==bar->count)
{
rtgui_scrollbar_ondraw(bar);
return;
}
/* line step */
bar->value += bar->line_step;
if(bar->value > bar->count) bar->value = bar->count;
}
else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
bar->status = 0;
goto __exit;
}
}
__exit:
rtgui_scrollbar_ondraw(bar);
if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
{
if(bar->widget_link != RT_NULL && bar->on_scroll != RT_NULL)
{
rtgui_widget_focus(bar->widget_link);
bar->on_scroll(RTGUI_OBJECT(bar->widget_link), event);
}
}
}
/* thumb chunk activity */
static void _rtgui_scrollbar_on_mousemotion(rtgui_scrollbar_t *bar, rtgui_event_t * event)
{
float tmppos;
rt_uint32_t pos;
struct rtgui_event_mouse *mouse = (struct rtgui_event_mouse*)event;
rt_kprintf("sbar mouse motion.\n");
tmppos = _rtgui_scrollbar_get_length(bar);
tmppos /= bar->count;
pos = (rt_uint32_t)tmppos;
if(bar->orient == RTGUI_VERTICAL)
{
if(bar->status & SBS_VERTTHUMB)
{
/* from then on mouseclick */
if((mouse->y-sbar_mouse_move_size.y) > 3)
{
bar->status |= SBS_DOWNTHUMB;
}
else if((mouse->y-sbar_mouse_move_size.y) < -3)
{
bar->status |= SBS_UPTHUMB;
}
else bar->status &= ~(SBS_UPTHUMB|SBS_DOWNTHUMB);
if(abs(mouse->y-sbar_mouse_move_size.y) >= pos)
{
int step = abs(mouse->y-sbar_mouse_move_size.y)/pos;
sbar_mouse_move_size.y = mouse->y;
if(bar->status & SBS_UPTHUMB)
{
bar->value -= step;
if(bar->value < 0) bar->value = 0;
}
else if(bar->status & SBS_DOWNTHUMB)
{
bar->value += step;
if(bar->value > bar->count) bar->value = bar->count;
}
goto __exit;
}
}
else if(bar->status & SBS_UPARROW)
{
/* on-going push down uparrow button */
if(bar->value==0)return;
bar->value -= bar->line_step;
if(bar->value < 0) bar->value = 0;
goto __exit;
}
else if(bar->status & SBS_DOWNARROW)
{
/* on-going push down downarrow button */
if(bar->value==bar->count)return;
bar->value += bar->line_step;
if(bar->value > bar->count) bar->value = bar->count;
goto __exit;
}
/*else if(bar->status & SBS_UPSPACE)
{
bar->value -= bar->page_step;
if(bar->value < 0) bar->value = 0;
goto __exit;
}
else if(bar->status & SBS_DOWNSPACE)
{
bar->value += bar->page_step;
if(bar->value > bar->count) bar->value = bar->count;
goto __exit;
}*/
return;
}
else
{
if(bar->status & SBS_HORZTHUMB)
{rt_kprintf("HORZTHUMB, move event\n");
if((mouse->x-sbar_mouse_move_size.x) > 5)
{
bar->status |= SBS_RIGHTTHUMB;
}
else if((mouse->x-sbar_mouse_move_size.x) < -5)
{
bar->status |= SBS_LEFTTHUMB;
}
if(abs(mouse->x-sbar_mouse_move_size.x) > pos)
{
int step = abs(mouse->x-sbar_mouse_move_size.x)/pos;
sbar_mouse_move_size.x = mouse->x;
if(bar->status & SBS_LEFTTHUMB)
{
bar->value -= step;
if(bar->value < 0) bar->value = 0;
}
else if(bar->status & SBS_RIGHTTHUMB)
{
bar->value += step;
if(bar->value > bar->count) bar->value = bar->count;
}
goto __exit;
}
}
else if(bar->status & SBS_LEFTARROW)
{
if(bar->value==0)return;
bar->value -= bar->line_step;
if(bar->value < 0) bar->value = 0;
goto __exit;
}
else if(bar->status & SBS_RIGHTARROW)
{
if(bar->value==bar->count)return;
bar->value += bar->line_step;
if(bar->value > bar->count) bar->value = bar->count;
goto __exit;
}
/*else if(bar->status & SBS_LEFTSPACE)
{
bar->value -= bar->page_step;
if(bar->value < bar->min) bar->value = bar->min;
goto __exit;
}
else if(bar->status & SBS_RIGHTSPACE)
{
bar->value += bar->page_step;
if(bar->value > bar->count-1) bar->value = bar->count-1;
goto __exit;
}*/
return;
}
__exit:
rtgui_scrollbar_ondraw(bar);
if(bar->widget_link != RT_NULL && bar->on_scroll != RT_NULL)
{
rtgui_widget_focus(bar->widget_link);
bar->on_scroll(RTGUI_OBJECT(bar->widget_link), event);
}
}
rt_bool_t rtgui_scrollbar_event_handler(rtgui_object_t *object, rtgui_event_t *event)
{
rtgui_widget_t *widget = RTGUI_WIDGET(object);
rtgui_scrollbar_t* bar = RTGUI_SCROLLBAR(object);
switch(event->type)
{
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if(widget->on_draw != RT_NULL)
widget->on_draw(object, event);
else
#endif
{
if(!RTGUI_WIDGET_IS_HIDE(bar))
rtgui_scrollbar_ondraw(bar);
}
break;
case RTGUI_EVENT_MOUSE_BUTTON:
if(RTGUI_WIDGET_IS_ENABLE(widget))
{
#ifndef RTGUI_USING_SMALL_SIZE
if(widget->on_mouseclick != RT_NULL)
{
widget->on_mouseclick(object, event);
}
else
#endif
{
_rtgui_scrollbar_on_mouseclick(bar, event);
}
}
break;
case RTGUI_EVENT_MOUSE_MOTION:
if(RTGUI_WIDGET_IS_ENABLE(widget))
{
_rtgui_scrollbar_on_mousemotion(bar, event);
}
default:
return rtgui_widget_event_handler(object, event);
}
return RT_FALSE;
}
void rtgui_scrollbar_set_orientation(rtgui_scrollbar_t* bar, int orient)
{
RT_ASSERT(bar != RT_NULL);
bar->orient = orient;
}
/* get active area length */
rt_uint32_t get_sbar_active_len(rtgui_scrollbar_t *bar)
{
rtgui_rect_t rect;
rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect);
if(bar->orient & RTGUI_VERTICAL)
return rtgui_rect_height(rect) - 2*rtgui_rect_width(rect);
else
return rtgui_rect_width(rect) - 2*rtgui_rect_height(rect);
}
void rtgui_scrollbar_set_thumbbar_len(rtgui_scrollbar_t* bar)
{
double size=0;
rt_uint32_t len,w;
RT_ASSERT(bar != RT_NULL);
/* Make sure called rtgui_scrollbar_set_range(),before you use under code. */
size = bar->page_step;
size /= bar->count+bar->page_step;
size *= get_sbar_active_len(bar);
len = (rt_uint32_t)size ;
w = bar->thumb_w;
if(len < w/2) len = w/2;
bar->thumb_len = len;
}
/*
* please use them with below step:
* 1.SetLineStep();2.SetPageStep();3.SetRange();
*/
void rtgui_scrollbar_set_line_step(rtgui_scrollbar_t* bar, int step)
{
RT_ASSERT(bar != RT_NULL);
bar->line_step = step;
}
void rtgui_scrollbar_set_page_step(rtgui_scrollbar_t* bar, int step)
{
RT_ASSERT(bar != RT_NULL);
bar->page_step = step;
}
void rtgui_scrollbar_set_range(rtgui_scrollbar_t* bar, int count)
{
RT_ASSERT(bar != RT_NULL);
/* disable or enable scrollbar */
if(bar->page_step >= count)
{
/* disable bar */
RTGUI_WIDGET_DISABLE(bar);
}
else
{
/* enable bar */
RTGUI_WIDGET_ENABLE(bar);
}
/* thumb step count = item_count-item_per_page */
bar->count = (rt_int16_t)(count-bar->page_step);
rtgui_scrollbar_set_thumbbar_len(bar);
}
/* use VALUE change be binding widget's frist item. */
void rtgui_scrollbar_set_value(rtgui_scrollbar_t* bar, rt_int16_t value)
{
RT_ASSERT(bar != RT_NULL);
bar->value = value;
if(bar->value < 0) bar->value = 0;
rtgui_widget_update(RTGUI_WIDGET(bar));
}
void rtgui_scrollbar_set_onscroll(rtgui_scrollbar_t* bar, rtgui_event_handler_ptr handler)
{
if(bar == RT_NULL || handler == RT_NULL) return;
bar->on_scroll = handler;
}
void rtgui_scrollbar_hide(rtgui_scrollbar_t* bar)
{
rtgui_rect_t rect;
struct rtgui_dc* dc;
RT_ASSERT(bar != RT_NULL);
/* begin drawing */
dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(bar));
if(dc == RT_NULL)return;
RTGUI_WIDGET_HIDE(bar);
/* begin drawing */
rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect);
if((RTGUI_WIDGET(bar))->parent != RT_NULL)
RTGUI_DC_BC(dc) = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(bar)->parent);
else
RTGUI_DC_BC(dc) = RTGUI_RGB(225, 228, 220);
rtgui_dc_fill_rect(dc,&rect);
rtgui_dc_end_drawing(dc);
}