filelist.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. #include <rtgui/rtgui_object.h>
  2. #include <rtgui/rtgui_system.h>
  3. #include <rtgui/rtgui_theme.h>
  4. #include <rtgui/list.h>
  5. #include <rtgui/image.h>
  6. #include <rtgui/widgets/view.h>
  7. #include <rtgui/widgets/workbench.h>
  8. #include "filelist.h"
  9. #include <dfs_posix.h>
  10. #include <string.h>
  11. #define FILELIST_MARGIN 5
  12. #ifdef _WIN32
  13. #define PATH_SEPARATOR '\\'
  14. #define stat _stat
  15. #else
  16. #define PATH_SEPARATOR '/'
  17. #endif
  18. const static char * file_xpm[] = {
  19. "16 16 21 1",
  20. " c None",
  21. ". c #999999",
  22. "+ c #818181",
  23. "@ c #FFFFFF",
  24. "# c #ECECEC",
  25. "$ c #EAEAEA",
  26. "% c #EBEBEB",
  27. "& c #EDEDED",
  28. "* c #F0F0F0",
  29. "= c #C4C4C4",
  30. "- c #C5C5C5",
  31. "; c #C6C6C6",
  32. "> c #C7C7C7",
  33. ", c #EEEEEE",
  34. "' c #EDEDE5",
  35. ") c #EDEDE6",
  36. "! c #EFEFEF",
  37. "~ c #C8C8C8",
  38. "{ c #F1F1F1",
  39. "] c #F2F2F2",
  40. "^ c #959595",
  41. ".++++++++++++ ",
  42. "+@@@@@@@@@@@@+ ",
  43. "+@#$$%%%##&*@+ ",
  44. "+@$=--;;;;>*@+ ",
  45. "+@$%%###&&,*@+ ",
  46. "+@%-;;;;;;>*@+ ",
  47. "+@%%##&&'#,*@+ ",
  48. "+@%;;;;,,),*@+ ",
  49. "+@##&&,,!!!*@+ ",
  50. "+@#;;;>>~~~*@+ ",
  51. "+@#&,,!!*{{{@+ ",
  52. "+@&;>>~~~{{]@+ ",
  53. "+@&&,!!**{]]@+ ",
  54. "+@@@@@@@@@@@@+ ",
  55. "^++++++++++++^ ",
  56. " "};
  57. const static char * folder_xpm[] = {
  58. "16 16 121 2",
  59. " c None",
  60. ". c #D9B434",
  61. "+ c #E1C25E",
  62. "@ c #E2C360",
  63. "# c #E2C35F",
  64. "$ c #DBB63C",
  65. "% c #DAB336",
  66. "& c #FEFEFD",
  67. "* c #FFFFFE",
  68. "= c #FFFEFE",
  69. "- c #FFFEFD",
  70. "; c #FBF7EA",
  71. "> c #E4C76B",
  72. ", c #E3C76B",
  73. "' c #E6CD79",
  74. ") c #E5CA74",
  75. "! c #DAAF35",
  76. "~ c #FEFCF7",
  77. "{ c #F8E48E",
  78. "] c #F5DE91",
  79. "^ c #F5E09F",
  80. "/ c #F6E1AC",
  81. "( c #FEFBEF",
  82. "_ c #FEFDF4",
  83. ": c #FEFCF3",
  84. "< c #FEFCF1",
  85. "[ c #FEFBEE",
  86. "} c #FFFDFA",
  87. "| c #DAAF36",
  88. "1 c #DAAA36",
  89. "2 c #FDFAF1",
  90. "3 c #F5DE94",
  91. "4 c #F4DC93",
  92. "5 c #F2D581",
  93. "6 c #EDCA6A",
  94. "7 c #EACB6C",
  95. "8 c #EFD385",
  96. "9 c #EFD280",
  97. "0 c #EFD07A",
  98. "a c #EECF76",
  99. "b c #EECF72",
  100. "c c #FBF7E9",
  101. "d c #DAAE34",
  102. "e c #DAAB35",
  103. "f c #FBF6E8",
  104. "g c #EFD494",
  105. "h c #EECE88",
  106. "i c #E9C173",
  107. "j c #F6E9C9",
  108. "k c #FEFCF2",
  109. "l c #FEFCF0",
  110. "m c #DAAB36",
  111. "n c #DAA637",
  112. "o c #FFFDF8",
  113. "p c #FFFDF6",
  114. "q c #FFFCF5",
  115. "r c #FCF6D8",
  116. "s c #F8E694",
  117. "t c #F7E385",
  118. "u c #F6DF76",
  119. "v c #F5DB68",
  120. "w c #F4D85C",
  121. "x c #FCF4D7",
  122. "y c #DAA435",
  123. "z c #DAA136",
  124. "A c #FEFCF6",
  125. "B c #FCF2C8",
  126. "C c #FBEFB9",
  127. "D c #FAECAC",
  128. "E c #F9E89C",
  129. "F c #F7E38B",
  130. "G c #F6E07C",
  131. "H c #F6DC6C",
  132. "I c #F5D95D",
  133. "J c #F4D64F",
  134. "K c #F3D344",
  135. "L c #FCF3D0",
  136. "M c #DA9F35",
  137. "N c #DA9A36",
  138. "O c #FDFAF2",
  139. "P c #FAEDB3",
  140. "Q c #F9E9A4",
  141. "R c #F8E695",
  142. "S c #F7E285",
  143. "T c #F6DE76",
  144. "U c #F5DB65",
  145. "V c #F4D757",
  146. "W c #F3D449",
  147. "X c #F2D13B",
  148. "Y c #F1CE30",
  149. "Z c #FBF2CC",
  150. "` c #DA9835",
  151. " . c #DA9435",
  152. ".. c #FEFAEF",
  153. "+. c #F9E9A1",
  154. "@. c #F8E591",
  155. "#. c #F7E181",
  156. "$. c #F6DE72",
  157. "%. c #F5DA63",
  158. "&. c #F4D754",
  159. "*. c #F3D347",
  160. "=. c #F2D039",
  161. "-. c #F1CD2E",
  162. ";. c #F0CB26",
  163. ">. c #FBF2CA",
  164. ",. c #D98E33",
  165. "'. c #FAF0DC",
  166. "). c #F4DDA7",
  167. "!. c #F4DB9E",
  168. "~. c #F3DA96",
  169. "{. c #F3D88E",
  170. "]. c #F3D786",
  171. "^. c #F2D47F",
  172. "/. c #F2D379",
  173. "(. c #F1D272",
  174. "_. c #F1D06C",
  175. ":. c #F1CF69",
  176. "<. c #F8EAC2",
  177. "[. c #D8882D",
  178. "}. c #D8872D",
  179. "|. c #D8862C",
  180. " ",
  181. " ",
  182. " ",
  183. " . + @ @ @ # $ ",
  184. " % & * = - * ; > , , , ' ) ",
  185. " ! ~ { ] ^ / ( _ : < ( [ } | ",
  186. " 1 2 3 4 5 6 7 8 9 0 a b c d ",
  187. " e f g h i j k : k l ( [ * m ",
  188. " n * o p q : r s t u v w x y ",
  189. " z A B C D E F G H I J K L M ",
  190. " N O P Q R S T U V W X Y Z ` ",
  191. " ...+.@.#.$.%.&.*.=.-.;.>. . ",
  192. " ,.'.).!.~.{.].^./.(._.:.<.,. ",
  193. " [.}.[.[.[.[.[.[.[.[.}.[.|. ",
  194. " ",
  195. " "};
  196. /* image for file and folder */
  197. static rtgui_image_t *file_image, *folder_image;
  198. static struct filelist_view *filelist_view = RT_NULL; /* only one view in global */
  199. static void _filelist_view_constructor(struct filelist_view *view)
  200. {
  201. /* default rect */
  202. struct rtgui_rect rect = {0, 0, 200, 200};
  203. /* set default widget rect and set event handler */
  204. rtgui_widget_set_event_handler(RTGUI_WIDGET(view),filelist_view_event_handler);
  205. rtgui_widget_set_rect(RTGUI_WIDGET(view), &rect);
  206. RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
  207. view->current_item = 0;
  208. view->items_count = 0;
  209. view->page_items = 0;
  210. view->current_directory = RT_NULL;
  211. view->pattern = RT_NULL;
  212. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = white;
  213. RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(view)) = RTGUI_ALIGN_CENTER_VERTICAL;
  214. file_image = rtgui_image_create_from_mem("xpm",
  215. (rt_uint8_t*)file_xpm, sizeof(file_xpm), RT_TRUE);
  216. folder_image = rtgui_image_create_from_mem("xpm",
  217. (rt_uint8_t*)folder_xpm, sizeof(folder_xpm), RT_TRUE);
  218. }
  219. rtgui_type_t *filelist_view_type_get(void)
  220. {
  221. static rtgui_type_t *filelist_view_type = RT_NULL;
  222. if (!filelist_view_type)
  223. {
  224. filelist_view_type = rtgui_type_create("flview", RTGUI_VIEW_TYPE,
  225. sizeof(filelist_view_t), RTGUI_CONSTRUCTOR(_filelist_view_constructor), RT_NULL);
  226. }
  227. return filelist_view_type;
  228. }
  229. void filelist_view_ondraw(struct filelist_view* view)
  230. {
  231. struct rtgui_rect rect, item_rect, image_rect;
  232. struct rtgui_dc* dc;
  233. rt_uint16_t page_index, index;
  234. struct file_item* item;
  235. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view));
  236. if (dc == RT_NULL) return;
  237. rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect);
  238. rtgui_dc_fill_rect(dc, &rect);
  239. /* get item base rect */
  240. item_rect = rect;
  241. item_rect.y1 += 1;
  242. item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height());
  243. /* get image base rect */
  244. image_rect.x1 = FILELIST_MARGIN; image_rect.y1 = 0;
  245. image_rect.x2 = FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h;
  246. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  247. /* get current page */
  248. page_index = (view->current_item / view->page_items) * view->page_items;
  249. for (index = 0; index < view->page_items; index ++)
  250. {
  251. if (page_index + index >= view->items_count) break;
  252. item = &(view->items[page_index + index]);
  253. if (page_index + index == view->current_item)
  254. {
  255. rtgui_theme_draw_selected(dc, &item_rect);
  256. }
  257. else
  258. {
  259. /* draw background */
  260. rtgui_dc_fill_rect(dc, &item_rect);
  261. }
  262. /* draw item */
  263. if (item->type == FITEM_FILE)
  264. rtgui_image_blit(file_image, dc, &image_rect);
  265. else
  266. rtgui_image_blit(folder_image, dc, &image_rect);
  267. /* draw text */
  268. item_rect.x1 += FILELIST_MARGIN + file_image->w + 2;
  269. rtgui_dc_draw_text(dc, item->name, &item_rect);
  270. item_rect.x1 -= FILELIST_MARGIN + file_image->w + 2;
  271. /* move to next item position */
  272. item_rect.y1 += (rtgui_theme_get_selected_height() + 1);
  273. item_rect.y2 += (rtgui_theme_get_selected_height() + 1);
  274. image_rect.y1 += (rtgui_theme_get_selected_height() + 1);
  275. image_rect.y2 += (rtgui_theme_get_selected_height() + 1);
  276. }
  277. rtgui_dc_end_drawing(dc);
  278. }
  279. void filelist_view_update_current(struct filelist_view* view, rt_uint16_t old_item)
  280. {
  281. struct rtgui_dc* dc;
  282. struct file_item* item;
  283. rtgui_rect_t rect, item_rect, image_rect;
  284. if (old_item/view->page_items != view->current_item/view->page_items)
  285. {
  286. /* it's not a same page, update all */
  287. rtgui_widget_update(RTGUI_WIDGET(view));
  288. return;
  289. }
  290. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view));
  291. if (dc == RT_NULL) return;
  292. rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect);
  293. /* get old item rect */
  294. item_rect = rect;
  295. item_rect.y1 += 1;
  296. item_rect.y1 += (old_item % view->page_items) * (1 + rtgui_theme_get_selected_height());
  297. item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height());
  298. /* get image rect */
  299. image_rect.x1 = FILELIST_MARGIN; image_rect.y1 = 0;
  300. image_rect.x2 = FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h;
  301. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  302. /* draw old item */
  303. rtgui_dc_fill_rect(dc, &item_rect);
  304. item = &(view->items[old_item]);
  305. if (item->type == FITEM_FILE) /* draw item image */
  306. rtgui_image_blit(file_image, dc, &image_rect);
  307. else
  308. rtgui_image_blit(folder_image, dc, &image_rect);
  309. item_rect.x1 += FILELIST_MARGIN + file_image->w + 2;
  310. rtgui_dc_draw_text(dc, item->name, &item_rect);
  311. /* draw current item */
  312. item_rect = rect;
  313. item_rect.y1 += 1;
  314. item_rect.y1 += (view->current_item % view->page_items) * (1 + rtgui_theme_get_selected_height());
  315. item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height());
  316. rtgui_theme_draw_selected(dc, &item_rect);
  317. /* get image base rect */
  318. image_rect.x1 = FILELIST_MARGIN; image_rect.y1 = 0;
  319. image_rect.x2 = FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h;
  320. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  321. item = &(view->items[view->current_item]);
  322. if (item->type == FITEM_FILE) /* draw item image */
  323. rtgui_image_blit(file_image, dc, &image_rect);
  324. else
  325. rtgui_image_blit(folder_image, dc, &image_rect);
  326. item_rect.x1 += FILELIST_MARGIN + file_image->w + 2;
  327. rtgui_dc_draw_text(dc, item->name, &item_rect);
  328. rtgui_dc_end_drawing(dc);
  329. }
  330. rt_bool_t filelist_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
  331. {
  332. struct filelist_view* view = RT_NULL;
  333. view = FILELIST_VIEW(widget);
  334. switch (event->type)
  335. {
  336. case RTGUI_EVENT_PAINT:
  337. filelist_view_ondraw(view);
  338. return RT_FALSE;
  339. case RTGUI_EVENT_RESIZE:
  340. {
  341. struct rtgui_event_resize* resize;
  342. resize = (struct rtgui_event_resize*)event;
  343. /* recalculate page items */
  344. if (file_image != RT_NULL)
  345. view->page_items = resize->h / (1 + rtgui_theme_get_selected_height());
  346. else
  347. view->page_items = resize->h / (2 + 14);
  348. }
  349. break;
  350. case RTGUI_EVENT_KBD:
  351. {
  352. struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
  353. if (ekbd->type == RTGUI_KEYDOWN)
  354. {
  355. rt_uint16_t old_item;
  356. old_item = view->current_item;
  357. switch (ekbd->key)
  358. {
  359. case RTGUIK_UP:
  360. if (view->current_item > 0)
  361. view->current_item --;
  362. filelist_view_update_current(view, old_item);
  363. return RT_FALSE;
  364. case RTGUIK_DOWN:
  365. if (view->current_item < view->items_count - 1)
  366. view->current_item ++;
  367. filelist_view_update_current(view, old_item);
  368. return RT_FALSE;
  369. case RTGUIK_LEFT:
  370. if (view->current_item - view->page_items >= 0)
  371. view->current_item -= view->page_items;
  372. filelist_view_update_current(view, old_item);
  373. return RT_FALSE;
  374. case RTGUIK_RIGHT:
  375. if (view->current_item + view->page_items < view->items_count - 1)
  376. view->current_item += view->page_items;
  377. filelist_view_update_current(view, old_item);
  378. return RT_FALSE;
  379. case RTGUIK_RETURN:
  380. if (view->items[view->current_item].type == FITEM_DIR)
  381. {
  382. char new_path[64];
  383. if (strcmp(view->items[view->current_item].name, ".") == 0) return RT_FALSE;
  384. if (strcmp(view->items[view->current_item].name, "..") == 0)
  385. {
  386. char *ptr;
  387. ptr = strrchr(view->current_directory, PATH_SEPARATOR);
  388. if (ptr == RT_NULL) return RT_FALSE;
  389. if (ptr == &(view->current_directory[0]))
  390. {
  391. /* it's root directory */
  392. new_path[0] = PATH_SEPARATOR;
  393. new_path[1] = '\0';
  394. }
  395. else
  396. {
  397. strncpy(new_path, view->current_directory, ptr - view->current_directory + 1);
  398. new_path[ptr - view->current_directory] = '\0';
  399. }
  400. }
  401. else if (view->current_item == 0 &&
  402. (view->current_directory[0] == '/') && (view->current_directory[1] == '\0'))
  403. {
  404. if (RTGUI_VIEW(view)->modal_show == RT_TRUE)
  405. {
  406. rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_CANCEL);
  407. }
  408. else
  409. {
  410. filelist_view_destroy(view);
  411. }
  412. return RT_FALSE;
  413. }
  414. else
  415. {
  416. if (view->current_directory[strlen(view->current_directory) - 1] != PATH_SEPARATOR)
  417. sprintf(new_path, "%s%c%s",view->current_directory, PATH_SEPARATOR,
  418. view->items[view->current_item].name);
  419. else
  420. sprintf(new_path, "%s%s",view->current_directory,
  421. view->items[view->current_item].name);
  422. }
  423. filelist_view_set_directory(view, new_path);
  424. }
  425. else
  426. {
  427. if (RTGUI_VIEW(view)->modal_show == RT_TRUE)
  428. {
  429. rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_OK);
  430. }
  431. }
  432. return RT_FALSE;
  433. default:
  434. break;
  435. }
  436. }
  437. }
  438. return RT_FALSE;
  439. }
  440. /* use view event handler */
  441. return rtgui_view_event_handler(widget, event);
  442. }
  443. filelist_view_t* filelist_view_create(rtgui_workbench_t* workbench, const char* directory, const char* pattern, const rtgui_rect_t* rect)
  444. {
  445. struct filelist_view* view = RT_NULL;
  446. if (filelist_view != RT_NULL)
  447. {
  448. rtgui_view_show(RTGUI_VIEW(filelist_view), RT_FALSE);
  449. }
  450. else
  451. {
  452. /* create a new view */
  453. view = (struct filelist_view*) rtgui_widget_create(FILELIST_VIEW_TYPE);
  454. if (view != RT_NULL)
  455. {
  456. view->items = RT_NULL;
  457. view->pattern = rt_strdup(pattern);
  458. view->page_items = rtgui_rect_height(*rect) / (1 + rtgui_theme_get_selected_height());
  459. filelist_view_set_directory(view, directory);
  460. rtgui_workbench_add_view(workbench, RTGUI_VIEW(view));
  461. }
  462. filelist_view = view;
  463. }
  464. return view;
  465. }
  466. void filelist_view_destroy(filelist_view_t* view)
  467. {
  468. /* delete all file items */
  469. filelist_view_clear(view);
  470. /* delete current directory and pattern */
  471. rtgui_free(view->current_directory); view->current_directory = RT_NULL;
  472. rtgui_free(view->pattern); view->pattern = RT_NULL;
  473. /* delete image */
  474. rtgui_image_destroy(file_image);
  475. rtgui_image_destroy(folder_image);
  476. filelist_view = RT_NULL;
  477. /* destroy view */
  478. rtgui_widget_destroy(RTGUI_WIDGET(view));
  479. }
  480. /* clear all file items */
  481. void filelist_view_clear(filelist_view_t* view)
  482. {
  483. rt_uint32_t index;
  484. struct file_item* item;
  485. for (index = 0; index < view->items_count; index ++)
  486. {
  487. item = &(view->items[index]);
  488. /* release item name */
  489. rt_free(item->name);
  490. item->name = RT_NULL;
  491. }
  492. /* release items */
  493. rtgui_free(view->items);
  494. view->items = RT_NULL;
  495. view->items_count = 0;
  496. view->current_item = 0;
  497. }
  498. void filelist_view_set_directory(filelist_view_t* view, const char* directory)
  499. {
  500. rt_uint8_t fullpath[256];
  501. struct file_item *item;
  502. RT_ASSERT(view != RT_NULL);
  503. /* clear file items firstly */
  504. filelist_view_clear(view);
  505. if (directory != RT_NULL)
  506. {
  507. DIR* dir;
  508. struct stat s;
  509. rt_uint32_t index;
  510. struct dirent* dirent;
  511. view->items_count = 0;
  512. dir = opendir(directory);
  513. if (dir == RT_NULL) goto __return;
  514. /* current directory exists, set it */
  515. if (view->current_directory != RT_NULL) rt_free(view->current_directory);
  516. view->current_directory = rt_strdup(directory);
  517. do
  518. {
  519. dirent = readdir(dir);
  520. if (dirent == RT_NULL) break;
  521. if (strcmp(dirent->d_name, ".") == 0) continue;
  522. if (strcmp(dirent->d_name, "..") == 0) continue;
  523. view->items_count ++;
  524. } while (dirent != RT_NULL);
  525. closedir(dir);
  526. view->items_count ++; /* root directory for [x] exit, others for .. */
  527. view->items = (struct file_item*) rtgui_malloc(sizeof(struct file_item) * view->items_count);
  528. if (view->items == RT_NULL) return; /* no memory */
  529. index = 0;
  530. if (directory[0] == '/' && directory[1] != '\0')
  531. {
  532. item = &(view->items[0]);
  533. /* add .. directory */
  534. item->name = rt_strdup("..");
  535. item->type = FITEM_DIR;
  536. item->size = 0;
  537. index ++;
  538. }
  539. else
  540. {
  541. item = &(view->items[0]);
  542. /* add .. directory */
  543. item->name = rt_strdup("Í˳öÎļþä¯ÀÀ");
  544. item->type = FITEM_DIR;
  545. item->size = 0;
  546. index ++;
  547. }
  548. /* reopen directory */
  549. dir = opendir(directory);
  550. for (; index < view->items_count; index ++)
  551. {
  552. dirent = readdir(dir);
  553. if (dirent == RT_NULL) break;
  554. item = &(view->items[index]);
  555. item->name = rt_strdup(dirent->d_name);
  556. rt_memset(&s, 0, sizeof(struct stat));
  557. /* build full path for the file */
  558. if (directory[strlen(directory) - 1] != PATH_SEPARATOR)
  559. sprintf(fullpath, "%s%c%s", directory, PATH_SEPARATOR, dirent->d_name);
  560. else
  561. sprintf(fullpath, "%s%s", directory, dirent->d_name);
  562. stat(fullpath, &s);
  563. if ( s.st_mode & S_IFDIR )
  564. {
  565. item->type = FITEM_DIR;
  566. item->size = 0;
  567. }
  568. else
  569. {
  570. item->type = FITEM_FILE;
  571. item->size = s.st_size;
  572. }
  573. }
  574. closedir(dir);
  575. }
  576. view->current_item = 0;
  577. __return:
  578. /* update view */
  579. rtgui_widget_update(RTGUI_WIDGET(view));
  580. }