filelist.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include <rtgui/rtgui_object.h>
  2. #include <rtgui/rtgui_system.h>
  3. #include <rtgui/list.h>
  4. #include <rtgui/widgets/view.h>
  5. /* image for file and folder */
  6. rtgui_image_t *file_image, *folder_image;
  7. static void _filelist_view_constructor(filelist_view *view)
  8. {
  9. /* default rect */
  10. struct rtgui_rect rect = {0, 0, 200, 200};
  11. /* set default widget rect and set event handler */
  12. rtgui_widget_set_event_handler(RTGUI_WIDGET(view),filelist_view_event_handler);
  13. rtgui_widget_set_rect(RTGUI_WIDGET(view), &rect);
  14. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(list)) = RTGUI_RGB(212, 208, 200);
  15. view->count = 0;
  16. view->current_directory = RT_NULL;
  17. view->pattern = RT_NULL;
  18. rtgui_list_init(&view->list);
  19. }
  20. rtgui_type_t *filelist_view_type_get(void)
  21. {
  22. static rtgui_type_t *filelist_view_type = RT_NULL;
  23. if (!filelist_view_type)
  24. {
  25. filelist_view_type = rtgui_type_create("flview", RTGUI_VIEW_TYPE,
  26. sizeof(filelist_view_t), RTGUI_CONSTRUCTOR(_filelist_view_constructor), RT_NULL);
  27. }
  28. return filelist_view_type;
  29. }
  30. rt_bool_t filelist_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
  31. {
  32. struct filelist_view* view = RT_NULL;
  33. view = FILELIST_VIEW(widget);
  34. switch (event.type)
  35. {
  36. case RTGUI_EVENT_PAINT:
  37. break;
  38. case RTGUI_EVENT_RESIZE:
  39. {
  40. /* recalculate page items */
  41. }
  42. break;
  43. case RTGUI_EVENT_KBD:
  44. {
  45. struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
  46. if (ekbd->type == RTGUI_KEYDOWN)
  47. {
  48. switch (ekbd->key)
  49. {
  50. case RTGUIK_UP:
  51. break;
  52. case RTGUIK_DOWN:
  53. break;
  54. default:
  55. break;
  56. }
  57. }
  58. }
  59. break;
  60. }
  61. /* use view event handler */
  62. return rtgui_view_event_handler(widget, event);
  63. }
  64. filelist_view_t* filelist_view_create(const char* directory, const char* pattern)
  65. {
  66. struct filelist_view* view = RT_NULL;
  67. view = (struct filelist_view*) rtgui_widget_create(FILELIST_VIEW_TYPE);
  68. if (view != RT_NULL)
  69. {
  70. view->pattern = rt_strdup(pattern);
  71. filelist_view_set_directory(view, directory);
  72. }
  73. return list;
  74. }
  75. void filelist_view_destroy(filelist_view_t* view)
  76. {
  77. /* delete all file items */
  78. filelist_view_clear(view);
  79. /* destroy view */
  80. rtgui_widget_destroy(RTGUI_WIDGET(view));
  81. }
  82. /* clear all file items */
  83. void filelist_view_clear(filelist_view_t* view)
  84. {
  85. struct rtgui_list_node* node;
  86. struct file_item* item;
  87. while (view->list.next != RT_NULL)
  88. {
  89. node = view->list.next;
  90. rtgui_list_remove(&view->list, node);
  91. item = rtgui_list_entry(node, struct file_item, list);
  92. rtgui_free(item->name);
  93. rtgui_free(item);
  94. }
  95. }
  96. void filelist_view_set_directory(filelist_view_t* view, const char* directory)
  97. {
  98. rt_uint8_t fullpath[256];
  99. struct file_item *item;
  100. RT_ASSERT(view != RT_NULL);
  101. /* clear file items firstly */
  102. filelist_view_clear(view);
  103. if (directory != RT_NULL)
  104. {
  105. DIR* dir;
  106. dir = opendir(directory);
  107. if (dir != RT_NULL)
  108. {
  109. struct dfs_dirent* dirent;
  110. struct dfs_stat s;
  111. do
  112. {
  113. dirent = readdir(dir);
  114. if (dirent == RT_NULL) break;
  115. if (fnmatch(dirent->d_name, view->pattern, FNM_FILE_NAME) != 0) continue;
  116. item = (struct file_item*) rt_malloc (sizeof(struct file_item));
  117. if (item == RT_NULL) break;
  118. rt_memset(&s, 0, sizeof(struct dfs_stat));
  119. /* build full path for the file */
  120. rt_sprintf(fullpath, "%s/%s", directory, dirent->d_name);
  121. item->name = strdup(direct->d_name);
  122. rtgui_list_init(&item->list);
  123. stat(fullpath, &s);
  124. if ( s.st_mode & DFS_S_IFDIR )
  125. {
  126. item->type = FITEM_DIR;
  127. item->size = 0;
  128. }
  129. else
  130. {
  131. item->type = FITEM_FILE;
  132. item->size = s.st_size;
  133. }
  134. rtgui_list_append(&view->list, &item->list);
  135. view->count ++;
  136. } while (dirent != RT_NULL);
  137. closedir(dir);
  138. }
  139. }
  140. if (view->count > 0)
  141. {
  142. /* select first one */
  143. view->selected = rtgui_list_entry(view->list.next,
  144. struct file_item, list);
  145. }
  146. else view->selected = RT_NULL;
  147. /* update view */
  148. rtgui_widget_update(RTGUI_WIDGET(view));
  149. }