2 //gcc -g `pkg-config --cflags --libs elementary` genlist_example_04.c -o genlist_example_04
4 #include <Elementary.h>
6 # include "elementary_config.h"
13 typedef struct _Node_Data {
21 static Elm_Genlist_Item_Class _itc;
22 static Elm_Genlist_Item_Class _itp;
23 static Elm_Genlist_Item_Class _itfav;
24 static int nitems = 0;
27 _item_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
29 static Elm_Genlist_Item_Class *_itc = NULL;
30 static Elm_Genlist_Item_Class *_itp = NULL;
31 static Elm_Genlist_Item_Class *_itfav = NULL;
32 static int nitems = 0;
35 _item_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
36 >>>>>>> remotes/origin/upstream
41 if (!strcmp(part, "elm.text"))
42 snprintf(buf, sizeof(buf), "Item # %i (level %i)", d->value, d->level);
48 _item_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
50 Evas_Object *ic = elm_icon_add(obj);
52 if (!strcmp(part, "elm.swallow.icon"))
53 elm_icon_standard_set(ic, "file");
55 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
60 _item_sel_cb(void *data, Evas_Object *obj, void *event_info)
62 printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n",
63 data, obj, event_info);
68 _parent_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
70 _parent_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
71 >>>>>>> remotes/origin/upstream
76 snprintf(buf, sizeof(buf), "Group %d (%d items)", d->value / 7,
77 eina_list_count(d->children));
83 _parent_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part __UNUSED__)
85 Evas_Object *ic = elm_icon_add(obj);
87 if (!strcmp(part, "elm.swallow.icon"))
88 elm_icon_standard_set(ic, "folder");
90 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
96 _favorite_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
98 _favorite_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
99 >>>>>>> remotes/origin/upstream
104 if (!strcmp(part, "elm.text"))
105 snprintf(buf, sizeof(buf), "Favorite # %i", d->value);
111 _favorite_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
113 Evas_Object *ic = elm_icon_add(obj);
115 if (!strcmp(part, "elm.swallow.icon"))
116 elm_icon_standard_set(ic, "apps");
118 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
123 _append_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
125 Evas_Object *list = data;
127 Elm_Object_Item *it, *parent = NULL;
129 Elm_Object_Item *glit, *parent = NULL;
130 >>>>>>> remotes/origin/upstream
131 Node_Data *pdata, *d = malloc(sizeof(*d));
135 d->favorite = EINA_FALSE;
138 it = elm_genlist_selected_item_get(list);
140 parent = elm_genlist_item_parent_get(it);
144 d->level = elm_genlist_item_expanded_depth_get(parent) + 1;
145 pdata = elm_genlist_item_data_get(parent);
146 pdata->children = eina_list_append(pdata->children, d);
148 glit = elm_genlist_selected_item_get(list);
150 parent = elm_genlist_item_parent_get(glit);
154 d->level = elm_genlist_item_expanded_depth_get(parent) + 1;
155 pdata = elm_object_item_data_get(parent);
156 pdata->children = eina_list_append(pdata->children, d);
157 >>>>>>> remotes/origin/upstream
163 elm_genlist_item_append(list, &_itc,
165 ELM_GENLIST_ITEM_NONE,
168 elm_genlist_item_append(list, _itc,
170 ELM_GENLIST_ITEM_NONE,
172 >>>>>>> remotes/origin/upstream
176 _favorite_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
178 Evas_Object *list = data;
180 Elm_Object_Item *it = elm_genlist_selected_item_get(list);
185 Node_Data *d = elm_genlist_item_data_get(it);
186 d->favorite = !d->favorite;
188 elm_genlist_item_item_class_update(it, &_itfav);
192 elm_genlist_item_item_class_update(it, &_itp);
194 elm_genlist_item_item_class_update(it, &_itc);
197 elm_genlist_item_update(it);
199 Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
203 Node_Data *d = elm_object_item_data_get(glit);
204 d->favorite = !d->favorite;
206 elm_genlist_item_item_class_update(glit, _itfav);
210 elm_genlist_item_item_class_update(glit, _itp);
212 elm_genlist_item_item_class_update(glit, _itc);
215 elm_genlist_item_update(glit);
216 >>>>>>> remotes/origin/upstream
220 _add_child_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
222 Evas_Object *list = data;
224 Elm_Object_Item *it = elm_genlist_selected_item_get(list);
225 Elm_Object_Item *prev, *parent;
230 Node_Data *d = elm_genlist_item_data_get(it);
231 prev = elm_genlist_item_prev_get(it);
232 parent = elm_genlist_item_parent_get(it);
234 Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
235 Elm_Object_Item *glit_prev, *glit_parent;
239 Node_Data *d = elm_object_item_data_get(glit);
240 glit_prev = elm_genlist_item_prev_get(glit);
241 glit_parent = elm_genlist_item_parent_get(glit);
242 >>>>>>> remotes/origin/upstream
244 Eina_Bool change_item = !d->children;
246 // creating new item data
247 Node_Data *ndata = malloc(sizeof(*ndata));
248 ndata->value = nitems++;
249 ndata->children = NULL;
250 ndata->favorite = EINA_FALSE;
252 ndata->level = elm_genlist_item_expanded_depth_get(it) + 1;
254 ndata->level = elm_genlist_item_expanded_depth_get(glit) + 1;
255 >>>>>>> remotes/origin/upstream
256 d->children = eina_list_append(d->children, ndata);
258 // Changing leaf item to parent item
262 elm_genlist_item_del(it);
265 it = elm_genlist_item_insert_after(list, &_itp, d, parent, prev,
266 ELM_GENLIST_ITEM_SUBITEMS,
269 it = elm_genlist_item_prepend(list, &_itp, d, parent,
270 ELM_GENLIST_ITEM_SUBITEMS,
272 elm_genlist_item_expanded_set(it, EINA_FALSE);
273 elm_genlist_item_selected_set(it, EINA_TRUE);
275 else if (elm_genlist_item_expanded_get(it))
277 elm_genlist_item_append(list, &_itc, ndata, it,
278 ELM_GENLIST_ITEM_NONE, _item_sel_cb, NULL);
281 elm_genlist_item_update(it);
283 elm_object_item_del(glit);
285 if (glit_prev != glit_parent)
286 glit = elm_genlist_item_insert_after(list, _itp, d, glit_parent,
288 ELM_GENLIST_ITEM_TREE,
291 glit = elm_genlist_item_prepend(list, _itp, d, glit_parent,
292 ELM_GENLIST_ITEM_TREE,
294 elm_genlist_item_expanded_set(glit, EINA_FALSE);
295 elm_genlist_item_selected_set(glit, EINA_TRUE);
297 else if (elm_genlist_item_expanded_get(glit))
299 elm_genlist_item_append(list, _itc, ndata, glit,
300 ELM_GENLIST_ITEM_NONE, _item_sel_cb, NULL);
303 elm_genlist_item_update(glit);
305 >>>>>>> remotes/origin/upstream
309 _clear_list(Node_Data *d)
313 EINA_LIST_FREE(d->children, tmp)
319 _del_item_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
321 Evas_Object *list = data;
323 Elm_Object_Item *it = elm_genlist_selected_item_get(list);
324 Elm_Object_Item *parent = NULL;
329 Node_Data *pdata, *d = elm_genlist_item_data_get(it);
330 parent = elm_genlist_item_parent_get(it);
331 elm_genlist_item_subitems_clear(it);
332 elm_genlist_item_del(it);
339 pdata = elm_genlist_item_data_get(parent);
340 pdata->children = eina_list_remove(pdata->children, d);
341 elm_genlist_item_update(parent);
343 Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
344 Elm_Object_Item *glit_parent = NULL;
348 Node_Data *pdata, *d = elm_object_item_data_get(glit);
349 glit_parent = elm_genlist_item_parent_get(glit);
350 elm_genlist_item_subitems_clear(glit);
351 elm_object_item_del(glit);
355 if (!glit_parent) return;
357 pdata = elm_object_item_data_get(glit_parent);
358 pdata->children = eina_list_remove(pdata->children, d);
359 elm_genlist_item_update(glit_parent);
360 >>>>>>> remotes/origin/upstream
364 _expand_request_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
367 Elm_Object_Item *it = event_info;
368 printf("expand request on item: %p\n", event_info);
369 elm_genlist_item_expanded_set(it, EINA_TRUE);
371 Elm_Object_Item *glit = event_info;
372 printf("expand request on item: %p\n", event_info);
373 elm_genlist_item_expanded_set(glit, EINA_TRUE);
374 >>>>>>> remotes/origin/upstream
378 _contract_request_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
381 Elm_Object_Item *it = event_info;
382 printf("contract request on item: %p\n", event_info);
383 elm_genlist_item_expanded_set(it, EINA_FALSE);
385 Elm_Object_Item *glit = event_info;
386 printf("contract request on item: %p\n", event_info);
387 elm_genlist_item_expanded_set(glit, EINA_FALSE);
388 >>>>>>> remotes/origin/upstream
392 _expanded_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
396 Elm_Object_Item *it = event_info;
397 Node_Data *it_data, *d = elm_genlist_item_data_get(it);
398 Evas_Object *list = elm_genlist_item_genlist_get(it);
400 Elm_Object_Item *glit = event_info;
401 Node_Data *it_data, *d = elm_object_item_data_get(glit);
402 Evas_Object *list = elm_object_item_widget_get(glit);
403 >>>>>>> remotes/origin/upstream
405 Elm_Genlist_Item_Class *ic;
407 EINA_LIST_FOREACH(d->children, l, it_data)
410 Elm_Object_Item *nitem;
411 Elm_Genlist_Item_Flags flags = ELM_GENLIST_ITEM_NONE;
412 printf("expanding item: #%d from parent #%d\n", it_data->value, d->value);
413 if (it_data->favorite)
415 else if (it_data->children)
418 flags = ELM_GENLIST_ITEM_SUBITEMS;
423 nitem = elm_genlist_item_append(list, ic, it_data, it,
424 flags, _item_sel_cb, NULL);
425 elm_genlist_item_expanded_set(nitem, EINA_FALSE);
427 Elm_Object_Item *nitem;
428 Elm_Genlist_Item_Type type = ELM_GENLIST_ITEM_NONE;
429 printf("expanding item: #%d from parent #%d\n", it_data->value, d->value);
430 if (it_data->favorite)
432 else if (it_data->children)
435 type = ELM_GENLIST_ITEM_TREE;
440 nitem = elm_genlist_item_append(list, ic, it_data, glit,
441 type, _item_sel_cb, NULL);
442 elm_genlist_item_expanded_set(nitem, EINA_FALSE);
443 >>>>>>> remotes/origin/upstream
448 _contracted_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
451 Elm_Object_Item *it = event_info;
452 elm_genlist_item_subitems_clear(it);
454 Elm_Object_Item *glit = event_info;
455 elm_genlist_item_subitems_clear(glit);
456 >>>>>>> remotes/origin/upstream
460 _button_add(Evas_Object *list, Evas_Object *box, const char *label, Evas_Smart_Cb cb)
464 bt = elm_button_add(elm_object_parent_widget_get(list));
465 elm_object_text_set(bt, label);
466 elm_box_pack_end(box, bt);
467 evas_object_show(bt);
470 evas_object_smart_callback_add(bt, "clicked", cb, list);
476 elm_main(int argc __UNUSED__, char **argv __UNUSED__)
478 Evas_Object *win, *bg, *box, *fbox;
482 win = elm_win_add(NULL, "icon", ELM_WIN_BASIC);
483 elm_win_title_set(win, "Icon");
484 elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
485 elm_win_autodel_set(win, EINA_TRUE);
487 bg = elm_bg_add(win);
488 elm_bg_color_set(bg, 255,255 ,255);
489 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
490 elm_win_resize_object_add(win, bg);
491 evas_object_show(bg);
493 box = elm_box_add(win);
494 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
495 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
496 elm_win_resize_object_add(win, box);
497 evas_object_show(box);
500 _itc.item_style = "default";
501 _itc.func.text_get = _item_text_get;
502 _itc.func.content_get = _item_content_get;
503 _itc.func.state_get = NULL;
504 _itc.func.del = NULL;
506 _itp.item_style = "default";
507 _itp.func.text_get = _parent_text_get;
508 _itp.func.content_get = _parent_content_get;
509 _itp.func.state_get = NULL;
510 _itp.func.del = NULL;
512 _itfav.item_style = "default";
513 _itfav.func.text_get = _favorite_text_get;
514 _itfav.func.content_get = _favorite_content_get;
515 _itfav.func.state_get = NULL;
516 _itfav.func.del = NULL;
520 _itc = elm_genlist_item_class_new();
521 _itc->item_style = "default";
522 _itc->func.text_get = _item_label_get;
523 _itc->func.content_get = _item_content_get;
524 _itc->func.state_get = NULL;
525 _itc->func.del = NULL;
530 _itp = elm_genlist_item_class_new();
531 _itp->item_style = "default";
532 _itp->func.text_get = _parent_label_get;
533 _itp->func.content_get = _parent_content_get;
534 _itp->func.state_get = NULL;
535 _itp->func.del = NULL;
540 _itfav = elm_genlist_item_class_new();
541 _itfav->item_style = "default";
542 _itfav->func.text_get = _favorite_label_get;
543 _itfav->func.content_get = _favorite_content_get;
544 _itfav->func.state_get = NULL;
545 _itfav->func.del = NULL;
547 >>>>>>> remotes/origin/upstream
549 list = elm_genlist_add(win);
551 evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
552 evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
553 elm_box_pack_end(box, list);
554 evas_object_show(list);
556 fbox = elm_box_add(win);
557 elm_box_layout_set(fbox, evas_object_box_layout_flow_horizontal,
562 >>>>>>> remotes/origin/upstream
563 evas_object_size_hint_weight_set(fbox, EVAS_HINT_EXPAND, 0);
564 evas_object_size_hint_align_set(fbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
565 elm_box_pack_end(box, fbox);
566 evas_object_show(fbox);
568 _button_add(list, fbox, "append item", _append_cb);
569 _button_add(list, fbox, "favorite", _favorite_cb);
570 _button_add(list, fbox, "add child", _add_child_cb);
571 _button_add(list, fbox, "del item", _del_item_cb);
573 for (i = 0; i < N_ITEMS; i++)
576 Elm_Object_Item *gli, *glg;
577 Node_Data *data = malloc(sizeof(*data)); // data for this item
578 data->children = NULL;
580 data->favorite = EINA_FALSE;
583 Node_Data *pdata; // data for the parent of the group
585 printf("creating item: #%d\n", data->value);
588 glg = gli = elm_genlist_item_append(list, &_itp, data, NULL,
589 ELM_GENLIST_ITEM_SUBITEMS,
591 elm_genlist_item_expanded_set(glg, EINA_TRUE);
597 gli = elm_genlist_item_append(list, &_itc, data, glg,
598 ELM_GENLIST_ITEM_NONE,
600 pdata->children = eina_list_append(pdata->children, data);
604 Elm_Object_Item *gli, *glg;
605 Node_Data *data = malloc(sizeof(*data)); // data for this item
606 data->children = NULL;
608 data->favorite = EINA_FALSE;
611 Node_Data *pdata; // data for the parent of the group
613 printf("creating item: #%d\n", data->value);
616 glg = gli = elm_genlist_item_append(list, _itp, data, NULL,
617 ELM_GENLIST_ITEM_TREE,
619 elm_genlist_item_expanded_set(glg, EINA_TRUE);
625 gli = elm_genlist_item_append(list, _itc, data, glg,
626 ELM_GENLIST_ITEM_NONE,
628 pdata->children = eina_list_append(pdata->children, data);
631 >>>>>>> remotes/origin/upstream
634 evas_object_smart_callback_add(list, "expand,request", _expand_request_cb, list);
635 evas_object_smart_callback_add(list, "contract,request", _contract_request_cb, list);
636 evas_object_smart_callback_add(list, "expanded", _expanded_cb, list);
637 evas_object_smart_callback_add(list, "contracted", _contracted_cb, list);
639 evas_object_size_hint_min_set(bg, 160, 160);
640 evas_object_size_hint_max_set(bg, 640, 800);
641 evas_object_resize(win, 420, 600);
642 evas_object_show(win);