patch from zub in #e to fix example building
[framework/uifw/elementary.git] / src / examples / gengrid_example.c
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 `pkg-config --cflags --libs elementary` gengrid_example.c -o gengrid_example
9  * @endverbatim
10  */
11
12 #include <Elementary.h>
13 #ifdef HAVE_CONFIG_H
14 # include "elementary_config.h"
15 #else
16 # define __UNUSED__
17 # define PACKAGE_DATA_DIR "../../data"
18 #endif
19
20 typedef struct _Example_Item
21 {
22    const char *path;
23 } Example_Item;
24
25 static const char *imgs[9] =
26 {
27    "panel_01.jpg",
28    "plant_01.jpg",
29    "rock_01.jpg",
30    "rock_02.jpg",
31    "sky_01.jpg",
32    "sky_02.jpg",
33    "sky_03.jpg",
34    "sky_04.jpg",
35    "wood_01.jpg",
36 };
37
38 static Elm_Gengrid_Item_Class gic;
39 Evas_Object *before_bt, *after_bt;
40
41 static void
42 _on_done(void        *data __UNUSED__,
43          Evas_Object *obj __UNUSED__,
44          void        *event_info __UNUSED__)
45 {
46    elm_exit();
47 }
48
49 /* change layouting mode */
50 static void
51 _horizontal_grid(void        *data,
52                  Evas_Object *obj,
53                  void        *event_info __UNUSED__)
54 {
55    Evas_Object *grid = data;
56
57    elm_gengrid_horizontal_set(grid, elm_check_state_get(obj));
58 }
59
60 /* "always select" callback */
61 static void
62 _always_select_change(void        *data,
63                       Evas_Object *obj,
64                       void        *event_info __UNUSED__)
65 {
66    Evas_Object *grid = data;
67    Eina_Bool always = elm_check_state_get(obj);
68
69    elm_gengrid_always_select_mode_set(grid, always);
70
71    fprintf(stdout, "\"Always select\" mode for gengrid items is now %s\n",
72            always ? "on" : "off");
73 }
74
75 /* "bouncing mode" callback */
76 static void
77 _bouncing_change(void        *data,
78                  Evas_Object *obj,
79                  void        *event_info __UNUSED__)
80 {
81    Evas_Object *grid = data;
82    Eina_Bool bounce = elm_check_state_get(obj);
83
84    elm_gengrid_bounce_set(grid, bounce, bounce);
85
86    fprintf(stdout, "Bouncing effect for gengrid is now %s\n",
87            bounce ? "on" : "off");
88 }
89
90 /* multi-selection callback */
91 static void
92 _multi_change(void        *data,
93               Evas_Object *obj,
94               void        *event_info __UNUSED__)
95 {
96    Evas_Object *grid = data;
97    Eina_Bool multi = elm_check_state_get(obj);
98
99    elm_gengrid_multi_select_set(grid, multi);
100
101    fprintf(stdout, "Multi-selection for gengrid is now %s\n",
102            multi ? "on" : "off");
103
104    elm_object_disabled_set(before_bt, multi);
105    elm_object_disabled_set(after_bt, multi);
106
107    if (!multi)
108      {
109         Elm_Gengrid_Item *it;
110         const Eina_List *selected = elm_gengrid_selected_items_get(grid), *l;
111         EINA_LIST_FOREACH(selected, l, it)
112           elm_gengrid_item_selected_set(it, EINA_FALSE);
113      }
114 }
115
116 /* no selection callback */
117 static void
118 _no_sel_change(void        *data,
119                Evas_Object *obj,
120                void        *event_info __UNUSED__)
121 {
122    Evas_Object *grid = data;
123    Eina_Bool no_sel = elm_check_state_get(obj);
124
125    elm_gengrid_no_select_mode_set(grid, no_sel);
126
127    fprintf(stdout, "Selection for gengrid items is now %s\n",
128            no_sel ? "disabled" : "enabled");
129 }
130
131 /* item selection callback */
132 static void
133 _grid_sel(void        *data,
134           Evas_Object *obj __UNUSED__,
135           void        *event_info)
136 {
137    unsigned int x, y;
138    Example_Item *it = elm_gengrid_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 */
147 static 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 */
159 static void
160 _before_bt_clicked(void        *data,
161                    Evas_Object *obj __UNUSED__,
162                    void        *event_info __UNUSED__)
163 {
164    Example_Item *it;
165    Evas_Object *grid = data;
166    Elm_Gengrid_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 */
177 static void
178 _after_bt_clicked(void        *data,
179                   Evas_Object *obj __UNUSED__,
180                   void        *event_info __UNUSED__)
181 {
182    Example_Item *it;
183    Evas_Object *grid = data;
184    Elm_Gengrid_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 */
195 static void
196 _prepend_bt_clicked(void        *data,
197                     Evas_Object *obj __UNUSED__,
198                     void        *event_info __UNUSED__)
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 */
208 static void
209 _append_bt_clicked(void        *data,
210                    Evas_Object *obj __UNUSED__,
211                    void        *event_info __UNUSED__)
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 */
220 static void
221 _clear_cb(void        *data,
222           Evas_Object *obj __UNUSED__,
223           void        *event_info __UNUSED__)
224 {
225    elm_gengrid_clear(data);
226
227    fprintf(stdout, "Clearing the grid!\n");
228 }
229
230 /* bring in 1st item */
231 static void
232 _bring_1st_clicked(void        *data,
233                    Evas_Object *obj __UNUSED__,
234                    void        *event_info __UNUSED__)
235 {
236    Elm_Gengrid_Item *it = elm_gengrid_first_item_get(data);
237
238    if (!it) return;
239
240    elm_gengrid_item_bring_in(it);
241 }
242
243 /* show last item */
244 static void
245 _show_last_clicked(void        *data,
246                    Evas_Object *obj __UNUSED__,
247                    void        *event_info __UNUSED__)
248 {
249    Elm_Gengrid_Item *it = elm_gengrid_last_item_get(data);
250
251    if (!it) return;
252
253    elm_gengrid_item_show(it);
254 }
255
256 /* disable selected item */
257 static void
258 _toggle_disabled_cb(void        *data,
259                     Evas_Object *obj __UNUSED__,
260                     void        *event_info __UNUSED__)
261 {
262    Elm_Gengrid_Item *it = elm_gengrid_selected_item_get(data);
263
264    if (!it) return;
265
266    elm_gengrid_item_selected_set(it, EINA_FALSE);
267    elm_gengrid_item_disabled_set(it, EINA_TRUE);
268 }
269
270 /* change items' size */
271 static void
272 _size_changed(void        *data,
273               Evas_Object *obj,
274               void        *event_info __UNUSED__)
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 */
283 static void
284 _double_click(void        *data __UNUSED__,
285               Evas_Object *obj __UNUSED__,
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 */
292 static void
293 _long_pressed(void        *data __UNUSED__,
294               Evas_Object *obj __UNUSED__,
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 */
302 static char *
303 _grid_label_get(void        *data,
304                 Evas_Object *obj __UNUSED__,
305                 const char  *part __UNUSED__)
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 */
315 static 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", PACKAGE_DATA_DIR,
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 */
349 static Eina_Bool
350 _grid_state_get(void        *data __UNUSED__,
351                 Evas_Object *obj __UNUSED__,
352                 const char  *part __UNUSED__)
353 {
354    return EINA_FALSE;
355 }
356
357 /* deletion callback */
358 static void
359 _grid_del(void        *data,
360           Evas_Object *obj __UNUSED__)
361 {
362    Example_Item *it = data;
363
364    eina_stringshare_del(it->path);
365    free(it);
366 }
367
368 /* scrolling animation stopped callback */
369 static void
370 _grid_scroll_stopped_cb(void        *data __UNUSED__,
371                         Evas_Object *obj,
372                         void        *event_info __UNUSED__)
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 */
381 static void
382 _h_align_change_cb(void        *data,
383                    Evas_Object *obj,
384                    void        *event_info __UNUSED__)
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
395 static void
396 _v_align_change_cb(void        *data,
397                    Evas_Object *obj,
398                    void        *event_info __UNUSED__)
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 */
410 static void
411 _page_change_cb(void        *data,
412                 Evas_Object *obj,
413                 void        *event_info __UNUSED__)
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
422 int
423 elm_main(int    argc __UNUSED__,
424          char **argv __UNUSED__)
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    win = elm_win_add(NULL, "gengrid", ELM_WIN_BASIC);
434    elm_win_title_set(win, "Generic Grid Example");
435    evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
436
437    bg = elm_bg_add(win);
438    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
439    elm_win_resize_object_add(win, bg);
440    evas_object_show(bg);
441
442    bx = elm_box_add(win);
443    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
444    elm_win_resize_object_add(win, bx);
445    evas_object_show(bx);
446
447    grid = elm_gengrid_add(win);
448    elm_gengrid_item_size_set(grid, 150, 150);
449    evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
450    evas_object_size_hint_min_set(grid, 600, 500);
451    elm_box_pack_end(bx, grid);
452    evas_object_smart_callback_add(grid, "clicked,double", _double_click, NULL);
453    evas_object_smart_callback_add(grid, "longpressed", _long_pressed, NULL);
454    evas_object_show(grid);
455
456    hbx_1 = elm_box_add(win);
457    evas_object_size_hint_weight_set(hbx_1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
458    elm_box_horizontal_set(hbx_1, EINA_TRUE);
459    elm_box_pack_end(bx, hbx_1);
460    evas_object_show(hbx_1);
461
462    bt = elm_button_add(win);
463    elm_object_text_set(bt, "Append");
464    evas_object_smart_callback_add(bt, "clicked", _append_bt_clicked, grid);
465    elm_box_pack_end(hbx_1, bt);
466    evas_object_show(bt);
467
468    bt = elm_button_add(win);
469    elm_object_text_set(bt, "Prepend");
470    evas_object_smart_callback_add(bt, "clicked", _prepend_bt_clicked, grid);
471    elm_box_pack_end(hbx_1, bt);
472    evas_object_show(bt);
473
474    before_bt = elm_button_add(win);
475    elm_object_text_set(before_bt, "Insert before");
476    evas_object_smart_callback_add(before_bt, "clicked", _before_bt_clicked,
477                                   grid);
478    elm_box_pack_end(hbx_1, before_bt);
479    evas_object_show(before_bt);
480
481    after_bt = elm_button_add(win);
482    elm_object_text_set(after_bt, "Insert after");
483    evas_object_smart_callback_add(after_bt, "clicked", _after_bt_clicked, grid);
484    elm_box_pack_end(hbx_1, after_bt);
485    evas_object_show(after_bt);
486
487    bt = elm_button_add(win);
488    elm_object_text_set(bt, "Clear");
489    evas_object_smart_callback_add(bt, "clicked", _clear_cb, grid);
490    elm_box_pack_end(hbx_1, bt);
491    evas_object_show(bt);
492
493    bt = elm_button_add(win);
494    elm_object_text_set(bt, "Bring in 1st");
495    evas_object_smart_callback_add(bt, "clicked", _bring_1st_clicked, grid);
496    elm_box_pack_end(hbx_1, bt);
497    evas_object_show(bt);
498
499    bt = elm_button_add(win);
500    elm_object_text_set(bt, "Show last");
501    evas_object_smart_callback_add(bt, "clicked", _show_last_clicked, grid);
502    elm_box_pack_end(hbx_1, bt);
503    evas_object_show(bt);
504
505    sp = elm_spinner_add(win);
506    elm_spinner_min_max_set(sp, 10, 1024);
507    elm_spinner_value_set(sp, 150);
508    elm_spinner_label_format_set(sp, "Item size: %.0f");
509    evas_object_smart_callback_add(sp, "changed", _size_changed, grid);
510    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
511    elm_box_pack_end(hbx_1, sp);
512    evas_object_show(sp);
513
514    hbx_2 = elm_box_add(win);
515    evas_object_size_hint_weight_set(hbx_2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
516    elm_box_horizontal_set(hbx_2, EINA_TRUE);
517    elm_box_pack_end(bx, hbx_2);
518    evas_object_show(hbx_2);
519
520    bt = elm_button_add(win);
521    elm_object_text_set(bt, "Disable item");
522    evas_object_smart_callback_add(bt, "clicked", _toggle_disabled_cb, grid);
523    elm_box_pack_end(hbx_2, bt);
524    evas_object_show(bt);
525
526    ck = elm_check_add(win);
527    elm_object_text_set(ck, "Horizontal mode");
528    evas_object_smart_callback_add(ck, "changed", _horizontal_grid, grid);
529    elm_box_pack_end(hbx_2, ck);
530    evas_object_show(ck);
531
532    ck = elm_check_add(win);
533    elm_object_text_set(ck, "Always select");
534    evas_object_smart_callback_add(ck, "changed", _always_select_change, grid);
535    elm_box_pack_end(hbx_2, ck);
536    evas_object_show(ck);
537
538    ck = elm_check_add(win);
539    elm_gengrid_bounce_get(grid, &bounce, NULL);
540    elm_object_text_set(ck, "Bouncing");
541    elm_check_state_set(ck, bounce);
542    evas_object_smart_callback_add(ck, "changed", _bouncing_change, grid);
543    elm_box_pack_end(hbx_2, ck);
544    evas_object_show(ck);
545
546    ck = elm_check_add(win);
547    elm_object_text_set(ck, "Multi-selection");
548    elm_check_state_set(ck, elm_gengrid_multi_select_get(grid));
549    evas_object_smart_callback_add(ck, "changed", _multi_change, grid);
550    elm_box_pack_end(hbx_2, ck);
551    evas_object_show(ck);
552
553    ck = elm_check_add(win);
554    elm_object_text_set(ck, "No selection");
555    evas_object_smart_callback_add(ck, "changed", _no_sel_change, grid);
556    elm_box_pack_end(hbx_2, ck);
557    evas_object_show(ck);
558
559    hbx_3 = elm_box_add(win);
560    evas_object_size_hint_weight_set(hbx_3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
561    elm_box_horizontal_set(hbx_3, EINA_TRUE);
562    elm_box_pack_end(bx, hbx_3);
563    evas_object_show(hbx_3);
564
565    elm_gengrid_align_get(grid, &h, &v);
566    evas_object_smart_callback_add(grid, "scroll,anim,stop", _grid_scroll_stopped_cb, NULL);
567
568    sl = elm_slider_add(win);
569    elm_object_text_set(sl, "Horiz. alignment");
570    elm_slider_span_size_set(sl, 100);
571    evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
572    evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
573    elm_slider_indicator_format_set(sl, "%1.1f");
574    elm_slider_value_set(sl, h);
575    elm_box_pack_end(hbx_3, sl);
576    evas_object_show(sl);
577
578    evas_object_smart_callback_add(sl, "changed", _h_align_change_cb, grid);
579
580    sl = elm_slider_add(win);
581    elm_object_text_set(sl, "Vert. alignment");
582    elm_slider_span_size_set(sl, 100);
583    evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
584    evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
585    elm_slider_indicator_format_set(sl, "%1.1f");
586    elm_slider_value_set(sl, v);
587    elm_box_pack_end(hbx_3, sl);
588    evas_object_show(sl);
589
590    evas_object_smart_callback_add(sl, "changed", _v_align_change_cb, grid);
591
592    elm_gengrid_align_get(grid, &h, &v);
593
594    sl = elm_slider_add(win);
595    elm_object_text_set(sl, "Page rel. size");
596    elm_slider_span_size_set(sl, 100);
597    evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
598    evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
599    elm_slider_indicator_format_set(sl, "%1.1f");
600    elm_slider_value_set(sl, h);
601    elm_box_pack_end(hbx_3, sl);
602    evas_object_show(sl);
603
604    _page_change_cb(grid, sl, NULL);
605    evas_object_smart_callback_add(sl, "changed", _page_change_cb, grid);
606
607    gic.item_style = "default";
608    gic.func.label_get = _grid_label_get;
609    gic.func.content_get = _grid_content_get;
610    gic.func.state_get = _grid_state_get;
611    gic.func.del = _grid_del;
612
613    _append_bt_clicked(grid, NULL, NULL);
614    _append_bt_clicked(grid, NULL, NULL);
615    _append_bt_clicked(grid, NULL, NULL);
616
617    evas_object_resize(win, 600, 600);
618    evas_object_show(win);
619
620    elm_run();
621    return 0;
622 }
623
624 ELM_MAIN()