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_fileview_ondraw(rtgui_fileview_t* fview) { rt_uint16_t first, i,rx2; rtgui_fileview_item_t* item; rtgui_rect_t rect, item_rect, image_rect; rtgui_dc_t* dc; RT_ASSERT(fview != RT_NULL); /* begin drawing */ dc = rtgui_dc_begin_drawing(fview); if(dc == RT_NULL)return; rtgui_widget_get_rect(fview, &rect); rtgui_dc_draw_border(dc, &rect,RTGUI_WIDGET_BORDER_STYLE(fview)); rtgui_rect_inflate(&rect,-RTGUI_WIDGET_BORDER_SIZE(fview)); RTGUI_DC_BC(dc) = theme.blankspace; rtgui_dc_fill_rect(dc,&rect); rtgui_rect_inflate(&rect,RTGUI_WIDGET_BORDER_SIZE(fview)); if(fview->sbar && !RTGUI_WIDGET_IS_HIDE(fview->sbar)) rect.x2 -= RC_W(fview->sbar->parent.extent); rect.x2 -=1; rect.y2 -= 1; /* get item base rect */ item_rect = rect; item_rect.x1 += RTGUI_WIDGET_BORDER_SIZE(fview); item_rect.x2 -= RTGUI_WIDGET_BORDER_SIZE(fview); rx2 = item_rect.x2; item_rect.y1 += RTGUI_WIDGET_BORDER_SIZE(fview); item_rect.y2 = item_rect.y1 + (1 + RTGUI_SEL_H); /* get image base rect */ image_rect.x1 = RTGUI_MARGIN; image_rect.y1 = 0; image_rect.x2 = RTGUI_MARGIN + file_image->w; image_rect.y2 = file_image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); /* get current page */ first = fview->first_item; for(i = 0; i < fview->item_per_page; i ++) { char str_size[32]; if(first + i >= fview->item_count) break; item = &(fview->items[first + i]); /* draw item image */ if(item->type == RTGUI_FITEM_FILE) rtgui_image_paste(file_image, dc, &image_rect, Black); else rtgui_image_paste(folder_image, dc, &image_rect, Black); /* draw text */ item_rect.x1 += RTGUI_MARGIN + file_image->w + 2; item_rect.x2 = item_rect.x1 + rtgui_font_get_string_width(RTGUI_DC_FONT(dc), item->name); if(first + i == fview->now_item) { if(RTGUI_WIDGET_IS_FOCUSED(fview)) { RTGUI_DC_BC(dc) = DarkBlue; RTGUI_DC_FC(dc) = theme.blankspace; } else { RTGUI_DC_BC(dc) = Gray; RTGUI_DC_FC(dc) = theme.foreground; } rtgui_dc_fill_rect(dc, &item_rect); rtgui_dc_draw_text(dc, item->name, &item_rect); } else { /* draw background */ RTGUI_DC_BC(dc) = theme.blankspace; RTGUI_DC_FC(dc) = theme.foreground; rtgui_dc_fill_rect(dc,&item_rect); rtgui_dc_draw_text(dc, item->name, &item_rect); } #if (1) /* please turn off it when need. */ if(item->type == RTGUI_FITEM_FILE) { rtgui_rect_t rect=item_rect; /* print file information */ rt_snprintf(str_size, 16, "(%dB)",item->size); rect.x1 = rect.x2 + RTGUI_MARGIN; rect.x2 = rect.x1 + rt_strlen(str_size) * FONT_W(RTGUI_WIDGET_FONT(fview)); RTGUI_DC_FC(dc) = theme.foreground; rtgui_dc_draw_text(dc, str_size, &rect); } #endif item_rect.x1 -= RTGUI_MARGIN + file_image->w + 2; item_rect.x2 = rx2; /* move to next item position */ item_rect.y1 += (RTGUI_SEL_H + 1); item_rect.y2 += (RTGUI_SEL_H + 1); image_rect.y1 += (RTGUI_SEL_H + 1); image_rect.y2 += (RTGUI_SEL_H + 1); } if(fview->sbar && !RTGUI_WIDGET_IS_HIDE(fview->sbar)) { rtgui_scrollbar_ondraw(fview->sbar); } rtgui_dc_end_drawing(dc); }
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); } }
void rtgui_edit_ondraw(struct rtgui_edit *edit) { rtgui_rect_t rect, r; struct rtgui_dc *dc; #ifdef RTGUI_EDIT_USING_SCROLL int hscroll_flag=0; int vscroll_flag=0; #endif RT_ASSERT(edit != RT_NULL); dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(edit)); if(dc == RT_NULL) return; /* get widget rect */ rtgui_widget_get_rect(RTGUI_WIDGET(edit), &rect); rtgui_rect_inflate(&rect, -RTGUI_WIDGET_BORDER_SIZE(edit)); /* fill widget rect with edit background color */ RTGUI_DC_BC(dc) = RTGUI_WIDGET_BC(edit); rtgui_dc_fill_rect(dc, &rect); rtgui_rect_inflate(&rect, RTGUI_WIDGET_BORDER_SIZE(edit)); /* draw border */ rtgui_dc_draw_border(dc, &rect, RTGUI_WIDGET_BORDER_STYLE(edit)); rtgui_rect_inflate(&rect, -(edit->margin + RTGUI_WIDGET_BORDER_SIZE(edit))); #ifdef RTGUI_EDIT_USING_SCROLL if(edit->vscroll && !RTGUI_WIDGET_IS_HIDE(edit->vscroll)) { rect.x2 = rect.x2 - rtgui_rect_width(edit->vscroll->parent.extent); } if(edit->hscroll && !RTGUI_WIDGET_IS_HIDE(edit->hscroll)) { rect.y2 = rect.y2 - rtgui_rect_height(edit->hscroll->parent.extent); } #endif r = rect; /* draw text */ if(edit->head != RT_NULL) { struct edit_line *line = edit->first_line; int num=0; rect.y2 = rect.y1 + edit->item_height; while(line) { rt_uint32_t tmp_pos=0, ofs; char *str = line->text+edit->upleft.x; if(edit->upleft.x < line->len) { rtgui_point_t p = edit->visual; edit->visual.x = 0; identify_double_byte(edit, line, EDIT_IDENT_DIR_LEFT, &tmp_pos); ofs = tmp_pos % 2; if(ofs == 1) { char dbl_bmp[3]; rtgui_point_t pot = {0}; rtgui_rect_t r = {0}; pot.x = edit->font_width; r.x2 = edit->font_width*2; r.y2 = edit->font_height; dbl_bmp[0] = *(str-1); dbl_bmp[1] = *str; dbl_bmp[2] = '\0'; RTGUI_DC_BC(edit->dbl_buf) = RTGUI_WIDGET_BC(edit); rtgui_dc_fill_rect(edit->dbl_buf, &r); RTGUI_DC_FC(edit->dbl_buf) = RTGUI_WIDGET_FC(edit); rtgui_dc_draw_text(edit->dbl_buf, dbl_bmp, &r); rtgui_dc_blit(edit->dbl_buf, pot.x, pot.y, dc, rect.x1, rect.y1, edit->font_width, edit->font_height); } rect.x1 += ofs * edit->font_width; rtgui_dc_draw_text(dc, line->text+edit->upleft.x+ofs, &rect); rect.x1 -= ofs * edit->font_width; edit->visual = p; } line = line->next; rect.y1 += edit->item_height; if((rect.y1 + edit->item_height) < r.y2) rect.y2 = rect.y1 + edit->item_height; else rect.y2 = r.y2; if(num++ >= edit->row_per_page) break; } } #ifdef RTGUI_EDIT_USING_SCROLL if(edit->hscroll && !RTGUI_WIDGET_IS_HIDE(edit->hscroll)) { hscroll_flag = 1; rtgui_scrollbar_ondraw(edit->hscroll); } if(edit->vscroll && !RTGUI_WIDGET_IS_HIDE(edit->vscroll)) { vscroll_flag = 1; rtgui_scrollbar_ondraw(edit->vscroll); } if(hscroll_flag && vscroll_flag) { rtgui_color_t _bc; rtgui_widget_get_rect(RTGUI_WIDGET(edit), &rect); rect.x1 = rect.x2-RTGUI_WIDGET_BORDER_SIZE(edit); rect.y1 = rect.y2-RTGUI_WIDGET_BORDER_SIZE(edit); _bc = RTGUI_DC_BC(dc); RTGUI_DC_BC(dc) = theme.background; rtgui_dc_fill_rect(dc,&rect); RTGUI_DC_BC(dc) = _bc; } #endif rtgui_dc_end_drawing(dc); }