2 * Simple Elementary's <b>gengrid widget</b> example, illustrating its
5 * See stdout/stderr for output. Compile with:
8 * gcc -g `pkg-config --cflags --libs elementary` gengrid_example.c -o gengrid_example
12 #include <Elementary.h>
14 # include "elementary_config.h"
17 # define PACKAGE_DATA_DIR "../../data"
20 typedef struct _Example_Item
25 static const char *imgs[9] =
38 static Elm_Gengrid_Item_Class *gic = NULL;
39 static Evas_Object *before_bt, *after_bt;
42 _on_done(void *data __UNUSED__,
43 Evas_Object *obj __UNUSED__,
44 void *event_info __UNUSED__)
49 /* change layouting mode */
51 _horizontal_grid(void *data,
53 void *event_info __UNUSED__)
55 Evas_Object *grid = data;
57 elm_gengrid_horizontal_set(grid, elm_check_state_get(obj));
60 /* "always select" callback */
62 _always_select_change(void *data,
64 void *event_info __UNUSED__)
66 Evas_Object *grid = data;
67 Eina_Bool always = elm_check_state_get(obj);
70 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS);
72 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DEFAULT);
74 fprintf(stdout, "\"Always select\" mode for gengrid items is now %s\n",
75 always ? "on" : "off");
78 /* "bouncing mode" callback */
80 _bouncing_change(void *data,
82 void *event_info __UNUSED__)
84 Evas_Object *grid = data;
85 Eina_Bool bounce = elm_check_state_get(obj);
87 elm_gengrid_bounce_set(grid, bounce, bounce);
89 fprintf(stdout, "Bouncing effect for gengrid is now %s\n",
90 bounce ? "on" : "off");
93 /* multi-selection callback */
95 _multi_change(void *data,
97 void *event_info __UNUSED__)
99 Evas_Object *grid = data;
100 Eina_Bool multi = elm_check_state_get(obj);
102 elm_gengrid_multi_select_set(grid, multi);
104 fprintf(stdout, "Multi-selection for gengrid is now %s\n",
105 multi ? "on" : "off");
107 elm_object_disabled_set(before_bt, multi);
108 elm_object_disabled_set(after_bt, multi);
112 Elm_Object_Item *gg_it;
113 const Eina_List *selected = elm_gengrid_selected_items_get(grid), *l;
114 EINA_LIST_FOREACH(selected, l, gg_it)
115 elm_gengrid_item_selected_set(gg_it, EINA_FALSE);
119 /* no selection callback */
121 _no_sel_change(void *data,
123 void *event_info __UNUSED__)
125 Evas_Object *grid = data;
126 Eina_Bool no_sel = elm_check_state_get(obj);
129 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_NONE);
131 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DEFAULT);
133 fprintf(stdout, "Selection for gengrid items is now %s\n",
134 no_sel ? "disabled" : "enabled");
137 /* item selection callback */
139 _grid_sel(void *data,
140 Evas_Object *obj __UNUSED__,
144 Example_Item *it = elm_object_item_data_get(event_info);
146 elm_gengrid_item_pos_get(event_info, &x, &y);
148 fprintf(stdout, "Item [%p], with data [%p], path %s, at position (%d, %d),"
149 " has been selected\n", event_info, data, it->path, x, y);
152 /* new item with random path */
153 static Example_Item *
158 it = malloc(sizeof(*it));
159 it->path = eina_stringshare_add(imgs[rand() % (sizeof(imgs) /
164 /* "insert before" callback */
166 _before_bt_clicked(void *data,
167 Evas_Object *obj __UNUSED__,
168 void *event_info __UNUSED__)
171 Evas_Object *grid = data;
172 Elm_Object_Item *sel;
174 sel = elm_gengrid_selected_item_get(grid);
179 elm_gengrid_item_insert_before(grid, gic, it, sel, _grid_sel, NULL);
182 /* "insert after" callback */
184 _after_bt_clicked(void *data,
185 Evas_Object *obj __UNUSED__,
186 void *event_info __UNUSED__)
189 Evas_Object *grid = data;
190 Elm_Object_Item *sel;
192 sel = elm_gengrid_selected_item_get(grid);
197 elm_gengrid_item_insert_after(grid, gic, it, sel, _grid_sel, NULL);
200 /* prepend an item */
202 _prepend_bt_clicked(void *data,
203 Evas_Object *obj __UNUSED__,
204 void *event_info __UNUSED__)
207 Evas_Object *grid = data;
210 elm_gengrid_item_prepend(grid, gic, it, _grid_sel, NULL);
215 _append_bt_clicked(void *data,
216 Evas_Object *obj __UNUSED__,
217 void *event_info __UNUSED__)
219 Evas_Object *grid = data;
220 Example_Item *it = _item_new();
222 elm_gengrid_item_append(grid, gic, it, _grid_sel, NULL);
227 _clear_cb(void *data,
228 Evas_Object *obj __UNUSED__,
229 void *event_info __UNUSED__)
231 elm_gengrid_clear(data);
233 fprintf(stdout, "Clearing the grid!\n");
236 /* bring in 1st item */
238 _bring_1st_clicked(void *data,
239 Evas_Object *obj __UNUSED__,
240 void *event_info __UNUSED__)
242 Elm_Object_Item *gg_it = elm_gengrid_first_item_get(data);
246 elm_gengrid_item_bring_in(gg_it, ELM_GENGRID_ITEM_SCROLLTO_IN);
251 _show_last_clicked(void *data,
252 Evas_Object *obj __UNUSED__,
253 void *event_info __UNUSED__)
255 Elm_Object_Item *gg_it = elm_gengrid_last_item_get(data);
259 elm_gengrid_item_show(gg_it, ELM_GENGRID_ITEM_SCROLLTO_IN);
262 /* disable selected item */
264 _toggle_disabled_cb(void *data,
265 Evas_Object *obj __UNUSED__,
266 void *event_info __UNUSED__)
268 Elm_Object_Item *gg_it = elm_gengrid_selected_item_get(data);
272 elm_gengrid_item_selected_set(gg_it, EINA_FALSE);
273 elm_object_item_disabled_set(gg_it, EINA_TRUE);
276 /* change items' size */
278 _size_changed(void *data,
280 void *event_info __UNUSED__)
282 Evas_Object *grid = data;
283 int size = elm_spinner_value_get(obj);
285 elm_gengrid_item_size_set(grid, size, size);
288 /* item double click callback */
290 _double_click(void *data __UNUSED__,
291 Evas_Object *obj __UNUSED__,
294 fprintf(stdout, "Double click on item with handle %p\n", event_info);
297 /* item long press callback */
299 _long_pressed(void *data __UNUSED__,
300 Evas_Object *obj __UNUSED__,
303 fprintf(stdout, "Long press on item with handle %p\n", event_info);
307 /* label fetching callback */
309 _grid_label_get(void *data,
310 Evas_Object *obj __UNUSED__,
311 const char *part __UNUSED__)
313 const Example_Item *it = data;
316 snprintf(buf, sizeof(buf), "Photo %s", it->path);
320 /* icon fetching callback */
322 _grid_content_get(void *data,
326 const Example_Item *it = data;
328 if (!strcmp(part, "elm.swallow.icon"))
330 Evas_Object *icon = elm_bg_add(obj);
333 snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR,
336 elm_bg_file_set(icon, buf, NULL);
337 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1,
339 evas_object_show(icon);
342 else if (!strcmp(part, "elm.swallow.end"))
345 ck = elm_check_add(obj);
346 evas_object_propagate_events_set(ck, EINA_FALSE);
347 evas_object_show(ck);
354 /* state fetching callback */
356 _grid_state_get(void *data __UNUSED__,
357 Evas_Object *obj __UNUSED__,
358 const char *part __UNUSED__)
363 /* deletion callback */
365 _grid_del(void *data,
366 Evas_Object *obj __UNUSED__)
368 Example_Item *it = data;
370 eina_stringshare_del(it->path);
374 /* scrolling animation stopped callback */
376 _grid_scroll_stopped_cb(void *data __UNUSED__,
378 void *event_info __UNUSED__)
380 int h_pagenumber = 0, v_pagenumber = 0;
381 elm_gengrid_current_page_get(obj, &h_pagenumber, &v_pagenumber);
382 fprintf(stdout, "Grid current horiz page is %d, vert page is %d\n",
383 h_pagenumber, v_pagenumber);
386 /* items grid horizontal alignment change */
388 _h_align_change_cb(void *data,
390 void *event_info __UNUSED__)
393 double val = elm_slider_value_get(obj);
395 elm_gengrid_align_get(data, NULL, &v_align);
397 fprintf(stdout, "Setting horizontal alignment to %f\n", val);
398 elm_gengrid_align_set(data, val, v_align);
402 _v_align_change_cb(void *data,
404 void *event_info __UNUSED__)
407 double val = elm_slider_value_get(obj);
409 elm_gengrid_align_get(data, &h_align, NULL);
411 fprintf(stdout, "Setting vertical alignment to %f\n", val);
412 elm_gengrid_align_set(data, h_align, val);
415 /* page relative size change */
417 _page_change_cb(void *data,
419 void *event_info __UNUSED__)
421 double val = elm_slider_value_get(obj);
423 elm_gengrid_page_relative_set(data, val, val);
425 fprintf(stdout, "Setting grid page's relative size to %f\n", val);
429 elm_main(int argc __UNUSED__,
430 char **argv __UNUSED__)
432 Evas_Object *win, *bg, *grid, *bx, *hbx_1, *hbx_2, *hbx_3, *bt, *ck, *sl,
439 win = elm_win_add(NULL, "gengrid", ELM_WIN_BASIC);
440 elm_win_title_set(win, "Generic Grid Example");
441 evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
443 bg = elm_bg_add(win);
444 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
445 elm_win_resize_object_add(win, bg);
446 evas_object_show(bg);
448 bx = elm_box_add(win);
449 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
450 elm_win_resize_object_add(win, bx);
451 evas_object_show(bx);
453 grid = elm_gengrid_add(win);
454 elm_gengrid_item_size_set(grid, 150, 150);
455 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
456 evas_object_size_hint_min_set(grid, 600, 500);
457 elm_box_pack_end(bx, grid);
458 evas_object_smart_callback_add(grid, "clicked,double", _double_click, NULL);
459 evas_object_smart_callback_add(grid, "longpressed", _long_pressed, NULL);
460 evas_object_show(grid);
462 hbx_1 = elm_box_add(win);
463 evas_object_size_hint_weight_set(hbx_1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
464 elm_box_horizontal_set(hbx_1, EINA_TRUE);
465 elm_box_pack_end(bx, hbx_1);
466 evas_object_show(hbx_1);
468 bt = elm_button_add(win);
469 elm_object_text_set(bt, "Append");
470 evas_object_smart_callback_add(bt, "clicked", _append_bt_clicked, grid);
471 elm_box_pack_end(hbx_1, bt);
472 evas_object_show(bt);
474 bt = elm_button_add(win);
475 elm_object_text_set(bt, "Prepend");
476 evas_object_smart_callback_add(bt, "clicked", _prepend_bt_clicked, grid);
477 elm_box_pack_end(hbx_1, bt);
478 evas_object_show(bt);
480 before_bt = elm_button_add(win);
481 elm_object_text_set(before_bt, "Insert before");
482 evas_object_smart_callback_add(before_bt, "clicked", _before_bt_clicked,
484 elm_box_pack_end(hbx_1, before_bt);
485 evas_object_show(before_bt);
487 after_bt = elm_button_add(win);
488 elm_object_text_set(after_bt, "Insert after");
489 evas_object_smart_callback_add(after_bt, "clicked", _after_bt_clicked, grid);
490 elm_box_pack_end(hbx_1, after_bt);
491 evas_object_show(after_bt);
493 bt = elm_button_add(win);
494 elm_object_text_set(bt, "Clear");
495 evas_object_smart_callback_add(bt, "clicked", _clear_cb, grid);
496 elm_box_pack_end(hbx_1, bt);
497 evas_object_show(bt);
499 bt = elm_button_add(win);
500 elm_object_text_set(bt, "Bring in 1st");
501 evas_object_smart_callback_add(bt, "clicked", _bring_1st_clicked, grid);
502 elm_box_pack_end(hbx_1, bt);
503 evas_object_show(bt);
505 bt = elm_button_add(win);
506 elm_object_text_set(bt, "Show last");
507 evas_object_smart_callback_add(bt, "clicked", _show_last_clicked, grid);
508 elm_box_pack_end(hbx_1, bt);
509 evas_object_show(bt);
511 sp = elm_spinner_add(win);
512 elm_spinner_min_max_set(sp, 10, 1024);
513 elm_spinner_value_set(sp, 150);
514 elm_spinner_label_format_set(sp, "Item size: %.0f");
515 evas_object_smart_callback_add(sp, "changed", _size_changed, grid);
516 evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
517 elm_box_pack_end(hbx_1, sp);
518 evas_object_show(sp);
520 hbx_2 = elm_box_add(win);
521 evas_object_size_hint_weight_set(hbx_2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
522 elm_box_horizontal_set(hbx_2, EINA_TRUE);
523 elm_box_pack_end(bx, hbx_2);
524 evas_object_show(hbx_2);
526 bt = elm_button_add(win);
527 elm_object_text_set(bt, "Disable item");
528 evas_object_smart_callback_add(bt, "clicked", _toggle_disabled_cb, grid);
529 elm_box_pack_end(hbx_2, bt);
530 evas_object_show(bt);
532 ck = elm_check_add(win);
533 elm_object_text_set(ck, "Horizontal mode");
534 evas_object_smart_callback_add(ck, "changed", _horizontal_grid, grid);
535 elm_box_pack_end(hbx_2, ck);
536 evas_object_show(ck);
538 ck = elm_check_add(win);
539 elm_object_text_set(ck, "Always select");
540 evas_object_smart_callback_add(ck, "changed", _always_select_change, grid);
541 elm_box_pack_end(hbx_2, ck);
542 evas_object_show(ck);
544 ck = elm_check_add(win);
545 elm_gengrid_bounce_get(grid, &bounce, NULL);
546 elm_object_text_set(ck, "Bouncing");
547 elm_check_state_set(ck, bounce);
548 evas_object_smart_callback_add(ck, "changed", _bouncing_change, grid);
549 elm_box_pack_end(hbx_2, ck);
550 evas_object_show(ck);
552 ck = elm_check_add(win);
553 elm_object_text_set(ck, "Multi-selection");
554 elm_check_state_set(ck, elm_gengrid_multi_select_get(grid));
555 evas_object_smart_callback_add(ck, "changed", _multi_change, grid);
556 elm_box_pack_end(hbx_2, ck);
557 evas_object_show(ck);
559 ck = elm_check_add(win);
560 elm_object_text_set(ck, "No selection");
561 evas_object_smart_callback_add(ck, "changed", _no_sel_change, grid);
562 elm_box_pack_end(hbx_2, ck);
563 evas_object_show(ck);
565 hbx_3 = elm_box_add(win);
566 evas_object_size_hint_weight_set(hbx_3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
567 elm_box_horizontal_set(hbx_3, EINA_TRUE);
568 elm_box_pack_end(bx, hbx_3);
569 evas_object_show(hbx_3);
571 elm_gengrid_align_get(grid, &h, &v);
572 evas_object_smart_callback_add(grid, "scroll,anim,stop", _grid_scroll_stopped_cb, NULL);
574 sl = elm_slider_add(win);
575 elm_object_text_set(sl, "Horiz. alignment");
576 elm_slider_span_size_set(sl, 100);
577 evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
578 evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
579 elm_slider_indicator_format_set(sl, "%1.1f");
580 elm_slider_value_set(sl, h);
581 elm_box_pack_end(hbx_3, sl);
582 evas_object_show(sl);
584 evas_object_smart_callback_add(sl, "changed", _h_align_change_cb, grid);
586 sl = elm_slider_add(win);
587 elm_object_text_set(sl, "Vert. alignment");
588 elm_slider_span_size_set(sl, 100);
589 evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
590 evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
591 elm_slider_indicator_format_set(sl, "%1.1f");
592 elm_slider_value_set(sl, v);
593 elm_box_pack_end(hbx_3, sl);
594 evas_object_show(sl);
596 evas_object_smart_callback_add(sl, "changed", _v_align_change_cb, grid);
598 elm_gengrid_align_get(grid, &h, &v);
600 sl = elm_slider_add(win);
601 elm_object_text_set(sl, "Page rel. size");
602 elm_slider_span_size_set(sl, 100);
603 evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
604 evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
605 elm_slider_indicator_format_set(sl, "%1.1f");
606 elm_slider_value_set(sl, h);
607 elm_box_pack_end(hbx_3, sl);
608 evas_object_show(sl);
610 _page_change_cb(grid, sl, NULL);
611 evas_object_smart_callback_add(sl, "changed", _page_change_cb, grid);
615 gic = elm_gengrid_item_class_new();
616 gic->item_style = "default";
617 gic->func.text_get = _grid_label_get;
618 gic->func.content_get = _grid_content_get;
619 gic->func.state_get = _grid_state_get;
620 gic->func.del = _grid_del;
621 } // we only create the first time its needed. we dont unref/free
623 _append_bt_clicked(grid, NULL, NULL);
624 _append_bt_clicked(grid, NULL, NULL);
625 _append_bt_clicked(grid, NULL, NULL);
627 evas_object_resize(win, 600, 600);
628 evas_object_show(win);