static void rtgui_list_view_onlistdraw(struct rtgui_list_view* view, struct rtgui_dc *dc) { rt_ubase_t index, page_index; rtgui_rect_t rect, item_rect, image_rect; const struct rtgui_list_item* item; rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); /* get item base rect */ item_rect = rect; item_rect.y1 += 2; item_rect.y2 = item_rect.y1 + (2 + rtgui_theme_get_selected_height()); /* get current page */ page_index = (view->current_item / view->page_items) * view->page_items; for (index = 0; index < view->page_items; index ++) { if (page_index + index >= view->items_count) break; item = &(view->items[page_index + index]); if (page_index + index == view->current_item) { rtgui_theme_draw_selected(dc, &item_rect); } item_rect.x1 += LIST_MARGIN; if (item->image != RT_NULL) { /* blit on center */ image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = item->image->w; image_rect.y2 = item->image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(item->image, dc, &image_rect); item_rect.x1 += item->image->w + 2; } /* draw text */ rtgui_dc_draw_text(dc, item->name, &item_rect); if (item->image != RT_NULL) item_rect.x1 -= (item->image->w + 2); item_rect.x1 -= LIST_MARGIN; /* move to next item position */ item_rect.y1 += (rtgui_theme_get_selected_height() + 2); item_rect.y2 += (rtgui_theme_get_selected_height() + 2); } }
static void _rtgui_menu_item_ondraw(struct rtgui_listctrl *list, struct rtgui_dc* dc, rtgui_rect_t* rect, rt_uint16_t index) { rtgui_rect_t item_rect; struct rtgui_menu_item* item; item_rect = *rect; item_rect.x1 += 5; /* re-fill item */ if (list->current_item == index) { rtgui_color_t bc; bc = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(list)); RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(list)) = blue; rtgui_dc_fill_rect(dc, rect); RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(list)) = bc; } /* get menu item */ item = (rtgui_menu_item_t*)list->items; item = &item[index]; if (item->type == RTGUI_ITEM_SUBMENU) { rtgui_rect_t r = {0, 0, 8, 8}; rtgui_dc_draw_text(dc, item->label, &item_rect); item_rect.x1 = item_rect.x2 - 16; item_rect.x2 -= 8; rtgui_rect_moveto_align(&item_rect, &r, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); rtgui_dc_draw_byte(dc, r.x1, r.y1, 8, right_arrow); } else if (item->type == RTGUI_ITEM_SEPARATOR) { rtgui_dc_draw_horizontal_line(dc, item_rect.x1, item_rect.x2, (item_rect.y2 + item_rect.y1)/2); } else if (item->type == RTGUI_ITEM_CHECK) { /* not support right now */ } else { /* normal menu item */ rtgui_dc_draw_text(dc, item->label, &item_rect); if (item->image != RT_NULL) rtgui_image_blit(item->image, dc, &item_rect); } }
void _rtgui_listctrl_item_draw(struct rtgui_listctrl *list, struct rtgui_dc *dc, rtgui_rect_t *rect, rt_uint16_t index) { char age_str[8]; rtgui_rect_t item_rect; struct list_item *items, *item; item_rect = *rect; item_rect.x1 += 5; items = (struct list_item *)list->items; item = &items[index]; /* draw text */ rtgui_dc_draw_text(dc, item->name, &item_rect); item_rect.x1 += 60; rtgui_dc_draw_vline(dc, item_rect.x1, item_rect.y1, item_rect.y2); item_rect.x1 += 5; rtgui_dc_draw_text(dc, item->gender, &item_rect); item_rect.x1 += 60; rtgui_dc_draw_vline(dc, item_rect.x1, item_rect.y1, item_rect.y2); item_rect.x1 += 5; rt_snprintf(age_str, sizeof(age_str), "%d", item->age); rtgui_dc_draw_text(dc, age_str, &item_rect); item_rect.x1 += 40; rtgui_dc_draw_vline(dc, item_rect.x1, item_rect.y1, item_rect.y2); item_rect.x1 += 5; /* draw image */ if (item->image != RT_NULL) { rtgui_rect_t image_rect; image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = item->image->w; image_rect.y2 = item->image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(item->image, dc, &image_rect); } }
static rt_bool_t picture_view_event_handler(rtgui_object_t *object, rtgui_event_t *event) { if (event->type == RTGUI_EVENT_PAINT) { struct rtgui_dc* dc; struct rtgui_rect rect; struct rtgui_image* image = RT_NULL; char fn[32]; dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(object)); if (dc == RT_NULL) return RT_FALSE; rtgui_widget_get_rect(RTGUI_WIDGET(object), &rect); /* open image */ rt_snprintf(fn, sizeof(fn), "%s/%s", PICTURE_DIR, current_fn); rt_kprintf("pic fn: %s\n", fn); image = rtgui_image_create(fn, RT_FALSE); if (image != RT_NULL) { /* blit image */ rtgui_image_blit(image, dc, &rect); /* destroy image */ rtgui_image_destroy(image); } else { rtgui_dc_fill_rect(dc, &rect); rtgui_dc_draw_text(dc, "没有文件被打开", &rect); } rtgui_dc_end_drawing(dc); return RT_FALSE; } return rtgui_win_event_handler(object, event); }
rt_bool_t demo_bitmap_showbox(struct rtgui_object* object, struct rtgui_event* event) { rtgui_container_t *container; rtgui_widget_t *widget; RT_ASSERT(object != RT_NULL); container = RTGUI_CONTAINER(object); widget = RTGUI_WIDGET(object); if(event->type == RTGUI_EVENT_PAINT) { int w, h; rtgui_rect_t rect; struct rtgui_dc *dc; struct rtgui_image *image = bmpdt.showimg; /* 如果从其他标签切换到当前标签, image应该是RT_NULL, 重置它 */ if(image == RT_NULL && bmpdt.image != RT_NULL) { image = bmpdt.image; bmpdt.scale = 1.0f; bmpdt.angle = 0.0f; rtgui_widget_get_rect(RTGUI_WIDGET(bmpdt.showbox), &bmpdt.lastrect); rtgui_rect_inflate(&bmpdt.lastrect, -RTGUI_WIDGET_BORDER(bmpdt.showbox)); } dc = rtgui_dc_begin_drawing(widget); if (dc == RT_NULL) return RT_FALSE; rtgui_widget_get_rect(widget, &rect); /* 在绘制边框后, 再将rect缩小填充背景, 可以降低闪烁现象 */ rtgui_dc_draw_border(dc, &rect, RTGUI_WIDGET_BORDER_STYLE(widget)); rtgui_rect_inflate(&rect, -RTGUI_WIDGET_BORDER(widget)); w = rtgui_rect_width(bmpdt.lastrect); h = rtgui_rect_height(bmpdt.lastrect); if(w > rtgui_rect_width(rect)) w = rtgui_rect_width(rect); if(h > rtgui_rect_height(rect)) h = rtgui_rect_height(rect); /* fill container with background */ /* * 参数lastrect会记录上一次绘图所用区域 * 每次重绘时,只需与lastrect比较,即可得知那些背景区域需要刷新 * 例如当放大图片时,lastrect比当前绘图区小,所有无需更新背景区, * 当缩小图片时, 也仅需要更新绘图区比lastrect大的区域. */ if(image != RT_NULL) { /* 减少不必要的绘图 */ rtgui_rect_t rc; if(w > image->w) { rc.x1 = image->w; rc.y1 = bmpdt.lastrect.y1; rc.x2 = bmpdt.lastrect.x2; rc.y2 = (h > image->h) ? image->h : bmpdt.lastrect.y2; rtgui_dc_fill_rect(dc, &rc); } if(h > image->h) { rc.x1 = bmpdt.lastrect.x1; rc.y1 = image->h; rc.x2 = bmpdt.lastrect.x2; rc.y2 = bmpdt.lastrect.y2; rtgui_dc_fill_rect(dc, &rc); } } else rtgui_dc_fill_rect(dc, &bmpdt.lastrect); /* 将图像数据blit到画布上 */ if (image != RT_NULL) { int value; rtgui_image_blit(image, dc, &rect); bmpdt.lastrect.x1 = bmpdt.lastrect.y1 = RTGUI_WIDGET_BORDER(bmpdt.showbox); if(image->w > rtgui_rect_width(rect)) value = rtgui_rect_width(rect); else value = image->w; bmpdt.lastrect.x2 = bmpdt.lastrect.x1 + value; if(image->h > rtgui_rect_height(rect)) value = rtgui_rect_height(rect); else value = image->h; bmpdt.lastrect.y2 = bmpdt.lastrect.y1 + value; } rtgui_dc_end_drawing(dc); return RT_FALSE; } return rtgui_container_event_handler(object, event); }
/* widget drawing */ void rtgui_theme_draw_button(rtgui_button_t* btn) { /* draw button */ struct rtgui_dc* dc; struct rtgui_rect rect; rtgui_color_t bc, fc; /* begin drawing */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(btn)); if (dc == RT_NULL) return; /* get widget rect */ rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect); /* get foreground color */ bc = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(btn)); fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)); if (btn->flag & RTGUI_BUTTON_TYPE_PUSH && btn->flag & RTGUI_BUTTON_FLAG_PRESS) { /* fill button rect with background color */ rtgui_dc_fill_rect(dc, &rect); /* draw border */ RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(64, 64, 64); rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1); rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(128, 128, 128); rtgui_dc_draw_hline(dc, rect.x1, rect.x2 - 1, rect.y1 + 1); rtgui_dc_draw_vline(dc, rect.x1 + 1, rect.y1 + 1, rect.y2 - 2); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(255, 255, 255); rtgui_dc_draw_hline(dc, rect.x1, rect.x2 + 1, rect.y2 - 1); rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1, rect.y2); if (btn->pressed_image != RT_NULL) { rtgui_rect_t image_rect; image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = btn->unpressed_image->w; image_rect.y2 = btn->unpressed_image->h; rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(btn->pressed_image, dc, &image_rect); } } else if (btn->flag & RTGUI_BUTTON_FLAG_PRESS) { if (btn->pressed_image != RT_NULL) { rtgui_rect_t image_rect; image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = btn->unpressed_image->w; image_rect.y2 = btn->unpressed_image->h; rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(btn->pressed_image, dc, &image_rect); } else { /* fill button rect with background color */ RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(0xff, 0xff, 0xff); rtgui_dc_fill_rect(dc, &rect); /* draw border */ RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(0, 0, 0); rtgui_dc_draw_rect(dc, &rect); RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(128, 128, 128); rect.x1 += 1; rect.y1 += 1; rect.x2 -= 1; rect.y2 -= 1; rtgui_dc_draw_rect(dc, &rect); } } else { if (btn->unpressed_image != RT_NULL) { rtgui_rect_t image_rect; image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = btn->unpressed_image->w; image_rect.y2 = btn->unpressed_image->h; rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(btn->unpressed_image, dc, &image_rect); } else { /* fill button rect with background color */ rtgui_dc_fill_rect(dc, &rect); /* draw border */ RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(255, 255, 255); rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1); rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2); RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(0, 0, 0); rtgui_dc_draw_hline(dc, rect.x1, rect.x2 + 1, rect.y2); rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2); RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(128, 128, 128); rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2, rect.y2 - 1); rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2 - 1); } } if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(btn))) { /* re-set foreground and get default rect */ rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect); rtgui_rect_inflate(&rect, -2); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = black; rtgui_dc_draw_focus_rect(dc, &rect); } /* set forecolor */ RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(btn)) = bc; RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = fc; if (btn->pressed_image == RT_NULL) { /* re-set foreground and get default rect */ rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect); /* remove border */ rtgui_rect_inflate(&rect, -2); /* draw text */ rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(btn)), &rect); } /* end drawing */ rtgui_dc_end_drawing(dc); }
/* Draw tab bars of @param notebook. @param dc should be initialized and * finished outside this function. Don't pass @param notebook or @param dc as * RT_NULL, it should be checked outside. */ static void _rtgui_notebook_draw_bar(struct rtgui_notebook *notebook, struct rtgui_dc *dc) { int index; struct rtgui_rect rect; struct rtgui_rect text_rect; #ifdef RTGUI_USING_NOTEBOOK_IMAGE struct rtgui_image* image = RT_NULL; struct rtgui_rect image_rect; #endif RT_ASSERT((notebook != RT_NULL) && (dc != RT_NULL)); if (notebook->flag == RTGUI_NOTEBOOK_NOTAB) return; _rtgui_notebook_get_bar_rect(notebook, &rect); rtgui_dc_fill_rect(dc, &rect); if (notebook->flag == RTGUI_NOTEBOOK_TOP || notebook->flag == RTGUI_NOTEBOOK_BOTTOM) { rect.x2 = rect.x1 + notebook->tab_w; /* draw tab bar */ for (index = 0; index < notebook->count; index++) { if (notebook->current == index) { #ifdef RTGUI_USING_NOTEBOOK_IMAGE if (notebook->childs[index].pressed_image != RT_NULL) image = notebook->childs[index].pressed_image; else #endif rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN); } else { #ifdef RTGUI_USING_NOTEBOOK_IMAGE if (notebook->childs[index].unpressed_image != RT_NULL) image = notebook->childs[index].unpressed_image; else #endif rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_BOX); } rtgui_font_get_metrics(RTGUI_WIDGET_FONT(notebook), notebook->childs[index].title, &text_rect); rtgui_rect_moveto_align(&rect, &text_rect, RTGUI_ALIGN_CENTER); #ifdef RTGUI_USING_NOTEBOOK_IMAGE if (image != RT_NULL) { image_rect.x1 = 0; image_rect.y1 = RTGUI_WIDGET_DEFAULT_MARGIN; image_rect.x2 = image_rect.x1 + image->w; image_rect.y2 = image_rect.y1 + image->h; rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); rtgui_image_blit(image, dc, &image_rect); } if (image != RT_NULL) { int text_height = text_rect.y2 - text_rect.y1; text_rect.y1 = image_rect.y2 + RTGUI_WIDGET_DEFAULT_MARGIN; text_rect.y2 = text_rect.y1 + text_height; } image = RT_NULL; #endif rtgui_dc_draw_text(dc, notebook->childs[index].title, &text_rect); /* move to next tab */ rect.x1 = rect.x2; rect.x2 = rect.x1 + notebook->tab_w; } } else { rect.y2 = rect.y1 + notebook->tab_h; /* draw tab bar */ for (index = 0; index < notebook->count; index++) { if (notebook->current == index) { #ifdef RTGUI_USING_NOTEBOOK_IMAGE if (notebook->childs[index].pressed_image != RT_NULL) image = notebook->childs[index].pressed_image; else #endif rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN); } else { #ifdef RTGUI_USING_NOTEBOOK_IMAGE if (notebook->childs[index].unpressed_image != RT_NULL) image = notebook->childs[index].unpressed_image; else #endif rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_BOX); } rtgui_font_get_metrics(RTGUI_WIDGET_FONT(notebook), notebook->childs[index].title, &text_rect); rtgui_rect_moveto_align(&rect, &text_rect, RTGUI_ALIGN_CENTER); #ifdef RTGUI_USING_NOTEBOOK_IMAGE if (image != RT_NULL) { image_rect.x1 = 0; image_rect.y1 = RTGUI_WIDGET_DEFAULT_MARGIN; image_rect.x2 = image->w; image_rect.y2 = image_rect.y1 + image->h; rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); rtgui_image_blit(image, dc, &image_rect); } if (image != RT_NULL) { int text_height = text_rect.y2 - text_rect.y1; text_rect.y1 = image_rect.y2 + RTGUI_WIDGET_DEFAULT_MARGIN; text_rect.y2 = text_rect.y1 + text_height; } image = RT_NULL; #endif rtgui_dc_draw_text(dc, notebook->childs[index].title, &text_rect); /* move to next tab */ rect.y1 = rect.y2; rect.y2 = rect.y1 + notebook->tab_h; } } }
static void player_update_tag_info() { char line[32]; struct rtgui_dc* dc; rtgui_color_t bc, fc; rtgui_rect_t rect; rtgui_image_t *button; /* get dc */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(home_view)); if (dc == RT_NULL) return; /* save old foreground and background color */ fc = RTGUI_DC_FC(dc); bc = RTGUI_DC_BC(dc); /* draw playing information */ rect.x1 = 25; rect.y1 = 20; rect.x2 = 220; rect.y2 = rect.y1 + 16; RTGUI_DC_BC(dc) = RTGUI_RGB(0, 134, 206); rtgui_dc_fill_rect(dc, &rect); RTGUI_DC_FC(dc) = black; if (player_mode == PLAYER_STOP) { rt_snprintf(line, sizeof(line), "网络收音机"); rtgui_dc_draw_text(dc, line, &rect); } else rtgui_dc_draw_text(dc, tinfo.title, &rect); /* reset progress bar */ #if 0 if (tinfo.position != 0) { rt_snprintf(line, sizeof(line), "%3d:%02d", item->duration / 60, item->duration % 60); } else #endif { RTGUI_DC_FC(dc) = RTGUI_RGB(82, 199, 16); rtgui_dc_draw_hline(dc, 14, 226, 75); } rect.x1 = 25; rect.y1 = 48; rect.x2 = 220; rect.y2 = rect.y1 + 16; RTGUI_DC_BC(dc) = RTGUI_RGB(0, 125, 198); rtgui_dc_fill_rect(dc, &rect); RTGUI_DC_FC(dc) = black; if (player_mode == PLAYER_STOP) { rt_snprintf(line, sizeof(line), "radio.rt-thread.org"); rtgui_dc_draw_text(dc, line, &rect); } else { rtgui_dc_draw_text(dc, tinfo.artist, &rect); } if ((tinfo.duration != 0) && player_mode == PLAYER_PLAY_FILE) { play_time = 0; rect.x1 = 172; rt_snprintf(line, sizeof(line), " 0:00"); rtgui_dc_draw_text(dc, line, &rect); } /* update playing button */ if (player_mode == PLAYER_STOP) button = (rtgui_image_t*)&stop_image; else button = (rtgui_image_t*)&play_image; rect.x1 = 32; rect.y1 = 92; rect.x2 = 61; rect.y2 = 114; rtgui_image_blit(button, dc, &rect); RTGUI_DC_FC(dc) = fc; RTGUI_DC_BC(dc) = bc; rtgui_dc_end_drawing(dc); }
void rtgui_filelist_view_ondraw(struct rtgui_filelist_view *view) { struct rtgui_dc *dc; rt_uint16_t page_index, index; struct rtgui_file_item *item; struct rtgui_rect rect, item_rect, image_rect; dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view)); if (dc == RT_NULL) return; rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); rtgui_dc_fill_rect(dc, &rect); /* get item base rect */ item_rect = rect; item_rect.y1 += 1; item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height()); /* get image base rect */ image_rect.x1 = RTGUI_FILELIST_MARGIN; image_rect.y1 = 0; image_rect.x2 = RTGUI_FILELIST_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 */ page_index = (view->current_item / view->page_items) * view->page_items; for (index = 0; index < view->page_items; index ++) { if (page_index + index >= view->items_count) break; item = &(view->items[page_index + index]); if (page_index + index == view->current_item) { rtgui_theme_draw_selected(dc, &item_rect); } else { /* draw background */ rtgui_dc_fill_rect(dc, &item_rect); } /* draw item */ if (item->type == RTGUI_FITEM_FILE) rtgui_image_blit(file_image, dc, &image_rect); else rtgui_image_blit(folder_image, dc, &image_rect); /* draw text */ item_rect.x1 += RTGUI_FILELIST_MARGIN + file_image->w + 2; rtgui_dc_draw_text(dc, item->name, &item_rect); item_rect.x1 -= RTGUI_FILELIST_MARGIN + file_image->w + 2; /* move to next item position */ item_rect.y1 += (rtgui_theme_get_selected_height() + 1); item_rect.y2 += (rtgui_theme_get_selected_height() + 1); image_rect.y1 += (rtgui_theme_get_selected_height() + 1); image_rect.y2 += (rtgui_theme_get_selected_height() + 1); } rtgui_dc_end_drawing(dc); }
void rtgui_listbox_update_current(struct rtgui_listbox* box, rt_uint16_t old_item) { struct rtgui_dc* dc; const struct rtgui_listbox_item* item; rtgui_rect_t rect, item_rect; if (old_item/box->page_items != box->current_item/box->page_items) { /* it's not a same page, update all */ rtgui_widget_update(RTGUI_WIDGET(box)); return; } dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(box)); if (dc == RT_NULL) return; rtgui_widget_get_rect(RTGUI_WIDGET(box), &rect); rect.x2 -= 1; rect.y2 -= 1; item_rect = rect; /* get old item's rect */ item_rect.x1 += 1; item_rect.x2 -= 1; item_rect.y1 += 2; item_rect.y1 += (old_item % box->page_items) * (2 + rtgui_theme_get_selected_height()); item_rect.y2 = item_rect.y1 + (2 + rtgui_theme_get_selected_height()); /* draw old item */ rtgui_dc_fill_rect(dc, &item_rect); item_rect.x1 += LIST_MARGIN; item = &(box->items[old_item]); if (item->image != RT_NULL) { rtgui_image_blit(item->image, dc, &item_rect); item_rect.x1 += item->image->w + 2; } rtgui_dc_draw_text(dc, item->name, &item_rect); /* draw current item */ item_rect = rect; /* get current item's rect */ item_rect.x1 += 1; item_rect.x2 -= 1; item_rect.y1 += 2; item_rect.y1 += (box->current_item % box->page_items) * (2 + rtgui_theme_get_selected_height()); item_rect.y2 = item_rect.y1 + (2 + rtgui_theme_get_selected_height()); /* draw current item */ rtgui_theme_draw_selected(dc, &item_rect); item_rect.x1 += LIST_MARGIN; item = &(box->items[box->current_item]); if (item->image != RT_NULL) { rtgui_image_blit(item->image, dc, &item_rect); item_rect.x1 += (item->image->w + 2); } rtgui_dc_draw_text(dc, item->name, &item_rect); rtgui_dc_end_drawing(dc); }
static void app_list_draw(struct app_list_view *view) { struct rtgui_rect item_rect, drawing_rect; rt_ubase_t p, c, r, item_index; /* col and row index */ rt_ubase_t item_width, item_height; rtgui_image_t *image; rt_uint16_t width, height; if (view->items_count == 0) return; width = rtgui_rect_width(view->view_rect); height = rtgui_rect_height(view->view_rect); item_index = (view->current_item / view->page_items) * view->page_items; item_width = (width - 2 * LIST_MARGIN) / view->col_items; item_height = (height - 4) / view->row_items; image = view->items[0].icon; for (p = 0; p < view->page_count; p++) { for (r = 0; r < view->row_items; r++) { for (c = 0; c < view->col_items; c++) { if (item_index < view->items_count) { item_rect.y1 = r * item_height; item_rect.x1 = p * width + LIST_MARGIN + c * item_width; item_rect.x2 = item_rect.x1 + item_width; item_rect.y2 = item_rect.y1 + item_height; if (item_index == view->current_item) { //TO DO } if (view->items[item_index].icon) { drawing_rect.x1 = drawing_rect.y1 = 0; drawing_rect.x2 = image->w; drawing_rect.y2 = image->h; rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); drawing_rect.y1 += 5; drawing_rect.y2 += 5; rtgui_image_blit(view->items[item_index].icon, view->view_buffer, &drawing_rect); } if (view->items[item_index].text) { item_rect.y1 = drawing_rect.y2 + LIST_MARGIN; item_rect.x1 += 3; item_rect.x2 -= 3; rtgui_font_get_metrics(RTGUI_WIDGET_FONT(win), view->items[item_index].text, &drawing_rect); rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); rtgui_dc_draw_text(view->view_buffer, view->items[item_index].text, &drawing_rect); } item_index++; } else break; } } } }
static struct app_list_view *app_list_create(rtgui_rect_t *rect, struct app_item *items, rt_uint16_t item_count, rt_uint8_t row_items, rt_uint8_t col_items, rtgui_image_t *bg_image) { struct app_list_view *view = RT_NULL; view = (struct app_list_view *)rtgui_malloc(sizeof(struct app_list_view)); view->rect = *rect; view->view_rect.x1 = rect->x1; view->view_rect.x2 = rect->x2; view->view_rect.y1 = rect->y1 + 4 * LIST_MARGIN; view->view_rect.y2 = rect->y2 - 6 * LIST_MARGIN; view->col_items = col_items; view->row_items = row_items; view->current_page = 0; view->old_page = 0; view->page_items = col_items * row_items; view->page_count = (item_count + view->page_items - 1) / view->page_items; view->current_item = -1; view->items = items; view->items_count = item_count; if (bg_image != RT_NULL) { rtgui_rect_t bg_rect; RTGUI_RECT(bg_rect, 0, 0, bg_image->w, bg_image->h); /* create background dc buffer */ view->bg_buffer = rtgui_dc_buffer_create(bg_image->w, bg_image->h); /* draw background image to buffer */ rtgui_image_blit(bg_image, view->bg_buffer, &bg_rect); } /* create the main menu dc buffer */ view->view_buffer = rtgui_dc_buffer_create_pixformat(RTGRAPHIC_PIXEL_FORMAT_ARGB888, rtgui_rect_width(view->view_rect) * view->page_count, rtgui_rect_height(view->view_rect)); RTGUI_DC_BC(view->view_buffer) = RTGUI_ARGB(0, 0, 0, 0); view->pm_rect.x1 = 0; view->pm_rect.y1 = rect->y2 - 6 * LIST_MARGIN; view->pm_rect.x2 = PAGE_MARK_ITEM_WIDTH * view->page_count + PAGE_MARK_MARGIN * (view->page_count - 1); view->pm_rect.y2 = view->pm_rect.y1 + PAGE_MARK_ITEM_HEIGHT; view->pm_buffer = rtgui_dc_buffer_create_pixformat(RTGRAPHIC_PIXEL_FORMAT_ARGB888, rtgui_rect_width(view->pm_rect) , rtgui_rect_height(view->pm_rect)); rtgui_rect_moveto_align(rect, &view->pm_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); RTGUI_DC_BC(view->pm_buffer) = RTGUI_ARGB(0, 0, 0, 0); view->bgdisp_point.x = 0; view->bgdisp_point.y = 0; view->listdisp_point.x = 0; view->listdisp_point.y = 0; view->on_select = RT_NULL; return view; }
static rt_bool_t picture_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { if (event->type == RTGUI_EVENT_PAINT) { struct rtgui_dc* dc; struct rtgui_rect rect; struct rtgui_image* image; char fn[32]; dc = rtgui_dc_begin_drawing(widget); if (dc == RT_NULL) return RT_FALSE; rtgui_widget_get_rect(widget, &rect); /* open image */ rt_snprintf(fn, sizeof(fn), "%s/%s", PICTURE_DIR, current_fn); image = rtgui_image_create_from_file("hdc", fn, RT_FALSE); if (image != RT_NULL) { /* blit image */ rtgui_image_blit(image, dc, &rect); /* destroy image */ rtgui_image_destroy(image); } else { rtgui_dc_fill_rect(dc, &rect); rtgui_dc_draw_text(dc, "没有文件被打开", &rect); } rtgui_dc_end_drawing(dc); return RT_FALSE; } else if (event->type == RTGUI_EVENT_KBD) { struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN) { switch (ekbd->key) { case RTGUIK_RIGHT: if (view_mode == VIEW_DIR_MODE) picture_show_next(); else if (view_mode == VIEW_FN_LIST_MODE) { picture_fn_list_current ++; if (picture_fn_list_current == picture_fn_list_size) { picture_fn_list_current = 0; } strcpy(current_fn, picture_fn_list[picture_fn_list_current]); rtgui_widget_update(RTGUI_WIDGET(picture_view)); } break; case RTGUIK_LEFT: if (view_mode == VIEW_DIR_MODE) picture_show_prev(); else if (view_mode == VIEW_FN_LIST_MODE) { if (picture_fn_list_current == 0) { picture_fn_list_current = picture_fn_list_size - 1; } else picture_fn_list_current --; strcpy(current_fn, picture_fn_list[picture_fn_list_current]); rtgui_widget_update(RTGUI_WIDGET(picture_view)); } break; case RTGUIK_RETURN: { rtgui_view_t* view; view = RTGUI_VIEW(widget); /* close this view */ current_fn[0] = '\0'; /* end of modal */ rtgui_view_end_modal(view, RTGUI_MODAL_OK); picture_view = RT_NULL; } break; } } return RT_FALSE; } return rtgui_view_event_handler(widget, event); }
/* * view的事件处理函数 */ rt_bool_t dc_event_handler(rtgui_widget_t* widget, rtgui_event_t *event) { /* 仅对PAINT事件进行处理 */ if (event->type == RTGUI_EVENT_PAINT) { struct rtgui_dc* dc; rtgui_rect_t rect; /* const int vx[] = {20, 50, 60, 45, 60, 20}; const int vy[] = {150, 50, 90, 60, 45, 50}; */ /* * 因为用的是demo view,上面本身有一部分控件,所以在绘图时先要让demo view * 先绘图 */ rtgui_view_event_handler(widget, event); /************************************************************************/ /* 下面的是DC的操作 */ /************************************************************************/ /* 获得控件所属的DC */ dc = rtgui_dc_begin_drawing(widget); /* 如果不能正常获得DC,返回(如果控件或父控件是隐藏状态,DC是获取不成功的) */ if (dc == RT_NULL) return RT_FALSE; /* 获得demo view允许绘图的区域 */ demo_view_get_logic_rect(RTGUI_VIEW(widget), &rect); RTGUI_DC_TEXTALIGN(dc) = RTGUI_ALIGN_BOTTOM | RTGUI_ALIGN_CENTER_HORIZONTAL; /* 显示GUI的版本信息 */ #ifdef RTGUI_USING_SMALL_SIZE rtgui_dc_draw_text(dc, "RT-Thread/GUI小型版本", &rect); #else rtgui_dc_draw_text(dc, "RT-Thread/GUI标准版本", &rect); #endif { rtgui_rect_t rect = {0, 0, 0x1c, 0x16}; rtgui_rect_moveto(&rect, 80, 80); rtgui_image_blit((rtgui_image_t*)&play_image, dc, &rect); rect.x1 = 0; rect.y1 = 0; rect.x2 = 0x1c; rect.y2 = 0x16; rtgui_rect_moveto(&rect, 130, 80); rtgui_image_blit((rtgui_image_t*)&stop_image, dc, &rect); } /* 绘制一个圆形 */ RTGUI_DC_FC(dc) = red; rtgui_dc_draw_circle(dc, rect.x1 + 10, rect.y1 + 10, 10); /* 填充一个圆形 */ RTGUI_DC_FC(dc) = green; rtgui_dc_fill_circle(dc, rect.x1 + 30, rect.y1 + 10, 10); #if 0 /* 画一个圆角矩形 */ rect.x1 = 150; rect.y1 = 180; rect.x2 = 210; rect.y2 = 260; RTGUI_DC_FC(dc) = RTGUI_RGB(25, 70, 150); rtgui_dc_draw_round_rect(dc, &rect, 10); rect.x1 = 160; rect.y1 = 190; rect.x2 = 200; rect.y2 = 250; RTGUI_DC_FC(dc) = RTGUI_RGB(170, 7, 80); rtgui_dc_fill_round_rect(dc, &rect, 7); /* 画一个圆弧 */ RTGUI_DC_FC(dc) = RTGUI_RGB(250, 120, 120); rtgui_dc_draw_arc(dc, rect.x1 + 120, rect.y1 + 60, 30, 0, 120); /* 画一个扇形圆环 */ RTGUI_DC_FC(dc) = RTGUI_RGB(150, 23, 100); rtgui_dc_draw_annulus(dc, 180, 170, 30, 50, 210, 330); /* 多边形 */ RTGUI_DC_FC(dc) = blue; rtgui_dc_draw_polygon(dc, vx, vy, 6); #endif RTGUI_DC_FC(dc) = blue; /* 绘制不同的边框 */ { rtgui_rect_t rect = {0, 0, 16, 16}; rtgui_rect_moveto(&rect, 30, 120); rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_RAISE); rect.x1 += 20; rect.x2 += 20 + 50; rtgui_dc_draw_text(dc, "raise", &rect); rect.x1 -= 20; rect.x2 -= 20 + 50; rect.y1 += 20; rect.y2 += 20; rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SIMPLE); rect.x1 += 20; rect.x2 += 20 + 50; rtgui_dc_draw_text(dc, "simple", &rect); rect.x1 -= 20; rect.x2 -= 20 + 50; rect.y1 += 20; rect.y2 += 20; rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN); rect.x1 += 20; rect.x2 += 20 + 50; rtgui_dc_draw_text(dc, "sunken", &rect); rect.x1 -= 20; rect.x2 -= 20 + 50; rect.y1 += 20; rect.y2 += 20; rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_BOX); rect.x1 += 20; rect.x2 += 20 + 50; rtgui_dc_draw_text(dc, "box", &rect); rect.x1 -= 20; rect.x2 -= 20 + 50; rect.y1 += 20; rect.y2 += 20; rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_STATIC); rect.x1 += 20; rect.x2 += 20 + 50; rtgui_dc_draw_text(dc, "static", &rect); rect.x1 -= 20; rect.x2 -= 20 + 50; rect.y1 += 20; rect.y2 += 20; rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_EXTRA); rect.x1 += 20; rect.x2 += 20 + 50; rtgui_dc_draw_text(dc, "extera", &rect); rect.x1 -= 20; rect.x2 -= 20 + 50; rect.y1 += 20; rect.y2 += 20; } /* 绘图完成 */ rtgui_dc_end_drawing(dc); } else { /* 其他事件,调用默认的事件处理函数 */ return rtgui_view_event_handler(widget, event); } return RT_FALSE; }
static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { if (event->type == RTGUI_EVENT_PAINT) { struct rtgui_dc* dc; struct rtgui_rect rect; rtgui_image_t *background; /* draw child */ rtgui_view_event_handler(widget, event); dc = rtgui_dc_begin_drawing(widget); if (dc == RT_NULL) return RT_FALSE; rtgui_widget_get_rect(widget, &rect); /* draw background */ background = rtgui_image_create_from_file("hdc", "/resource/bg.hdc", RT_FALSE); if (background != RT_NULL) { rtgui_image_blit(background, dc, &rect); rtgui_image_destroy(background); } else { rtgui_dc_fill_rect(dc, &rect); } /* draw playing information */ player_update_tag_info(); rtgui_dc_end_drawing(dc); return RT_FALSE; } else if (event->type == RTGUI_EVENT_KBD) { struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN) { if ((ekbd->key == RTGUIK_LEFT) || (ekbd->key == RTGUIK_RIGHT)) { if (player_mode == PLAYER_STOP) { rtgui_view_show(RTGUI_VIEW(function_view), RT_FALSE); } else { rt_device_t dev = rt_device_find("snd"); if (ekbd->key == RTGUIK_LEFT && radio_setup.default_volume > 0) { radio_setup.default_volume--; rt_device_control(dev, CODEC_CMD_VOLUME, &radio_setup.default_volume); } else if (ekbd->key == RTGUIK_RIGHT && radio_setup.default_volume < CODEC_VOLUME_MAX) { radio_setup.default_volume++; rt_device_control(dev, CODEC_CMD_VOLUME, &radio_setup.default_volume); } } } else { return RTGUI_WIDGET(music_listbox)->event_handler(RTGUI_WIDGET(music_listbox), event); } } return RT_FALSE; } else if (event->type == RTGUI_EVENT_MOUSE_BUTTON) { struct rtgui_event_mouse* emouse; emouse = (struct rtgui_event_mouse*)event; if (emouse->button & RTGUI_MOUSE_BUTTON_UP) { if (rtgui_rect_contains_point(&next_btn_rect, emouse->x, emouse->y) == RT_EOK) player_onbutton(NEXT_BUTTON); else if (rtgui_rect_contains_point(&prev_btn_rect, emouse->x, emouse->y) == RT_EOK) player_onbutton(PREV_BUTTON); else if (rtgui_rect_contains_point(&playing_btn_rect, emouse->x, emouse->y) == RT_EOK) player_onbutton(PLAYING_BUTTON); } } else if (event->type == RTGUI_EVENT_COMMAND) { struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event; switch (ecmd->command_id) { case PLAYER_REQUEST_PLAY_SINGLE_FILE: case PLAYER_REQUEST_PLAY_LIST: rtgui_timer_start(info_timer); return RT_TRUE; case PLAYER_REQUEST_STOP: { struct play_item *item = RT_NULL; /* if it's radio mode, set next mode to stop */ if (player_mode == PLAYER_PLAY_RADIO) next_step = PLAYER_STEP_STOP; /* set player mode */ player_mode = PLAYER_STOP; switch (next_step) { case PLAYER_STEP_NEXT: /* play next */ item = play_list_next(play_list_get_mode()); break; case PLAYER_STEP_PREV: /* play prev */ item = play_list_prev(play_list_get_mode()); break; case PLAYER_STEP_SEEK: /* play current item */ item = play_list_current(); } if (item != RT_NULL) player_play_item(item); else { player_mode = PLAYER_STOP; rtgui_timer_stop(info_timer); } /* update tag information */ player_update_tag_info(); } return RT_TRUE; case PLAYER_REQUEST_FREEZE: { /* stop play */ if (player_is_playing() == RT_TRUE) { player_stop(); } /* delay some tick */ rt_thread_delay(50); /* show a modal view */ { rtgui_view_t *view; rtgui_label_t *label; rtgui_rect_t rect = {0, 0, 150, 150}, container_rect; rtgui_graphic_driver_get_default_rect(&container_rect); /* set centre */ rtgui_rect_moveto_align(&container_rect, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); view = rtgui_view_create("USB"); rtgui_workbench_add_view(workbench, view); /* set container to window rect */ container_rect = rect; rect.x1 = 0; rect.y1 = 0; rect.x2 = 120; rect.y2 = 20; label = rtgui_label_create("USB 联机中..."); rtgui_rect_moveto_align(&container_rect, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect); rtgui_container_add_child(RTGUI_CONTAINER(view), RTGUI_WIDGET(label)); rtgui_view_show(view, RT_TRUE); /* never reach hear */ } } case PLAYER_REQUEST_UPDATE_INFO: /* update status information */ player_update_tag_info(); return RT_TRUE; default: break; } return RT_FALSE; } return rtgui_view_event_handler(widget, event); }
static void rtgui_list_view_update_icon(struct rtgui_list_view* view, rt_uint16_t old_item) { struct rtgui_rect rect, item_rect, drawing_rect; rt_ubase_t c, r; /* col and row index */ rt_ubase_t item_width, item_height; rtgui_image_t* image; struct rtgui_dc* dc; if ((view->items_count == 0) || (old_item == view->current_item)) return; if (old_item/view->page_items != view->current_item/view->page_items) { /* it's not a same page, update all */ rtgui_widget_update(RTGUI_WIDGET(view)); return; } dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view)); if (dc == RT_NULL) return; rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); item_width = (rtgui_rect_width(rect) - 2 * LIST_MARGIN)/view->col_items; item_height = (rtgui_rect_height(rect) - 4)/view->row_items; image = view->items[0].image; /* update old item */ r = (old_item % view->page_items)/ view->col_items; c = (old_item % view->page_items)% view->col_items; item_rect.y1 = rect.y1 + LIST_MARGIN + r * item_height; item_rect.x1 = rect.x1 + LIST_MARGIN + c * item_width; item_rect.x2 = item_rect.x1 + item_width; item_rect.y2 = item_rect.y1 + item_height; rtgui_dc_fill_rect(dc, &item_rect); /* draw image */ drawing_rect.x1 = drawing_rect.y1 = 0; drawing_rect.x2 = image->w; drawing_rect.y2 = image->h; rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); drawing_rect.y1 += 3; drawing_rect.y2 += 3; rtgui_image_blit(view->items[old_item].image, dc, &drawing_rect); /* draw text */ item_rect.y1 = drawing_rect.y2 + LIST_MARGIN; item_rect.x1 += 3; item_rect.x2 -=3; rtgui_font_get_metrics(RTGUI_WIDGET_FONT(RTGUI_WIDGET(view)), view->items[old_item].name, &drawing_rect); rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); rtgui_dc_draw_text(dc, view->items[old_item].name, &drawing_rect); /* update new item as selected */ r = (view->current_item % view->page_items) / view->col_items; c = (view->current_item % view->page_items) % view->col_items; item_rect.y1 = rect.y1 + LIST_MARGIN + r * item_height; item_rect.x1 = rect.x1 + LIST_MARGIN + c * item_width; item_rect.x2 = item_rect.x1 + item_width; item_rect.y2 = item_rect.y1 + item_height; rtgui_theme_draw_selected(dc, &item_rect); /* draw image */ drawing_rect.x1 = 0; drawing_rect.y1 = 3; drawing_rect.x2 = image->w; drawing_rect.y2 = 3 + image->h; rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); rtgui_image_blit(view->items[view->current_item].image, dc, &drawing_rect); /* draw text */ item_rect.y1 = drawing_rect.y2 + LIST_MARGIN; item_rect.x1 += 3; item_rect.x2 -=3; rtgui_font_get_metrics(RTGUI_WIDGET_FONT(RTGUI_WIDGET(view)), view->items[view->current_item].name, &drawing_rect); rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); rtgui_dc_draw_text(dc, view->items[view->current_item].name, &drawing_rect); rtgui_dc_end_drawing(dc); }
void rtgui_list_view_update_list(struct rtgui_list_view* view, rt_uint16_t old_item) { struct rtgui_dc* dc; const struct rtgui_list_item* item; rtgui_rect_t rect, item_rect; if (old_item/view->page_items != view->current_item/view->page_items) { /* it's not a same page, update all */ rtgui_widget_update(RTGUI_WIDGET(view)); return; } dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view)); if (dc == RT_NULL) return; rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); /* get old item's rect and draw old item */ item_rect.x1 = rect.x1; item_rect.x2 = rect.x2; item_rect.y1 = rect.y1 + 2; item_rect.y1 += (old_item % view->page_items) * (2 + rtgui_theme_get_selected_height()); item_rect.y2 = item_rect.y1 + (2 + rtgui_theme_get_selected_height()); rtgui_dc_fill_rect(dc, &item_rect); item_rect.x1 += LIST_MARGIN; item = &(view->items[old_item]); if (item->image != RT_NULL) { struct rtgui_rect image_rect; /* blit on center */ image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = item->image->w; image_rect.y2 = item->image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(item->image, dc, &image_rect); item_rect.x1 += item->image->w + 2; } rtgui_dc_draw_text(dc, item->name, &item_rect); /* draw current item */ item_rect = rect; /* get current item's rect */ item_rect.y1 += 2; item_rect.y1 += (view->current_item % view->page_items) * (2 + rtgui_theme_get_selected_height()); item_rect.y2 = item_rect.y1 + (2 + rtgui_theme_get_selected_height()); /* draw current item */ rtgui_theme_draw_selected(dc, &item_rect); item_rect.x1 += LIST_MARGIN; item = &(view->items[view->current_item]); if (item->image != RT_NULL) { struct rtgui_rect image_rect; /* blit on center */ image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = item->image->w; image_rect.y2 = item->image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(item->image, dc, &image_rect); item_rect.x1 += (item->image->w + 2); } rtgui_dc_draw_text(dc, item->name, &item_rect); rtgui_dc_end_drawing(dc); }
void rtgui_filelist_view_update_current(struct rtgui_filelist_view *view, rt_uint16_t old_item) { struct rtgui_dc *dc; struct rtgui_file_item *item; rtgui_rect_t rect, item_rect, image_rect; if (old_item / view->page_items != view->current_item / view->page_items) { /* it's not a same page, update all */ rtgui_widget_update(RTGUI_WIDGET(view)); return; } dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view)); if (dc == RT_NULL) return; rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); /* get old item rect */ item_rect = rect; item_rect.y1 += 1; item_rect.y1 += (old_item % view->page_items) * (1 + rtgui_theme_get_selected_height()); item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height()); /* get image rect */ image_rect.x1 = RTGUI_FILELIST_MARGIN; image_rect.y1 = 0; image_rect.x2 = RTGUI_FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); /* draw old item */ rtgui_dc_fill_rect(dc, &item_rect); item = &(view->items[old_item]); if (item->type == RTGUI_FITEM_FILE) /* draw item image */ rtgui_image_blit(file_image, dc, &image_rect); else rtgui_image_blit(folder_image, dc, &image_rect); item_rect.x1 += RTGUI_FILELIST_MARGIN + file_image->w + 2; rtgui_dc_draw_text(dc, item->name, &item_rect); /* draw current item */ item_rect = rect; item_rect.y1 += 1; item_rect.y1 += (view->current_item % view->page_items) * (1 + rtgui_theme_get_selected_height()); item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height()); rtgui_theme_draw_selected(dc, &item_rect); /* get image base rect */ image_rect.x1 = RTGUI_FILELIST_MARGIN; image_rect.y1 = 0; image_rect.x2 = RTGUI_FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); item = &(view->items[view->current_item]); if (item->type == RTGUI_FITEM_FILE) /* draw item image */ rtgui_image_blit(file_image, dc, &image_rect); else rtgui_image_blit(folder_image, dc, &image_rect); item_rect.x1 += RTGUI_FILELIST_MARGIN + file_image->w + 2; rtgui_dc_draw_text(dc, item->name, &item_rect); if(view->on_changed!=RT_NULL) { view->on_changed(RTGUI_OBJECT(view),RT_NULL); } rtgui_dc_end_drawing(dc); }