seriously file globbing. another day would have been much better.
[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 = NULL;
39 static 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    if (always)
70      elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS);
71    else
72      elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DEFAULT);
73
74    fprintf(stdout, "\"Always select\" mode for gengrid items is now %s\n",
75            always ? "on" : "off");
76 }
77
78 /* "bouncing mode" callback */
79 static void
80 _bouncing_change(void        *data,
81                  Evas_Object *obj,
82                  void        *event_info __UNUSED__)
83 {
84    Evas_Object *grid = data;
85    Eina_Bool bounce = elm_check_state_get(obj);
86
87    elm_gengrid_bounce_set(grid, bounce, bounce);
88
89    fprintf(stdout, "Bouncing effect for gengrid is now %s\n",
90            bounce ? "on" : "off");
91 }
92
93 /* multi-selection callback */
94 static void
95 _multi_change(void        *data,
96               Evas_Object *obj,
97               void        *event_info __UNUSED__)
98 {
99    Evas_Object *grid = data;
100    Eina_Bool multi = elm_check_state_get(obj);
101
102    elm_gengrid_multi_select_set(grid, multi);
103
104    fprintf(stdout, "Multi-selection for gengrid is now %s\n",
105            multi ? "on" : "off");
106
107    elm_object_disabled_set(before_bt, multi);
108    elm_object_disabled_set(after_bt, multi);
109
110    if (!multi)
111      {
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);
116      }
117 }
118
119 /* no selection callback */
120 static void
121 _no_sel_change(void        *data,
122                Evas_Object *obj,
123                void        *event_info __UNUSED__)
124 {
125    Evas_Object *grid = data;
126    Eina_Bool no_sel = elm_check_state_get(obj);
127
128    if (no_sel)
129      elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_NONE);
130    else
131      elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DEFAULT);
132
133    fprintf(stdout, "Selection for gengrid items is now %s\n",
134            no_sel ? "disabled" : "enabled");
135 }
136
137 /* item selection callback */
138 static void
139 _grid_sel(void        *data,
140           Evas_Object *obj __UNUSED__,
141           void        *event_info)
142 {
143    unsigned int x, y;
144    Example_Item *it = elm_object_item_data_get(event_info);
145
146    elm_gengrid_item_pos_get(event_info, &x, &y);
147
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);
150 }
151
152 /* new item with random path */
153 static Example_Item *
154 _item_new(void)
155 {
156    Example_Item *it;
157
158    it = malloc(sizeof(*it));
159    it->path = eina_stringshare_add(imgs[rand() % (sizeof(imgs) /
160                                                   sizeof(imgs[0]))]);
161    return it;
162 }
163
164 /* "insert before" callback */
165 static void
166 _before_bt_clicked(void        *data,
167                    Evas_Object *obj __UNUSED__,
168                    void        *event_info __UNUSED__)
169 {
170    Example_Item *it;
171    Evas_Object *grid = data;
172    Elm_Object_Item *sel;
173
174    sel = elm_gengrid_selected_item_get(grid);
175    if (!sel)
176      return;
177
178    it = _item_new();
179    elm_gengrid_item_insert_before(grid, gic, it, sel, _grid_sel, NULL);
180 }
181
182 /* "insert after" callback */
183 static void
184 _after_bt_clicked(void        *data,
185                   Evas_Object *obj __UNUSED__,
186                   void        *event_info __UNUSED__)
187 {
188    Example_Item *it;
189    Evas_Object *grid = data;
190    Elm_Object_Item *sel;
191
192    sel = elm_gengrid_selected_item_get(grid);
193    if (!sel)
194      return;
195
196    it = _item_new();
197    elm_gengrid_item_insert_after(grid, gic, it, sel, _grid_sel, NULL);
198 }
199
200 /* prepend an item */
201 static void
202 _prepend_bt_clicked(void        *data,
203                     Evas_Object *obj __UNUSED__,
204                     void        *event_info __UNUSED__)
205 {
206    Example_Item *it;
207    Evas_Object *grid = data;
208
209    it = _item_new();
210    elm_gengrid_item_prepend(grid, gic, it, _grid_sel, NULL);
211 }
212
213 /* append an item */
214 static void
215 _append_bt_clicked(void        *data,
216                    Evas_Object *obj __UNUSED__,
217                    void        *event_info __UNUSED__)
218 {
219    Evas_Object *grid = data;
220    Example_Item *it = _item_new();
221
222    elm_gengrid_item_append(grid, gic, it, _grid_sel, NULL);
223 }
224
225 /* delete items */
226 static void
227 _clear_cb(void        *data,
228           Evas_Object *obj __UNUSED__,
229           void        *event_info __UNUSED__)
230 {
231    elm_gengrid_clear(data);
232
233    fprintf(stdout, "Clearing the grid!\n");
234 }
235
236 /* bring in 1st item */
237 static void
238 _bring_1st_clicked(void        *data,
239                    Evas_Object *obj __UNUSED__,
240                    void        *event_info __UNUSED__)
241 {
242    Elm_Object_Item *gg_it = elm_gengrid_first_item_get(data);
243
244    if (!gg_it) return;
245
246    elm_gengrid_item_bring_in(gg_it, ELM_GENGRID_ITEM_SCROLLTO_IN);
247 }
248
249 /* show last item */
250 static void
251 _show_last_clicked(void        *data,
252                    Evas_Object *obj __UNUSED__,
253                    void        *event_info __UNUSED__)
254 {
255    Elm_Object_Item *gg_it = elm_gengrid_last_item_get(data);
256
257    if (!gg_it) return;
258
259    elm_gengrid_item_show(gg_it, ELM_GENGRID_ITEM_SCROLLTO_IN);
260 }
261
262 /* disable selected item */
263 static void
264 _toggle_disabled_cb(void        *data,
265                     Evas_Object *obj __UNUSED__,
266                     void        *event_info __UNUSED__)
267 {
268    Elm_Object_Item *gg_it = elm_gengrid_selected_item_get(data);
269
270    if (!gg_it) return;
271
272    elm_gengrid_item_selected_set(gg_it, EINA_FALSE);
273    elm_object_item_disabled_set(gg_it, EINA_TRUE);
274 }
275
276 /* change items' size */
277 static void
278 _size_changed(void        *data,
279               Evas_Object *obj,
280               void        *event_info __UNUSED__)
281 {
282    Evas_Object *grid = data;
283    int size = elm_spinner_value_get(obj);
284
285    elm_gengrid_item_size_set(grid, size, size);
286 }
287
288 /* item double click callback */
289 static void
290 _double_click(void        *data __UNUSED__,
291               Evas_Object *obj __UNUSED__,
292               void        *event_info)
293 {
294    fprintf(stdout, "Double click on item with handle %p\n", event_info);
295 }
296
297 /* item long press callback */
298 static void
299 _long_pressed(void        *data __UNUSED__,
300               Evas_Object *obj __UNUSED__,
301               void        *event_info)
302 {
303    fprintf(stdout, "Long press on item with handle %p\n", event_info);
304 }
305
306
307 /* label fetching callback */
308 static char *
309 _grid_label_get(void        *data,
310                 Evas_Object *obj __UNUSED__,
311                 const char  *part __UNUSED__)
312 {
313    const Example_Item *it = data;
314    char buf[256];
315
316    snprintf(buf, sizeof(buf), "Photo %s", it->path);
317    return strdup(buf);
318 }
319
320 /* icon fetching callback */
321 static Evas_Object *
322 _grid_content_get(void        *data,
323                Evas_Object *obj,
324                const char  *part)
325 {
326    const Example_Item *it = data;
327
328    if (!strcmp(part, "elm.swallow.icon"))
329      {
330         Evas_Object *icon = elm_bg_add(obj);
331         char buf[PATH_MAX];
332
333         snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR,
334                  it->path);
335
336         elm_bg_file_set(icon, buf, NULL);
337         evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1,
338                                          1);
339         evas_object_show(icon);
340         return icon;
341      }
342    else if (!strcmp(part, "elm.swallow.end"))
343      {
344         Evas_Object *ck;
345         ck = elm_check_add(obj);
346         evas_object_propagate_events_set(ck, EINA_FALSE);
347         evas_object_show(ck);
348         return ck;
349      }
350
351    return NULL;
352 }
353
354 /* state fetching callback */
355 static Eina_Bool
356 _grid_state_get(void        *data __UNUSED__,
357                 Evas_Object *obj __UNUSED__,
358                 const char  *part __UNUSED__)
359 {
360    return EINA_FALSE;
361 }
362
363 /* deletion callback */
364 static void
365 _grid_del(void        *data,
366           Evas_Object *obj __UNUSED__)
367 {
368    Example_Item *it = data;
369
370    eina_stringshare_del(it->path);
371    free(it);
372 }
373
374 /* scrolling animation stopped callback */
375 static void
376 _grid_scroll_stopped_cb(void        *data __UNUSED__,
377                         Evas_Object *obj,
378                         void        *event_info __UNUSED__)
379 {
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);
384 }
385
386 /* items grid horizontal alignment change */
387 static void
388 _h_align_change_cb(void        *data,
389                    Evas_Object *obj,
390                    void        *event_info __UNUSED__)
391 {
392    double v_align;
393    double val = elm_slider_value_get(obj);
394
395    elm_gengrid_align_get(data, NULL, &v_align);
396
397    fprintf(stdout, "Setting horizontal alignment to %f\n", val);
398    elm_gengrid_align_set(data, val, v_align);
399 }
400
401 static void
402 _v_align_change_cb(void        *data,
403                    Evas_Object *obj,
404                    void        *event_info __UNUSED__)
405 {
406    double h_align;
407    double val = elm_slider_value_get(obj);
408
409    elm_gengrid_align_get(data, &h_align, NULL);
410
411    fprintf(stdout, "Setting vertical alignment to %f\n", val);
412    elm_gengrid_align_set(data, h_align, val);
413 }
414
415 /* page relative size change */
416 static void
417 _page_change_cb(void        *data,
418                 Evas_Object *obj,
419                 void        *event_info __UNUSED__)
420 {
421    double val = elm_slider_value_get(obj);
422
423    elm_gengrid_page_relative_set(data, val, val);
424
425    fprintf(stdout, "Setting grid page's relative size to %f\n", val);
426 }
427
428 int
429 elm_main(int    argc __UNUSED__,
430          char **argv __UNUSED__)
431 {
432    Evas_Object *win, *bg, *grid, *bx, *hbx_1, *hbx_2, *hbx_3, *bt, *ck, *sl,
433    *sp;
434    Eina_Bool bounce;
435    double h, v;
436
437    srand(time(NULL));
438
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);
442
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);
447
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);
452
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);
461
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);
467
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);
473
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);
479
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,
483                                   grid);
484    elm_box_pack_end(hbx_1, before_bt);
485    evas_object_show(before_bt);
486
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);
492
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);
498
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);
504
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);
510
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);
519
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);
525
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);
531
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);
537
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);
543
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);
551
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);
558
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);
564
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);
570
571    elm_gengrid_align_get(grid, &h, &v);
572    evas_object_smart_callback_add(grid, "scroll,anim,stop", _grid_scroll_stopped_cb, NULL);
573
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);
583
584    evas_object_smart_callback_add(sl, "changed", _h_align_change_cb, grid);
585
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);
595
596    evas_object_smart_callback_add(sl, "changed", _v_align_change_cb, grid);
597
598    elm_gengrid_align_get(grid, &h, &v);
599
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);
609
610    _page_change_cb(grid, sl, NULL);
611    evas_object_smart_callback_add(sl, "changed", _page_change_cb, grid);
612
613    if (!gic)
614      {
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
622
623    _append_bt_clicked(grid, NULL, NULL);
624    _append_bt_clicked(grid, NULL, NULL);
625    _append_bt_clicked(grid, NULL, NULL);
626
627    evas_object_resize(win, 600, 600);
628    evas_object_show(win);
629
630    elm_run();
631    return 0;
632 }
633
634 ELM_MAIN()