aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/elementary/src/examples/gengrid_example.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/elementary/src/examples/gengrid_example.c')
-rw-r--r--libraries/elementary/src/examples/gengrid_example.c630
1 files changed, 630 insertions, 0 deletions
diff --git a/libraries/elementary/src/examples/gengrid_example.c b/libraries/elementary/src/examples/gengrid_example.c
new file mode 100644
index 0000000..e3b345d
--- /dev/null
+++ b/libraries/elementary/src/examples/gengrid_example.c
@@ -0,0 +1,630 @@
1/**
2 * Simple Elementary's <b>gengrid widget</b> example, illustrating its
3 * usage and API.
4 *
5 * See stdout/stderr for output. Compile with:
6 *
7 * @verbatim
8 * gcc -g gengrid_example.c -o gengrid_example `pkg-config --cflags --libs elementary`
9 * @endverbatim
10 */
11
12#include <Elementary.h>
13
14typedef struct _Example_Item
15{
16 const char *path;
17} Example_Item;
18
19static const char *imgs[9] =
20{
21 "panel_01.jpg",
22 "plant_01.jpg",
23 "rock_01.jpg",
24 "rock_02.jpg",
25 "sky_01.jpg",
26 "sky_02.jpg",
27 "sky_03.jpg",
28 "sky_04.jpg",
29 "wood_01.jpg",
30};
31
32static Elm_Gengrid_Item_Class *gic = NULL;
33static Evas_Object *before_bt, *after_bt;
34
35static void
36_on_done(void *data,
37 Evas_Object *obj,
38 void *event_info)
39{
40 elm_exit();
41}
42
43/* change layouting mode */
44static void
45_horizontal_grid(void *data,
46 Evas_Object *obj,
47 void *event_info)
48{
49 Evas_Object *grid = data;
50
51 elm_gengrid_horizontal_set(grid, elm_check_state_get(obj));
52}
53
54/* "always select" callback */
55static void
56_always_select_change(void *data,
57 Evas_Object *obj,
58 void *event_info)
59{
60 Evas_Object *grid = data;
61 Eina_Bool always = elm_check_state_get(obj);
62
63 if (always)
64 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS);
65 else
66 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DEFAULT);
67
68 fprintf(stdout, "\"Always select\" mode for gengrid items is now %s\n",
69 always ? "on" : "off");
70}
71
72/* "bouncing mode" callback */
73static void
74_bouncing_change(void *data,
75 Evas_Object *obj,
76 void *event_info)
77{
78 Evas_Object *grid = data;
79 Eina_Bool bounce = elm_check_state_get(obj);
80
81 elm_gengrid_bounce_set(grid, bounce, bounce);
82
83 fprintf(stdout, "Bouncing effect for gengrid is now %s\n",
84 bounce ? "on" : "off");
85}
86
87/* multi-selection callback */
88static void
89_multi_change(void *data,
90 Evas_Object *obj,
91 void *event_info)
92{
93 Evas_Object *grid = data;
94 Eina_Bool multi = elm_check_state_get(obj);
95
96 elm_gengrid_multi_select_set(grid, multi);
97
98 fprintf(stdout, "Multi-selection for gengrid is now %s\n",
99 multi ? "on" : "off");
100
101 elm_object_disabled_set(before_bt, multi);
102 elm_object_disabled_set(after_bt, multi);
103
104 if (!multi)
105 {
106 Elm_Object_Item *gg_it;
107 const Eina_List *selected = elm_gengrid_selected_items_get(grid), *l;
108 EINA_LIST_FOREACH(selected, l, gg_it)
109 elm_gengrid_item_selected_set(gg_it, EINA_FALSE);
110 }
111}
112
113/* no selection callback */
114static void
115_no_sel_change(void *data,
116 Evas_Object *obj,
117 void *event_info)
118{
119 Evas_Object *grid = data;
120 Eina_Bool no_sel = elm_check_state_get(obj);
121
122 if (no_sel)
123 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_NONE);
124 else
125 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DEFAULT);
126
127 fprintf(stdout, "Selection for gengrid items is now %s\n",
128 no_sel ? "disabled" : "enabled");
129}
130
131/* item selection callback */
132static void
133_grid_sel(void *data,
134 Evas_Object *obj,
135 void *event_info)
136{
137 unsigned int x, y;
138 Example_Item *it = elm_object_item_data_get(event_info);
139
140 elm_gengrid_item_pos_get(event_info, &x, &y);
141
142 fprintf(stdout, "Item [%p], with data [%p], path %s, at position (%d, %d),"
143 " has been selected\n", event_info, data, it->path, x, y);
144}
145
146/* new item with random path */
147static Example_Item *
148_item_new(void)
149{
150 Example_Item *it;
151
152 it = malloc(sizeof(*it));
153 it->path = eina_stringshare_add(imgs[rand() % (sizeof(imgs) /
154 sizeof(imgs[0]))]);
155 return it;
156}
157
158/* "insert before" callback */
159static void
160_before_bt_clicked(void *data,
161 Evas_Object *obj,
162 void *event_info)
163{
164 Example_Item *it;
165 Evas_Object *grid = data;
166 Elm_Object_Item *sel;
167
168 sel = elm_gengrid_selected_item_get(grid);
169 if (!sel)
170 return;
171
172 it = _item_new();
173 elm_gengrid_item_insert_before(grid, gic, it, sel, _grid_sel, NULL);
174}
175
176/* "insert after" callback */
177static void
178_after_bt_clicked(void *data,
179 Evas_Object *obj,
180 void *event_info)
181{
182 Example_Item *it;
183 Evas_Object *grid = data;
184 Elm_Object_Item *sel;
185
186 sel = elm_gengrid_selected_item_get(grid);
187 if (!sel)
188 return;
189
190 it = _item_new();
191 elm_gengrid_item_insert_after(grid, gic, it, sel, _grid_sel, NULL);
192}
193
194/* prepend an item */
195static void
196_prepend_bt_clicked(void *data,
197 Evas_Object *obj,
198 void *event_info)
199{
200 Example_Item *it;
201 Evas_Object *grid = data;
202
203 it = _item_new();
204 elm_gengrid_item_prepend(grid, gic, it, _grid_sel, NULL);
205}
206
207/* append an item */
208static void
209_append_bt_clicked(void *data,
210 Evas_Object *obj,
211 void *event_info)
212{
213 Evas_Object *grid = data;
214 Example_Item *it = _item_new();
215
216 elm_gengrid_item_append(grid, gic, it, _grid_sel, NULL);
217}
218
219/* delete items */
220static void
221_clear_cb(void *data,
222 Evas_Object *obj,
223 void *event_info)
224{
225 elm_gengrid_clear(data);
226
227 fprintf(stdout, "Clearing the grid!\n");
228}
229
230/* bring in 1st item */
231static void
232_bring_1st_clicked(void *data,
233 Evas_Object *obj,
234 void *event_info)
235{
236 Elm_Object_Item *gg_it = elm_gengrid_first_item_get(data);
237
238 if (!gg_it) return;
239
240 elm_gengrid_item_bring_in(gg_it, ELM_GENGRID_ITEM_SCROLLTO_IN);
241}
242
243/* show last item */
244static void
245_show_last_clicked(void *data,
246 Evas_Object *obj,
247 void *event_info)
248{
249 Elm_Object_Item *gg_it = elm_gengrid_last_item_get(data);
250
251 if (!gg_it) return;
252
253 elm_gengrid_item_show(gg_it, ELM_GENGRID_ITEM_SCROLLTO_IN);
254}
255
256/* disable selected item */
257static void
258_toggle_disabled_cb(void *data,
259 Evas_Object *obj,
260 void *event_info)
261{
262 Elm_Object_Item *gg_it = elm_gengrid_selected_item_get(data);
263
264 if (!gg_it) return;
265
266 elm_gengrid_item_selected_set(gg_it, EINA_FALSE);
267 elm_object_item_disabled_set(gg_it, EINA_TRUE);
268}
269
270/* change items' size */
271static void
272_size_changed(void *data,
273 Evas_Object *obj,
274 void *event_info)
275{
276 Evas_Object *grid = data;
277 int size = elm_spinner_value_get(obj);
278
279 elm_gengrid_item_size_set(grid, size, size);
280}
281
282/* item double click callback */
283static void
284_double_click(void *data,
285 Evas_Object *obj,
286 void *event_info)
287{
288 fprintf(stdout, "Double click on item with handle %p\n", event_info);
289}
290
291/* item long press callback */
292static void
293_long_pressed(void *data,
294 Evas_Object *obj,
295 void *event_info)
296{
297 fprintf(stdout, "Long press on item with handle %p\n", event_info);
298}
299
300
301/* label fetching callback */
302static char *
303_grid_label_get(void *data,
304 Evas_Object *obj,
305 const char *part)
306{
307 const Example_Item *it = data;
308 char buf[256];
309
310 snprintf(buf, sizeof(buf), "Photo %s", it->path);
311 return strdup(buf);
312}
313
314/* icon fetching callback */
315static Evas_Object *
316_grid_content_get(void *data,
317 Evas_Object *obj,
318 const char *part)
319{
320 const Example_Item *it = data;
321
322 if (!strcmp(part, "elm.swallow.icon"))
323 {
324 Evas_Object *icon = elm_bg_add(obj);
325 char buf[PATH_MAX];
326
327 snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(),
328 it->path);
329
330 elm_bg_file_set(icon, buf, NULL);
331 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1,
332 1);
333 evas_object_show(icon);
334 return icon;
335 }
336 else if (!strcmp(part, "elm.swallow.end"))
337 {
338 Evas_Object *ck;
339 ck = elm_check_add(obj);
340 evas_object_propagate_events_set(ck, EINA_FALSE);
341 evas_object_show(ck);
342 return ck;
343 }
344
345 return NULL;
346}
347
348/* state fetching callback */
349static Eina_Bool
350_grid_state_get(void *data,
351 Evas_Object *obj,
352 const char *part)
353{
354 return EINA_FALSE;
355}
356
357/* deletion callback */
358static void
359_grid_del(void *data,
360 Evas_Object *obj)
361{
362 Example_Item *it = data;
363
364 eina_stringshare_del(it->path);
365 free(it);
366}
367
368/* scrolling animation stopped callback */
369static void
370_grid_scroll_stopped_cb(void *data,
371 Evas_Object *obj,
372 void *event_info)
373{
374 int h_pagenumber = 0, v_pagenumber = 0;
375 elm_gengrid_current_page_get(obj, &h_pagenumber, &v_pagenumber);
376 fprintf(stdout, "Grid current horiz page is %d, vert page is %d\n",
377 h_pagenumber, v_pagenumber);
378}
379
380/* items grid horizontal alignment change */
381static void
382_h_align_change_cb(void *data,
383 Evas_Object *obj,
384 void *event_info)
385{
386 double v_align;
387 double val = elm_slider_value_get(obj);
388
389 elm_gengrid_align_get(data, NULL, &v_align);
390
391 fprintf(stdout, "Setting horizontal alignment to %f\n", val);
392 elm_gengrid_align_set(data, val, v_align);
393}
394
395static void
396_v_align_change_cb(void *data,
397 Evas_Object *obj,
398 void *event_info)
399{
400 double h_align;
401 double val = elm_slider_value_get(obj);
402
403 elm_gengrid_align_get(data, &h_align, NULL);
404
405 fprintf(stdout, "Setting vertical alignment to %f\n", val);
406 elm_gengrid_align_set(data, h_align, val);
407}
408
409/* page relative size change */
410static void
411_page_change_cb(void *data,
412 Evas_Object *obj,
413 void *event_info)
414{
415 double val = elm_slider_value_get(obj);
416
417 elm_gengrid_page_relative_set(data, val, val);
418
419 fprintf(stdout, "Setting grid page's relative size to %f\n", val);
420}
421
422EAPI_MAIN int
423elm_main(int argc,
424 char **argv)
425{
426 Evas_Object *win, *bg, *grid, *bx, *hbx_1, *hbx_2, *hbx_3, *bt, *ck, *sl,
427 *sp;
428 Eina_Bool bounce;
429 double h, v;
430
431 srand(time(NULL));
432
433 elm_app_info_set(elm_main, "elementary", "images");
434 win = elm_win_add(NULL, "gengrid", ELM_WIN_BASIC);
435 elm_win_title_set(win, "Generic Grid Example");
436 evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
437
438 bg = elm_bg_add(win);
439 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
440 elm_win_resize_object_add(win, bg);
441 evas_object_show(bg);
442
443 bx = elm_box_add(win);
444 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
445 elm_win_resize_object_add(win, bx);
446 evas_object_show(bx);
447
448 grid = elm_gengrid_add(win);
449 elm_gengrid_item_size_set(grid, 150, 150);
450 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
451 evas_object_size_hint_min_set(grid, 600, 500);
452 elm_box_pack_end(bx, grid);
453 evas_object_smart_callback_add(grid, "clicked,double", _double_click, NULL);
454 evas_object_smart_callback_add(grid, "longpressed", _long_pressed, NULL);
455 evas_object_show(grid);
456
457 hbx_1 = elm_box_add(win);
458 evas_object_size_hint_weight_set(hbx_1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
459 elm_box_horizontal_set(hbx_1, EINA_TRUE);
460 elm_box_pack_end(bx, hbx_1);
461 evas_object_show(hbx_1);
462
463 bt = elm_button_add(win);
464 elm_object_text_set(bt, "Append");
465 evas_object_smart_callback_add(bt, "clicked", _append_bt_clicked, grid);
466 elm_box_pack_end(hbx_1, bt);
467 evas_object_show(bt);
468
469 bt = elm_button_add(win);
470 elm_object_text_set(bt, "Prepend");
471 evas_object_smart_callback_add(bt, "clicked", _prepend_bt_clicked, grid);
472 elm_box_pack_end(hbx_1, bt);
473 evas_object_show(bt);
474
475 before_bt = elm_button_add(win);
476 elm_object_text_set(before_bt, "Insert before");
477 evas_object_smart_callback_add(before_bt, "clicked", _before_bt_clicked,
478 grid);
479 elm_box_pack_end(hbx_1, before_bt);
480 evas_object_show(before_bt);
481
482 after_bt = elm_button_add(win);
483 elm_object_text_set(after_bt, "Insert after");
484 evas_object_smart_callback_add(after_bt, "clicked", _after_bt_clicked, grid);
485 elm_box_pack_end(hbx_1, after_bt);
486 evas_object_show(after_bt);
487
488 bt = elm_button_add(win);
489 elm_object_text_set(bt, "Clear");
490 evas_object_smart_callback_add(bt, "clicked", _clear_cb, grid);
491 elm_box_pack_end(hbx_1, bt);
492 evas_object_show(bt);
493
494 bt = elm_button_add(win);
495 elm_object_text_set(bt, "Bring in 1st");
496 evas_object_smart_callback_add(bt, "clicked", _bring_1st_clicked, grid);
497 elm_box_pack_end(hbx_1, bt);
498 evas_object_show(bt);
499
500 bt = elm_button_add(win);
501 elm_object_text_set(bt, "Show last");
502 evas_object_smart_callback_add(bt, "clicked", _show_last_clicked, grid);
503 elm_box_pack_end(hbx_1, bt);
504 evas_object_show(bt);
505
506 sp = elm_spinner_add(win);
507 elm_spinner_min_max_set(sp, 10, 1024);
508 elm_spinner_value_set(sp, 150);
509 elm_spinner_label_format_set(sp, "Item size: %.0f");
510 evas_object_smart_callback_add(sp, "changed", _size_changed, grid);
511 evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
512 elm_box_pack_end(hbx_1, sp);
513 evas_object_show(sp);
514
515 hbx_2 = elm_box_add(win);
516 evas_object_size_hint_weight_set(hbx_2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
517 elm_box_horizontal_set(hbx_2, EINA_TRUE);
518 elm_box_pack_end(bx, hbx_2);
519 evas_object_show(hbx_2);
520
521 bt = elm_button_add(win);
522 elm_object_text_set(bt, "Disable item");
523 evas_object_smart_callback_add(bt, "clicked", _toggle_disabled_cb, grid);
524 elm_box_pack_end(hbx_2, bt);
525 evas_object_show(bt);
526
527 ck = elm_check_add(win);
528 elm_object_text_set(ck, "Horizontal mode");
529 evas_object_smart_callback_add(ck, "changed", _horizontal_grid, grid);
530 elm_box_pack_end(hbx_2, ck);
531 evas_object_show(ck);
532
533 ck = elm_check_add(win);
534 elm_object_text_set(ck, "Always select");
535 evas_object_smart_callback_add(ck, "changed", _always_select_change, grid);
536 elm_box_pack_end(hbx_2, ck);
537 evas_object_show(ck);
538
539 ck = elm_check_add(win);
540 elm_gengrid_bounce_get(grid, &bounce, NULL);
541 elm_object_text_set(ck, "Bouncing");
542 elm_check_state_set(ck, bounce);
543 evas_object_smart_callback_add(ck, "changed", _bouncing_change, grid);
544 elm_box_pack_end(hbx_2, ck);
545 evas_object_show(ck);
546
547 ck = elm_check_add(win);
548 elm_object_text_set(ck, "Multi-selection");
549 elm_check_state_set(ck, elm_gengrid_multi_select_get(grid));
550 evas_object_smart_callback_add(ck, "changed", _multi_change, grid);
551 elm_box_pack_end(hbx_2, ck);
552 evas_object_show(ck);
553
554 ck = elm_check_add(win);
555 elm_object_text_set(ck, "No selection");
556 evas_object_smart_callback_add(ck, "changed", _no_sel_change, grid);
557 elm_box_pack_end(hbx_2, ck);
558 evas_object_show(ck);
559
560 hbx_3 = elm_box_add(win);
561 evas_object_size_hint_weight_set(hbx_3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
562 elm_box_horizontal_set(hbx_3, EINA_TRUE);
563 elm_box_pack_end(bx, hbx_3);
564 evas_object_show(hbx_3);
565
566 elm_gengrid_align_get(grid, &h, &v);
567 evas_object_smart_callback_add(grid, "scroll,anim,stop", _grid_scroll_stopped_cb, NULL);
568
569 sl = elm_slider_add(win);
570 elm_object_text_set(sl, "Horiz. alignment");
571 elm_slider_span_size_set(sl, 100);
572 evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
573 evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
574 elm_slider_indicator_format_set(sl, "%1.1f");
575 elm_slider_value_set(sl, h);
576 elm_box_pack_end(hbx_3, sl);
577 evas_object_show(sl);
578
579 evas_object_smart_callback_add(sl, "changed", _h_align_change_cb, grid);
580
581 sl = elm_slider_add(win);
582 elm_object_text_set(sl, "Vert. alignment");
583 elm_slider_span_size_set(sl, 100);
584 evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
585 evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
586 elm_slider_indicator_format_set(sl, "%1.1f");
587 elm_slider_value_set(sl, v);
588 elm_box_pack_end(hbx_3, sl);
589 evas_object_show(sl);
590
591 evas_object_smart_callback_add(sl, "changed", _v_align_change_cb, grid);
592
593 elm_gengrid_align_get(grid, &h, &v);
594
595 sl = elm_slider_add(win);
596 elm_object_text_set(sl, "Page rel. size");
597 elm_slider_span_size_set(sl, 100);
598 evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
599 evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
600 elm_slider_indicator_format_set(sl, "%1.1f");
601 elm_slider_value_set(sl, h);
602 elm_box_pack_end(hbx_3, sl);
603 evas_object_show(sl);
604
605 _page_change_cb(grid, sl, NULL);
606 evas_object_smart_callback_add(sl, "changed", _page_change_cb, grid);
607
608 if (!gic)
609 {
610 gic = elm_gengrid_item_class_new();
611 gic->item_style = "default";
612 gic->func.text_get = _grid_label_get;
613 gic->func.content_get = _grid_content_get;
614 gic->func.state_get = _grid_state_get;
615 gic->func.del = _grid_del;
616 } // we only create the first time its needed. we dont unref/free
617
618 _append_bt_clicked(grid, NULL, NULL);
619 _append_bt_clicked(grid, NULL, NULL);
620 _append_bt_clicked(grid, NULL, NULL);
621
622 evas_object_resize(win, 600, 600);
623 evas_object_show(win);
624
625 elm_run();
626 elm_shutdown();
627
628 return 0;
629}
630ELM_MAIN()