list_view.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. /*
  2. * File : list_view.c
  3. * This file is part of RTGUI in RT-Thread RTOS
  4. * COPYRIGHT (C) 2010, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2010-01-06 Bernard first version
  13. */
  14. #include <rtgui/rtgui_theme.h>
  15. #include <rtgui/widgets/list_view.h>
  16. static void _rtgui_list_view_constructor(rtgui_list_view_t *view)
  17. {
  18. /* default rect */
  19. rtgui_rect_t rect = {0, 0, 200, 200};
  20. /* set default widget rect and set event handler */
  21. rtgui_widget_set_event_handler(view,rtgui_list_view_event_handler);
  22. rtgui_widget_set_rect(view, &rect);
  23. RTGUI_WIDGET_FLAG(view) |= RTGUI_WIDGET_FLAG_FOCUSABLE;
  24. view->flag = RTGUI_LIST_VIEW_LIST;
  25. view->item_current = 0;
  26. view->item_count = 0;
  27. view->page = 0;
  28. RTGUI_WIDGET_BACKGROUND(view) = white;
  29. RTGUI_WIDGET_TEXTALIGN(view) = RTGUI_ALIGN_CENTER_VERTICAL;
  30. }
  31. static void _rtgui_list_view_destructor(rtgui_list_view_t *view)
  32. {
  33. }
  34. rtgui_type_t *rtgui_list_view_type_get(void)
  35. {
  36. static rtgui_type_t *list_view_type = RT_NULL;
  37. if(!list_view_type)
  38. {
  39. list_view_type = rtgui_type_create("listview", RTGUI_VIEW_TYPE,
  40. sizeof(rtgui_list_view_t),
  41. RTGUI_CONSTRUCTOR(_rtgui_list_view_constructor),
  42. RTGUI_DESTRUCTOR(_rtgui_list_view_destructor));
  43. }
  44. return list_view_type;
  45. }
  46. static void rtgui_list_view_onicondraw(rtgui_list_view_t* view)
  47. {
  48. rtgui_rect_t rect, item_rect, drawing_rect;
  49. rt_uint32_t c, r, i; /* col and row index */
  50. rt_uint32_t item_width, item_height;
  51. rtgui_image_t* image;
  52. rtgui_dc_t* dc;
  53. RT_ASSERT(view != RT_NULL);
  54. /* begin drawing */
  55. dc = rtgui_dc_begin_drawing(view);
  56. if(dc == RT_NULL)return;
  57. if(view->item_count == 0) return;
  58. rtgui_widget_get_rect(view, &rect);
  59. i = (view->item_current / view->page) * view->page;
  60. item_width = (rtgui_rect_width(rect) - 2 * RTGUI_WIDGET_DEFAULT_MARGIN)/view->col_items;
  61. item_height = (rtgui_rect_height(rect) - 4)/view->row_items;
  62. image = view->items[0].image;
  63. for(r = 0; r < view->row_items; r ++)
  64. {
  65. for(c = 0; c < view->col_items; c ++)
  66. {
  67. if(i < view->item_count)
  68. {
  69. item_rect.y1 = rect.y1 + RTGUI_WIDGET_DEFAULT_MARGIN + r * item_height;
  70. item_rect.x1 = rect.x1 + RTGUI_WIDGET_DEFAULT_MARGIN + c * item_width;
  71. item_rect.x2 = item_rect.x1 + item_width;
  72. item_rect.y2 = item_rect.y1 + item_height;
  73. if(i == view->item_current)
  74. {
  75. RTGUI_DC_BC(dc) = selected_color;
  76. rtgui_dc_fill_rect(dc, &item_rect);
  77. }
  78. drawing_rect.x1 = drawing_rect.y1 = 0;
  79. drawing_rect.x2 = image->w;
  80. drawing_rect.y2 = image->h;
  81. rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL);
  82. drawing_rect.y1 += 3; drawing_rect.y2 += 3;
  83. rtgui_image_blit(view->items[i].image, dc, &drawing_rect);
  84. item_rect.y1 = drawing_rect.y2 + RTGUI_WIDGET_DEFAULT_MARGIN;
  85. item_rect.x1 += 3; item_rect.x2 -=3;
  86. rtgui_font_get_string_rect(RTGUI_WIDGET_FONT(view), view->items[i].name,
  87. &drawing_rect);
  88. rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL);
  89. rtgui_dc_draw_text(dc, view->items[i].name, &drawing_rect);
  90. i ++;
  91. }
  92. else break;
  93. }
  94. }
  95. rtgui_dc_end_drawing(dc);
  96. }
  97. static void rtgui_list_view_update_icon(rtgui_list_view_t* view, rt_uint16_t old_item)
  98. {
  99. rtgui_rect_t rect, item_rect, drawing_rect;
  100. rt_uint32_t c, r; /* col and row index */
  101. rt_uint32_t item_width, item_height;
  102. rtgui_image_t* image;
  103. rtgui_dc_t* dc;
  104. RT_ASSERT(view != RT_NULL);
  105. /* begin drawing */
  106. dc = rtgui_dc_begin_drawing(view);
  107. if(dc == RT_NULL)return;
  108. if((view->item_count == 0) ||
  109. (old_item == view->item_current))
  110. return;
  111. if(old_item/view->page != view->item_current/view->page)
  112. {
  113. /* it's not a same page, update all */
  114. rtgui_widget_update(view);
  115. return;
  116. }
  117. rtgui_widget_get_rect(view, &rect);
  118. item_width = (rtgui_rect_width(rect) - 2 * RTGUI_WIDGET_DEFAULT_MARGIN)/view->col_items;
  119. item_height = (rtgui_rect_height(rect) - 4)/view->row_items;
  120. image = view->items[0].image;
  121. /* update old item */
  122. r = (old_item % view->page)/ view->col_items;
  123. c = (old_item % view->page)% view->col_items;
  124. item_rect.y1 = rect.y1 + RTGUI_WIDGET_DEFAULT_MARGIN + r * item_height;
  125. item_rect.x1 = rect.x1 + RTGUI_WIDGET_DEFAULT_MARGIN + c * item_width;
  126. item_rect.x2 = item_rect.x1 + item_width;
  127. item_rect.y2 = item_rect.y1 + item_height;
  128. rtgui_dc_fill_rect(dc,&item_rect);
  129. /* draw image */
  130. drawing_rect.x1 = drawing_rect.y1 = 0;
  131. drawing_rect.x2 = image->w;
  132. drawing_rect.y2 = image->h;
  133. rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL);
  134. drawing_rect.y1 += 3; drawing_rect.y2 += 3;
  135. rtgui_image_blit(view->items[old_item].image, dc,&drawing_rect);
  136. /* draw text */
  137. item_rect.y1 = drawing_rect.y2 + RTGUI_WIDGET_DEFAULT_MARGIN;
  138. item_rect.x1 += 3; item_rect.x2 -=3;
  139. rtgui_font_get_string_rect(RTGUI_WIDGET_FONT(view), view->items[old_item].name,
  140. &drawing_rect);
  141. rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL);
  142. rtgui_dc_draw_text(dc, view->items[old_item].name, &drawing_rect);
  143. /* update new item as selected */
  144. r = (view->item_current % view->page) / view->col_items;
  145. c = (view->item_current % view->page) % view->col_items;
  146. item_rect.y1 = rect.y1 + RTGUI_WIDGET_DEFAULT_MARGIN + r * item_height;
  147. item_rect.x1 = rect.x1 + RTGUI_WIDGET_DEFAULT_MARGIN + c * item_width;
  148. item_rect.x2 = item_rect.x1 + item_width;
  149. item_rect.y2 = item_rect.y1 + item_height;
  150. RTGUI_DC_BC(dc) = selected_color;
  151. rtgui_dc_fill_rect(dc, &item_rect);
  152. /* draw image */
  153. drawing_rect.x1 = 0;
  154. drawing_rect.y1 = 3;
  155. drawing_rect.x2 = image->w;
  156. drawing_rect.y2 = 3 + image->h;
  157. rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL);
  158. rtgui_image_blit(view->items[view->item_current].image, dc, &drawing_rect);
  159. /* draw text */
  160. item_rect.y1 = drawing_rect.y2 + RTGUI_WIDGET_DEFAULT_MARGIN;
  161. item_rect.x1 += 3; item_rect.x2 -=3;
  162. rtgui_font_get_string_rect(RTGUI_WIDGET_FONT(view),
  163. view->items[view->item_current].name,
  164. &drawing_rect);
  165. rtgui_rect_moveto_align(&item_rect, &drawing_rect, RTGUI_ALIGN_CENTER_HORIZONTAL);
  166. rtgui_dc_draw_text(dc, view->items[view->item_current].name, &drawing_rect);
  167. rtgui_dc_end_drawing(dc);
  168. }
  169. static void rtgui_list_view_onlistdraw(rtgui_list_view_t* view)
  170. {
  171. rt_uint32_t i, page;
  172. rtgui_rect_t rect, item_rect, image_rect;
  173. const rtgui_list_view_item_t* item;
  174. rtgui_dc_t* dc;
  175. RT_ASSERT(view != RT_NULL);
  176. /* begin drawing */
  177. dc = rtgui_dc_begin_drawing(view);
  178. if(dc == RT_NULL)return;
  179. rtgui_widget_get_rect(view, &rect);
  180. /* get item base rect */
  181. item_rect = rect;
  182. item_rect.x1 += 2;
  183. item_rect.x2 -= 2;
  184. item_rect.y1 += 2;
  185. item_rect.y2 = item_rect.y1 + (2 + SELECTED_HEIGHT);
  186. /* get current page */
  187. page = (view->item_current / view->page) * view->page;
  188. for(i = 0; i < view->page; i ++)
  189. {
  190. if(page + i >= view->item_count) break;
  191. item = &(view->items[page + i]);
  192. if(page + i == view->item_current)
  193. {
  194. RTGUI_DC_BC(dc) = selected_color;
  195. rtgui_dc_fill_rect(dc, &item_rect);
  196. }
  197. item_rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  198. if(item->image != RT_NULL)
  199. {
  200. /* blit on center */
  201. image_rect.x1 = 0; image_rect.y1 = 0;
  202. image_rect.x2 = item->image->w;
  203. image_rect.y2 = item->image->h;
  204. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  205. rtgui_image_blit(item->image, dc, &image_rect);
  206. item_rect.x1 += item->image->w + 2;
  207. }
  208. /* draw text */
  209. rtgui_dc_draw_text(dc, item->name, &item_rect);
  210. if(item->image != RT_NULL)
  211. item_rect.x1 -= (item->image->w + 2);
  212. item_rect.x1 -= RTGUI_WIDGET_DEFAULT_MARGIN;
  213. /* move to next item position */
  214. item_rect.y1 += (SELECTED_HEIGHT + 2);
  215. item_rect.y2 += (SELECTED_HEIGHT + 2);
  216. }
  217. rtgui_dc_end_drawing(dc);
  218. }
  219. void rtgui_list_view_update_list(rtgui_list_view_t* view, rt_uint16_t old_item)
  220. {
  221. const rtgui_list_view_item_t* item;
  222. rtgui_rect_t rect, item_rect;
  223. rtgui_dc_t* dc;
  224. RT_ASSERT(view != RT_NULL);
  225. /* begin drawing */
  226. dc = rtgui_dc_begin_drawing(view);
  227. if(dc == RT_NULL)return;
  228. if(old_item/view->page != view->item_current/view->page)
  229. {
  230. /* it's not a same page, update all */
  231. rtgui_widget_update(view);
  232. return;
  233. }
  234. //绘制上一个项目
  235. rtgui_widget_get_rect(view, &rect);
  236. item_rect = rect;
  237. item_rect.x1 += 2;
  238. item_rect.x2 -= 2;
  239. item_rect.y1 += 2;
  240. item_rect.y1 += (old_item % view->page) * (2 + SELECTED_HEIGHT);
  241. item_rect.y2 = item_rect.y1 + (2 + SELECTED_HEIGHT);
  242. rtgui_dc_fill_rect(dc,&item_rect);
  243. item_rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  244. item = &(view->items[old_item]);
  245. if(item->image != RT_NULL)
  246. {
  247. rtgui_rect_t image_rect;
  248. /* blit on center */
  249. image_rect.x1 = 0; image_rect.y1 = 0;
  250. image_rect.x2 = item->image->w;
  251. image_rect.y2 = item->image->h;
  252. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  253. rtgui_image_blit(item->image, dc, &image_rect);
  254. item_rect.x1 += item->image->w + 2;
  255. }
  256. rtgui_dc_draw_text(dc, item->name, &item_rect);
  257. //绘制当前项
  258. item_rect = rect;
  259. /* get current item's rect */
  260. item_rect.x1 += 2;
  261. item_rect.x2 -= 2;
  262. item_rect.y1 += 2;
  263. item_rect.y1 += (view->item_current % view->page) * (2 + SELECTED_HEIGHT);
  264. item_rect.y2 = item_rect.y1 + (2 + SELECTED_HEIGHT);
  265. /* draw current item */
  266. RTGUI_DC_BC(dc) = selected_color;
  267. rtgui_dc_fill_rect(dc, &item_rect);
  268. item_rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  269. item = &(view->items[view->item_current]);
  270. if(item->image != RT_NULL)
  271. {
  272. rtgui_rect_t image_rect;
  273. /* blit on center */
  274. image_rect.x1 = 0; image_rect.y1 = 0;
  275. image_rect.x2 = item->image->w;
  276. image_rect.y2 = item->image->h;
  277. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  278. rtgui_image_blit(item->image, dc, &image_rect);
  279. item_rect.x1 += (item->image->w + 2);
  280. }
  281. RTGUI_DC_FC(dc) = white;
  282. rtgui_dc_draw_text(dc, item->name, &item_rect);
  283. rtgui_dc_end_drawing(dc);
  284. }
  285. void rtgui_list_view_ondraw(rtgui_list_view_t* view)
  286. {
  287. rtgui_rect_t rect;
  288. rtgui_dc_t* dc;
  289. RT_ASSERT(view != RT_NULL);
  290. /* begin drawing */
  291. dc = rtgui_dc_begin_drawing(view);
  292. if(dc == RT_NULL)return;
  293. rtgui_widget_get_rect(view, &rect);
  294. rtgui_dc_fill_rect(dc,&rect);
  295. switch (view->flag)
  296. {
  297. case RTGUI_LIST_VIEW_LIST:
  298. rtgui_list_view_onlistdraw(view);
  299. break;
  300. case RTGUI_LIST_VIEW_ICON:
  301. rtgui_list_view_onicondraw(view);
  302. break;
  303. }
  304. rtgui_dc_end_drawing(dc);
  305. }
  306. static rt_bool_t rtgui_list_view_onmouse(rtgui_list_view_t* view, rtgui_event_mouse_t* emouse)
  307. {
  308. rtgui_rect_t rect;
  309. /* calculate selected item */
  310. /* get physical extent information */
  311. rtgui_widget_get_rect(view, &rect);
  312. if(rtgui_rect_contains_point(&rect, emouse->x, emouse->y) == RT_EOK)
  313. {
  314. rt_uint16_t index;
  315. rt_uint16_t old_item;
  316. /* get old item */
  317. old_item = view->item_current;
  318. switch (view->flag)
  319. {
  320. case RTGUI_LIST_VIEW_LIST:
  321. index = (emouse->y - rect.y1) / (2 + SELECTED_HEIGHT);
  322. if((index < view->item_count) && (index < view->page))
  323. {
  324. /* set selected item */
  325. view->item_current = (view->item_current/view->page) * view->page + index;
  326. if(emouse->button & RTGUI_MOUSE_BUTTON_DOWN)
  327. {
  328. /* down event */
  329. rtgui_list_view_update_list(view, old_item);
  330. }
  331. else
  332. {
  333. /* up event */
  334. if(view->items[view->item_current].action != RT_NULL)
  335. {
  336. view->items[view->item_current].action(view->items[view->item_current].parameter);
  337. }
  338. }
  339. }
  340. break;
  341. case RTGUI_LIST_VIEW_ICON:
  342. {
  343. rt_uint16_t x, y;
  344. rt_uint16_t item_height, item_width;
  345. rt_uint32_t current_page;
  346. item_width = (rtgui_rect_width(rect) - 2 * RTGUI_WIDGET_DEFAULT_MARGIN)/view->col_items;
  347. item_height = (rtgui_rect_height(rect) - 4)/view->row_items;
  348. x = emouse->x - rect.x1;
  349. y = emouse->y - rect.y1;
  350. index = (y / item_height * view->col_items) + x / item_width;
  351. current_page = view->item_current / view->page;
  352. if((index + (current_page * view->page) < view->item_count))
  353. {
  354. if(emouse->button & RTGUI_MOUSE_BUTTON_DOWN)
  355. {
  356. view->item_current = index + (current_page * view->page);
  357. /* down event */
  358. rtgui_list_view_update_icon(view, old_item);
  359. }
  360. else
  361. {
  362. /* up event */
  363. if(view->items[view->item_current].action != RT_NULL)
  364. {
  365. view->items[view->item_current].action(view->items[view->item_current].parameter);
  366. }
  367. }
  368. }
  369. }
  370. break;
  371. case RTGUI_LIST_VIEW_REPORT:
  372. break;
  373. }
  374. return RT_TRUE;
  375. }
  376. return RT_FALSE;
  377. }
  378. rt_bool_t rtgui_list_view_event_handler(PVOID wdt, rtgui_event_t* event)
  379. {
  380. rtgui_widget_t *widget = (rtgui_widget_t*)wdt;
  381. rtgui_list_view_t* view = RT_NULL;
  382. view = RTGUI_LIST_VIEW(widget);
  383. switch (event->type)
  384. {
  385. case RTGUI_EVENT_PAINT:
  386. rtgui_list_view_ondraw(view);
  387. return RT_FALSE;
  388. case RTGUI_EVENT_RESIZE:
  389. {
  390. rtgui_event_resize_t* resize;
  391. resize = (rtgui_event_resize_t*)event;
  392. /* recalculate page items */
  393. view->page = resize->h / (2 + SELECTED_HEIGHT);
  394. }
  395. break;
  396. case RTGUI_EVENT_MOUSE_BUTTON:
  397. {
  398. rtgui_event_mouse_t* emouse;
  399. emouse = (rtgui_event_mouse_t*)event;
  400. return rtgui_list_view_onmouse(view, emouse);
  401. }
  402. case RTGUI_EVENT_KBD:
  403. {
  404. rtgui_event_kbd_t* ekbd = (rtgui_event_kbd_t*)event;
  405. if(RTGUI_KBD_IS_DOWN(ekbd))
  406. {
  407. rt_uint16_t old_item;
  408. old_item = view->item_current;
  409. switch (ekbd->key)
  410. {
  411. case RTGUIK_LEFT:
  412. if(view->flag == RTGUI_LIST_VIEW_LIST)
  413. {
  414. if(view->item_current - view->page >= 0)
  415. view->item_current -= view->page;
  416. rtgui_list_view_update_list(view, old_item);
  417. }
  418. else if(view->flag == RTGUI_LIST_VIEW_ICON)
  419. {
  420. if(view->item_current > 0)
  421. view->item_current --;
  422. rtgui_list_view_update_icon(view, old_item);
  423. }
  424. return RT_FALSE;
  425. case RTGUIK_UP:
  426. if(view->flag == RTGUI_LIST_VIEW_LIST)
  427. {
  428. if(view->item_current > 0)
  429. view->item_current --;
  430. rtgui_list_view_update_list(view, old_item);
  431. }
  432. else if(view->flag == RTGUI_LIST_VIEW_ICON)
  433. {
  434. if(view->item_current >= view->col_items)
  435. view->item_current -= view->col_items;
  436. else
  437. view->item_current = 0;
  438. rtgui_list_view_update_icon(view, old_item);
  439. }
  440. return RT_FALSE;
  441. case RTGUIK_RIGHT:
  442. if(view->flag == RTGUI_LIST_VIEW_LIST)
  443. {
  444. if(view->item_current + view->page < view->item_count - 1)
  445. view->item_current += view->page;
  446. rtgui_list_view_update_list(view, old_item);
  447. }
  448. else if(view->flag == RTGUI_LIST_VIEW_ICON)
  449. {
  450. if(view->item_current < view->item_count - 1)
  451. view->item_current ++;
  452. rtgui_list_view_update_icon(view, old_item);
  453. }
  454. return RT_FALSE;
  455. case RTGUIK_DOWN:
  456. if(view->flag == RTGUI_LIST_VIEW_LIST)
  457. {
  458. if(view->item_current < view->item_count - 1)
  459. view->item_current ++;
  460. rtgui_list_view_update_list(view, old_item);
  461. }
  462. else if(view->flag == RTGUI_LIST_VIEW_ICON)
  463. {
  464. if(view->item_current + view->col_items <= (view->item_count - 1))
  465. view->item_current += view->col_items;
  466. else
  467. view->item_current = view->item_count - 1;
  468. rtgui_list_view_update_icon(view, old_item);
  469. }
  470. return RT_FALSE;
  471. case RTGUIK_RETURN:
  472. if(view->items[view->item_current].action != RT_NULL)
  473. {
  474. view->items[view->item_current].action(view->items[view->item_current].parameter);
  475. }
  476. return RT_FALSE;
  477. default:
  478. break;
  479. }
  480. }
  481. }
  482. return RT_FALSE;
  483. default:
  484. break;
  485. }
  486. /* use view event handler */
  487. return rtgui_view_event_handler(widget, event);
  488. }
  489. static void rtgui_list_view_calc(rtgui_list_view_t* view)
  490. {
  491. /* get image of first item*/
  492. rtgui_image_t *image;
  493. rtgui_rect_t rect;
  494. rt_uint32_t text_width, text_height;
  495. rt_uint32_t item_width, item_height;
  496. if(view->item_count == 0) return;
  497. image = view->items[0].image;
  498. rtgui_font_get_string_rect(RTGUI_WIDGET_FONT(view), "HHHHHH", &rect);
  499. text_height = rtgui_rect_height(rect);
  500. text_width = rtgui_rect_width(rect);
  501. rtgui_widget_get_rect(view, &rect);
  502. item_width = image->w + RTGUI_WIDGET_DEFAULT_MARGIN;
  503. if(item_width < (text_width + RTGUI_WIDGET_DEFAULT_MARGIN)) item_width = text_width + RTGUI_WIDGET_DEFAULT_MARGIN;
  504. item_height = image->h + 3 + text_height + RTGUI_WIDGET_DEFAULT_MARGIN;
  505. view->row_items = (rtgui_rect_height(rect) - 2 * RTGUI_WIDGET_DEFAULT_MARGIN) / item_height;
  506. view->col_items = (rtgui_rect_width(rect) - 2 * RTGUI_WIDGET_DEFAULT_MARGIN) / item_width;
  507. view->page = view->row_items * view->col_items;
  508. }
  509. rtgui_list_view_t* rtgui_list_view_create(PVOID parent,const rtgui_list_view_item_t* items, rt_uint16_t count, int left,int top,int w,int h, rt_uint16_t flag)
  510. {
  511. rtgui_list_view_t* view = RT_NULL;
  512. RT_ASSERT(parent != RT_NULL);
  513. view = rtgui_widget_create(RTGUI_LIST_VIEW_TYPE);
  514. if(view != RT_NULL)
  515. {
  516. rtgui_rect_t rect;
  517. view->items = items;
  518. view->item_count = count;
  519. view->flag = flag;
  520. rtgui_widget_get_rect(view, &rect);
  521. rtgui_widget_rect_to_device(parent,&rect);
  522. rect.x1 += left;
  523. rect.y1 += top;
  524. rect.x2 = rect.x1+w;
  525. rect.y2 = rect.y1+h;
  526. rtgui_widget_set_rect(view, &rect);
  527. if(flag == RTGUI_LIST_VIEW_LIST)
  528. view->page = rtgui_rect_height(rect) / (2 + SELECTED_HEIGHT);
  529. else if((flag == RTGUI_LIST_VIEW_ICON) && (count > 0))
  530. {
  531. rtgui_list_view_calc(view);
  532. }
  533. rtgui_container_add_child(parent, view);
  534. }
  535. return view;
  536. }
  537. void rtgui_list_view_destroy(rtgui_list_view_t* view)
  538. {
  539. /* destroy view */
  540. rtgui_widget_destroy(view);
  541. }