void rtgui_edit_adjust_scroll(rtgui_scrollbar_t *bar) { struct rtgui_edit *edit; RT_ASSERT(bar != RT_NULL); if(bar->WIDGET_GROUP != RT_NULL) { rtgui_rect_t rect; rt_uint32_t _left=0,_top=0,_width=RTGUI_DEFAULT_SB_WIDTH,_len=0; edit = bar->WIDGET_GROUP; rtgui_widget_get_rect(edit, &rect); rtgui_widget_rect_to_device(edit,&rect); if(bar->orient==RTGUI_HORIZONTAL) { if(RTGUI_WIDGET_IS_HIDE(edit->hscroll)) { if(edit->max_rows > edit->row_per_page) { RTGUI_WIDGET_SHOW(edit->hscroll); rtgui_scrollbar_set_line_step(edit->hscroll, 1); rtgui_scrollbar_set_page_step(edit->hscroll, edit->row_per_page); rtgui_scrollbar_set_range(edit->hscroll, edit->max_rows); } else RTGUI_WIDGET_HIDE(edit->vscroll); rtgui_widget_update_clip(RTGUI_WIDGET(edit)); } else { _left = RTGUI_WIDGET_BORDER_SIZE(edit); _top = rtgui_rect_height(rect)-RTGUI_WIDGET_BORDER_SIZE(edit)-_width; _len = rtgui_rect_width(rect)-RTGUI_WIDGET_BORDER_SIZE(edit)*2; if(!RTGUI_WIDGET_IS_HIDE(edit->vscroll)) _len -= _width; rect.x1 += _left; rect.y1 += _top; rect.x2 = rect.x1+_len; rect.y2 = rect.y1+_width; } } else if(bar->orient==RTGUI_VERTICAL) { _left = rtgui_rect_width(rect)-RTGUI_WIDGET_BORDER_SIZE(edit)-_width; _top = RTGUI_WIDGET_BORDER_SIZE(edit); _len = rtgui_rect_height(rect)-RTGUI_WIDGET_BORDER_SIZE(edit)*2; if(!RTGUI_WIDGET_IS_HIDE(edit->hscroll)) _len -= _width; rect.x1 += _left; rect.y1 += _top; rect.x2 = rect.x1+_width; rect.y2 = rect.y1+_len; } rtgui_widget_set_rect(bar,&rect); } }
void rtgui_combo_add_string(rtgui_combo_t* cbo,const char* string) { if(cbo->lbox != RT_NULL) { rtgui_listbox_item_t item; rtgui_rect_t rect; rt_uint32_t h,count; item.name = (char*)string; item.image = RT_NULL; rtgui_listbox_add_item(cbo->lbox, &item, 1); rtgui_widget_get_rect(cbo->lbox, &rect); count = rtgui_listbox_get_count(cbo->lbox); h = RTGUI_WIDGET_BORDER_SIZE(cbo->lbox)*2+(RTGUI_SEL_H + 2)*count; if(h>RC_H(rect)) { if(cbo->lbox->item_per_page<5)/* change when less than five */ { rect.y2 = rect.y1+h; rtgui_widget_rect_to_device(cbo->lbox,&rect); rtgui_widget_set_rect(cbo->lbox,&rect);/* update listbox extent */ cbo->lbox->item_per_page = RC_H(rect) / (RTGUI_SEL_H+2); if(cbo->lbox->scroll != RT_NULL)/* update scrollbar extent */ { rtgui_widget_get_rect(cbo->lbox->scroll, &rect); rect.y2 = rect.y1+h-RTGUI_WIDGET_BORDER_SIZE(cbo->lbox)*2; rtgui_widget_rect_to_device(cbo->lbox->scroll,&rect); rtgui_widget_set_rect(cbo->lbox->scroll,&rect); if(cbo->lbox->item_count > cbo->lbox->item_per_page) { RTGUI_WIDGET_SHOW(cbo->lbox->scroll); rtgui_scrollbar_set_line_step(cbo->lbox->scroll, 1); rtgui_scrollbar_set_page_step(cbo->lbox->scroll, cbo->lbox->item_per_page); rtgui_scrollbar_set_range(cbo->lbox->scroll, cbo->lbox->item_count); } else { RTGUI_WIDGET_HIDE(cbo->lbox->scroll); } rtgui_widget_update_clip(cbo->lbox); } } } } }
rtgui_view_t *demo_gui_scrollbar(rtgui_view_t* parent_view) { rtgui_view_t *view; rtgui_scrollbar_t* hbar; rtgui_scrollbar_t* vbar; /* create a demo view */ view = demo_view_create(parent_view, "ScrollBar View"); rtgui_label_create(view, "horizontal bar:", 5, 40, 150, 20); hbar = rtgui_scrollbar_create(view, 5, 65, 20, 100, RTGUI_HORIZONTAL); rtgui_scrollbar_set_range(hbar, 10); rtgui_scrollbar_set_page_step(hbar, 5); rtgui_scrollbar_set_line_step(hbar, 1); rtgui_label_create(view, "vertical bar:", 5, 90, 150, 20); vbar = rtgui_scrollbar_create(view, 10, 115, 20, 80, RTGUI_VERTICAL); rtgui_scrollbar_set_range(vbar, 5); rtgui_scrollbar_set_page_step(vbar, 3); rtgui_scrollbar_set_line_step(vbar, 1); return view; }
rtgui_container_t *demo_view_scrollbar(void) { rtgui_container_t *container; rtgui_rect_t rect; rtgui_label_t *label; rtgui_scrollbar_t *hbar; rtgui_scrollbar_t *vbar; /* create a demo container */ container = demo_view("ScrollBar View"); /* get demo container rect */ demo_view_get_rect(container, &rect); label = rtgui_label_create("horizontal bar:"); rtgui_container_add_child(container, RTGUI_WIDGET(label)); rect.x1 += 5; rect.x2 -= 5; rect.y1 += 5; rect.y2 = rect.y1 + 18; rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect); rect.y1 += 20; rect.y2 = rect.y1 + 18; hbar = rtgui_scrollbar_create(RTGUI_HORIZONTAL, &rect); rtgui_container_add_child(container, RTGUI_WIDGET(hbar)); /* get demo container rect */ demo_view_get_rect(container, &rect); label = rtgui_label_create("vertical bar:"); rtgui_container_add_child(container, RTGUI_WIDGET(label)); rect.x1 += 5; rect.x2 -= 5; rect.y1 += 45; rect.y2 = rect.y1 + 18; rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect); rect.x1 += 110; rect.x2 = rect.x1 + 20; rect.y1 += 18 + 5; rect.y2 = rect.y1 + 150; vbar = rtgui_scrollbar_create(RTGUI_VERTICAL, &rect); rtgui_container_add_child(container, RTGUI_WIDGET(vbar)); rtgui_scrollbar_set_line_step(vbar, 1); // RTGUI_WIDGET_DISABLE(vbar); return container; }
static void _rtgui_scrollbar_constructor(rtgui_scrollbar_t *bar) { struct rtgui_rect rect = {0, 0, RTGUI_DEFAULT_SB_WIDTH, RTGUI_DEFAULT_SB_HEIGHT}; /* set event handler */ rtgui_widget_set_event_handler(RTGUI_WIDGET(bar), rtgui_scrollbar_event_handler); rtgui_scrollbar_set_range(bar, 0, 100); rtgui_scrollbar_set_page_step(bar, 20); rtgui_scrollbar_set_line_step(bar, 10); bar->status = 0; bar->thumb_position = 0; bar->thumb_size = 16; bar->on_scroll = RT_NULL; bar->orient = RTGUI_HORIZONTAL; rtgui_widget_set_rect(RTGUI_WIDGET(bar), &rect); /* set gc */ RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(bar)) = RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL; }
void rtgui_fileview_set_directory(rtgui_fileview_t* fview, const char* directory) { char fullpath[256]; rtgui_fileview_item_t *item; fview->first_item = 0; fview->item_count = 0; /* clear file information */ rtgui_fileview_clear(fview); if(directory != RT_NULL) { DIR* dir; struct stat s; rt_uint32_t i; struct dirent* dirent; fview->item_count = 0; /* open directory */ dir = opendir(directory); if(dir == RT_NULL) return; /* set current directory */ if(fview->current_dir != RT_NULL) { rt_free(fview->current_dir); fview->current_dir = RT_NULL; } fview->current_dir = rt_strdup(directory); if(fview->dlg != RT_NULL) { if(fview->dlg->path != RT_NULL) rt_free(fview->dlg->path); fview->dlg->path = rt_strdup(fview->current_dir); if(fview->dlg->tbox_path != RT_NULL) { rtgui_textbox_set_value(fview->dlg->tbox_path,fview->dlg->path); rtgui_textbox_ondraw(fview->dlg->tbox_path); } } do { dirent = readdir(dir); if(dirent == RT_NULL) break; fview->item_count ++; } while(dirent != RT_NULL); closedir(dir); if((fview->item_count > fview->item_per_page) && fview->sbar!=RT_NULL) { RTGUI_WIDGET_SHOW(fview->sbar); rtgui_scrollbar_set_line_step(fview->sbar,1); rtgui_scrollbar_set_page_step(fview->sbar, fview->item_per_page); rtgui_scrollbar_set_range(fview->sbar, fview->item_count); } else { RTGUI_WIDGET_HIDE(fview->sbar); } rtgui_widget_update_clip(fview); /* apply to memory for store all items. */ fview->items = (rtgui_fileview_item_t*) rt_malloc(sizeof(rtgui_fileview_item_t) * fview->item_count); if(fview->items == RT_NULL) goto __return; /* under the folder has not sub files. */ /* reopen directory */ dir = opendir(directory); if(dir == RT_NULL) goto __return; for(i=0; i < fview->item_count; i ++) { dirent = readdir(dir); if(dirent == RT_NULL) break; item = &(fview->items[i]); item->name = rt_strdup(dirent->d_name); rt_memset(&s, 0, sizeof(struct stat)); /* get fullpath of file */ dfs_get_fullpath(fullpath, directory, dirent->d_name); stat(fullpath, &s); if(s.st_mode & S_IFDIR) { item->type = RTGUI_FITEM_DIR; item->size = 0; } else { item->type = RTGUI_FITEM_FILE; item->size = s.st_size; } } closedir(dir); } fview->now_item = 0; __return: /* update view */ rtgui_widget_update(fview); }
/* set edit text */ void rtgui_edit_set_text(struct rtgui_edit* edit, const char* text) { const char *begin, *ptr; int hscroll_flag=0; int vscroll_flag=0; RT_ASSERT(edit != RT_NULL); while(edit->max_rows > 0) rtgui_edit_delete_line(edit, edit->head); edit->max_rows = 0; begin = text; for(ptr=begin; *ptr != '\0'; ptr++) { if(*ptr == 0x0A) { /* unix style */ rtgui_edit_append_line(edit, begin); begin = ptr+1; } else if(*ptr == 0x0D && *(ptr+1) == 0x0A) { /* windows style */ rtgui_edit_append_line(edit, begin); begin = ptr+2; } } if(*ptr == '\0') { if(begin < ptr) rtgui_edit_append_line(edit, begin); } #ifdef RTGUI_EDIT_USING_SCROLL if(edit->hscroll != RT_NULL) { if(edit->max_cols > edit->col_per_page) { RTGUI_WIDGET_SHOW(edit->hscroll); rtgui_scrollbar_set_line_step(edit->hscroll, 1); rtgui_scrollbar_set_page_step(edit->hscroll, edit->col_per_page); rtgui_scrollbar_set_range(edit->hscroll, edit->max_cols); hscroll_flag = 1; } else { RTGUI_WIDGET_HIDE(edit->hscroll); } } if(edit->vscroll != RT_NULL) { if(edit->max_rows > edit->row_per_page) { RTGUI_WIDGET_SHOW(edit->vscroll); rtgui_scrollbar_set_line_step(edit->vscroll, 1); rtgui_scrollbar_set_page_step(edit->vscroll, edit->row_per_page); rtgui_scrollbar_set_range(edit->vscroll, edit->max_rows); vscroll_flag = 1; } else { RTGUI_WIDGET_HIDE(edit->vscroll); } } if(edit->hscroll != RT_NULL && !RTGUI_WIDGET_IS_HIDE(edit->hscroll)) { rtgui_edit_adjust_scroll(edit->hscroll); } if(edit->vscroll != RT_NULL && !RTGUI_WIDGET_IS_HIDE(edit->vscroll)) { rtgui_edit_adjust_scroll(edit->vscroll); } #endif if(hscroll_flag || vscroll_flag) { rtgui_widget_update_clip(RTGUI_WIDGET(edit)); } }