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