From: Hyoyoung Chang <hyoyoung@gmail.com>
[framework/uifw/elementary.git] / src / bin / test_gengrid.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6 typedef struct _Testitem
7 {
8    Elm_Object_Item *item;
9    const char *path;
10    int mode;
11    int onoff;
12 } Testitem;
13
14 static const char *img[9] =
15 {
16    "panel_01.jpg",
17    "plant_01.jpg",
18    "rock_01.jpg",
19    "rock_02.jpg",
20    "sky_01.jpg",
21    "sky_02.jpg",
22    "sky_03.jpg",
23    "sky_04.jpg",
24    "wood_01.jpg",
25 };
26
27 static Elm_Gengrid_Item_Class *gic;
28 static Elm_Gengrid_Item_Class ggic;
29
30 static void
31 _horizontal_grid(void *data, Evas_Object *obj, void *event_info __UNUSED__)
32 {
33    Evas_Object *grid = data;
34    elm_gengrid_horizontal_set(grid, elm_check_state_get(obj));
35 }
36
37 static void
38 grid_drag_up(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
39 {
40    printf("Drag up: %p\n", event_info);
41 }
42
43 static void
44 grid_drag_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
45 {
46    printf("Drag right: %p\n", event_info);
47 }
48
49 static void
50 grid_drag_down(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
51 {
52    printf("Drag down: %p\n", event_info);
53 }
54
55 static void
56 grid_drag_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
57 {
58    printf("Drag left: %p\n", event_info);
59 }
60
61 static void
62 grid_drag_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
63 {
64    printf("Drag stop: %p\n", event_info);
65 }
66
67 static void
68 grid_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
69 {
70    printf("Selected: %p\n", event_info);
71 }
72
73 static void
74 grid_double_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
75 {
76    printf("Double clicked: %p\n", event_info);
77 }
78
79 static void
80 grid_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
81 {
82    printf("longpress %p\n", event_info);
83 }
84
85 static void
86 grid_moved(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
87 {
88    printf("moved %p\n", event_info);
89 }
90
91 static void
92 grid_item_check_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__)
93 {
94    Testitem *ti = data;
95    ti->onoff = elm_check_state_get(obj);
96    printf("item %p onoff = %i\n", ti, ti->onoff);
97 }
98
99 char *
100 grid_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
101 {
102    const Testitem *ti = data;
103    char buf[256];
104    snprintf(buf, sizeof(buf), "Photo %s", ti->path);
105    return strdup(buf);
106 }
107
108 Evas_Object *
109 grid_content_get(void *data, Evas_Object *obj, const char *part)
110 {
111    const Testitem *ti = data;
112    if (!strcmp(part, "elm.swallow.icon"))
113      {
114         Evas_Object *icon = elm_bg_add(obj);
115         elm_bg_file_set(icon, ti->path, NULL);
116         evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
117         evas_object_show(icon);
118         return icon;
119      }
120    else if (!strcmp(part, "elm.swallow.end"))
121      {
122         Evas_Object *ck;
123         ck = elm_check_add(obj);
124         evas_object_propagate_events_set(ck, 0);
125         elm_check_state_set(ck, ti->onoff);
126         evas_object_smart_callback_add(ck, "changed", grid_item_check_changed, data);
127         evas_object_show(ck);
128         return ck;
129      }
130    return NULL;
131 }
132
133 Eina_Bool
134 grid_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
135 {
136    return EINA_FALSE;
137 }
138
139 void
140 grid_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
141 {
142 }
143
144 static void
145 grid_sel(void *data, Evas_Object *obj, void *event_info)
146 {
147    printf("sel item data [%p] on grid obj [%p], pointer [%p]\n", data, obj, event_info);
148 }
149
150 void
151 test_gengrid(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
152 {
153    Evas_Object *win, *bg, *grid;
154    static Testitem ti[144];
155    int i, n;
156    char buf[PATH_MAX];
157
158    win = elm_win_add(NULL, "gengrid", ELM_WIN_BASIC);
159    elm_win_title_set(win, "GenGrid");
160    elm_win_autodel_set(win, EINA_TRUE);
161
162    bg = elm_bg_add(win);
163    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
164    elm_win_resize_object_add(win, bg);
165    evas_object_show(bg);
166
167    grid = elm_gengrid_add(win);
168    elm_gengrid_item_size_set(grid, 150, 150);
169    elm_gengrid_horizontal_set(grid, EINA_FALSE);
170    elm_gengrid_multi_select_set(grid, EINA_TRUE);
171    elm_gengrid_reorder_mode_set(grid, EINA_TRUE);
172    evas_object_smart_callback_add(grid, "selected", grid_selected, NULL);
173    evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL);
174    evas_object_smart_callback_add(grid, "longpressed", grid_longpress, NULL);
175    evas_object_smart_callback_add(grid, "moved", grid_moved, NULL);
176    evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL);
177    evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL);
178    evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL);
179    evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL);
180    evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL);
181    evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
182
183    gic = elm_gengrid_item_class_new();
184    gic->item_style = "default";
185    gic->func.text_get = grid_text_get;
186    gic->func.content_get = grid_content_get;
187    gic->func.state_get = grid_state_get;
188    gic->func.del = grid_del;
189
190    n = 0;
191    for (i = 0; i < 12 * 12; i++)
192      {
193         snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
194         n = (n + 1) % 9;
195         ti[i].mode = i;
196         ti[i].path = eina_stringshare_add(buf);
197         ti[i].item = elm_gengrid_item_append(grid, gic, &(ti[i]), grid_sel, NULL);
198         if (!(i % 5))
199           elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE);
200      }
201
202    elm_gengrid_item_class_free(gic);
203
204    evas_object_show(grid);
205    elm_win_resize_object_add(win, grid);
206
207    evas_object_resize(win, 600, 600);
208    evas_object_show(win);
209 }
210
211 static void
212 _before_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
213 {
214    Testitem *ti;
215    Evas_Object *grid = data;
216    Elm_Object_Item *sel;
217    char buf[PATH_MAX];
218
219    sel = elm_gengrid_selected_item_get(grid);
220    if (!sel)
221        return;
222    snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]);
223    ti = malloc(sizeof(*ti));
224    ti->mode = 0;
225    ti->path = eina_stringshare_add(buf);
226    ti->item = elm_gengrid_item_insert_before(grid, gic, ti, sel, grid_sel,
227                                              NULL);
228 }
229
230 static void
231 _after_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
232 {
233    Testitem *ti;
234    Evas_Object *grid = data;
235    Elm_Object_Item *sel;
236    char buf[PATH_MAX];
237
238    sel = elm_gengrid_selected_item_get(grid);
239    if (!sel)
240        return;
241    snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]);
242    ti = malloc(sizeof(*ti));
243    ti->mode = 0;
244    ti->path = eina_stringshare_add(buf);
245    ti->item = elm_gengrid_item_insert_after(grid, gic, ti, sel, grid_sel,
246                                             NULL);
247 }
248
249 static void
250 _delete_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
251 {
252    Evas_Object *grid = data;
253    Eina_List *l, *l2, *l3;
254    Elm_Object_Item *gg_it;
255
256    l = (Eina_List*)elm_gengrid_selected_items_get(grid);
257    if (!l) return;
258    EINA_LIST_FOREACH_SAFE(l, l2, l3, gg_it)
259      elm_object_item_del(gg_it);
260 }
261
262 static void
263 _prepend_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
264 {
265    Testitem *ti;
266    Evas_Object *grid = data;
267    char buf[PATH_MAX];
268
269    snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]);
270    ti = malloc(sizeof(*ti));
271    ti->mode = 0;
272    ti->path = eina_stringshare_add(buf);
273    ti->item = elm_gengrid_item_prepend(grid, gic, ti, grid_sel, NULL);
274 }
275
276 static void
277 _append_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
278 {
279    Testitem *ti;
280    Evas_Object *grid = data;
281    char buf[PATH_MAX];
282
283    snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]);
284    ti = malloc(sizeof(*ti));
285    ti->mode = 0;
286    ti->path = eina_stringshare_add(buf);
287    ti->item = elm_gengrid_item_append(grid, gic, ti, grid_sel, NULL);
288 }
289
290 static void
291 _size_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__)
292 {
293    Evas_Object *grid = data;
294    int size = elm_spinner_value_get(obj);
295    elm_gengrid_item_size_set(grid, size, size);
296 }
297
298 void
299 test_gengrid2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
300 {
301    Evas_Object *win, *bg, *grid, *bx, *hbx, *bt, *ck;
302
303    win = elm_win_add(NULL, "gengrid2", ELM_WIN_BASIC);
304    elm_win_title_set(win, "GenGrid2");
305    elm_win_autodel_set(win, EINA_TRUE);
306
307    bg = elm_bg_add(win);
308    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
309    elm_win_resize_object_add(win, bg);
310    evas_object_show(bg);
311
312    bx = elm_box_add(win);
313    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
314    elm_win_resize_object_add(win, bx);
315    evas_object_show(bx);
316
317    grid = elm_gengrid_add(win);
318    elm_gengrid_item_size_set(grid, 150, 150);
319    elm_gengrid_horizontal_set(grid, EINA_FALSE);
320    elm_gengrid_multi_select_set(grid, EINA_FALSE);
321    evas_object_smart_callback_add(grid, "selected", grid_selected, NULL);
322    evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
323    evas_object_size_hint_min_set(grid, 600, 500);
324    elm_box_pack_end(bx, grid);
325    evas_object_show(grid);
326
327    hbx = elm_box_add(win);
328    evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
329    elm_box_horizontal_set(hbx, EINA_TRUE);
330    elm_box_pack_end(bx, hbx);
331    evas_object_show(hbx);
332
333    bt = elm_button_add(win);
334    elm_object_text_set(bt, "Append");
335    evas_object_smart_callback_add(bt, "clicked", _append_bt_clicked, grid);
336    elm_box_pack_end(hbx, bt);
337    evas_object_show(bt);
338
339    bt = elm_button_add(win);
340    elm_object_text_set(bt, "Prepend");
341    evas_object_smart_callback_add(bt, "clicked", _prepend_bt_clicked, grid);
342    elm_box_pack_end(hbx, bt);
343    evas_object_show(bt);
344
345    bt = elm_button_add(win);
346    elm_object_text_set(bt, "Insert before");
347    evas_object_smart_callback_add(bt, "clicked", _before_bt_clicked, grid);
348    elm_box_pack_end(hbx, bt);
349    evas_object_show(bt);
350
351    bt = elm_button_add(win);
352    elm_object_text_set(bt, "Insert after");
353    evas_object_smart_callback_add(bt, "clicked", _after_bt_clicked, grid);
354    elm_box_pack_end(hbx, bt);
355    evas_object_show(bt);
356
357    bt = elm_button_add(win);
358    elm_object_text_set(bt, "Delete");
359    evas_object_smart_callback_add(bt, "clicked", _delete_bt_clicked, grid);
360    elm_box_pack_end(hbx, bt);
361    evas_object_show(bt);
362
363    bt = elm_spinner_add(win);
364    elm_spinner_min_max_set(bt, 10, 1024);
365    elm_spinner_value_set(bt, 150);
366    elm_spinner_label_format_set(bt, "Item size: %.0f");
367    evas_object_smart_callback_add(bt, "changed", _size_changed, grid);
368    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
369    elm_box_pack_end(hbx, bt);
370    evas_object_show(bt);
371
372    ck = elm_check_add(win);
373    elm_object_text_set(ck, "Horizontal Mode");
374    evas_object_smart_callback_add(ck, "changed", _horizontal_grid, grid);
375    elm_box_pack_end(hbx, ck);
376    evas_object_show(ck);
377
378    gic = elm_gengrid_item_class_new();
379
380    gic->item_style = "default";
381    gic->func.text_get = grid_text_get;
382    gic->func.content_get = grid_content_get;
383    gic->func.state_get = grid_state_get;
384    gic->func.del = grid_del;
385
386    /* item_class_ref is needed for gic. some items can be added in callbacks */
387    elm_gengrid_item_class_ref(gic);
388    elm_gengrid_item_class_free(gic);
389
390    evas_object_resize(win, 600, 600);
391    evas_object_show(win);
392 }
393
394 void
395 test_gengrid3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
396 {
397    Evas_Object *win, *bg, *grid;
398    static Testitem ti[144];
399    int i, n;
400    char buf[PATH_MAX];
401
402    win = elm_win_add(NULL, "gengrid_group", ELM_WIN_BASIC);
403    elm_win_title_set(win, "GenGrid Group");
404    elm_win_autodel_set(win, EINA_TRUE);
405
406    bg = elm_bg_add(win);
407    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
408    elm_win_resize_object_add(win, bg);
409    evas_object_show(bg);
410
411    grid = elm_gengrid_add(win);
412    elm_gengrid_item_size_set(grid, 150, 150);
413    elm_gengrid_group_item_size_set(grid, 31, 31);
414    //elm_gengrid_horizontal_set(grid, EINA_TRUE);
415    elm_gengrid_horizontal_set(grid, EINA_FALSE);
416    elm_gengrid_multi_select_set(grid, EINA_TRUE);
417    elm_gengrid_reorder_mode_set(grid, EINA_TRUE);
418    evas_object_smart_callback_add(grid, "selected", grid_selected, NULL);
419    evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL);
420    evas_object_smart_callback_add(grid, "longpressed", grid_longpress, NULL);
421    evas_object_smart_callback_add(grid, "moved", grid_moved, NULL);
422    evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL);
423    evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL);
424    evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL);
425    evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL);
426    evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL);
427    evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
428
429    gic = elm_gengrid_item_class_new();
430    gic->item_style = "default";
431    gic->func.text_get = grid_text_get;
432    gic->func.content_get = grid_content_get;
433    gic->func.state_get = grid_state_get;
434    gic->func.del = grid_del;
435
436    ggic.item_style = "group_index";
437    ggic.func.text_get = grid_text_get;
438    ggic.func.content_get = NULL;
439    ggic.func.state_get = NULL;
440    ggic.func.del = NULL;
441
442    n = 0;
443    for (i = 0; i < 12 * 12; i++)
444      {
445         snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
446         n = (n + 1) % 9;
447         ti[i].mode = i;
448         ti[i].path = eina_stringshare_add(buf);
449         if (i == 0 || i == 18 || i == 53 || i == 100)
450           //if (i == 0 || i == 18)
451           ti[i].item = elm_gengrid_item_append(grid, &ggic, &(ti[i]), grid_sel, NULL);
452         else
453           ti[i].item = elm_gengrid_item_append(grid, gic, &(ti[i]), grid_sel, NULL);
454         if (!(i % 5))
455           elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE);
456      }
457    elm_gengrid_item_class_free(gic);
458
459    evas_object_show(grid);
460    elm_win_resize_object_add(win, grid);
461
462    evas_object_resize(win, 600, 600);
463    evas_object_show(win);
464 }
465
466 #endif