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