1 #ifndef ELM_WIDGET_FILESELECTOR_H 2 #define ELM_WIDGET_FILESELECTOR_H 3 4 #include "Elementary.h" 5 6 /* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR 7 * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT 8 * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK 9 * IT AT RUNTIME. 10 */ 11 12 /** 13 * @addtogroup Widget 14 * @{ 15 * 16 * @section elm-fileselector-class The Elementary Fileselector Class 17 * 18 * Elementary, besides having the @ref Fileselector widget, exposes its 19 * foundation -- the Elementary Fileselector Class -- in order to create other 20 * widgets which are a fileselector with some more logic on top. 21 */ 22 23 typedef struct _Elm_Fileselector_Filter Elm_Fileselector_Filter; 24 typedef struct _Listing_Request Listing_Request; 25 typedef struct _Elm_Fileselector_Item_Data Elm_Fileselector_Item_Data; 26 27 /** 28 * Base layout smart data extended with fileselector instance data. 29 */ 30 typedef struct _Elm_Fileselector_Data Elm_Fileselector_Data; 31 struct _Elm_Fileselector_Data 32 { 33 Evas_Object *obj; 34 Evas_Object *path_entry; 35 Evas_Object *name_entry; 36 Evas_Object *search_entry; 37 Evas_Object *files_view; 38 Evas_Object *up_button; 39 Evas_Object *home_button; 40 Evas_Object *spinner; 41 Evas_Object *filter_hoversel; 42 Evas_Object *ok_button; 43 Evas_Object *cancel_button; 44 45 Eina_List *files_item_data; 46 47 Eina_List *filter_list; 48 Elm_Fileselector_Filter *current_filter; 49 50 /* a list of selected paths. only for multi selection */ 51 Eina_List *multi_selection; 52 Eina_List *multi_selection_tmp; 53 54 const char *path; 55 Efl_Model *model; 56 Efl_Model *prev_model; 57 Eina_List *children; 58 Ecore_Idler *path_entry_idler; 59 60 Efl_Model *target; 61 62 const char *path_separator; 63 const char *search_string; 64 65 Listing_Request *current_populate_lreq; 66 67 Evas_Coord_Size thumbnail_size; 68 69 /* a sort method to decide orders of files/directories */ 70 int (*sort_method)(const Elm_Fileselector_Item_Data *, const Elm_Fileselector_Item_Data *); 71 72 Elm_Fileselector_Mode mode; 73 Elm_Fileselector_Sort sort_type; 74 75 Eina_Bool only_folder : 1; 76 Eina_Bool expand : 1; 77 Eina_Bool double_tap_navigation : 1; 78 Eina_Bool multi : 1; 79 Eina_Bool monitoring : 1; 80 81 /* this flag is only for multi selection. 82 * If this flag is set to @c EINA_TRUE, it means directory is selected 83 * so that fileselector will clear current selection when user clicked 84 * another item. */ 85 Eina_Bool dir_selected : 1; 86 87 Eina_Bool hidden_visible : 1; 88 Eina_Bool target_ready : 1; 89 }; 90 91 struct sel_data 92 { 93 Evas_Object *fs; 94 Efl_Model *model; 95 Efl_Model *selected; 96 }; 97 98 struct _Listing_Request 99 { 100 Elm_Fileselector_Data *sd; 101 Elm_Object_Item *parent_it; 102 103 Evas_Object *obj; 104 Efl_Model *model; 105 Efl_Model *selected; 106 Eina_Stringshare *path; 107 Eina_Stringshare *selected_path; 108 int item_total; 109 int item_processed_count; 110 111 Eina_Bool first : 1; 112 Eina_Bool valid : 1; 113 }; 114 115 struct _Elm_Fileselector_Item_Data 116 { 117 void *user_data; 118 Efl_Model *model; 119 Eina_Stringshare *path; 120 Eina_Stringshare *filename; 121 Eina_Stringshare *mime_type; 122 Efl_Model *parent_model; 123 const char *parent_path; 124 125 int64_t size; 126 double mtime; 127 128 Eina_Bool is_dir : 1; 129 }; 130 131 typedef enum { 132 ELM_DIRECTORY = 0, 133 ELM_FILE_IMAGE = 1, 134 ELM_FILE_UNKNOW = 2, 135 ELM_FILE_LAST 136 } Elm_Fileselector_Type; 137 138 typedef enum { 139 ELM_FILESELECTOR_MIME_FILTER = 0, 140 ELM_FILESELECTOR_CUSTOM_FILTER, 141 ELM_FILESELECTOR_FILTER_LAST 142 } Elm_Fileselector_Filter_Type; 143 144 typedef struct _Elm_Fileselector_Custom_Filter Elm_Fileselector_Custom_Filter; 145 struct _Elm_Fileselector_Custom_Filter 146 { 147 Elm_Fileselector_Filter_Func func; 148 void *data; 149 }; 150 151 struct _Elm_Fileselector_Filter 152 { 153 const char *filter_name; 154 Elm_Fileselector_Data *sd; 155 156 union { 157 char **mime_types; 158 Elm_Fileselector_Custom_Filter *custom; 159 } filter; 160 161 Elm_Fileselector_Filter_Type filter_type; 162 }; 163 164 /** 165 * @} 166 */ 167 168 #define ELM_FILESELECTOR_DATA_GET(o, sd) \ 169 Elm_Fileselector_Data * sd = efl_data_scope_get(o, ELM_FILESELECTOR_CLASS) 170 171 #define ELM_FILESELECTOR_DATA_GET_OR_RETURN(o, ptr) \ 172 ELM_FILESELECTOR_DATA_GET(o, ptr); \ 173 if (EINA_UNLIKELY(!ptr)) \ 174 { \ 175 ERR("No widget data for object %p (%s)", \ 176 o, evas_object_type_get(o)); \ 177 return; \ 178 } 179 180 #define ELM_FILESELECTOR_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ 181 ELM_FILESELECTOR_DATA_GET(o, ptr); \ 182 if (EINA_UNLIKELY(!ptr)) \ 183 { \ 184 ERR("No widget data for object %p (%s)", \ 185 o, evas_object_type_get(o)); \ 186 return val; \ 187 } 188 189 #define ELM_FILESELECTOR_CHECK(obj) \ 190 if (EINA_UNLIKELY(!efl_isa((obj), ELM_FILESELECTOR_CLASS))) \ 191 return 192 193 #endif 194