patch from zub in #e to fix example building
[framework/uifw/elementary.git] / src / examples / genlist_example_05.c
1 //Compile with:
2 //gcc -g `pkg-config --cflags --libs elementary` genlist_example_04.c -o genlist_example_04
3
4 #include <Elementary.h>
5 #ifdef HAVE_CONFIG_H
6 # include "elementary_config.h"
7 #else
8 # define __UNUSED__
9 #endif
10
11 #define N_ITEMS 6
12
13 typedef struct _Node_Data {
14      Eina_List *children;
15      int value;
16      int level;
17      Eina_Bool favorite;
18 } Node_Data;
19
20 static Elm_Genlist_Item_Class _itc;
21 static Elm_Genlist_Item_Class _itp;
22 static Elm_Genlist_Item_Class _itfav;
23 static int nitems = 0;
24
25 static char *
26 _item_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
27 {
28    char buf[256];
29    Node_Data *d = data;
30
31    if (!strcmp(part, "elm.text"))
32      snprintf(buf, sizeof(buf), "Item # %i (level %i)", d->value, d->level);
33
34    return strdup(buf);
35 }
36
37 static Evas_Object *
38 _item_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
39 {
40    Evas_Object *ic = elm_icon_add(obj);
41
42    if (!strcmp(part, "elm.swallow.icon"))
43      elm_icon_standard_set(ic, "file");
44
45    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
46    return ic;
47 }
48
49 static void
50 _item_sel_cb(void *data, Evas_Object *obj, void *event_info)
51 {
52    printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n",
53           data, obj, event_info);
54 }
55
56 static char *
57 _parent_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
58 {
59    char buf[256];
60    Node_Data *d = data;
61
62    snprintf(buf, sizeof(buf), "Group %d (%d items)", d->value / 7,
63             eina_list_count(d->children));
64
65    return strdup(buf);
66 }
67
68 static Evas_Object *
69 _parent_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part __UNUSED__)
70 {
71    Evas_Object *ic = elm_icon_add(obj);
72
73    if (!strcmp(part, "elm.swallow.icon"))
74      elm_icon_standard_set(ic, "folder");
75
76    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
77    return ic;
78 }
79
80 static char *
81 _favorite_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
82 {
83    char buf[256];
84    Node_Data *d = data;
85
86    if (!strcmp(part, "elm.text"))
87      snprintf(buf, sizeof(buf), "Favorite # %i", d->value);
88
89    return strdup(buf);
90 }
91
92 static Evas_Object *
93 _favorite_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
94 {
95    Evas_Object *ic = elm_icon_add(obj);
96
97    if (!strcmp(part, "elm.swallow.icon"))
98      elm_icon_standard_set(ic, "apps");
99
100    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
101    return ic;
102 }
103
104 static void
105 _append_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
106 {
107    Evas_Object *list = data;
108    Elm_Genlist_Item *it, *parent = NULL;
109    Node_Data *pdata, *d = malloc(sizeof(*d));
110
111    d->children = NULL;
112    d->value = nitems++;
113    d->favorite = EINA_FALSE;
114
115    it = elm_genlist_selected_item_get(list);
116    if (it)
117      parent = elm_genlist_item_parent_get(it);
118
119    if (parent)
120      {
121         d->level = elm_genlist_item_expanded_depth_get(parent) + 1;
122         pdata = elm_genlist_item_data_get(parent);
123         pdata->children = eina_list_append(pdata->children, d);
124      }
125    else
126      d->level = 0;
127
128    elm_genlist_item_append(list, &_itc,
129                            d, parent,
130                            ELM_GENLIST_ITEM_NONE,
131                            _item_sel_cb, NULL);
132
133 }
134
135 static void
136 _favorite_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
137 {
138    Evas_Object *list = data;
139    Elm_Genlist_Item *it = elm_genlist_selected_item_get(list);
140
141    if (!it)
142      return;
143
144    Node_Data *d = elm_genlist_item_data_get(it);
145    d->favorite = !d->favorite;
146    if (d->favorite)
147      elm_genlist_item_item_class_update(it, &_itfav);
148    else
149      {
150         if (d->children)
151           elm_genlist_item_item_class_update(it, &_itp);
152         else
153           elm_genlist_item_item_class_update(it, &_itc);
154      }
155
156    elm_genlist_item_update(it);
157 }
158
159 static void
160 _add_child_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
161 {
162    Evas_Object *list = data;
163    Elm_Genlist_Item *it = elm_genlist_selected_item_get(list);
164    Elm_Genlist_Item *prev, *parent;
165
166    if (!it)
167      return;
168
169    Node_Data *d = elm_genlist_item_data_get(it);
170    prev = elm_genlist_item_prev_get(it);
171    parent = elm_genlist_item_parent_get(it);
172
173    Eina_Bool change_item = !d->children;
174
175    // creating new item data
176    Node_Data *ndata = malloc(sizeof(*ndata));
177    ndata->value = nitems++;
178    ndata->children = NULL;
179    ndata->favorite = EINA_FALSE;
180    ndata->level = elm_genlist_item_expanded_depth_get(it) + 1;
181    d->children = eina_list_append(d->children, ndata);
182
183    // Changing leaf item to parent item
184    if (change_item)
185      {
186         elm_genlist_item_del(it);
187
188         if (prev != parent)
189           it = elm_genlist_item_insert_after(list, &_itp, d, parent, prev,
190                                              ELM_GENLIST_ITEM_SUBITEMS,
191                                              _item_sel_cb, NULL);
192         else
193           it = elm_genlist_item_prepend(list, &_itp, d, parent,
194                                         ELM_GENLIST_ITEM_SUBITEMS,
195                                         _item_sel_cb, NULL);
196         elm_genlist_item_expanded_set(it, EINA_FALSE);
197         elm_genlist_item_selected_set(it, EINA_TRUE);
198      }
199    else if (elm_genlist_item_expanded_get(it))
200      {
201         elm_genlist_item_append(list, &_itc, ndata, it,
202                                 ELM_GENLIST_ITEM_NONE, _item_sel_cb, NULL);
203      }
204
205    elm_genlist_item_update(it);
206
207 }
208
209 static void
210 _clear_list(Node_Data *d)
211 {
212    Node_Data *tmp;
213
214    EINA_LIST_FREE(d->children, tmp)
215       _clear_list(tmp);
216    free(d);
217 }
218
219 static void
220 _del_item_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
221 {
222    Evas_Object *list = data;
223    Elm_Genlist_Item *it = elm_genlist_selected_item_get(list);
224    Elm_Genlist_Item *parent = NULL;
225
226    if (!it)
227      return;
228
229    Node_Data *pdata, *d = elm_genlist_item_data_get(it);
230    parent = elm_genlist_item_parent_get(it);
231    elm_genlist_item_subitems_clear(it);
232    elm_genlist_item_del(it);
233
234    _clear_list(d);
235
236    if (!parent)
237      return;
238
239    pdata = elm_genlist_item_data_get(parent);
240    pdata->children = eina_list_remove(pdata->children, d);
241    elm_genlist_item_update(parent);
242 }
243
244 static void
245 _expand_request_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
246 {
247    Elm_Genlist_Item *it = event_info;
248    printf("expand request on item: %p\n", event_info);
249    elm_genlist_item_expanded_set(it, EINA_TRUE);
250 }
251
252 static void
253 _contract_request_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
254 {
255    Elm_Genlist_Item *it = event_info;
256    printf("contract request on item: %p\n", event_info);
257    elm_genlist_item_expanded_set(it, EINA_FALSE);
258 }
259
260 static void
261 _expanded_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
262 {
263    Eina_List *l;
264    Elm_Genlist_Item *it = event_info;
265    Node_Data *it_data, *d = elm_genlist_item_data_get(it);
266    Evas_Object *list = elm_genlist_item_genlist_get(it);
267
268    Elm_Genlist_Item_Class *ic;
269
270    EINA_LIST_FOREACH(d->children, l, it_data)
271      {
272         Elm_Genlist_Item *nitem;
273         Elm_Genlist_Item_Flags flags = ELM_GENLIST_ITEM_NONE;
274         printf("expanding item: #%d from parent #%d\n", it_data->value, d->value);
275         if (it_data->favorite)
276           ic = &_itfav;
277         else if (it_data->children)
278           {
279              ic = &_itp;
280              flags = ELM_GENLIST_ITEM_SUBITEMS;
281           }
282         else
283           ic = &_itc;
284
285         nitem = elm_genlist_item_append(list, ic, it_data, it,
286                                         flags, _item_sel_cb, NULL);
287         elm_genlist_item_expanded_set(nitem, EINA_FALSE);
288      }
289 }
290
291 static void
292 _contracted_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
293 {
294    Elm_Genlist_Item *it = event_info;
295    elm_genlist_item_subitems_clear(it);
296 }
297
298 static Evas_Object *
299 _button_add(Evas_Object *list, Evas_Object *box, const char *label, Evas_Smart_Cb cb)
300 {
301    Evas_Object *bt;
302
303    bt = elm_button_add(elm_object_parent_widget_get(list));
304    elm_object_text_set(bt, label);
305    elm_box_pack_end(box, bt);
306    evas_object_show(bt);
307
308    if (cb)
309      evas_object_smart_callback_add(bt, "clicked", cb, list);
310
311    return bt;
312 }
313
314 int
315 elm_main(int argc __UNUSED__, char **argv __UNUSED__)
316 {
317    Evas_Object *win, *bg, *box, *fbox;
318    Evas_Object *list;
319    int i;
320
321    win = elm_win_add(NULL, "icon", ELM_WIN_BASIC);
322    elm_win_title_set(win, "Icon");
323    elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
324    elm_win_autodel_set(win, EINA_TRUE);
325
326    bg = elm_bg_add(win);
327    elm_bg_color_set(bg, 255,255 ,255);
328    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
329    elm_win_resize_object_add(win, bg);
330    evas_object_show(bg);
331
332    box = elm_box_add(win);
333    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
334    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
335    elm_win_resize_object_add(win, box);
336    evas_object_show(box);
337
338    _itc.item_style = "default";
339    _itc.func.label_get = _item_label_get;
340    _itc.func.content_get = _item_content_get;
341    _itc.func.state_get = NULL;
342    _itc.func.del = NULL;
343
344    _itp.item_style = "default";
345    _itp.func.label_get = _parent_label_get;
346    _itp.func.content_get = _parent_content_get;
347    _itp.func.state_get = NULL;
348    _itp.func.del = NULL;
349
350    _itfav.item_style = "default";
351    _itfav.func.label_get = _favorite_label_get;
352    _itfav.func.content_get = _favorite_content_get;
353    _itfav.func.state_get = NULL;
354    _itfav.func.del = NULL;
355
356    list = elm_genlist_add(win);
357
358    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
359    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
360    elm_box_pack_end(box, list);
361    evas_object_show(list);
362
363    fbox = elm_box_add(win);
364    elm_box_layout_set(fbox, evas_object_box_layout_flow_horizontal,
365                       NULL, NULL);
366    evas_object_size_hint_weight_set(fbox, EVAS_HINT_EXPAND, 0);
367    evas_object_size_hint_align_set(fbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
368    elm_box_pack_end(box, fbox);
369    evas_object_show(fbox);
370
371    _button_add(list, fbox, "append item", _append_cb);
372    _button_add(list, fbox, "favorite", _favorite_cb);
373    _button_add(list, fbox, "add child", _add_child_cb);
374    _button_add(list, fbox, "del item", _del_item_cb);
375
376    for (i = 0; i < N_ITEMS; i++)
377      {
378         Elm_Genlist_Item *gli, *glg;
379         Node_Data *data = malloc(sizeof(*data)); // data for this item
380         data->children = NULL;
381         data->value = i;
382         data->favorite = EINA_FALSE;
383         nitems++;
384
385         Node_Data *pdata; // data for the parent of the group
386
387         printf("creating item: #%d\n", data->value);
388         if (i % 3 == 0)
389           {
390              glg = gli = elm_genlist_item_append(list, &_itp, data, NULL,
391                                                  ELM_GENLIST_ITEM_SUBITEMS,
392                                                  _item_sel_cb, NULL);
393              elm_genlist_item_expanded_set(glg, EINA_TRUE);
394              pdata = data;
395              data->level = 0;
396           }
397         else
398           {
399              gli = elm_genlist_item_append(list, &_itc, data, glg,
400                                            ELM_GENLIST_ITEM_NONE,
401                                            _item_sel_cb, NULL);
402              pdata->children = eina_list_append(pdata->children, data);
403              data->level = 1;
404           }
405      }
406
407    evas_object_smart_callback_add(list, "expand,request", _expand_request_cb, list);
408    evas_object_smart_callback_add(list, "contract,request", _contract_request_cb, list);
409    evas_object_smart_callback_add(list, "expanded", _expanded_cb, list);
410    evas_object_smart_callback_add(list, "contracted", _contracted_cb, list);
411
412    evas_object_size_hint_min_set(bg, 160, 160);
413    evas_object_size_hint_max_set(bg, 640, 800);
414    evas_object_resize(win, 420, 600);
415    evas_object_show(win);
416
417    elm_run();
418
419    return 0;
420 }
421
422 ELM_MAIN()