1 #include <Elementary_Cursor.h>
2 #include "test.h"
3 #ifdef HAVE_CONFIG_H
4 #include "elementary_config.h"
5 #endif
6
7 #ifdef _WIN32
8 # include <evil_private.h> /* strcasestr */
9 #endif
10
11 #include <Elementary.h>
12
13 #include "test_explode.h"
14
15 Evas_Object * _elm_min_set(Evas_Object *obj, Evas_Object *parent,
16 Evas_Coord w, Evas_Coord h);
17
18 struct _api_data
19 {
20 unsigned int state; /* What state we are testing */
21 void *box; /* Use this to get box content */
22
23 Elm_Genlist_Item_Class *itc;
24 Elm_Genlist_Item_Class *itc1;
25 Elm_Genlist_Item_Class *itc2;
26 void *gl;
27
28 void *filter_data; /* The data used for filtering */
29 Elm_Genlist_Item_Scrollto_Type type;
30 Elm_List_Mode mode;
31 int max_items, show_item;
32 int scrollto;
33 };
34 typedef struct _api_data api_data;
35
36 enum _api_state
37 {
38 HORIZONTAL_SET,
39 NO_SELECT_MODE_SET,
40 COMPRESS_MODE_SET,
41 BOUNCE_SET,
42 HOMOGENEOUS_SET,
43 SCROLLER_POLICY_SET,
44 TOOLTIP_TEXT_SET,
45 ITEM_CURSOR_SET,
46 ITEM_STYLE_SET,
47 API_STATE_LAST
48 };
49 typedef enum _api_state api_state;
50
51 static int bounce_max = 50;
52
53 static void
set_api_state(api_data * api)54 set_api_state(api_data *api)
55 {
56 const Eina_List *items = elm_box_children_get(api->box);
57 if (!eina_list_count(items))
58 return;
59
60 Evas_Object *gl = eina_list_nth(items, 0); /* Genlist is the first item */
61 /* use elm_box_children_get() to get list of children */
62 switch(api->state)
63 {/* Put all api-changes under switch */
64 case HORIZONTAL_SET: /* 0 */
65 elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
66 break;
67
68 case NO_SELECT_MODE_SET: /* 1 */
69 elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_NONE);
70 elm_genlist_mode_set(gl, ELM_LIST_SCROLL); /* Back to default */
71 break;
72
73 case COMPRESS_MODE_SET: /* 2 */
74 elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_DEFAULT);
75 elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
76 break;
77
78 case BOUNCE_SET: /* 3 */
79 elm_scroller_bounce_set(gl, EINA_FALSE, EINA_FALSE);
80 break;
81
82 case HOMOGENEOUS_SET: /* 4 */
83 elm_scroller_bounce_set(gl, EINA_TRUE, EINA_TRUE); /* Back to default */
84 elm_genlist_homogeneous_set(gl, EINA_TRUE);
85 break;
86
87 case SCROLLER_POLICY_SET: /* 5 */
88 elm_genlist_homogeneous_set(gl, EINA_FALSE); /* Back to default */
89 elm_scroller_policy_set(gl, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
90 break;
91
92 case TOOLTIP_TEXT_SET: /* 6 */
93 {
94 elm_genlist_item_tooltip_text_set(elm_genlist_first_item_get(gl), "Tooltip text from API");
95 elm_genlist_item_bring_in(elm_genlist_first_item_get(gl),
96 ELM_GENLIST_ITEM_SCROLLTO_IN);
97 }
98 break;
99
100 case ITEM_CURSOR_SET: /* 7 */
101 elm_genlist_item_cursor_set(elm_genlist_first_item_get(gl), ELM_CURSOR_HAND2);
102 break;
103
104 case ITEM_STYLE_SET: /* 8 */
105 elm_object_item_style_set(elm_genlist_first_item_get(gl), "double_label");
106 break;
107 default:
108 return;
109 }
110 }
111
112 static void
_api_bt_clicked(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)113 _api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
114 { /* Will add here a SWITCH command containing code to modify test-object */
115 /* in accordance a->state value. */
116 api_data *a = data;
117 char str[128];
118
119 INF("clicked event on API Button: api_state=<%d>", a->state);
120 set_api_state(a);
121 a->state++;
122 sprintf(str, "Next API function (%u)", a->state);
123 elm_object_text_set(obj, str);
124 elm_object_disabled_set(obj, a->state == API_STATE_LAST);
125 }
126 /* Hint:
127 * In this example some calls to elm_genlist_item_append() are used which give the
128 * value of an int as 'item data' and 'func data' after casting into (void*). For
129 * sure this works only on architectures where sizeof(int)==sizeof(void*).
130 * For real world usage you should hold a data structure or value in your
131 * application and then give only a pointer to this data as data pointer.
132 */
133
134 typedef struct _Testitem
135 {
136 Elm_Object_Item *item;
137 int mode;
138 int onoff;
139 Eina_Bool checked;
140 } Testitem;
141
142 static char *
gl_text_get1(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)143 gl_text_get1(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
144 {
145 char buf[256];
146 int num = (int)(uintptr_t)data;
147
148 snprintf(buf, sizeof(buf), "Item # %i", num);
149
150 return strdup(buf);
151 }
152
gl_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)153 Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
154 {
155 char buf[PATH_MAX];
156 Evas_Object *ic = elm_icon_add(obj);
157 if (!strcmp(part, "elm.swallow.end"))
158 snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
159 else
160 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
161 elm_image_file_set(ic, buf, NULL);
162 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
163 return ic;
164 }
165
on_bt_clicked(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)166 static void on_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
167 {
168 printf("button clicked\n");
169 }
170
on_ck_changed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)171 static void on_ck_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
172 {
173 printf("checkbox changed\n");
174 }
175
gl_content_full_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)176 Evas_Object *gl_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
177 {
178 Evas_Object *fr, *bx, *ic, *bt, *ck;
179
180 if (strcmp(part, "elm.swallow.content") != 0) return NULL;
181
182 fr = elm_frame_add(obj);
183 elm_layout_text_set(fr, NULL, "A Frame");
184
185 bx = elm_box_add(fr);
186 elm_box_horizontal_set(bx, EINA_TRUE);
187
188 ic = elm_icon_add(bx);
189 elm_icon_standard_set(ic, "go-home");
190 evas_object_size_hint_min_set(ic,
191 ELM_SCALE_SIZE(32),
192 ELM_SCALE_SIZE(32));
193 evas_object_size_hint_align_set(ic, 0.5, EVAS_HINT_FILL);
194 evas_object_show(ic);
195 elm_box_pack_end(bx, ic);
196
197 bt = elm_button_add(bx);
198 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
199 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
200 evas_object_smart_callback_add(bt, "clicked", on_bt_clicked, NULL);
201 elm_layout_text_set(bt, NULL, "Click Me");
202 evas_object_show(bt);
203 elm_box_pack_end(bx, bt);
204
205 ck = elm_check_add(bx);
206 evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
207 evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
208 evas_object_smart_callback_add(ck, "changed", on_ck_changed, NULL);
209 elm_layout_text_set(ck, NULL, "some checkbox");
210 evas_object_show(ck);
211 elm_box_pack_end(bx, ck);
212
213 elm_layout_content_set(fr, NULL, bx);
214
215 return fr;
216 }
217
218
gl_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)219 Eina_Bool gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
220 {
221 return EINA_FALSE;
222 }
223
gl_reusable_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part,Evas_Object * old)224 Evas_Object *gl_reusable_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part, Evas_Object *old)
225 {
226 if (old && !strcmp(part, "elm.swallow.end"))
227 {
228 // Reuse old content
229 // Here need to add initializing and state changing
230 // for cached content.
231 // printf("content reuse for cached content %p, %s\n", old, part);
232 return old;
233 }
234 else
235 {
236 // Create new content object for non-reused part.
237 //printf("content create in reuse %p, %s\n", old, part);
238 char buf[PATH_MAX];
239 Evas_Object *ic = elm_icon_add(obj);
240 if (!strcmp(part, "elm.swallow.end"))
241 snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
242 else
243 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
244 elm_image_file_set(ic, buf, NULL);
245 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
246 return ic;
247 }
248
249 // If return NULL value, content_get will be called to get new content.
250 // return NULL;
251 }
252
253 static void
gl_sel(void * data,Evas_Object * obj,void * event_info)254 gl_sel(void *data, Evas_Object *obj, void *event_info)
255 {
256 printf("sel item data [%p] on genlist obj [%p], item pointer [%p], index [%d]\n",
257 data, obj, event_info, elm_genlist_item_index_get(event_info));
258 }
259
260 static void
_move(void * data,Evas * evas EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)261 _move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
262 {
263 Evas_Object *gl = data;
264 Evas_Event_Mouse_Move *ev = event_info;
265 int where = 0;
266 Elm_Object_Item *gli;
267 gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where);
268 if (gli)
269 INF("<%s> over %p, where %i\n", __func__, elm_object_item_data_get(gli), where);
270 else
271 INF("<%s> over none, where %i\n", __func__,where);
272 }
273
274
275 /*** Genlist ***************************************************************/
276 static void
_bt50_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)277 _bt50_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
278 {
279 elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_IN);
280 }
281
282 static void
_bt1500_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)283 _bt1500_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
284 {
285 elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
286 }
287
288 static void
_gl_selected(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)289 _gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
290 {
291 printf("selected: %p\n", event_info);
292 }
293
294 static void
_gl_double_clicked(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)295 _gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
296 {
297 printf("double clicked: %p\n", event_info);
298 Elm_Object_Item *it = event_info;
299 if (!elm_genlist_item_pin_get(it))
300 elm_genlist_item_pin_set(it, EINA_TRUE);
301 else
302 elm_genlist_item_pin_set(it, EINA_FALSE);
303 }
304
305 static void
_gl_right_clicked(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)306 _gl_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
307 {
308 printf("right clicked: %p\n", event_info);
309 }
310
311 static void
_gl_longpress(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)312 _gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
313 {
314 printf("longpress %p\n", event_info);
315 }
316
317 static void
_gl_changed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)318 _gl_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
319 {
320 // printf("changed %p\n", event_info);
321 }
322
323 static void
_cleanup_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)324 _cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
325 {
326 api_data *api = (api_data *)data;
327 if (api->filter_data) free(api->filter_data);
328 free(api);
329 }
330
331 typedef struct
332 {
333 Evas_Object *gl;
334 Elm_Object_Item *it1, *it2;
335 int state;
336 } Bounce;
337
338 #ifdef CLOCK_PROCESS_CPUTIME_ID
339 static unsigned long long frames = 0;
340
341 static void
_bounce_cb_frame(void * data EINA_UNUSED,Evas * e EINA_UNUSED,void * event_info EINA_UNUSED)342 _bounce_cb_frame(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
343 {
344 frames++;
345 }
346 #endif
347
348 static Eina_Bool
_bounce_cb(void * data)349 _bounce_cb(void *data)
350 {
351 Bounce *bounce = data;
352 bounce->state++;
353 if (bounce->state & 0x1)
354 elm_genlist_item_bring_in(bounce->it2, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
355 else
356 elm_genlist_item_bring_in(bounce->it1, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
357
358 #ifdef CLOCK_PROCESS_CPUTIME_ID
359 static struct timespec t0;
360 if (bounce->state == 2)
361 {
362 evas_event_callback_add(evas_object_evas_get(bounce->gl),
363 EVAS_CALLBACK_RENDER_FLUSH_POST,
364 _bounce_cb_frame, NULL);
365 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t0);
366 }
367 #endif
368
369 if (bounce->state > bounce_max)
370 {
371 #ifdef CLOCK_PROCESS_CPUTIME_ID
372 struct timespec t;
373 unsigned long long tll, t0ll, tdll;
374
375 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t);
376 t0ll = (((unsigned long long)t0.tv_sec) * 1000000000ULL) + t0.tv_nsec;
377 tll = (((unsigned long long)t.tv_sec) * 1000000000ULL) + t.tv_nsec;
378 tdll = tll - t0ll;
379 printf("NS since 2 = %llu , %llu frames = %llu / frame\n",
380 tdll, frames, tdll / frames);
381 #endif
382 if (getenv("ELM_TEST_AUTOBOUNCE")) elm_exit();
383 }
384 return EINA_TRUE;
385 }
386
387 static void
_btbounce_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)388 _btbounce_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
389 {
390 Ecore_Timer *tim = evas_object_data_get(obj, "timer");
391 if (!tim)
392 {
393 _bounce_cb(data);
394 tim = ecore_timer_add(0.5, _bounce_cb, data);
395 evas_object_data_set(obj, "timer", tim);
396 }
397 }
398
399 static void
_btdel_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)400 _btdel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
401 {
402 Bounce *bounce = data;
403 Ecore_Timer *tim = evas_object_data_get(obj, "timer");
404 if (tim)
405 {
406 ecore_timer_del(tim);
407 evas_object_data_del(obj, "timer");
408 }
409 free(bounce);
410 }
411
412 void
test_genlist(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)413 test_genlist(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
414 {
415 Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
416 Evas_Object *over;
417 Elm_Object_Item *gli;
418 int i, max;
419 Bounce *bounce;
420 api_data *api = calloc(1, sizeof(api_data));
421
422 win = elm_win_util_standard_add("genlist", "Genlist");
423 elm_win_autodel_set(win, EINA_TRUE);
424 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
425
426 bxx = elm_box_add(win);
427 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
428 elm_win_resize_object_add(win, bxx);
429 evas_object_show(bxx);
430
431 bx = elm_box_add(win);
432 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
433 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
434 api->box = bx;
435 evas_object_show(bx);
436
437 bt = elm_button_add(win);
438 elm_object_text_set(bt, "Next API function");
439 evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
440 elm_box_pack_end(bxx, bt);
441 elm_object_disabled_set(bt, api->state == API_STATE_LAST);
442 evas_object_show(bt);
443
444 elm_box_pack_end(bxx, bx);
445
446 gl = elm_genlist_add(win);
447 evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
448 evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
449 evas_object_smart_callback_add(gl, "clicked,right", _gl_right_clicked, NULL);
450 evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
451 evas_object_smart_callback_add(gl, "changed", _gl_changed, NULL);
452 // FIXME: This causes genlist to resize the horiz axis very slowly :(
453 // Reenable this and resize the window horizontally, then try to resize it back
454 //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
455 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
456 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
457 elm_box_pack_end(bx, gl);
458 evas_object_show(gl);
459
460 over = evas_object_rectangle_add(evas_object_evas_get(win));
461 evas_object_color_set(over, 0, 0, 0, 0);
462 evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
463 evas_object_repeat_events_set(over, EINA_TRUE);
464 evas_object_show(over);
465 evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
466 elm_win_resize_object_add(win, over);
467
468 api->itc1 = elm_genlist_item_class_new();
469 api->itc1->item_style = "default";
470 api->itc1->func.text_get = gl_text_get1;
471 api->itc1->func.content_get = NULL; // gl_content_get;
472 api->itc1->func.state_get = gl_state_get;
473 api->itc1->func.del = NULL;
474 // use content_reuse function for reusing
475 // repeated content objects instead of content_get
476 api->itc1->func.reusable_content_get = gl_reusable_content_get;
477
478 bt_50 = elm_button_add(win);
479 elm_object_text_set(bt_50, "Go to 50");
480 evas_object_show(bt_50);
481 elm_box_pack_end(bx, bt_50);
482
483 bt_1500 = elm_button_add(win);
484 elm_object_text_set(bt_1500, "Go to 1500");
485 evas_object_show(bt_1500);
486 elm_box_pack_end(bx, bt_1500);
487
488 bounce = calloc(1, sizeof(Bounce));
489 bt = elm_button_add(win);
490 elm_object_text_set(bt, "Bounce");
491 evas_object_show(bt);
492 elm_box_pack_end(bx, bt);
493 bounce->gl = gl;
494 evas_object_smart_callback_add(bt, "clicked", _btbounce_cb, bounce);
495 evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _btdel_cb, bounce);
496
497 max = 2000;
498 if (getenv("ELM_TEST_AUTOBOUNCE"))
499 {
500 max = 200;
501 bounce_max = atoi(getenv("ELM_TEST_AUTOBOUNCE"));
502 }
503 for (i = 0; i < max; i++)
504 {
505 gli = elm_genlist_item_append(gl, api->itc1,
506 (void *)(uintptr_t)i/* item data */,
507 NULL/* parent */,
508 ELM_GENLIST_ITEM_NONE,
509 gl_sel/* func */,
510 (void *)(uintptr_t)(i * 10)/* func data */);
511
512 if (i == 50)
513 evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
514 else if (i == 1500)
515 evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
516
517 if (i == 100) bounce->it1 = gli;
518 if (i == 120) bounce->it2 = gli;
519 }
520 elm_genlist_item_class_free(api->itc1);
521
522 evas_object_resize(win, 480, 400);
523 explode_win_enable(win);
524 evas_object_show(win);
525
526 if (max == 200) _btbounce_cb(bounce, bt, NULL);
527 }
528
529
530 /*** Genlist 2 *************************************************************/
531 static void
my_gl_clear(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)532 my_gl_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
533 {
534 elm_genlist_clear(data);
535 }
536
537 static char *
gl_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)538 gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
539 {
540 char buf[256];
541 snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
542 return strdup(buf);
543 }
544 static void
my_gl_add(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)545 my_gl_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
546 {
547 api_data *api = data;
548 Evas_Object *gl = api->gl;
549 static int i = 0;
550
551 if (!api->itc1)
552 {
553 ERR("Genlist item class should not be null. Something very bad is happening!!");
554 return;
555 }
556
557 api->itc1->item_style = "default";
558 api->itc1->func.text_get = gl_text_get;
559 api->itc1->func.content_get = gl_content_get;
560 api->itc1->func.state_get = gl_state_get;
561 api->itc1->func.del = NULL;
562
563 elm_genlist_item_append(gl, api->itc1,
564 (void *)(uintptr_t)i/* item data */,
565 NULL/* parent */,
566 ELM_GENLIST_ITEM_NONE,
567 gl_sel/* func */,
568 (void *)(uintptr_t)(i * 10)/* func data */);
569 i++;
570 }
571
572 static void
my_gl_insert_before(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)573 my_gl_insert_before(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
574 {
575 api_data *api = data;
576 Evas_Object *gl = api->gl;
577 static int i = 0;
578 Elm_Object_Item *gli_selected;
579
580 if (!api->itc1)
581 {
582 ERR("Genlist item class should not be null. Something very bad is happening!!");
583 return;
584 }
585
586 api->itc1->item_style = "default";
587 api->itc1->func.text_get = gl_text_get;
588 api->itc1->func.content_get = gl_content_get;
589 api->itc1->func.state_get = gl_state_get;
590 api->itc1->func.del = NULL;
591
592 gli_selected = elm_genlist_selected_item_get(gl);
593 if (!gli_selected)
594 {
595 printf("no item selected\n");
596 return ;
597 }
598
599 elm_genlist_item_insert_before(gl, api->itc1,
600 (void *)(uintptr_t)i/* item data */,
601 NULL/* parent */,
602 gli_selected /* item before */,
603 ELM_GENLIST_ITEM_NONE,
604 gl_sel/* func */,
605 (void *)(uintptr_t)(i * 10)/* func data */);
606 i++;
607 }
608
609 static void
my_gl_insert_after(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)610 my_gl_insert_after(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
611 {
612 api_data *api = data;
613 Evas_Object *gl = api->gl;
614 static int i = 0;
615 Elm_Object_Item *gli_selected;
616
617 if (!api->itc1)
618 {
619 ERR("Genlist item class should not be null. Something very bad is happening!!");
620 return;
621 }
622
623 api->itc1->item_style = "default";
624 api->itc1->func.text_get = gl_text_get;
625 api->itc1->func.content_get = gl_content_get;
626 api->itc1->func.state_get = gl_state_get;
627 api->itc1->func.del = NULL;
628
629 gli_selected = elm_genlist_selected_item_get(gl);
630 if (!gli_selected)
631 {
632 printf("no item selected\n");
633 return ;
634 }
635
636 elm_genlist_item_insert_after(gl, api->itc1,
637 (void *)(uintptr_t)i/* item data */,
638 NULL/* parent */,
639 gli_selected /* item after */,
640 ELM_GENLIST_ITEM_NONE,
641 gl_sel/* func */,
642 (void *)(uintptr_t)(i * 10)/* func data */);
643 i++;
644 }
645
646 static void
my_gl_del(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)647 my_gl_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
648 {
649 api_data *api = data;
650 Evas_Object *gl = api->gl;
651 Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
652 if (!gli)
653 {
654 printf("no item selected\n");
655 return;
656 }
657 elm_object_item_del(gli);
658 }
659
660 static void
my_gl_disable(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)661 my_gl_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
662 {
663 api_data *api = data;
664 Evas_Object *gl = api->gl;
665 Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
666 if (!gli)
667 {
668 printf("no item selected\n");
669 return;
670 }
671 elm_object_item_disabled_set(gli, EINA_TRUE);
672 elm_genlist_item_selected_set(gli, EINA_FALSE);
673 elm_genlist_item_update(gli);
674 }
675
676 static void
my_gl_update_all(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)677 my_gl_update_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
678 {
679 api_data *api = data;
680 Evas_Object *gl = api->gl;
681 int i = 0;
682 Elm_Object_Item *it = elm_genlist_first_item_get(gl);
683 while (it)
684 {
685 elm_genlist_item_update(it);
686 INF("%i", i);
687 i++;
688 it = elm_genlist_item_next_get(it);
689 }
690 }
691
692 static void
my_gl_first(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)693 my_gl_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
694 {
695 api_data *api = data;
696 Evas_Object *gl = api->gl;
697 Elm_Object_Item *gli = elm_genlist_first_item_get(gl);
698 if (!gli) return;
699 elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
700 elm_genlist_item_selected_set(gli, 1);
701 }
702
703 static void
my_gl_last(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)704 my_gl_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
705 {
706 api_data *api = data;
707 Evas_Object *gl = api->gl;
708 Elm_Object_Item *gli = elm_genlist_last_item_get(gl);
709 if (!gli) return;
710 elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
711 elm_genlist_item_selected_set(gli, 1);
712 }
713
714 static Eina_Bool
my_gl_flush_delay(void * data EINA_UNUSED)715 my_gl_flush_delay(void *data EINA_UNUSED)
716 {
717 elm_cache_all_flush();
718 return ECORE_CALLBACK_CANCEL;
719 }
720
721 static void
my_gl_flush(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)722 my_gl_flush(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
723 {
724 ecore_timer_add(1.2, my_gl_flush_delay, NULL);
725 }
726
727 static void
_genlist_del_cb(void * data,Evas * evas EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)728 _genlist_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
729 void *event_info EINA_UNUSED)
730 {
731 if (!data) return;
732
733 elm_genlist_item_class_free(data);
734 }
735
736 void
test_genlist2(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)737 test_genlist2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
738 {
739 Evas_Object *win, *bg, *gl, *bx, *bx2, *bx3, *bt;
740 Elm_Object_Item *gli[10];
741 char buf[PATH_MAX];
742
743 api_data *api = calloc(1, sizeof(api_data));
744 win = elm_win_add(NULL, "genlist2", ELM_WIN_BASIC);
745 elm_win_title_set(win, "Genlist 2");
746 elm_win_autodel_set(win, EINA_TRUE);
747 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
748
749 bg = elm_bg_add(win);
750 snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
751 elm_bg_file_set(bg, buf, NULL);
752 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
753 elm_win_resize_object_add(win, bg);
754 evas_object_show(bg);
755
756 bx = elm_box_add(win);
757 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
758 elm_win_resize_object_add(win, bx);
759 evas_object_show(bx);
760
761 gl = elm_genlist_add(win);
762 elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
763 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
764 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
765 api->gl = gl;
766 evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
767 evas_object_show(gl);
768
769 api->itc1 = elm_genlist_item_class_new();
770 api->itc1->item_style = "default";
771 api->itc1->func.text_get = gl_text_get;
772 api->itc1->func.content_get = gl_content_get;
773 api->itc1->func.state_get = gl_state_get;
774 api->itc1->func.del = NULL;
775
776 gli[0] = elm_genlist_item_append(gl, api->itc1,
777 (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
778 (void *)1001/* func data */);
779 gli[1] = elm_genlist_item_append(gl, api->itc1,
780 (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
781 (void *)1002/* func data */);
782 gli[2] = elm_genlist_item_append(gl, api->itc1,
783 (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
784 (void *)1003/* func data */);
785 gli[3] = elm_genlist_item_prepend(gl, api->itc1,
786 (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
787 (void *)1004/* func data */);
788 gli[4] = elm_genlist_item_prepend(gl, api->itc1,
789 (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
790 (void *)1005/* func data */);
791 gli[5] = elm_genlist_item_insert_before(gl, api->itc1,
792 (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
793 gl_sel/* func */, (void *)1006/* func data */);
794 gli[6] = elm_genlist_item_insert_after(gl, api->itc1,
795 (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
796 gl_sel/* func */, (void *)1007/* func data */);
797 elm_box_pack_end(bx, gl);
798
799 bx2 = elm_box_add(win);
800 elm_box_horizontal_set(bx2, EINA_TRUE);
801 elm_box_homogeneous_set(bx2, EINA_TRUE);
802 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
803 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
804
805 bt = elm_button_add(win);
806 elm_object_text_set(bt, "/\\");
807 evas_object_smart_callback_add(bt, "clicked", my_gl_first, api);
808 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
809 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
810 elm_box_pack_end(bx2, bt);
811 evas_object_show(bt);
812
813 bt = elm_button_add(win);
814 elm_object_text_set(bt, "\\/");
815 evas_object_smart_callback_add(bt, "clicked", my_gl_last, api);
816 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
817 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
818 elm_box_pack_end(bx2, bt);
819 evas_object_show(bt);
820
821 bt = elm_button_add(win);
822 elm_object_text_set(bt, "#");
823 evas_object_smart_callback_add(bt, "clicked", my_gl_disable, api);
824 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
825 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
826 elm_box_pack_end(bx2, bt);
827 evas_object_show(bt);
828
829 bt = elm_button_add(win);
830 elm_object_text_set(bt, "U");
831 evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, api);
832 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
833 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
834 elm_box_pack_end(bx2, bt);
835 evas_object_show(bt);
836
837 elm_box_pack_end(bx, bx2);
838 evas_object_show(bx2);
839
840 bx2 = elm_box_add(win);
841 elm_box_horizontal_set(bx2, EINA_TRUE);
842 elm_box_homogeneous_set(bx2, EINA_TRUE);
843 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
844 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
845
846 bt = elm_button_add(win);
847 elm_object_text_set(bt, "X");
848 evas_object_smart_callback_add(bt, "clicked", my_gl_clear, gl);
849 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
850 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
851 elm_box_pack_end(bx2, bt);
852 evas_object_show(bt);
853
854 bt = elm_button_add(win);
855 elm_object_text_set(bt, "+");
856 evas_object_smart_callback_add(bt, "clicked", my_gl_add, api);
857 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
858 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
859 elm_box_pack_end(bx2, bt);
860 evas_object_show(bt);
861
862 bt = elm_button_add(win);
863 elm_object_text_set(bt, "-");
864 evas_object_smart_callback_add(bt, "clicked", my_gl_del, api);
865 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
866 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
867 elm_box_pack_end(bx2, bt);
868 evas_object_show(bt);
869
870 elm_box_pack_end(bx, bx2);
871 evas_object_show(bx2);
872
873 bx3 = elm_box_add(win);
874 elm_box_horizontal_set(bx3, EINA_TRUE);
875 elm_box_homogeneous_set(bx3, EINA_TRUE);
876 evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
877 evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
878
879 bt = elm_button_add(win);
880 elm_object_text_set(bt, "+ before");
881 evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, api);
882 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
883 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
884 elm_box_pack_end(bx3, bt);
885 evas_object_show(bt);
886
887 bt = elm_button_add(win);
888 elm_object_text_set(bt, "+ after");
889 evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, api);
890 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
891 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
892 elm_box_pack_end(bx3, bt);
893 evas_object_show(bt);
894
895 bt = elm_button_add(win);
896 elm_object_text_set(bt, "Flush");
897 evas_object_smart_callback_add(bt, "clicked", my_gl_flush, api);
898 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
899 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
900 elm_box_pack_end(bx3, bt);
901 evas_object_show(bt);
902
903 elm_box_pack_end(bx, bx3);
904 evas_object_show(bx3);
905
906 evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _genlist_del_cb, api->itc1);
907
908 evas_object_resize(win, 320, 320);
909 evas_object_show(win);
910 }
911
912
913 /*** Genlist 3 *************************************************************/
914 char *
gl2_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)915 gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
916 {
917 const Testitem *tit = data;
918 char buf[256];
919 snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
920 return strdup(buf);
921 }
922
923 Evas_Object *
gl2_content_get(void * data,Evas_Object * obj,const char * part)924 gl2_content_get(void *data, Evas_Object *obj, const char *part)
925 {
926 const Testitem *tit = data;
927 char buf[PATH_MAX];
928 Evas_Object *ic = elm_icon_add(obj);
929 if (!strcmp(part, "elm.swallow.icon"))
930 {
931 if (!(tit->mode & 0x3))
932 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
933 else if ((tit->mode & 0x3) == 1)
934 snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
935 else if ((tit->mode & 0x3) == 2)
936 snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get());
937 else if ((tit->mode & 0x3) == 3)
938 snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
939 elm_image_file_set(ic, buf, NULL);
940 }
941 else if (!strcmp(part, "elm.swallow.end"))
942 {
943 if (!(tit->mode & 0x3))
944 snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
945 else if ((tit->mode & 0x3) == 1)
946 snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
947 else if ((tit->mode & 0x3) == 2)
948 snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get());
949 else if ((tit->mode & 0x3) == 3)
950 snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get());
951 elm_image_file_set(ic, buf, NULL);
952 }
953 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
954 return ic;
955 }
956
957 Eina_Bool
gl2_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)958 gl2_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
959 {
960 return EINA_FALSE;
961 }
962
963 static void
my_gl_update(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)964 my_gl_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
965 {
966 Testitem *tit = data;
967 tit->mode++;
968 elm_genlist_item_update(tit->item);
969 }
970
971 static void
my_gl_labels_update(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)972 my_gl_labels_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
973 {
974 Testitem *tit = data;
975 tit->mode++;
976 elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT);
977 }
978
979 static void
my_gl_contents_update(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)980 my_gl_contents_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
981 {
982 Testitem *tit = data;
983 tit->mode++;
984 elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT);
985 }
986
987 void
test_genlist3(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)988 test_genlist3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
989 {
990 Evas_Object *win, *gl, *bx, *bx2, *bt;
991 static Testitem tit[3];
992
993 api_data *api = calloc(1, sizeof(api_data));
994 win = elm_win_util_standard_add("genlist3", "Genlist 3");
995 elm_win_autodel_set(win, EINA_TRUE);
996 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
997
998 bx = elm_box_add(win);
999 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1000 elm_win_resize_object_add(win, bx);
1001 evas_object_show(bx);
1002
1003 gl = elm_genlist_add(win);
1004 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1005 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1006 evas_object_show(gl);
1007
1008 api->itc1 = elm_genlist_item_class_new();
1009 api->itc1->item_style = "default";
1010 api->itc1->func.text_get = gl2_text_get;
1011 api->itc1->func.content_get = gl2_content_get;
1012 api->itc1->func.state_get = gl2_state_get;
1013 api->itc1->func.del = NULL;
1014
1015 tit[0].mode = 0;
1016 tit[0].item = elm_genlist_item_append(gl, api->itc1,
1017 &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1018 NULL/* func data */);
1019 tit[1].mode = 1;
1020 tit[1].item = elm_genlist_item_append(gl, api->itc1,
1021 &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1022 NULL/* func data */);
1023 tit[2].mode = 2;
1024 tit[2].item = elm_genlist_item_append(gl, api->itc1,
1025 &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1026 NULL/* func data */);
1027
1028 elm_box_pack_end(bx, gl);
1029 evas_object_show(bx);
1030
1031 bx2 = elm_box_add(win);
1032 elm_box_horizontal_set(bx2, EINA_TRUE);
1033 elm_box_homogeneous_set(bx2, EINA_TRUE);
1034 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1035 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1036
1037 bt = elm_button_add(win);
1038 elm_object_text_set(bt, "[1]");
1039 evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1040 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1041 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1042 elm_box_pack_end(bx2, bt);
1043 evas_object_show(bt);
1044
1045 bt = elm_button_add(win);
1046 elm_object_text_set(bt, "labels");
1047 evas_object_smart_callback_add(bt, "clicked", my_gl_labels_update, &(tit[1]));
1048 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1049 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1050 elm_box_pack_end(bx2, bt);
1051 evas_object_show(bt);
1052
1053 bt = elm_button_add(win);
1054 elm_object_text_set(bt, "contents");
1055 evas_object_smart_callback_add(bt, "clicked", my_gl_contents_update, &(tit[2]));
1056 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1057 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1058 elm_box_pack_end(bx2, bt);
1059 evas_object_show(bt);
1060
1061 elm_box_pack_end(bx, bx2);
1062 evas_object_show(bx2);
1063
1064 elm_genlist_item_class_free(api->itc1);
1065 evas_object_resize(win, 320, 320);
1066 evas_object_show(win);
1067 }
1068
1069
1070 /*** Genlist 4 *************************************************************/
1071 static void
my_gl_item_check_changed(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1072 my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1073 {
1074 Testitem *tit = data;
1075 tit->onoff = elm_check_state_get(obj);
1076 printf("item %p onoff = %i\n", tit, tit->onoff);
1077 }
1078
1079 char *
gl3_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1080 gl3_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1081 {
1082 const Testitem *tit = data;
1083 char buf[256];
1084 snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
1085 return strdup(buf);
1086 }
1087
1088 Evas_Object *
gl3_content_get(void * data,Evas_Object * obj,const char * part)1089 gl3_content_get(void *data, Evas_Object *obj, const char *part)
1090 {
1091 const Testitem *tit = data;
1092 if (!strcmp(part, "elm.swallow.icon"))
1093 {
1094 Evas_Object *lb;
1095
1096 lb = elm_label_add(obj);
1097 elm_label_line_wrap_set(lb, ELM_WRAP_CHAR);
1098 elm_label_wrap_width_set(lb, 201);
1099 elm_object_text_set(lb, "ashj ascjscjh n asjkl hcjlh ls hzshnn zjh sh zxjcjsnd h dfw sdv edev efe fwefvv vsd cvs ws wf fvwf wd fwe f we wef we wfe rfwewef wfv wswf wefg sdfws w wsdcfwcf wsc vdv sdsd sdcd cv wsc sdcv wsc d sdcdcsd sdcdsc wdvd sdcsd wscxcv wssvd sd");
1100 return lb;
1101 }
1102 else if (!strcmp(part, "elm.swallow.end"))
1103 {
1104 Evas_Object *ck;
1105 ck = elm_check_add(obj);
1106 evas_object_propagate_events_set(ck, EINA_FALSE);
1107 elm_check_state_set(ck, tit->onoff);
1108 evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed, data);
1109 return ck;
1110 }
1111 return NULL;
1112 }
1113
1114 Eina_Bool
gl3_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1115 gl3_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1116 {
1117 return EINA_FALSE;
1118 }
1119
1120 static void
_realized(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * ei)1121 _realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei)
1122 {
1123 Evas_Object *check;
1124 Eina_List *items;
1125 items = NULL;
1126
1127 if (!ei) return;
1128 Elm_Object_Item *item = ei;
1129
1130 check = elm_object_item_part_content_get(item, "elm.swallow.end");
1131
1132 if (!check) return;
1133
1134 items = eina_list_append(items, check);
1135 elm_object_item_access_order_set(item, items);
1136 }
1137
1138 void
test_genlist4(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1139 test_genlist4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1140 {
1141 Evas_Object *win, *gl, *bx, *bx2, *bt;
1142 static Testitem tit[3];
1143
1144 api_data *api = calloc(1, sizeof(api_data));
1145 win = elm_win_util_standard_add("genlist4", "Genlist 4");
1146 elm_win_autodel_set(win, EINA_TRUE);
1147 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1148
1149 bx = elm_box_add(win);
1150 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1151 elm_win_resize_object_add(win, bx);
1152 evas_object_show(bx);
1153
1154 gl = elm_genlist_add(win);
1155 elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
1156 elm_genlist_multi_select_set(gl, EINA_TRUE);
1157 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1158 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1159 api->gl = gl;
1160 evas_object_show(gl);
1161
1162 evas_object_smart_callback_add(gl, "realized", _realized, NULL);
1163
1164 api->itc1 = elm_genlist_item_class_new();
1165 api->itc1->item_style = "default";
1166 api->itc1->func.text_get = gl3_text_get;
1167 api->itc1->func.content_get = gl3_content_get;
1168 api->itc1->func.state_get = gl3_state_get;
1169 api->itc1->func.del = NULL;
1170
1171 tit[0].mode = 0;
1172 tit[0].item = elm_genlist_item_append(gl, api->itc1,
1173 &(tit[0])/* item data */, NULL/* parent */,
1174 ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1175 NULL/* func data */);
1176 tit[1].mode = 1;
1177 tit[1].item = elm_genlist_item_append(gl, api->itc1,
1178 &(tit[1])/* item data */, NULL/* parent */,
1179 ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1180 NULL/* func data */);
1181 tit[2].mode = 2;
1182 tit[2].item = elm_genlist_item_append(gl, api->itc1,
1183 &(tit[2])/* item data */, NULL/* parent */,
1184 ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1185 NULL/* func data */);
1186
1187 elm_genlist_item_class_free(api->itc1);
1188 elm_box_pack_end(bx, gl);
1189 evas_object_show(bx);
1190
1191 bx2 = elm_box_add(win);
1192 elm_box_horizontal_set(bx2, EINA_TRUE);
1193 elm_box_homogeneous_set(bx2, EINA_TRUE);
1194 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1195 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1196
1197 bt = elm_button_add(win);
1198 elm_object_text_set(bt, "[1]");
1199 evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1200 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1201 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1202 elm_box_pack_end(bx2, bt);
1203 evas_object_show(bt);
1204
1205 bt = elm_button_add(win);
1206 elm_object_text_set(bt, "[2]");
1207 evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
1208 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1209 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1210 elm_box_pack_end(bx2, bt);
1211 evas_object_show(bt);
1212
1213 bt = elm_button_add(win);
1214 elm_object_text_set(bt, "[3]");
1215 evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
1216 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1217 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1218 elm_box_pack_end(bx2, bt);
1219 evas_object_show(bt);
1220
1221 elm_box_pack_end(bx, bx2);
1222 evas_object_show(bx2);
1223
1224 evas_object_resize(win, 320, 320);
1225 evas_object_show(win);
1226 }
1227
1228
1229 /*** Genlist 5 *************************************************************/
1230 static void
my_gl_item_check_changed2(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1231 my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1232 {
1233 Testitem *tit = data;
1234 tit->onoff = elm_check_state_get(obj);
1235 printf("item %p onoff = %i\n", tit, tit->onoff);
1236 }
1237
1238 char *
gl5_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part)1239 gl5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
1240 {
1241 const Testitem *tit = data;
1242 char buf[256] = { 0 };
1243 if (!strcmp(part, "elm.text"))
1244 {
1245 snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
1246 }
1247 else if (!strcmp(part, "elm.text.sub"))
1248 {
1249 snprintf(buf, sizeof(buf), "%i bottles on the wall", tit->mode);
1250 }
1251 return strdup(buf);
1252 }
1253
1254 Evas_Object *
gl5_content_get(void * data,Evas_Object * obj,const char * part)1255 gl5_content_get(void *data, Evas_Object *obj, const char *part)
1256 {
1257 const Testitem *tit = data;
1258 char buf[PATH_MAX];
1259 if (!strcmp(part, "elm.swallow.icon"))
1260 {
1261 Evas_Object *bx = elm_box_add(obj);
1262 Evas_Object *ic;
1263 elm_box_horizontal_set(bx, EINA_TRUE);
1264 ic = elm_icon_add(obj);
1265 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1266 elm_image_file_set(ic, buf, NULL);
1267 elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
1268 evas_object_show(ic);
1269 elm_box_pack_end(bx, ic);
1270 ic = elm_icon_add(obj);
1271 elm_image_file_set(ic, buf, NULL);
1272 elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
1273 evas_object_show(ic);
1274 elm_box_pack_end(bx, ic);
1275 elm_box_horizontal_set(bx, EINA_TRUE);
1276 evas_object_show(bx);
1277 return bx;
1278 }
1279 else if (!strcmp(part, "elm.swallow.end"))
1280 {
1281 Evas_Object *ck;
1282 ck = elm_check_add(obj);
1283 evas_object_propagate_events_set(ck, EINA_FALSE);
1284 elm_check_state_set(ck, tit->onoff);
1285 evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed2, data);
1286 evas_object_show(ck);
1287 return ck;
1288 }
1289 return NULL;
1290 }
1291
1292 Eina_Bool
gl5_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1293 gl5_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1294 {
1295 return EINA_FALSE;
1296 }
1297
1298 static void
item_drag_up(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1299 item_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1300 {
1301 INF("drag up");
1302 }
1303
1304 static void
item_drag_down(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1305 item_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1306 {
1307 INF("drag down");
1308 }
1309
1310 static void
item_drag_left(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1311 item_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1312 {
1313 INF("drag left");
1314 }
1315
1316 static void
item_drag_right(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1317 item_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1318 {
1319 INF("drag right");
1320 }
1321
1322 static void
scroll_top(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1323 scroll_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1324 {
1325 INF("Top edge!");
1326 }
1327
1328 static void
scroll_bottom(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1329 scroll_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1330 {
1331 INF("Bottom edge!");
1332 }
1333
1334 static void
scroll_left(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1335 scroll_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1336 {
1337 INF("Left edge!");
1338 }
1339
1340 static void
scroll_right(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1341 scroll_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1342 {
1343 INF("Right edge!");
1344 }
1345
1346 static void
item_drag(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1347 item_drag(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1348 {
1349 INF("drag");
1350 }
1351
1352 static void
item_drag_stop(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1353 item_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1354 {
1355 INF("drag stop");
1356 }
1357
1358 static void
item_longpress(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1359 item_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1360 {
1361 INF("longpress");
1362 }
1363
1364 void
test_genlist5(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1365 test_genlist5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1366 {
1367 Evas_Object *win, *gl, *bx, *bx2, *bt;
1368 static Testitem tit[3];
1369
1370 api_data *api = calloc(1, sizeof(api_data));
1371 win = elm_win_util_standard_add("genlist5", "Genlist 5");
1372 elm_win_autodel_set(win, EINA_TRUE);
1373 elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
1374 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1375
1376 bx = elm_box_add(win);
1377 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1378 elm_win_resize_object_add(win, bx);
1379 evas_object_show(bx);
1380
1381 gl = elm_genlist_add(win);
1382 elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
1383 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1384 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1385 api->gl = gl;
1386 evas_object_show(gl);
1387
1388 api->itc1 = elm_genlist_item_class_new();
1389 api->itc1->item_style = "double_label";
1390 api->itc1->func.text_get = gl5_text_get;
1391 api->itc1->func.content_get = gl5_content_get;
1392 api->itc1->func.state_get = gl5_state_get;
1393 api->itc1->func.del = NULL;
1394
1395 tit[0].mode = 0;
1396 tit[0].item = elm_genlist_item_append(gl, api->itc1,
1397 &(tit[0])/* item data */, NULL/* parent */,
1398 ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1399 NULL/* func data */);
1400 tit[1].mode = 1;
1401 tit[1].item = elm_genlist_item_append(gl, api->itc1,
1402 &(tit[1])/* item data */, NULL/* parent */,
1403 ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1404 NULL/* func data */);
1405 tit[2].mode = 2;
1406 tit[2].item = elm_genlist_item_append(gl, api->itc1,
1407 &(tit[2])/* item data */, NULL/* parent */,
1408 ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1409 NULL/* func data */);
1410
1411 elm_box_pack_end(bx, gl);
1412 evas_object_show(bx);
1413
1414 evas_object_smart_callback_add(gl, "drag,start,up", item_drag_up, NULL);
1415 evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL);
1416 evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL);
1417 evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL);
1418 evas_object_smart_callback_add(gl, "drag", item_drag, NULL);
1419 evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL);
1420 evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL);
1421
1422 bx2 = elm_box_add(win);
1423 elm_box_horizontal_set(bx2, EINA_TRUE);
1424 elm_box_homogeneous_set(bx2, EINA_TRUE);
1425 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1426 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1427
1428 bt = elm_button_add(win);
1429 elm_object_text_set(bt, "[1]");
1430 evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1431 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1432 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1433 elm_box_pack_end(bx2, bt);
1434 evas_object_show(bt);
1435
1436 bt = elm_button_add(win);
1437 elm_object_text_set(bt, "[2]");
1438 evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
1439 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1440 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1441 elm_box_pack_end(bx2, bt);
1442 evas_object_show(bt);
1443
1444 bt = elm_button_add(win);
1445 elm_object_text_set(bt, "[3]");
1446 evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
1447 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1448 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1449 elm_box_pack_end(bx2, bt);
1450 evas_object_show(bt);
1451
1452 elm_box_pack_end(bx, bx2);
1453 evas_object_show(bx2);
1454
1455 elm_genlist_item_class_free(api->itc1);
1456 evas_object_resize(win, 320, 320);
1457 evas_object_show(win);
1458 }
1459
1460
1461 /*** Genlist Tree **********************************************************/
1462 static void
gl4_sel(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1463 gl4_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1464 {
1465 Elm_Object_Item *glit = event_info;
1466 int depth = elm_genlist_item_expanded_depth_get(glit);
1467 printf("item sel callback %p - expanded depth = %d\n", glit, depth);
1468 }
1469
1470 static void
gl4_exp(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)1471 gl4_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
1472 {
1473 api_data *api = data;
1474 Elm_Object_Item *glit = event_info;
1475 Evas_Object *gl = elm_object_item_widget_get(glit);
1476 int val = (int)(uintptr_t) elm_object_item_data_get(glit);
1477 int i = 0;
1478
1479 printf("expand %p\n", glit);
1480 val *= 10;
1481 for (i = 0; i < 30; i++)
1482 {
1483 elm_genlist_item_append(gl, api->itc2,
1484 (void *)(uintptr_t) (val + i)/* item data */,
1485 glit/* parent */,
1486 ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
1487 NULL/* func data */);
1488 }
1489 }
1490
1491 static void
gl4_con(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1492 gl4_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1493 {
1494 Elm_Object_Item *glit = event_info;
1495 const Eina_List *list = NULL, *l = NULL;
1496 Elm_Object_Item *it = NULL;
1497
1498 printf("contract request %p\n", glit);
1499
1500 list = elm_genlist_item_subitems_get(glit);
1501 EINA_LIST_FOREACH(list, l, it)
1502 {
1503 printf("sub item: %p %s\n", it, elm_object_item_text_get(it));
1504 }
1505
1506 elm_genlist_item_subitems_clear(glit);
1507 }
1508
1509 static void
gl4_exp_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1510 gl4_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1511 {
1512 Elm_Object_Item *glit = event_info;
1513 printf("expand request %p\n", glit);
1514 elm_genlist_item_expanded_set(glit, EINA_TRUE);
1515 }
1516
1517 static void
gl4_con_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1518 gl4_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1519 {
1520 Elm_Object_Item *glit = event_info;
1521 elm_genlist_item_expanded_set(glit, EINA_FALSE);
1522 }
1523
1524 static void
gl4_selected(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1525 gl4_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1526 {
1527 Elm_Object_Item *glit = event_info;
1528 printf("selected %p\n", glit);
1529 }
1530
1531 static void
gl4_activated(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1532 gl4_activated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1533 {
1534 Elm_Object_Item *glit = event_info;
1535 printf("activated %p\n", glit);
1536 }
1537
1538 static void
gl4_unselected(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1539 gl4_unselected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1540 {
1541 Elm_Object_Item *glit = event_info;
1542 printf("unselected %p\n", glit);
1543 }
1544
1545 static void
gl4_longpressed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1546 gl4_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1547 {
1548 Elm_Object_Item *glit = event_info;
1549 printf("longpressed %p\n", glit);
1550 }
1551
1552 static void
gl4_pressed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1553 gl4_pressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1554 {
1555 Elm_Object_Item *glit = event_info;
1556 printf("pressed %p\n", glit);
1557 }
1558
1559 static void
gl4_released(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1560 gl4_released(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1561 {
1562 Elm_Object_Item *glit = event_info;
1563 printf("released %p\n", glit);
1564 }
1565
1566 char *
gl4_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1567 gl4_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1568 {
1569 char buf[256];
1570 snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data);
1571 return strdup(buf);
1572 }
1573
1574 Evas_Object *
gl4_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)1575 gl4_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
1576 {
1577 char buf[PATH_MAX];
1578 if (!strcmp(part, "elm.swallow.icon"))
1579 {
1580 Evas_Object *ic = elm_icon_add(obj);
1581 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1582 elm_image_file_set(ic, buf, NULL);
1583 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1584 evas_object_show(ic);
1585 return ic;
1586 }
1587 else if (!strcmp(part, "elm.swallow.end"))
1588 {
1589 Evas_Object *ck;
1590 ck = elm_check_add(obj);
1591 evas_object_propagate_events_set(ck, EINA_FALSE);
1592 evas_object_show(ck);
1593 return ck;
1594 }
1595 return NULL;
1596 }
1597
1598 Eina_Bool
gl4_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1599 gl4_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1600 {
1601 return EINA_FALSE;
1602 }
1603
1604 void
gl4_del(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED)1605 gl4_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
1606 {
1607 printf("item deleted.\n");
1608 }
1609
1610 static void
_tree_effect_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1611 _tree_effect_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1612 {
1613 elm_genlist_tree_effect_enabled_set(data, elm_check_state_get(obj));
1614 }
1615
1616 static void
_tree_homogeneous_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1617 _tree_homogeneous_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1618 {
1619 elm_genlist_homogeneous_set(data, elm_check_state_get(obj));
1620 }
1621
1622 void
test_genlist6(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1623 test_genlist6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1624 {
1625 Evas_Object *win, *gl, *bx, *fr, *bx2, *ck1, *ck2;
1626
1627 api_data *api = calloc(1, sizeof(api_data));
1628 win = elm_win_util_standard_add("genlist-tree", "Genlist Tree");
1629 elm_win_autodel_set(win, EINA_TRUE);
1630 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1631
1632 bx = elm_box_add(win);
1633 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1634 elm_win_resize_object_add(win, bx);
1635 evas_object_show(bx);
1636
1637 fr = elm_frame_add(win);
1638 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
1639 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
1640 elm_object_text_set(fr, "Genlist Tree Options");
1641 elm_box_pack_end(bx, fr);
1642 evas_object_show(fr);
1643
1644 bx2 = elm_box_add(win);
1645 elm_box_horizontal_set(bx2, EINA_TRUE);
1646 elm_box_homogeneous_set(bx2, EINA_TRUE);
1647 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1648 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1649 elm_object_content_set(fr, bx2);
1650 evas_object_show(bx2);
1651
1652 ck1 = elm_check_add(win);
1653 elm_object_text_set(ck1, "Tree Effect");
1654 evas_object_show(ck1);
1655 elm_box_pack_end(bx2, ck1);
1656
1657 ck2 = elm_check_add(win);
1658 elm_object_text_set(ck2, "Homogeneous");
1659 evas_object_show(ck2);
1660 elm_box_pack_end(bx2, ck2);
1661
1662 gl = elm_genlist_add(win);
1663 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1664 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1665 api->gl = gl;
1666 evas_object_show(gl);
1667 evas_object_smart_callback_add(gl, "edge,left", scroll_left, NULL);
1668 evas_object_smart_callback_add(gl, "edge,right", scroll_right, NULL);
1669 evas_object_smart_callback_add(gl, "edge,top", scroll_top, NULL);
1670 evas_object_smart_callback_add(gl, "edge,bottom", scroll_bottom, NULL);
1671
1672 api->itc1 = elm_genlist_item_class_new();
1673 api->itc1->item_style = "default";
1674 api->itc1->func.text_get = gl4_text_get;
1675 api->itc1->func.content_get = gl4_content_get;
1676 api->itc1->func.state_get = gl4_state_get;
1677 api->itc1->func.del = gl4_del;
1678
1679 api->itc2 = elm_genlist_item_class_new();
1680 api->itc2->item_style = "tree_effect";
1681 api->itc2->func.text_get = gl4_text_get;
1682 api->itc2->func.content_get = gl4_content_get;
1683 api->itc2->func.state_get = gl4_state_get;
1684 api->itc2->func.del = gl4_del;
1685
1686 api->itc = elm_genlist_item_class_new();
1687 api->itc->item_style = "indent";
1688 api->itc->func.text_get = gl4_text_get;
1689 api->itc->func.content_get = gl4_content_get;
1690 api->itc->func.state_get = gl4_state_get;
1691 api->itc->func.del = gl4_del;
1692
1693 elm_genlist_item_append(gl, api->itc2,
1694 (void *)1/* item data */, NULL/* parent */,
1695 ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
1696 NULL/* func data */);
1697 elm_genlist_item_append(gl, api->itc2,
1698 (void *)2/* item data */, NULL/* parent */,
1699 ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
1700 NULL/* func data */);
1701 elm_genlist_item_append(gl, api->itc,
1702 (void *)3/* item data */, NULL/* parent */,
1703 ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1704 NULL/* func data */);
1705 elm_genlist_item_append(gl, api->itc1,
1706 (void *)4/* item data */, NULL/* parent */,
1707 ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1708 NULL/* func data */);
1709
1710 elm_genlist_item_class_free(api->itc1);
1711 elm_genlist_item_class_free(api->itc2);
1712 elm_genlist_item_class_free(api->itc);
1713
1714 evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, api);
1715 evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, api);
1716 evas_object_smart_callback_add(gl, "expanded", gl4_exp, api);
1717 evas_object_smart_callback_add(gl, "contracted", gl4_con, api);
1718
1719 evas_object_smart_callback_add(gl, "selected", gl4_selected, api);
1720 evas_object_smart_callback_add(gl, "unselected", gl4_unselected, api);
1721 evas_object_smart_callback_add(gl, "activated", gl4_activated, api);
1722 evas_object_smart_callback_add(gl, "longpressed", gl4_longpressed, api);
1723 evas_object_smart_callback_add(gl, "pressed", gl4_pressed, api);
1724 evas_object_smart_callback_add(gl, "released", gl4_released, api);
1725
1726 evas_object_smart_callback_add(ck1, "changed", _tree_effect_changed_cb, gl);
1727 evas_object_smart_callback_add(ck2, "changed", _tree_homogeneous_changed_cb, gl);
1728
1729 elm_box_pack_end(bx, gl);
1730
1731 evas_object_resize(win, 320, 320);
1732 evas_object_show(win);
1733 }
1734
1735
1736 /*** Genlist 7 *************************************************************/
1737 struct genlist7_data
1738 {
1739 Evas_Object *win, *naviframe;
1740 };
1741
1742 static void
gl_sel7(void * data,Evas_Object * obj,void * event_info)1743 gl_sel7(void *data, Evas_Object *obj, void *event_info)
1744 {
1745 if (!event_info) return;
1746 api_data *api = data;
1747 elm_genlist_item_item_class_update(event_info, api->itc2);
1748 printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, api->itc2->item_style);
1749 }
1750
1751 static void
_gl7_back_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1752 _gl7_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1753 {
1754 struct genlist7_data *info = data;
1755 if (!info) return;
1756
1757 elm_naviframe_item_pop(info->naviframe);
1758 }
1759
1760 static void
_gl7_swipe_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)1761 _gl7_swipe_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
1762 {
1763 struct genlist7_data *info = data;
1764 Evas_Object *box, *entry, *button;
1765 char item_data[] = "Just a simple test";
1766
1767 if ((!event_info) || (!data)) return;
1768
1769 box = elm_box_add(info->win);
1770 elm_box_homogeneous_set(box, EINA_FALSE);
1771 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1772 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1773 evas_object_show(box);
1774
1775 entry = elm_entry_add(info->win);
1776 elm_entry_scrollable_set(entry, EINA_TRUE);
1777 elm_entry_editable_set(entry, EINA_FALSE);
1778 elm_object_text_set(entry, item_data);
1779 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1780 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1781 evas_object_show(entry);
1782
1783 button = elm_button_add(info->win);
1784 elm_object_text_set(button, "back");
1785 evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0);
1786 evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0);
1787 evas_object_smart_callback_add(button, "clicked", _gl7_back_cb,
1788 info);
1789 evas_object_show(button);
1790
1791 elm_box_pack_start(box, entry);
1792 elm_box_pack_end(box, button);
1793
1794 elm_naviframe_item_simple_push(info->naviframe, box);
1795 }
1796
1797 void
test_genlist7(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1798 test_genlist7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1799 {
1800 Evas_Object *win, *gl, *naviframe;
1801 static struct genlist7_data info;
1802 static Testitem tit[3];
1803
1804 api_data *api = calloc(1, sizeof(api_data));
1805 win = elm_win_util_standard_add("genlist7", "Genlist 7");
1806 elm_win_autodel_set(win, EINA_TRUE);
1807 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1808 info.win = win;
1809
1810 naviframe = elm_naviframe_add(win);
1811 elm_win_resize_object_add(win, naviframe);
1812 evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1813 evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
1814 evas_object_show(naviframe);
1815 info.naviframe = naviframe;
1816
1817 gl = elm_genlist_add(win);
1818 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1819 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1820 evas_object_smart_callback_add(gl, "swipe", _gl7_swipe_cb, &info);
1821 api->gl = gl;
1822 evas_object_show(gl);
1823 elm_naviframe_item_simple_push(naviframe, gl);
1824
1825 api->itc1 = elm_genlist_item_class_new();
1826 api->itc1->item_style = "default";
1827 api->itc1->func.text_get = gl2_text_get;
1828 api->itc1->func.content_get = gl2_content_get;
1829 api->itc1->func.state_get = gl2_state_get;
1830 api->itc1->func.del = NULL;
1831
1832 api->itc2 = elm_genlist_item_class_new();
1833 api->itc2->item_style = "double_label";
1834 api->itc2->func.text_get = gl5_text_get;
1835 api->itc2->func.content_get = gl5_content_get;
1836 api->itc2->func.state_get = gl5_state_get;
1837 api->itc2->func.del = NULL;
1838
1839 tit[0].mode = 0;
1840 tit[0].item = elm_genlist_item_append(gl, api->itc1,
1841 &(tit[0])/* item data */, NULL/* parent */,
1842 ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1843 api/* func data */);
1844 tit[1].mode = 1;
1845 tit[1].item = elm_genlist_item_append(gl, api->itc1,
1846 &(tit[1])/* item data */, NULL/* parent */,
1847 ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1848 api/* func data */);
1849 tit[2].mode = 2;
1850 tit[2].item = elm_genlist_item_append(gl, api->itc1,
1851 &(tit[2])/* item data */, NULL/* parent */,
1852 ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1853 api/* func data */);
1854
1855 evas_object_resize(win, 320, 320);
1856 evas_object_show(win);
1857 }
1858
1859
1860 /*** Genlist Group *********************************************************/
gl8_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1861 char *gl8_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1862 {
1863 char buf[256];
1864 snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)", (int)((uintptr_t)data / 10), (int)(uintptr_t)data);
1865 return strdup(buf);
1866 }
1867
1868 static void
_bt_show_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1869 _bt_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1870 {
1871 elm_genlist_item_show(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1872 }
1873
1874 static void
_bt_bring_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1875 _bt_bring_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1876 {
1877 elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1878 }
1879
1880 void
test_genlist8(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1881 test_genlist8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1882 {
1883 Evas_Object *win, *gl, *bt[8], *bx, *bx2, *bx3;
1884 Elm_Object_Item *gli = NULL, *git = NULL;
1885 int i, bt_num;
1886
1887 api_data *api = calloc(1, sizeof(api_data));
1888 win = elm_win_util_standard_add("genlist-group", "Genlist Group");
1889 elm_win_autodel_set(win, EINA_TRUE);
1890 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1891
1892 bx = elm_box_add(win);
1893 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1894 elm_win_resize_object_add(win, bx);
1895 evas_object_show(bx);
1896
1897 gl = elm_genlist_add(win);
1898 evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
1899 evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
1900 evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
1901 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1902 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1903 elm_box_pack_end(bx, gl);
1904 api->gl = gl;
1905 evas_object_show(gl);
1906
1907 // Use homogeneous mode for group index + homogeneous test.
1908 // Homogeneous is not mandatory for group index.
1909 elm_genlist_homogeneous_set(gl, EINA_TRUE);
1910
1911 api->itc1 = elm_genlist_item_class_new();
1912 api->itc1->item_style = "default";
1913 api->itc1->func.text_get = gl_text_get;
1914 api->itc1->func.content_get = gl_content_get;
1915 api->itc1->func.state_get = gl_state_get;
1916 api->itc1->func.del = NULL;
1917
1918 api->itc2 = elm_genlist_item_class_new();
1919 api->itc2->item_style = "group_index";
1920 api->itc2->func.text_get = gl8_text_get;
1921 api->itc2->func.content_get = NULL;
1922 api->itc2->func.state_get = NULL;
1923 api->itc2->func.del = NULL;
1924
1925 bx2 = elm_box_add(win);
1926 elm_box_horizontal_set(bx2, EINA_TRUE);
1927 elm_box_homogeneous_set(bx2, EINA_TRUE);
1928 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1929 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1930
1931 bt_num = 0;
1932 bt[bt_num] = elm_button_add(win);
1933 elm_object_text_set(bt[bt_num], "Show 0");
1934 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1935 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1936 evas_object_show(bt[bt_num]);
1937 elm_box_pack_end(bx2, bt[bt_num]);
1938
1939 bt[++bt_num] = elm_button_add(win);
1940 elm_object_text_set(bt[bt_num], "Show 26");
1941 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1942 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1943 evas_object_show(bt[bt_num]);
1944 elm_box_pack_end(bx2, bt[bt_num]);
1945
1946 bt[++bt_num] = elm_button_add(win);
1947 elm_object_text_set(bt[bt_num], "Show 101");
1948 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1949 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1950 evas_object_show(bt[bt_num]);
1951 elm_box_pack_end(bx2, bt[bt_num]);
1952
1953 bt[++bt_num] = elm_button_add(win);
1954 elm_object_text_set(bt[bt_num], "Show 480");
1955 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1956 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1957 evas_object_show(bt[bt_num]);
1958 elm_box_pack_end(bx2, bt[bt_num]);
1959
1960 elm_box_pack_end(bx, bx2);
1961 evas_object_show(bx2);
1962
1963 bx3 = elm_box_add(win);
1964 elm_box_horizontal_set(bx3, EINA_TRUE);
1965 elm_box_homogeneous_set(bx3, EINA_TRUE);
1966 evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
1967 evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
1968
1969 bt[++bt_num] = elm_button_add(win);
1970 elm_object_text_set(bt[bt_num], "Bring top 0");
1971 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1972 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1973 evas_object_show(bt[bt_num]);
1974 elm_box_pack_end(bx3, bt[bt_num]);
1975
1976 bt[++bt_num] = elm_button_add(win);
1977 elm_object_text_set(bt[bt_num], "Bring top 31");
1978 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1979 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1980 evas_object_show(bt[bt_num]);
1981 elm_box_pack_end(bx3, bt[bt_num]);
1982
1983 bt[++bt_num] = elm_button_add(win);
1984 elm_object_text_set(bt[bt_num], "Bring top 239");
1985 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1986 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1987 evas_object_show(bt[bt_num]);
1988 elm_box_pack_end(bx3, bt[bt_num]);
1989
1990 bt[++bt_num] = elm_button_add(win);
1991 elm_object_text_set(bt[bt_num], "Bring top 477");
1992 evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1993 evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1994 evas_object_show(bt[bt_num]);
1995 elm_box_pack_end(bx3, bt[bt_num]);
1996
1997 elm_box_pack_end(bx, bx3);
1998 evas_object_show(bx3);
1999
2000 for (i = 0; i < 500; i++)
2001 {
2002 if (!(i % 10))
2003 {
2004 gli = git = elm_genlist_item_append(gl, api->itc2,
2005 (void *)(uintptr_t)i/* item data */,
2006 NULL/* parent */,
2007 ELM_GENLIST_ITEM_GROUP,
2008 gl_sel/* func */,
2009 (void *)(uintptr_t)(i * 10)/* func data */);
2010 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2011 }
2012 else if (git)
2013 {
2014 gli = elm_genlist_item_append(gl, api->itc1,
2015 (void *)(uintptr_t)i/* item data */,
2016 git/* parent */,
2017 ELM_GENLIST_ITEM_NONE,
2018 gl_sel/* func */,
2019 (void *)(uintptr_t)(i * 10)/* func data */);
2020 }
2021 switch (i)
2022 {
2023 case 0:
2024 evas_object_smart_callback_add(bt[0], "clicked", _bt_show_cb, gli);
2025 evas_object_smart_callback_add(bt[4], "clicked", _bt_bring_cb, gli);
2026 break;
2027 case 26:
2028 evas_object_smart_callback_add(bt[1], "clicked", _bt_show_cb, gli);
2029 break;
2030 case 31:
2031 evas_object_smart_callback_add(bt[5], "clicked", _bt_bring_cb, gli);
2032 break;
2033 case 101:
2034 evas_object_smart_callback_add(bt[2], "clicked", _bt_show_cb, gli);
2035 break;
2036 case 239:
2037 evas_object_smart_callback_add(bt[6], "clicked", _bt_bring_cb, gli);
2038 break;
2039 case 477:
2040 evas_object_smart_callback_add(bt[7], "clicked", _bt_bring_cb, gli);
2041 break;
2042 case 480:
2043 evas_object_smart_callback_add(bt[3], "clicked", _bt_show_cb, gli);
2044 break;
2045 }
2046 }
2047
2048 elm_genlist_item_class_free(api->itc1);
2049 elm_genlist_item_class_free(api->itc2);
2050
2051 evas_object_resize(win, 480, 800);
2052 evas_object_show(win);
2053 }
2054
2055
2056 /*** Genlist Group Tree ****************************************************/
2057 static void
gl9_exp(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)2058 gl9_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2059 {
2060 api_data *api = data;
2061 Elm_Object_Item *glit = event_info;
2062 Evas_Object *gl = elm_object_item_widget_get(glit);
2063 int val = (int)(uintptr_t) elm_object_item_data_get(glit);
2064 val *= 10;
2065 elm_genlist_item_append(gl, api->itc1,
2066 (void *)(uintptr_t) (val + 1)/* item data */,
2067 glit/* parent */,
2068 ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2069 NULL/* func data */);
2070 elm_genlist_item_append(gl, api->itc1,
2071 (void *)(uintptr_t) (val + 2)/* item data */,
2072 glit/* parent */,
2073 ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2074 NULL/* func data */);
2075 elm_genlist_item_append(gl, api->itc1,
2076 (void *)(uintptr_t) (val + 3)/* item data */,
2077 glit/* parent */,
2078 ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2079 NULL/* func data */);
2080 }
2081
2082 static void
gl9_con(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2083 gl9_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
2084 {
2085 Elm_Object_Item *glit = event_info;
2086 elm_genlist_item_subitems_clear(glit);
2087 }
2088
2089 static void
gl9_exp_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2090 gl9_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
2091 {
2092 Elm_Object_Item *glit = event_info;
2093 elm_genlist_item_expanded_set(glit, EINA_TRUE);
2094 }
2095
2096 static void
gl9_con_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2097 gl9_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
2098 {
2099 Elm_Object_Item *glit = event_info;
2100 elm_genlist_item_expanded_set(glit, EINA_FALSE);
2101 }
2102
2103 static void
gl9_item_next(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2104 gl9_item_next(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2105 {
2106 api_data *api = data;
2107 Elm_Object_Item *it;
2108
2109 it = elm_genlist_selected_item_get(api->gl);
2110 it = elm_genlist_item_next_get(it);
2111 elm_genlist_item_selected_set(it, EINA_TRUE);
2112 printf("Next item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2113 }
2114
2115 static void
gl9_item_prev(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2116 gl9_item_prev(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2117 {
2118 api_data *api = data;
2119 Elm_Object_Item *it;
2120
2121 it = elm_genlist_selected_item_get(api->gl);
2122 it = elm_genlist_item_prev_get(it);
2123 elm_genlist_item_selected_set(it, EINA_TRUE);
2124 printf("Prev item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2125 }
2126
2127 static void
gl9_item_first(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2128 gl9_item_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2129 {
2130 api_data *api = data;
2131 Elm_Object_Item *it;
2132
2133 it = elm_genlist_first_item_get(api->gl);
2134 elm_genlist_item_selected_set(it, EINA_TRUE);
2135 printf("First item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2136 }
2137
2138 static void
gl9_item_last(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2139 gl9_item_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2140 {
2141 api_data *api = data;
2142 Elm_Object_Item *it;
2143
2144 it = elm_genlist_last_item_get(api->gl);
2145 elm_genlist_item_selected_set(it, EINA_TRUE);
2146 printf("Last item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2147 }
2148
2149 void
test_genlist9(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2150 test_genlist9(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2151 {
2152 Evas_Object *win, *gl, *bx, *bx2, *bt;
2153 Elm_Object_Item *git;
2154
2155 api_data *api = calloc(1, sizeof(api_data));
2156 win = elm_win_util_standard_add("genlist-group-tree", "Genlist Group Tree");
2157 elm_win_autodel_set(win, EINA_TRUE);
2158 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2159
2160 bx = elm_box_add(win);
2161 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2162 elm_win_resize_object_add(win, bx);
2163 evas_object_show(bx);
2164
2165 gl = elm_genlist_add(win);
2166 evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
2167 evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
2168 evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
2169 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2170 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2171 elm_box_pack_end(bx, gl);
2172 api->gl = gl;
2173 evas_object_show(gl);
2174
2175 api->itc1 = elm_genlist_item_class_new();
2176 api->itc1->item_style = "default";
2177 api->itc1->func.text_get = gl_text_get;
2178 api->itc1->func.content_get = gl_content_get;
2179 api->itc1->func.state_get = gl_state_get;
2180 api->itc1->func.del = NULL;
2181
2182 api->itc2 = elm_genlist_item_class_new();
2183 api->itc2->item_style = "group_index";
2184 api->itc2->func.text_get = gl8_text_get;
2185 api->itc2->func.content_get = NULL;
2186 api->itc2->func.state_get = NULL;
2187 api->itc2->func.del = NULL;
2188
2189 git = elm_genlist_item_append(gl, api->itc2,
2190 (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
2191 NULL/* func data */);
2192
2193 elm_genlist_item_append(gl, api->itc1,
2194 (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2195 NULL/* func data */);
2196 elm_genlist_item_append(gl, api->itc1,
2197 (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2198 NULL/* func data */);
2199 elm_genlist_item_append(gl, api->itc1,
2200 (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2201 NULL/* func data */);
2202 git = elm_genlist_item_append(gl, api->itc2,
2203 (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
2204 NULL/* func data */);
2205
2206 elm_genlist_item_append(gl, api->itc1,
2207 (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2208 NULL/* func data */);
2209 elm_genlist_item_append(gl, api->itc1,
2210 (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2211 NULL/* func data */);
2212 elm_genlist_item_append(gl, api->itc1,
2213 (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2214 NULL/* func data */);
2215 elm_genlist_item_class_free(api->itc1);
2216 elm_genlist_item_class_free(api->itc2);
2217
2218 evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, api);
2219 evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, api);
2220 evas_object_smart_callback_add(gl, "expanded", gl9_exp, api);
2221 evas_object_smart_callback_add(gl, "contracted", gl9_con, api);
2222
2223 bx2 = elm_box_add(win);
2224 elm_box_horizontal_set(bx2, EINA_TRUE);
2225 elm_box_pack_end(bx, bx2);
2226 evas_object_show(bx2);
2227
2228 bt = elm_button_add(bx2);
2229 elm_object_text_set(bt, "First item");
2230 evas_object_smart_callback_add(bt, "clicked", gl9_item_first, api);
2231 elm_box_pack_end(bx2, bt);
2232 evas_object_show(bt);
2233
2234 bt = elm_button_add(bx2);
2235 elm_object_text_set(bt, "Next item");
2236 evas_object_smart_callback_add(bt, "clicked", gl9_item_next, api);
2237 elm_box_pack_end(bx2, bt);
2238 evas_object_show(bt);
2239 bt = elm_button_add(bx2);
2240
2241 bt = elm_button_add(bx2);
2242 elm_object_text_set(bt, "Prev item");
2243 evas_object_smart_callback_add(bt, "clicked", gl9_item_prev, api);
2244 elm_box_pack_end(bx2, bt);
2245 evas_object_show(bt);
2246
2247 bt = elm_button_add(bx2);
2248 elm_object_text_set(bt, "Last item");
2249 evas_object_smart_callback_add(bt, "clicked", gl9_item_last, api);
2250 elm_box_pack_end(bx2, bt);
2251 evas_object_show(bt);
2252
2253 evas_object_resize(win, 480, 800);
2254 evas_object_show(win);
2255 }
2256
2257
2258 /*** Genlist Decorate Item Mode ********************************************/
2259 static char *mode_type[] = { "slide", "rotate" };
2260
2261 char *
gl10_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part)2262 gl10_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
2263 {
2264 char buf[256];
2265 if (!strcmp(part, "elm.text.mode"))
2266 snprintf(buf, sizeof(buf), "Mode # %i", (int)(uintptr_t)data);
2267 else
2268 snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
2269 return strdup(buf);
2270 }
2271
2272 Evas_Object *
gl10_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)2273 gl10_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
2274 {
2275 char buf[PATH_MAX];
2276 Evas_Object *ic = elm_icon_add(obj);
2277 if (!strcmp(part, "elm.swallow.end"))
2278 snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
2279 else
2280 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
2281 elm_image_file_set(ic, buf, NULL);
2282 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2283 return ic;
2284 }
2285
2286 static void
_gl_sel10(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2287 _gl_sel10(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2288 {
2289 if (!data) return;
2290 int v = elm_radio_value_get(data);
2291 if (v == 1)
2292 elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE);
2293 }
2294
2295 static void
_my_gl_mode_right(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)2296 _my_gl_mode_right(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2297 {
2298 if (!data) return;
2299 int v = elm_radio_value_get(data);
2300 if (v == 0)
2301 elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE);
2302 }
2303
2304 static void
_my_gl_mode_left(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)2305 _my_gl_mode_left(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2306 {
2307 if (!data) return;
2308 int v = elm_radio_value_get(data);
2309 if (v == 0)
2310 elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_FALSE);
2311 }
2312
2313 static void
_my_gl_mode_cancel(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)2314 _my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2315 {
2316 fprintf(stderr, "drag\n");
2317 if (!data) return;
2318 int v = elm_radio_value_get(data);
2319 Elm_Object_Item *glit = elm_genlist_decorated_item_get(obj);
2320 if (glit) elm_genlist_item_decorate_mode_set(glit, mode_type[v], EINA_FALSE);
2321 }
2322
2323 void
test_genlist10(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2324 test_genlist10(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2325 {
2326 Evas_Object *win, *fr, *bx, *bx2, *rd, *rdg, *gl;
2327 int i;
2328
2329 api_data *api = calloc(1, sizeof(api_data));
2330 win = elm_win_util_standard_add("genlist-decorate-item-mode", "Genlist Decorate Item Mode");
2331 elm_win_autodel_set(win, EINA_TRUE);
2332 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2333
2334 bx = elm_box_add(win);
2335 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2336 elm_win_resize_object_add(win, bx);
2337 evas_object_show(bx);
2338
2339 fr = elm_frame_add(win);
2340 elm_object_text_set(fr, "Decorate Item Mode Type");
2341 elm_box_pack_end(bx, fr);
2342 evas_object_show(fr);
2343
2344 bx2 = elm_box_add(win);
2345 elm_object_content_set(fr, bx2);
2346 evas_object_show(bx2);
2347
2348 rd = elm_radio_add(win);
2349 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2350 elm_radio_state_value_set(rd, 0);
2351 elm_object_text_set(rd, "Slide : Sweep genlist items to the right.");
2352 evas_object_show(rd);
2353 elm_box_pack_end(bx2, rd);
2354 rdg = rd;
2355
2356 rd = elm_radio_add(win);
2357 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2358 elm_radio_state_value_set(rd, 1);
2359 elm_object_text_set(rd, "Rotate : Click each item.");
2360 elm_radio_group_add(rd, rdg);
2361 evas_object_show(rd);
2362 elm_box_pack_end(bx2, rd);
2363
2364 gl = elm_genlist_add(win);
2365 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2366 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2367 evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg);
2368 evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
2369 evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
2370 evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
2371 api->gl = gl;
2372 evas_object_show(gl);
2373
2374 api->itc1 = elm_genlist_item_class_new();
2375 api->itc1->item_style = "default";
2376 api->itc1->decorate_item_style = "mode";
2377 api->itc1->func.text_get = gl10_text_get;
2378 api->itc1->func.content_get = gl10_content_get;
2379 api->itc1->func.state_get = gl_state_get;
2380 api->itc1->func.del = NULL;
2381
2382 for (i = 0; i < 50; i++)
2383 elm_genlist_item_append(gl,
2384 api->itc1,
2385 (void *)(uintptr_t)(1000 + i)/* item data */,
2386 NULL/* parent */,
2387 ELM_GENLIST_ITEM_NONE/* flags */,
2388 _gl_sel10/* func */,
2389 rdg/* func data */);
2390
2391 elm_box_pack_end(bx, gl);
2392
2393 elm_genlist_item_class_free(api->itc1);
2394 evas_object_resize(win, 520, 520);
2395 evas_object_show(win);
2396 }
2397
2398
2399 /*** Genlist Reorder Mode **************************************************/
2400 static void
_reorder_tg_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)2401 _reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2402 {
2403 elm_genlist_reorder_mode_set(data, elm_check_state_get(obj));
2404 }
2405
2406 /**
2407 * gl_moved is called after an item was reordered.
2408 * This is only called when reorder mode is enabled.
2409 *
2410 * @param obj : the genlist object.
2411 * @param event_info : the moved item.
2412 *
2413 * the item(event_info) had been moved
2414 *
2415 */
2416 static void
_gl_reorder_moved_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2417 _gl_reorder_moved_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2418 void *event_info EINA_UNUSED)
2419 {
2420 printf("\"moved\" it: %p\n", event_info);
2421 }
2422
2423 /**
2424 * _gl_reorder_moved_after_cb is called after an item was reordered.
2425 * This is only called when reorder mode is enabled.
2426 *
2427 * @param obj : the genlist object.
2428 * @param event_info : the moved item.
2429 *
2430 * the item(event_info) had been moved after the given relative item(*rel_item) in list.
2431 *
2432 */
2433 static void
_gl_reorder_moved_after_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2434 _gl_reorder_moved_after_cb(void *data EINA_UNUSED,
2435 Evas_Object *obj EINA_UNUSED, void *event_info)
2436 {
2437 // if needed, add application logic.
2438 Elm_Object_Item *it = elm_genlist_item_prev_get((Elm_Object_Item *)event_info);
2439 printf("it = %p, prev_it = %p\n", event_info, it);
2440 }
2441
2442 /**
2443 * _gl_reorder_moved_before_cb is called after an item was reordered.
2444 * This is only called when reorder mode is enabled.
2445 *
2446 * @param obj : the genlist object.
2447 * @param event_info : the moved item.
2448 *
2449 * the item(event_info) had been moved before the given relative item(*rel_item) in list.
2450 *
2451 */
2452 static void
_gl_reorder_moved_before_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2453 _gl_reorder_moved_before_cb(void *data EINA_UNUSED,
2454 Evas_Object *obj EINA_UNUSED, void *event_info)
2455 {
2456 // if needed, add application logic.
2457 Elm_Object_Item *it = elm_genlist_item_next_get((Elm_Object_Item *)event_info);
2458 printf("it = %p, next_it = %p\n", event_info, it);
2459 }
2460
2461 static void
_gl_reorder_item_focused_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2462 _gl_reorder_item_focused_cb(void *data EINA_UNUSED,
2463 Evas_Object *obj EINA_UNUSED, void *event_info)
2464 {
2465 printf("\"item,focused\" it: %p\n", event_info);
2466 }
2467
2468 static void
_gl_reorder_item_unfocused_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2469 _gl_reorder_item_unfocused_cb(void *data EINA_UNUSED,
2470 Evas_Object *obj EINA_UNUSED, void *event_info)
2471 {
2472 printf("\"item,unfocused\" it: %p\n", event_info);
2473 }
2474
2475 static void
_gl_reorder_item_selected_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2476 _gl_reorder_item_selected_cb(void *data EINA_UNUSED,
2477 Evas_Object *obj EINA_UNUSED, void *event_info)
2478 {
2479 printf("\"selected\" it: %p\n", event_info);
2480 }
2481
2482 static void
_gl_reorder_item_unselected_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2483 _gl_reorder_item_unselected_cb(void *data EINA_UNUSED,
2484 Evas_Object *obj EINA_UNUSED, void *event_info)
2485 {
2486 printf("\"unselected\" it: %p\n", event_info);
2487 }
2488
2489 void
test_genlist_reorder(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2490 test_genlist_reorder(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2491 void *event_info EINA_UNUSED)
2492 {
2493 Evas_Object *win, *fr, *lb, *bx, *tg, *gl;
2494 int i;
2495
2496 api_data *api = calloc(1, sizeof(api_data));
2497 win = elm_win_util_standard_add("genlist-reorder-mode", "Genlist Reorder Mode");
2498 elm_win_autodel_set(win, EINA_TRUE);
2499 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2500
2501 bx = elm_box_add(win);
2502 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2503 elm_win_resize_object_add(win, bx);
2504 evas_object_show(bx);
2505
2506 fr = elm_frame_add(win);
2507
2508 elm_object_text_set(fr, "Reorder Mode");
2509 elm_box_pack_end(bx, fr);
2510 evas_object_show(fr);
2511
2512 lb = elm_label_add(win);
2513 elm_object_text_set(lb,
2514 "Enable reorder mode if you want to move item.<br/>"
2515 "Then long press and drag item.");
2516 elm_object_content_set(fr, lb);
2517 evas_object_show(lb);
2518
2519 gl = elm_genlist_add(win);
2520 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2521 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2522 api->gl = gl;
2523 evas_object_show(gl);
2524
2525 tg = elm_check_add(win);
2526 elm_object_style_set(tg, "toggle");
2527 elm_object_text_set(tg, "Reorder Mode:");
2528 elm_check_state_set(tg, elm_config_mirrored_get());
2529 evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl);
2530 evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
2531 elm_box_pack_end(bx, tg);
2532 evas_object_show(tg);
2533
2534 api->itc1 = elm_genlist_item_class_new();
2535 api->itc1->item_style = "default";
2536 api->itc1->func.text_get = gl_text_get;
2537 api->itc1->func.content_get = gl_content_get;
2538 api->itc1->func.state_get = gl_state_get;
2539 api->itc1->func.del = NULL;
2540 evas_object_smart_callback_add(gl, "moved", _gl_reorder_moved_cb, NULL);
2541 evas_object_smart_callback_add(gl, "moved,after", _gl_reorder_moved_after_cb, NULL);
2542 evas_object_smart_callback_add(gl, "moved,before", _gl_reorder_moved_before_cb, NULL);
2543 evas_object_smart_callback_add(gl, "item,focused", _gl_reorder_item_focused_cb, NULL);
2544 evas_object_smart_callback_add(gl, "item,unfocused", _gl_reorder_item_unfocused_cb, NULL);
2545 evas_object_smart_callback_add(gl, "selected", _gl_reorder_item_selected_cb, NULL);
2546 evas_object_smart_callback_add(gl, "unselected", _gl_reorder_item_unselected_cb, NULL);
2547
2548 for (i = 0; i < 50; i++)
2549 elm_genlist_item_append(gl,
2550 api->itc1,
2551 (void *)(uintptr_t)(1 + i)/* item data */,
2552 NULL/* parent */,
2553 ELM_GENLIST_ITEM_NONE/* flags */,
2554 NULL/* func */,
2555 NULL/* func data */);
2556
2557 elm_genlist_item_class_free(api->itc1);
2558
2559 elm_box_pack_end(bx, gl);
2560
2561 evas_object_resize(win, 400, 500);
2562 evas_object_show(win);
2563 }
2564
2565
2566 /*** Genlist Textblock *****************************************************/
gl12_text_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)2567 char *gl12_text_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
2568 {
2569 return strdup("Enlightenment is not just a window manager for Linux/X11 and others, but also a whole suite of libraries to help you create beautiful user interfaces with much less work than doing it the old fashioned way and fighting with traditional toolkits, not to mention a traditional window manager. It covers uses from small mobile devices like phones all the way to powerful multi-core desktops (which are the primary development environment).");
2570 }
2571
2572 void
test_genlist12(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2573 test_genlist12(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2574 {
2575 Evas_Object *win, *bx, *gl;
2576 int i;
2577 api_data *api = calloc(1, sizeof(api_data));
2578
2579 win = elm_win_util_standard_add("genlist-textblock", "Genlist Textblock");
2580 elm_win_autodel_set(win, EINA_TRUE);
2581 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2582
2583 bx = elm_box_add(win);
2584 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2585 elm_win_resize_object_add(win, bx);
2586 evas_object_show(bx);
2587
2588 gl = elm_genlist_add(win);
2589 elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
2590 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2591 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2592 elm_box_pack_end(bx, gl);
2593 api->gl = gl;
2594 evas_object_show(gl);
2595
2596 api->itc1 = elm_genlist_item_class_new();
2597 api->itc1->item_style = "message";
2598 api->itc1->func.text_get = gl12_text_get;
2599 api->itc1->func.state_get = gl_state_get;
2600 api->itc1->func.del = NULL;
2601
2602 for (i = 0; i < 1000; i++)
2603 {
2604 elm_genlist_item_append(gl, api->itc1,
2605 (void *)(uintptr_t)i/* item data */,
2606 NULL/* parent */,
2607 ELM_GENLIST_ITEM_NONE,
2608 gl_sel/* func */,
2609 (void *)(uintptr_t)(i * 10)/* func data */);
2610 }
2611 elm_genlist_item_class_free(api->itc1);
2612
2613 evas_object_resize(win, 400, 500);
2614 evas_object_show(win);
2615 }
2616
2617
2618 /*** Genlist Tree, Insert Sorted *******************************************/
2619 static int
gl13_cmp(const void * pa,const void * pb)2620 gl13_cmp(const void *pa, const void *pb)
2621 {
2622 const char *a = elm_object_item_data_get(pa);
2623 const char *b = elm_object_item_data_get(pb);
2624
2625 if (!a) return -1;
2626 if (!b) return 1;
2627
2628 return strcmp(a, b);
2629 }
2630
2631 static void
_add_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2632 _add_cb(void *data,
2633 Evas_Object *obj EINA_UNUSED,
2634 void *event_info EINA_UNUSED)
2635 {
2636 Evas_Object *win = data;
2637 Evas_Object *gl = evas_object_data_get(win, "genlist");
2638 Evas_Object *entry = evas_object_data_get(win, "entry");
2639 api_data *api = evas_object_data_get(win, "api");
2640 const char *item_name = elm_entry_entry_get(entry);
2641 Elm_Object_Item *parent = elm_genlist_selected_item_get(gl);
2642
2643 if ((!item_name) || (!strcmp(item_name, "")))
2644 {
2645 printf("ERROR: Unable to add item with empty name. Please type name.\n");
2646 return;
2647 }
2648
2649 elm_genlist_item_sorted_insert
2650 (gl, api->itc2, eina_stringshare_add(item_name)/* item data */,
2651 parent/* parent */, ELM_GENLIST_ITEM_NONE,
2652 gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
2653
2654 elm_entry_entry_set(entry, NULL);
2655 }
2656
2657 static void
_del_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2658 _del_cb(void *data EINA_UNUSED,
2659 Evas_Object *obj EINA_UNUSED,
2660 void *event_info EINA_UNUSED)
2661 {
2662 Evas_Object *win = data;
2663 Evas_Object *gl = evas_object_data_get(win, "genlist");
2664 Elm_Object_Item *item = elm_genlist_selected_item_get(gl);
2665
2666 if (!item)
2667 {
2668 printf("ERROR: Unable to remove item. Please select item.\n");
2669 return;
2670 }
2671 elm_object_item_del(item);
2672 }
2673
2674 char *
gl6_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)2675 gl6_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
2676 {
2677 const char *str = data;
2678 return strdup(str);
2679 }
2680
2681 void
gl6_del(void * data,Evas_Object * obj EINA_UNUSED)2682 gl6_del(void *data, Evas_Object *obj EINA_UNUSED)
2683 {
2684 Eina_Stringshare *str = data;
2685 eina_stringshare_del(str);
2686 }
2687
2688 void
test_genlist13(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2689 test_genlist13(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2690 {
2691 Evas_Object *win, *bx, *bx1, *btn_add, *btn_del, *gl, *entry;
2692
2693 api_data *api = calloc(1, sizeof(api_data));
2694 win = elm_win_util_standard_add("genlist-tree-insert-sorted", "Genlist Tree, Insert Sorted");
2695 elm_win_autodel_set(win, EINA_TRUE);
2696 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2697 evas_object_data_set(win, "api", api);
2698
2699 bx = elm_box_add(win);
2700 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2701 elm_win_resize_object_add(win, bx);
2702 evas_object_show(bx);
2703
2704 gl = elm_genlist_add(win);
2705 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2706 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2707 evas_object_show(gl);
2708 evas_object_data_set(win, "genlist", gl);
2709
2710 api->itc2 = elm_genlist_item_class_new();
2711 api->itc2->item_style = "default";
2712 api->itc2->func.text_get = gl6_text_get;
2713 api->itc2->func.content_get = NULL;
2714 api->itc2->func.state_get = NULL;
2715 api->itc2->func.del = gl6_del;
2716
2717 entry = elm_entry_add(win);
2718 elm_entry_editable_set(entry, EINA_TRUE);
2719 elm_entry_single_line_set(entry, EINA_TRUE);
2720 elm_entry_scrollable_set(entry, EINA_TRUE);
2721 elm_object_part_text_set(entry, "guide", "Type item's name here to add.");
2722 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
2723 evas_object_show(entry);
2724 evas_object_data_set(win, "entry", entry);
2725
2726 bx1 = elm_box_add(win);
2727 elm_box_horizontal_set(bx1, EINA_TRUE);
2728 evas_object_show(bx1);
2729
2730 btn_add = elm_button_add(bx1);
2731 elm_object_text_set(btn_add, "Add");
2732 evas_object_size_hint_weight_set(btn_add, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2733 evas_object_smart_callback_add(btn_add, "clicked", _add_cb, win);
2734 elm_box_pack_end(bx1, btn_add);
2735 evas_object_show(btn_add);
2736
2737 btn_del = elm_button_add(bx1);
2738 elm_object_text_set(btn_del, "Delete");
2739 evas_object_size_hint_weight_set(btn_del, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2740 evas_object_smart_callback_add(btn_del, "clicked", _del_cb, win);
2741 elm_box_pack_end(bx1, btn_del);
2742 evas_object_show(btn_del);
2743
2744 elm_box_pack_end(bx, gl);
2745 elm_box_pack_end(bx, entry);
2746 elm_box_pack_end(bx, bx1);
2747 evas_object_show(bx);
2748
2749 evas_object_resize(win, 480, 480);
2750 evas_object_show(win);
2751 }
2752
2753 /*** Genlist Tree, Insert Relative *****************************************/
2754 static void
my_gl_insert_before_rel(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2755 my_gl_insert_before_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2756 {
2757 api_data *api = data;
2758 Evas_Object *gl = api->gl;
2759 static int i = 1000;
2760 Elm_Object_Item *gli_selected;
2761
2762 if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
2763 api->itc1->item_style = "default";
2764 api->itc1->func.text_get = gl_text_get;
2765 api->itc1->func.content_get = NULL;
2766 api->itc1->func.state_get = NULL;
2767 api->itc1->func.del = NULL;
2768
2769 gli_selected = elm_genlist_selected_item_get(gl);
2770 if (!gli_selected)
2771 {
2772 printf("no item selected\n");
2773 return;
2774 }
2775
2776 elm_genlist_item_insert_before(gl, api->itc1,
2777 (void *)(uintptr_t)i/* item data */,
2778 elm_genlist_item_parent_get(gli_selected),
2779 gli_selected/* item before */,
2780 ELM_GENLIST_ITEM_NONE,
2781 NULL/* func */, NULL/* func data */);
2782 i++;
2783 }
2784
2785 static void
my_gl_insert_after_rel(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2786 my_gl_insert_after_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2787 {
2788 api_data *api = data;
2789 Evas_Object *gl = api->gl;
2790 static int i = 0;
2791 Elm_Object_Item *gli_selected;
2792
2793 if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
2794 api->itc1->item_style = "default";
2795 api->itc1->func.text_get = gl_text_get;
2796 api->itc1->func.content_get = NULL;
2797 api->itc1->func.state_get = NULL;
2798 api->itc1->func.del = NULL;
2799
2800 gli_selected = elm_genlist_selected_item_get(gl);
2801 if (!gli_selected)
2802 {
2803 printf("no item selected\n");
2804 return;
2805 }
2806
2807 elm_genlist_item_insert_after(gl, api->itc1,
2808 (void *)(uintptr_t)i/* item data */,
2809 elm_genlist_item_parent_get(gli_selected),
2810 gli_selected/* item after */,
2811 ELM_GENLIST_ITEM_NONE,
2812 NULL/* func */, NULL/* func data */);
2813 i++;
2814 }
2815
2816 void
test_genlist14(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2817 test_genlist14(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2818 {
2819 Elm_Object_Item *pi[6];
2820 Evas_Object *win, *bx, *bx2, *bt, *gl;
2821 int i, base;
2822 /* index: 0, 1, 2, 3, 4, 5
2823 * items: 1, 15, 11, 2, 33, 21
2824 * final: 1, 2, 11, 15, 21, 33
2825 */
2826 const int idx[6] = {1, 15, 11, 2, 33, 21};
2827 const int relative[6] = {
2828 0, /* item '1' - not used */
2829 0, /* item '15' - insert after pi[0], item '1' */
2830 -1, /* item '11' - insert before pi[1], item '15' */
2831 -2, /* item '2' - insert before pi[2], item '11' */
2832 1, /* item '33' - insert after pi[1], item '15' */
2833 -4 /* item '21' - insert before pi[4], item '33' */
2834 };
2835
2836 api_data *api = calloc(1, sizeof(api_data));
2837 win = elm_win_util_standard_add("genlist-tree-insert-relative", "Genlist Tree, Insert Relative");
2838 elm_win_autodel_set(win, EINA_TRUE);
2839 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2840
2841 bx = elm_box_add(win);
2842 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2843 elm_win_resize_object_add(win, bx);
2844 evas_object_show(bx);
2845
2846 gl = elm_genlist_add(win);
2847 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2848 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2849 api->gl = gl;
2850 evas_object_show(gl);
2851
2852 api->itc2 = elm_genlist_item_class_new();
2853 api->itc2->item_style = "default";
2854 api->itc2->func.text_get = gl4_text_get;
2855 api->itc2->func.content_get = NULL;
2856 api->itc2->func.state_get = NULL;
2857 api->itc2->func.del = NULL;
2858
2859 /* mixed order to test insert sorted */
2860
2861 // BUG1: should be able to insert before=NULL, prepend
2862 // BUG2: should be able to insert after=NULL, append
2863
2864 pi[0] = elm_genlist_item_append
2865 (gl, api->itc2, (void *)(uintptr_t)idx[0]/* item data */,
2866 NULL/* parent */,
2867 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2868
2869 for (i = 1; i < 3; i++)
2870 {
2871 if (relative[i] < 0)
2872 pi[i] = elm_genlist_item_insert_before
2873 (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
2874 NULL/* parent */, pi[-relative[i]],
2875 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2876 else
2877 pi[i] = elm_genlist_item_insert_after
2878 (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
2879 NULL/* parent */, pi[relative[i]],
2880 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2881 }
2882
2883 for (i = 0; i < 3; i++)
2884 {
2885 Elm_Object_Item *sub_glit[6];
2886 int j;
2887
2888 base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
2889
2890 sub_glit[0] = elm_genlist_item_append
2891 (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
2892 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2893
2894 for (j = 1; j < 6; j++) {
2895 if (relative[j] < 0)
2896 sub_glit[j] = elm_genlist_item_insert_before
2897 (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2898 pi[i]/* parent */, sub_glit[-relative[j]],
2899 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2900 else
2901 sub_glit[j] = elm_genlist_item_insert_after
2902 (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2903 pi[i]/* parent */, sub_glit[relative[j]],
2904 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2905 }
2906 }
2907
2908 for (i = 3; i < 6; i++)
2909 {
2910 if (relative[i] < 0)
2911 pi[i] = elm_genlist_item_insert_before
2912 (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
2913 NULL/* parent */, pi[-relative[i]],
2914 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2915 else
2916 pi[i] = elm_genlist_item_insert_after
2917 (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
2918 NULL/* parent */, pi[relative[i]],
2919 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2920 }
2921
2922 for (i = 3; i < 6; i++)
2923 {
2924 Elm_Object_Item *sub_glit[6];
2925 int j;
2926
2927 base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
2928
2929 sub_glit[0] = elm_genlist_item_append
2930 (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
2931 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2932
2933 for (j = 1; j < 6; j++) {
2934 if (relative[j] < 0)
2935 sub_glit[j] = elm_genlist_item_insert_before
2936 (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2937 pi[i]/* parent */, sub_glit[-relative[j]],
2938 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2939 else
2940 sub_glit[j] = elm_genlist_item_insert_after
2941 (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2942 pi[i]/* parent */, sub_glit[relative[j]],
2943 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2944 }
2945 }
2946
2947 elm_box_pack_end(bx, gl);
2948 evas_object_show(bx);
2949
2950 bx2 = elm_box_add(win);
2951 elm_box_horizontal_set(bx2, EINA_TRUE);
2952 elm_box_homogeneous_set(bx2, EINA_TRUE);
2953 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
2954 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
2955
2956 bt = elm_button_add(win);
2957 elm_object_text_set(bt, "+ before");
2958 evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, api);
2959 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
2960 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
2961 elm_box_pack_end(bx2, bt);
2962 evas_object_show(bt);
2963
2964 bt = elm_button_add(win);
2965 elm_object_text_set(bt, "+ after");
2966 evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, api);
2967 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
2968 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
2969 elm_box_pack_end(bx2, bt);
2970 evas_object_show(bt);
2971
2972 elm_box_pack_end(bx, bx2);
2973 evas_object_show(bx2);
2974
2975 /* item_class_ref is needed for itc2. some items can be added in callbacks */
2976 elm_genlist_item_class_ref(api->itc2);
2977 elm_genlist_item_class_free(api->itc2);
2978
2979 evas_object_resize(win, 320, 320);
2980 evas_object_show(win);
2981 }
2982
2983
2984 /*** Genlist Decorate All Mode *********************************************/
2985 static void
_edit_icon_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2986 _edit_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2987 {
2988 Elm_Object_Item *item = (Elm_Object_Item *)data;
2989 elm_object_item_del(item);
2990 }
2991
2992 char *
gl15_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)2993 gl15_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
2994 {
2995 const Testitem *tit = data;
2996 char buf[256];
2997 snprintf(buf, sizeof(buf), "Item #%i", tit->mode);
2998 return strdup(buf);
2999 }
3000
3001 Evas_Object *
gl15_content_get(void * data,Evas_Object * obj,const char * part)3002 gl15_content_get(void *data, Evas_Object *obj, const char *part)
3003 {
3004 Testitem *tit = data;
3005 char buf[PATH_MAX];
3006
3007 // "edit" EDC layout is like below. each part is swallow part.
3008 // the existing item is swllowed to elm.swallow.edit.content part.
3009 // --------------------------------------------------------------------
3010 // | elm.edit.icon.1 | elm.swallow.decorate.content | elm.edit.icon,2 |
3011 // --------------------------------------------------------------------
3012
3013 if (!strcmp(part, "elm.swallow.end"))
3014 {
3015 Evas_Object *ic = elm_icon_add(obj);
3016 snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
3017 elm_image_file_set(ic, buf, NULL);
3018 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3019 return ic;
3020 }
3021 else if (!strcmp(part, "elm.edit.icon.1"))
3022 {
3023 Evas_Object *ck;
3024 ck = elm_check_add(obj);
3025 elm_check_state_pointer_set(ck, &tit->checked);
3026 evas_object_propagate_events_set(ck, EINA_FALSE);
3027 evas_object_show(ck);
3028 return ck;
3029 }
3030 else if (!strcmp(part, "elm.edit.icon.2"))
3031 {
3032 Evas_Object *icn = elm_icon_add(obj);
3033 snprintf(buf, sizeof(buf), "%s/images/icon_06.png", elm_app_data_dir_get());
3034 elm_image_file_set(icn, buf, NULL);
3035 evas_object_propagate_events_set(icn, EINA_FALSE);
3036 evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3037 evas_object_smart_callback_add(icn, "clicked", _edit_icon_clicked_cb, (void *)tit->item);
3038 return icn;
3039 }
3040 else return NULL;
3041 }
3042
3043 static void
gl15_sel(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3044 gl15_sel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
3045 {
3046 Testitem *tit = data;
3047 if (elm_genlist_decorate_mode_get(obj))
3048 {
3049 if (!tit->checked) tit->checked = EINA_TRUE;
3050 else tit->checked = EINA_FALSE;
3051 }
3052 elm_genlist_item_update(tit->item);
3053 }
3054
3055 static void
gl15_deco_all_mode(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3056 gl15_deco_all_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3057 {
3058 elm_genlist_decorate_mode_set(data, EINA_TRUE);
3059 elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
3060 }
3061
3062 static void
gl15_normal_mode(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3063 gl15_normal_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3064 {
3065 elm_genlist_decorate_mode_set(data, EINA_FALSE);
3066 elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT);
3067 }
3068
3069 void
gl15_del(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED)3070 gl15_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
3071 {
3072 Testitem *ti = data;
3073 printf("item deleted. (# %d)\n", ti->mode);
3074 }
3075
3076 void
test_genlist15(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3077 test_genlist15(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3078 {
3079 Evas_Object *win, *bx, *bx2, *bt, *gl;
3080 int i;
3081 static Testitem tit[100];
3082
3083 api_data *api = calloc(1, sizeof(api_data));
3084 win = elm_win_util_standard_add("genlist-decorate-all-mode", "Genlist Decorate All Mode");
3085 elm_win_autodel_set(win, EINA_TRUE);
3086 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3087
3088 bx = elm_box_add(win);
3089 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3090 elm_win_resize_object_add(win, bx);
3091 evas_object_show(bx);
3092
3093 gl = elm_genlist_add(win);
3094 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3095 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3096 api->gl = gl;
3097 evas_object_show(gl);
3098
3099 api->itc1 = elm_genlist_item_class_new();
3100 api->itc1->item_style = "default";
3101 api->itc1->func.text_get = gl15_text_get;
3102 api->itc1->func.content_get = gl15_content_get;
3103 api->itc1->func.state_get = gl_state_get;
3104 api->itc1->func.del = gl15_del;
3105 api->itc1->decorate_all_item_style = "edit";
3106
3107 for (i = 0; i < 100; i++)
3108 {
3109 tit[i].mode = i;
3110 tit[i].item = elm_genlist_item_append(gl, api->itc1,
3111 &(tit[i])/* item data */,
3112 NULL/* parent */,
3113 ELM_GENLIST_ITEM_NONE/* flags */,
3114 gl15_sel/* func */,
3115 (void *)(uintptr_t)&(tit[i])/* func data */);
3116 }
3117 elm_genlist_item_class_free(api->itc1);
3118 elm_box_pack_end(bx, gl);
3119 evas_object_show(bx);
3120
3121 bx2 = elm_box_add(win);
3122 elm_box_horizontal_set(bx2, EINA_TRUE);
3123 elm_box_homogeneous_set(bx2, EINA_TRUE);
3124 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
3125 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
3126
3127 bt = elm_button_add(win);
3128 elm_object_text_set(bt, "Decorate All mode");
3129 evas_object_smart_callback_add(bt, "clicked", gl15_deco_all_mode, gl);
3130 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
3131 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
3132 elm_box_pack_end(bx2, bt);
3133 evas_object_show(bt);
3134
3135 bt = elm_button_add(win);
3136 elm_object_text_set(bt, "Normal mode");
3137 evas_object_smart_callback_add(bt, "clicked", gl15_normal_mode,gl);
3138 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
3139 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
3140 elm_box_pack_end(bx2, bt);
3141 evas_object_show(bt);
3142
3143 elm_box_pack_end(bx, bx2);
3144 evas_object_show(bx2);
3145
3146 evas_object_resize(win, 520, 520);
3147 evas_object_show(win);
3148 }
3149
3150
3151 /*** Genlist Flip Mode *****************************************************/
3152 static void
_flip_icon_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3153 _flip_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3154 {
3155 const Testitem *tit = data;
3156
3157 if (elm_genlist_item_flip_get(tit->item))
3158 elm_genlist_item_flip_set(tit->item, EINA_FALSE);
3159 else
3160 elm_genlist_item_flip_set(tit->item, EINA_TRUE);
3161 }
3162
3163 char *
gl16_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)3164 gl16_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
3165 {
3166 const Testitem *tit = data;
3167 char buf[256];
3168 snprintf(buf, sizeof(buf), "Item #%i", tit->mode);
3169 return strdup(buf);
3170 }
3171
3172 Evas_Object *
gl16_content_get(void * data,Evas_Object * obj,const char * part)3173 gl16_content_get(void *data, Evas_Object *obj, const char *part)
3174 {
3175 Testitem *tit = data;
3176 char buf[PATH_MAX];
3177
3178 if (!strcmp(part, "elm.text.flip"))
3179 {
3180 Evas_Object *btn = elm_button_add(obj);
3181 elm_object_text_set(btn, "flipped content placement");
3182 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
3183 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
3184 evas_object_smart_callback_add(btn, "clicked", _flip_icon_clicked_cb, (void *)tit);
3185 evas_object_show(btn);
3186 return btn;
3187 }
3188 else if (!strcmp(part, "elm.edit.icon.1"))
3189 {
3190 Evas_Object *icn = elm_icon_add(obj);
3191 snprintf(buf, sizeof(buf), "%s/images/icon_04.png", elm_app_data_dir_get());
3192 elm_image_file_set(icn, buf, NULL);
3193 evas_object_propagate_events_set(icn, EINA_FALSE);
3194 evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3195 return icn;
3196 }
3197 else if (!strcmp(part, "elm.edit.icon.2"))
3198 {
3199 Evas_Object *icn = elm_icon_add(obj);
3200 snprintf(buf, sizeof(buf), "%s/images/icon_09.png", elm_app_data_dir_get());
3201 elm_image_file_set(icn, buf, NULL);
3202 evas_object_propagate_events_set(icn, EINA_FALSE);
3203 evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3204 evas_object_smart_callback_add(icn, "clicked", _flip_icon_clicked_cb, (void *)tit);
3205 return icn;
3206 }
3207 else return NULL;
3208 }
3209
3210 void
test_genlist16(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3211 test_genlist16(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3212 {
3213 Evas_Object *win, *bx, *gl;
3214 int i;
3215 static Testitem tit[100];
3216
3217 api_data *api = calloc(1, sizeof(api_data));
3218 win = elm_win_util_standard_add("genlist-flip-mode", "Genlist Flip Mode");
3219 elm_win_autodel_set(win, EINA_TRUE);
3220 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3221
3222 bx = elm_box_add(win);
3223 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3224 elm_win_resize_object_add(win, bx);
3225 evas_object_show(bx);
3226
3227 gl = elm_genlist_add(win);
3228 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3229 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3230 api->gl = gl;
3231 evas_object_show(gl);
3232
3233 /* note: flip mode can be used with/without edit mode */
3234 elm_genlist_decorate_mode_set(gl, EINA_TRUE);
3235 elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
3236
3237 api->itc1 = elm_genlist_item_class_new();
3238 api->itc1->item_style = "default";
3239 api->itc1->func.text_get = gl16_text_get;
3240 api->itc1->func.content_get = gl16_content_get;
3241 api->itc1->func.state_get = gl_state_get;
3242 api->itc1->func.del = NULL;
3243 api->itc1->decorate_all_item_style = "edit";
3244
3245 for (i = 0; i < 100; i++)
3246 {
3247 tit[i].mode = i;
3248 tit[i].item = elm_genlist_item_append(gl, api->itc1,
3249 &(tit[i])/* item data */,
3250 NULL/* parent */,
3251 ELM_GENLIST_ITEM_NONE/* flags */,
3252 gl_sel/* func */,
3253 (void *)(uintptr_t)&(tit[i])/* func data */);
3254 }
3255 elm_genlist_item_class_free(api->itc1);
3256 elm_box_pack_end(bx, gl);
3257 evas_object_show(bx);
3258
3259 evas_object_resize(win, 520, 520);
3260 evas_object_show(win);
3261 }
3262
3263
3264 /*** Genlist Decorate Modes ************************************************/
3265 char *
gl17_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part)3266 gl17_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
3267 {
3268 const Testitem *tit = data;
3269 char buf[256];
3270 if (!strcmp(part, "elm.text.mode"))
3271 snprintf(buf, sizeof(buf), "Mode # %i", tit->mode);
3272 else
3273 snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
3274 return strdup(buf);
3275 }
3276
3277 Evas_Object *
_decorate_item_mode_frame_new(Evas_Object * win,Evas_Object ** rdg)3278 _decorate_item_mode_frame_new(Evas_Object *win, Evas_Object **rdg)
3279 {
3280 Evas_Object *fr, *bx, *rd;
3281
3282 fr = elm_frame_add(win);
3283 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3284 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
3285 elm_object_text_set(fr, "Decorate Item Mode Type");
3286 evas_object_show(fr);
3287
3288 bx = elm_box_add(win);
3289 elm_object_content_set(fr, bx);
3290 evas_object_show(bx);
3291
3292 rd = elm_radio_add(win);
3293 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3294 elm_radio_state_value_set(rd, 0);
3295 elm_object_text_set(rd, "Slide : Sweep genlist items to the right.");
3296 evas_object_show(rd);
3297 elm_box_pack_end(bx, rd);
3298 *rdg = rd;
3299
3300 rd = elm_radio_add(win);
3301 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3302 elm_radio_state_value_set(rd, 1);
3303 elm_object_text_set(rd, "Rotate : Click each item.");
3304 elm_radio_group_add(rd, *rdg);
3305 evas_object_show(rd);
3306 elm_box_pack_end(bx, rd);
3307
3308 return fr;
3309 }
3310
3311 void
_decorate_all_set_btn_clicked_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3312 _decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
3313 {
3314 if (!data) return;
3315
3316 Evas_Object *gl;
3317 gl = evas_object_data_get(obj, "gl");
3318 if (!gl) return;
3319
3320 if (evas_object_data_get(gl, "tree_effect"))
3321 elm_genlist_tree_effect_enabled_set(gl, EINA_FALSE);
3322 elm_genlist_decorate_mode_set(gl, EINA_TRUE);
3323 }
3324
3325 void
_decorate_all_unset_btn_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3326 _decorate_all_unset_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3327 {
3328 if (evas_object_data_get(data, "tree_effect"))
3329 elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
3330 elm_genlist_decorate_mode_set(data, EINA_FALSE);
3331 }
3332
3333 Evas_Object *
_decorate_all_mode_frame_new(Evas_Object * win,Evas_Object * rdg,Evas_Object * gl)3334 _decorate_all_mode_frame_new(Evas_Object *win, Evas_Object *rdg, Evas_Object *gl)
3335 {
3336 Evas_Object *fr, *bx, *btn;
3337
3338 fr = elm_frame_add(win);
3339 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3340 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
3341 elm_object_text_set(fr, "Decorate All Mode Type");
3342 evas_object_show(fr);
3343
3344 bx = elm_box_add(win);
3345 elm_object_content_set(fr, bx);
3346 evas_object_show(bx);
3347
3348 btn = elm_button_add(win);
3349 evas_object_data_set(btn, "gl", gl);
3350 elm_object_text_set(btn, "Set Decorate All Mode");
3351 evas_object_smart_callback_add(btn, "clicked", _decorate_all_set_btn_clicked_cb, rdg);
3352 elm_box_pack_end(bx, btn);
3353 evas_object_show(btn);
3354
3355 btn = elm_button_add(win);
3356 elm_object_text_set(btn, "Unset Decorate All Mode");
3357 evas_object_smart_callback_add(btn, "clicked", _decorate_all_unset_btn_clicked_cb, gl);
3358 elm_box_pack_end(bx, btn);
3359 evas_object_show(btn);
3360
3361 return fr;
3362 }
3363
3364 void
test_genlist17(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3365 test_genlist17(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3366 {
3367 Evas_Object *win, *fr1, *fr2, *bx, *bx2, *rdg = NULL, *gl;
3368 int i;
3369 static Testitem tit[50];
3370
3371 api_data *api = calloc(1, sizeof(api_data));
3372 win = elm_win_util_standard_add("genlist-decorate-modes", "Genlist Decorate Modes");
3373 elm_win_autodel_set(win, EINA_TRUE);
3374 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3375
3376 bx = elm_box_add(win);
3377 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3378 elm_win_resize_object_add(win, bx);
3379 evas_object_show(bx);
3380
3381 bx2 = elm_box_add(win);
3382 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
3383 elm_box_horizontal_set(bx2, EINA_TRUE);
3384 elm_box_pack_end(bx, bx2);
3385 evas_object_show(bx2);
3386
3387 fr1 = _decorate_item_mode_frame_new(win, &rdg);
3388 elm_box_pack_end(bx2, fr1);
3389
3390 gl = elm_genlist_add(win);
3391 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3392 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3393 evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg);
3394 evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
3395 evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
3396 evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
3397 api->gl = gl;
3398 evas_object_show(gl);
3399
3400 api->itc1 = elm_genlist_item_class_new();
3401 api->itc1->item_style = "default";
3402 api->itc1->decorate_item_style = "mode";
3403 api->itc1->func.text_get = gl15_text_get;
3404 api->itc1->func.content_get = gl15_content_get;
3405 api->itc1->func.state_get = gl_state_get;
3406 api->itc1->func.del = NULL;
3407 api->itc1->decorate_all_item_style = "edit";
3408
3409 for (i = 0; i < 50; i++)
3410 {
3411 tit[i].checked = EINA_FALSE;
3412 tit[i].mode = i;
3413 tit[i].item = elm_genlist_item_append(gl,
3414 api->itc1,
3415 &(tit[i])/* item data */,
3416 NULL/* parent */,
3417 ELM_GENLIST_ITEM_NONE/* flags */,
3418 NULL/* select func */,
3419 NULL/* func data */);
3420 }
3421
3422 elm_genlist_item_class_free(api->itc1);
3423 elm_box_pack_end(bx, gl);
3424
3425 fr2 = _decorate_all_mode_frame_new(win, rdg, gl);
3426 elm_box_pack_end(bx2, fr2);
3427
3428 evas_object_resize(win, 520, 520);
3429 evas_object_show(win);
3430 }
3431
3432
3433 /*** Genlist Tree and Decorate All Mode ************************************/
3434 static void
_tree_effect_enable_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3435 _tree_effect_enable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3436 {
3437 elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
3438 }
3439
3440 static void
_tree_effect_disable_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3441 _tree_effect_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3442 {
3443 elm_genlist_tree_effect_enabled_set(data, EINA_FALSE);
3444 }
3445
3446 Evas_Object *
_tree_effect_frame_new(Evas_Object * win,Evas_Object ** rdg,Evas_Object * gl)3447 _tree_effect_frame_new(Evas_Object *win, Evas_Object **rdg, Evas_Object *gl)
3448 {
3449 Evas_Object *fr, *bx, *rd;
3450
3451 fr = elm_frame_add(win);
3452 elm_object_text_set(fr, "Genlist Tree Effect");
3453 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3454 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
3455 evas_object_show(fr);
3456
3457 bx = elm_box_add(win);
3458 elm_box_homogeneous_set(bx, EINA_TRUE);
3459 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3460 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
3461 elm_object_content_set(fr, bx);
3462 evas_object_show(bx);
3463
3464 rd = elm_radio_add(win);
3465 elm_radio_state_value_set(rd, 0);
3466 elm_object_text_set(rd, "Enable");
3467 evas_object_smart_callback_add(rd, "changed", _tree_effect_enable_cb, gl);
3468 evas_object_show(rd);
3469 elm_box_pack_end(bx, rd);
3470 *rdg = rd;
3471
3472 rd = elm_radio_add(win);
3473 elm_radio_state_value_set(rd, 1);
3474 elm_radio_group_add(rd, *rdg);
3475 elm_object_text_set(rd, "Disable");
3476 evas_object_smart_callback_add(rd, "changed", _tree_effect_disable_cb, gl);
3477 evas_object_show(rd);
3478 elm_box_pack_end(bx, rd);
3479
3480
3481 return fr;
3482 }
3483
3484 static void
gl18_sel(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3485 gl18_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
3486 {
3487 Elm_Object_Item *glit = event_info;
3488 int depth = elm_genlist_item_expanded_depth_get(glit);
3489 printf("expanded depth for selected item is %d\n", depth);
3490 }
3491
3492 static void
gl18_del(void * data,Evas_Object * obj EINA_UNUSED)3493 gl18_del(void *data, Evas_Object *obj EINA_UNUSED)
3494 {
3495 free(data);
3496 }
3497
3498 static void
gl18_exp(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3499 gl18_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
3500 {
3501 api_data *api = data;
3502 Elm_Object_Item *glit = event_info;
3503 Evas_Object *gl = elm_object_item_widget_get(glit);
3504 Testitem *tit = elm_object_item_data_get(glit);
3505 int i, j, val;
3506
3507 val = tit->mode * 10;
3508 for (i = 0; i < 100; i++)
3509 {
3510 tit = calloc(1, sizeof(Testitem));
3511 tit->mode = val + i;
3512 tit->item = elm_genlist_item_append(gl,
3513 api->itc2,
3514 tit/* item data */,
3515 glit/* parent */,
3516 ELM_GENLIST_ITEM_TREE,
3517 gl18_sel/* func */,
3518 NULL/* func data */);
3519 }
3520 for (j = 0; j < 3; j++)
3521 {
3522 tit = calloc(1, sizeof(Testitem));
3523 tit->mode = i;
3524 tit->item = elm_genlist_item_append(gl,
3525 api->itc1,
3526 tit/* item data */,
3527 glit/* parent */,
3528 ELM_GENLIST_ITEM_NONE,
3529 gl18_sel/* func */,
3530 NULL/* func data */);
3531 i++;
3532 }
3533 }
3534
3535 static void
gl18_con(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3536 gl18_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
3537 {
3538 Elm_Object_Item *glit = event_info;
3539 elm_genlist_item_subitems_clear(glit);
3540 }
3541
3542 static void
gl18_exp_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3543 gl18_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
3544 void *event_info)
3545 {
3546 Elm_Object_Item *glit = event_info;
3547 elm_genlist_item_expanded_set(glit, EINA_TRUE);
3548 }
3549
3550 static void
gl18_con_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3551 gl18_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
3552 void *event_info)
3553 {
3554 Elm_Object_Item *glit = event_info;
3555 elm_genlist_item_expanded_set(glit, EINA_FALSE);
3556 }
3557
3558 void
test_genlist18(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3559 test_genlist18(void *data EINA_UNUSED,
3560 Evas_Object *obj EINA_UNUSED,
3561 void *event_info EINA_UNUSED)
3562 {
3563 Evas_Object *win, *gl, *bx, *fr1, *fr2, *bx2, *rdg;
3564 Testitem *tit = NULL;
3565 int i, j;
3566
3567 api_data *api = calloc(1, sizeof(api_data));
3568 win = elm_win_util_standard_add("genlist-tree-decorate-all",
3569 "Genlist Tree and Decorate All Mode");
3570 elm_win_autodel_set(win, EINA_TRUE);
3571 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3572
3573 bx = elm_box_add(win);
3574 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3575 elm_win_resize_object_add(win, bx);
3576 evas_object_show(bx);
3577
3578 bx2 = elm_box_add(win);
3579 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
3580 elm_box_horizontal_set(bx2, EINA_TRUE);
3581 elm_box_pack_end(bx, bx2);
3582 evas_object_show(bx2);
3583
3584 gl = elm_genlist_add(win);
3585 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3586 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3587 api->gl = gl;
3588 evas_object_show(gl);
3589
3590 elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE);
3591 evas_object_data_set(gl, "tree_effect", "true");
3592
3593 /* normal item */
3594 api->itc1 = elm_genlist_item_class_new();
3595 api->itc1->item_style = "tree_effect"; /* item/tree_effect */
3596 api->itc1->func.text_get = gl15_text_get;
3597 api->itc1->func.content_get = gl15_content_get;
3598 api->itc1->func.state_get = gl_state_get;
3599 api->itc1->func.del = gl18_del;
3600 api->itc1->decorate_all_item_style = "edit";
3601
3602 /* expandable item */
3603 api->itc2 = elm_genlist_item_class_new();
3604 api->itc2->item_style = "tree_effect"; /* tree/tree_effect */
3605 api->itc2->func.text_get = gl15_text_get;
3606 api->itc2->func.content_get = gl15_content_get;
3607 api->itc2->func.state_get = gl_state_get;
3608 api->itc2->func.del = gl18_del;
3609 api->itc2->decorate_all_item_style = "edit";
3610
3611 for (i = 0; i < 5; i++)
3612 {
3613 tit = calloc(1, sizeof(Testitem));
3614 tit->mode = i;
3615 tit->item = elm_genlist_item_append(gl,
3616 api->itc2,
3617 tit/* item data */,
3618 NULL/* parent */,
3619 ELM_GENLIST_ITEM_TREE,
3620 gl18_sel/* func */,
3621 NULL/* func data */);
3622 }
3623
3624 for (j = 0; j < 3; j++)
3625 {
3626 tit = calloc(1, sizeof(Testitem));
3627 tit->mode = i;
3628 tit->item = elm_genlist_item_append(gl,
3629 api->itc1,
3630 tit/* item data */,
3631 NULL/* parent */,
3632 ELM_GENLIST_ITEM_NONE,
3633 gl18_sel/* func */,
3634 NULL/* func data */);
3635 i++;
3636 }
3637
3638 elm_genlist_item_class_free(api->itc1);
3639 elm_genlist_item_class_free(api->itc2);
3640
3641 evas_object_smart_callback_add(gl, "expand,request", gl18_exp_req, api);
3642 evas_object_smart_callback_add(gl, "contract,request", gl18_con_req, api);
3643 evas_object_smart_callback_add(gl, "expanded", gl18_exp, api);
3644 evas_object_smart_callback_add(gl, "contracted", gl18_con, api);
3645
3646 elm_box_pack_end(bx, gl);
3647
3648 fr1 = _tree_effect_frame_new(win, &rdg, gl);
3649 elm_box_pack_end(bx2, fr1);
3650
3651 fr2 = _decorate_all_mode_frame_new(win, rdg, gl);
3652 elm_box_pack_end(bx2, fr2);
3653
3654 evas_object_resize(win, 400, 800);
3655 evas_object_show(win);
3656 }
3657
3658
3659 /*** Genlist Full Widget ***************************************************/
3660 void
test_genlist19(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3661 test_genlist19(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3662 {
3663 Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
3664 Evas_Object *over;
3665 Elm_Object_Item *gli;
3666 int i;
3667 api_data *api = calloc(1, sizeof(api_data));
3668
3669 win = elm_win_util_standard_add("genlist-full", "Genlist Full Widget");
3670 elm_win_autodel_set(win, EINA_TRUE);
3671 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3672
3673 bxx = elm_box_add(win);
3674 elm_win_resize_object_add(win, bxx);
3675 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3676 evas_object_show(bxx);
3677
3678 bx = elm_box_add(win);
3679 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3680 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
3681 api->box = bx;
3682 evas_object_show(bx);
3683
3684 bt = elm_button_add(win);
3685 elm_object_text_set(bt, "Next API function");
3686 evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
3687 elm_box_pack_end(bxx, bt);
3688 elm_object_disabled_set(bt, api->state == API_STATE_LAST);
3689 evas_object_show(bt);
3690
3691 elm_box_pack_end(bxx, bx);
3692
3693 gl = elm_genlist_add(win);
3694 evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
3695 evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
3696 evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
3697 // FIXME: This causes genlist to resize the horiz axis very slowly :(
3698 // Reenable this and resize the window horizontally, then try to resize it back
3699 //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
3700 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3701 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3702 elm_box_pack_end(bx, gl);
3703 api->gl = gl;
3704 evas_object_show(gl);
3705
3706 over = evas_object_rectangle_add(evas_object_evas_get(win));
3707 evas_object_color_set(over, 0, 0, 0, 0);
3708 evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
3709 evas_object_repeat_events_set(over, EINA_TRUE);
3710 evas_object_show(over);
3711 evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3712 elm_win_resize_object_add(win, over);
3713
3714 api->itc1 = elm_genlist_item_class_new();
3715 api->itc1->item_style = "full";
3716 api->itc1->func.text_get = NULL;
3717 api->itc1->func.content_get = gl_content_full_get;
3718 api->itc1->func.state_get = gl_state_get;
3719 api->itc1->func.del = NULL;
3720
3721 bt_50 = elm_button_add(win);
3722 elm_object_text_set(bt_50, "Go to 50");
3723 evas_object_show(bt_50);
3724 elm_box_pack_end(bx, bt_50);
3725
3726 bt_1500 = elm_button_add(win);
3727 elm_object_text_set(bt_1500, "Go to 1500");
3728 evas_object_show(bt_1500);
3729 elm_box_pack_end(bx, bt_1500);
3730
3731 for (i = 0; i < 2000; i++)
3732 {
3733 gli = elm_genlist_item_append(gl, api->itc1,
3734 (void *)(uintptr_t)i/* item data */,
3735 NULL/* parent */,
3736 ELM_GENLIST_ITEM_NONE,
3737 gl_sel/* func */,
3738 (void *)(uintptr_t)(i * 10)/* func data */);
3739 if (i == 50)
3740 evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
3741 else if (i == 1500)
3742 evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
3743 }
3744 elm_genlist_item_class_free(api->itc1);
3745
3746 evas_object_resize(win, 480, 800);
3747 evas_object_show(win);
3748 }
3749
3750
3751 /*** Genlist Item Styles ***************************************************/
3752 const char *_genlist_styles[] = {
3753 "default", "full", "one_icon", "end_icon", "no_icon",
3754 "default_style", "double_label", "icon_top_text_bottom",
3755 "message", "media", "media-album", "media-preview",
3756 NULL
3757 };
3758
3759 static void
_genlist_renew(Evas_Object * obj,const char * style)3760 _genlist_renew(Evas_Object *obj, const char *style)
3761 {
3762 Elm_Genlist_Item_Class *ic;
3763 Evas_Object *check;
3764 int i;
3765
3766 if (!obj) return;
3767
3768 elm_genlist_clear(obj);
3769
3770 check = evas_object_data_get(obj, "check");
3771 if (elm_check_state_get(check))
3772 elm_genlist_mode_set(obj, ELM_LIST_COMPRESS);
3773 else
3774 elm_genlist_mode_set(obj, ELM_LIST_SCROLL);
3775
3776 ic = elm_genlist_item_class_new();
3777 ic->item_style = style;
3778 ic->func.text_get = gl_text_get;
3779 ic->func.content_get = gl_content_get;
3780 ic->func.state_get = NULL;
3781 ic->func.del = NULL;
3782
3783 for (i = 0; i < 50; i++)
3784 {
3785 elm_genlist_item_append(obj, ic, (void *)(uintptr_t)i, NULL,
3786 ELM_GENLIST_ITEM_NONE, NULL, NULL);
3787 }
3788 elm_genlist_item_class_free(ic);
3789 }
3790
3791 static void
_item_style_sel_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info)3792 _item_style_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
3793 {
3794 Evas_Object *gl = evas_object_data_get(obj, "genlist");
3795 if (gl)
3796 _genlist_renew(gl, elm_object_item_text_get(event_info));
3797 }
3798
3799 static Evas_Object *
_item_styles_list_create(Evas_Object * parent)3800 _item_styles_list_create(Evas_Object *parent)
3801 {
3802 Evas_Object *list;
3803 int i = 0;
3804
3805 list = elm_list_add(parent);
3806 evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3807 evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
3808
3809 while (_genlist_styles[i])
3810 {
3811 elm_list_item_append(list, _genlist_styles[i], NULL, NULL,
3812 _item_style_sel_cb, _genlist_styles[i]);
3813 i++;
3814 }
3815
3816 return list;
3817 }
3818
3819 void
test_genlist_item_styles(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3820 test_genlist_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
3821 void *event_info EINA_UNUSED)
3822 {
3823 Evas_Object *win, *box, *gl, *list, *table, *check;
3824
3825 win = elm_win_util_standard_add("genlist-item-styles", "Genlist Item Styles");
3826 elm_win_autodel_set(win, EINA_TRUE);
3827
3828 box = elm_box_add(win);
3829 elm_box_horizontal_set(box, EINA_TRUE);
3830 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3831 elm_win_resize_object_add(win, box);
3832 evas_object_show(box);
3833
3834 list = _item_styles_list_create(box);
3835 evas_object_show(list);
3836
3837 table = _elm_min_set(list, box, 200, 0);
3838 evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND);
3839 evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
3840 elm_box_pack_end(box, table);
3841 evas_object_show(table);
3842
3843 gl = elm_genlist_add(box);
3844 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3845 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3846 elm_box_pack_end(box, gl);
3847 evas_object_show(gl);
3848
3849 check = elm_check_add(win);
3850 elm_object_text_set(check, "Compress");
3851 elm_box_pack_end(box, check);
3852 evas_object_show(check);
3853 evas_object_data_set(gl, "check", check);
3854 _genlist_renew(gl, "default");
3855
3856 evas_object_data_set(list, "genlist", gl);
3857
3858 evas_object_resize(win, 600, 600);
3859 evas_object_show(win);
3860 }
3861
3862
3863 /*** Genlist Multi Select **************************************************/
3864 typedef struct _Genlist_Multi_Data Genlist_Multi_Data;
3865 struct _Genlist_Multi_Data
3866 {
3867 Evas_Object *gl;
3868 Evas_Object *rd1;
3869 Evas_Object *rd2;
3870 };
3871
3872 static void
_multi_select_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3873 _multi_select_changed_cb(void *data, Evas_Object *obj,
3874 void *event_info EINA_UNUSED)
3875 {
3876 Eina_Bool multi = elm_check_state_get(obj);
3877 Genlist_Multi_Data *gd = data;
3878 if (!gd) return;
3879
3880 elm_genlist_multi_select_set(gd->gl, multi);
3881 elm_object_disabled_set(gd->rd1, !multi);
3882 elm_object_disabled_set(gd->rd2, !multi);
3883 }
3884
3885 static void
_multi_select_mode_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3886 _multi_select_mode_changed_cb(void *data, Evas_Object *obj,
3887 void *event_info EINA_UNUSED)
3888 {
3889 elm_genlist_multi_select_mode_set(data, elm_radio_value_get(obj));
3890 }
3891
3892 static void
_multi_select_frame_create(Evas_Object * bx,Genlist_Multi_Data * gd)3893 _multi_select_frame_create(Evas_Object *bx, Genlist_Multi_Data *gd)
3894 {
3895 Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg;
3896 if (!gd) return;
3897
3898 fr = elm_frame_add(bx);
3899 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
3900 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
3901 elm_object_text_set(fr, "Multi Select Option");
3902 elm_box_pack_end(bx, fr);
3903 evas_object_show(fr);
3904
3905 bx2 = elm_box_add(fr);
3906 elm_object_content_set(fr, bx2);
3907 evas_object_show(bx2);
3908
3909 tg = elm_check_add(bx2);
3910 elm_object_style_set(tg, "toggle");
3911 elm_object_text_set(tg, "Multi Select Mode");
3912 elm_box_pack_end(bx2, tg);
3913 evas_object_show(tg);
3914
3915 bx3 = elm_box_add(bx2);
3916 elm_box_horizontal_set(bx3, EINA_TRUE);
3917 elm_box_pack_end(bx2, bx3);
3918 evas_object_show(bx3);
3919
3920 gd->rd1 = rdg = rd = elm_radio_add(bx3);
3921 elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT);
3922 elm_object_text_set(rd, "Default Mode");
3923 elm_box_pack_end(bx3, rd);
3924 evas_object_show(rd);
3925 elm_object_disabled_set(rd, EINA_TRUE);
3926 evas_object_smart_callback_add(rd, "changed",
3927 _multi_select_mode_changed_cb, gd->gl);
3928
3929 gd->rd2 = rd = elm_radio_add(bx3);
3930 elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL);
3931 elm_radio_group_add(rd, rdg);
3932 elm_object_text_set(rd, "With Control Mode");
3933 elm_box_pack_end(bx3, rd);
3934 evas_object_show(rd);
3935 elm_object_disabled_set(rd, EINA_TRUE);
3936 evas_object_smart_callback_add(rd, "changed",
3937 _multi_select_mode_changed_cb, gd->gl);
3938
3939 evas_object_smart_callback_add(tg, "changed",
3940 _multi_select_changed_cb, gd);
3941 }
3942
3943 static void
_multi_data_free_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3944 _multi_data_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3945 {
3946 free(data);
3947 }
3948
3949 void
test_genlist_multi_select(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3950 test_genlist_multi_select(void *data EINA_UNUSED,
3951 Evas_Object *obj EINA_UNUSED,
3952 void *event_info EINA_UNUSED)
3953 {
3954 Evas_Object *win, *gl, *bx;
3955 Genlist_Multi_Data *gd = calloc(1, sizeof(Genlist_Multi_Data));
3956 Elm_Genlist_Item_Class *itc = NULL;
3957 int i = 0;
3958
3959 win = elm_win_util_standard_add("genlist-multi-select", "Genlist Multi Select");
3960 elm_win_autodel_set(win, EINA_TRUE);
3961 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _multi_data_free_cb, gd);
3962
3963 bx = elm_box_add(win);
3964 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3965 elm_win_resize_object_add(win, bx);
3966 evas_object_show(bx);
3967
3968 gd->gl = gl = elm_genlist_add(bx);
3969 _multi_select_frame_create(bx, gd);
3970
3971 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3972 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3973 elm_box_pack_end(bx, gl);
3974 evas_object_show(gl);
3975
3976 itc = elm_genlist_item_class_new();
3977 itc->item_style = "default";
3978 itc->func.text_get = gl_text_get;
3979 itc->func.content_get = gl_content_get;
3980 itc->func.state_get = gl_state_get;
3981 itc->func.del = NULL;
3982
3983 for (i = 0; i < 100; i++)
3984 {
3985 elm_genlist_item_append(gl, itc,
3986 (void *)(uintptr_t)i/* item data */,
3987 NULL/* parent */,
3988 ELM_GENLIST_ITEM_NONE,
3989 gl_sel/* func */,
3990 (void *)(uintptr_t)(i * 10)/* func data */);
3991 }
3992 elm_genlist_item_class_free(itc);
3993
3994 evas_object_resize(win, 320, 500);
3995 evas_object_show(win);
3996 }
3997
3998
3999 /*** Genlist Item Search By Text *******************************************/
4000 typedef struct _gl20_Event_Data gl20_Event_Data;
4001 struct _gl20_Event_Data
4002 {
4003 Evas_Object *gl_obj;
4004 Evas_Object *tg_obj;
4005 Evas_Object *en_obj;
4006 Elm_Object_Item *last_item_found;
4007 };
4008
4009 static const char *_gl20_items_text[] = {
4010 "Albany", "Annapolis",
4011 "Atlanta", "Augusta",
4012 "Austin", "Baton Rouge",
4013 "Bismarck", "Boise",
4014 "Boston", "Carson City",
4015 "Charleston", "Cheyenne",
4016 "Columbia", "Columbus",
4017 "Concord", "Denver",
4018 "Des Moines", "Dover",
4019 "Frankfort", "Harrisburg",
4020 "Hartford", "Helena",
4021 "Honolulu", "Indianapolis",
4022 "Jackson", "Jefferson City",
4023 "Juneau", "Lansing",
4024 "Lincoln", "Little Rock",
4025 "Madison", "Montgomery",
4026 "Montpelier", "Nashville",
4027 "Oklahoma City", "Olympia",
4028 "Phoenix", "Pierre",
4029 "Providence", "Raleigh",
4030 "Richmond", "Sacramento",
4031 "Saint Paul", "Salem",
4032 "Salt Lake City", "Santa Fe",
4033 "Springfield", "Tallahassee",
4034 "Topeka", "Trenton" };
4035
4036 static void
_gl20_del_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4037 _gl20_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
4038 {
4039 free(data);
4040 }
4041
4042 static char *
_gl20_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4043 _gl20_text_get(void *data, Evas_Object *obj EINA_UNUSED,
4044 const char *part EINA_UNUSED)
4045 {
4046 char buf[32];
4047 int item_index = (int)(uintptr_t)data;
4048
4049 if (item_index < 50)
4050 {
4051 snprintf(buf, sizeof(buf), "%s", _gl20_items_text[item_index]);
4052 return strdup(buf);
4053 }
4054 else if (item_index < 100)
4055 {
4056 snprintf(buf, sizeof(buf), "%X", (item_index - 50));
4057 return strdup(buf);
4058 }
4059 else if (item_index == 100)
4060 return strdup("Tree Item");
4061
4062 return NULL;
4063 }
4064
4065 static void
_gl20_search_item(gl20_Event_Data * event_data,Elm_Object_Item * it)4066 _gl20_search_item(gl20_Event_Data *event_data, Elm_Object_Item * it)
4067 {
4068 const char *str = elm_entry_entry_get(event_data->en_obj);
4069 if (!str || !strlen(str)) return;
4070
4071 Elm_Glob_Match_Flags flag = 0;
4072 if (!elm_check_state_get(event_data->tg_obj)) flag = ELM_GLOB_MATCH_NOCASE;
4073
4074 printf("Looking for \"%s\". ", str);
4075 event_data->last_item_found = elm_genlist_search_by_text_item_get
4076 (event_data->gl_obj, it, NULL, str, flag);
4077
4078 if (event_data->last_item_found)
4079 {
4080 printf("Found.\n");
4081 elm_genlist_item_selected_set(event_data->last_item_found, EINA_TRUE);
4082 elm_genlist_item_bring_in(event_data->last_item_found,
4083 ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
4084 elm_object_focus_set(event_data->en_obj, EINA_TRUE);
4085 }
4086 else
4087 printf("Not Found.\n");
4088 }
4089
4090 static void
_gl20_search_settings_changed_cb(void * data,Evas_Object * obj EINA_UNUSED,void * einfo EINA_UNUSED)4091 _gl20_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
4092 void *einfo EINA_UNUSED)
4093 {
4094 _gl20_search_item(data, NULL);
4095 }
4096
4097 static Elm_Genlist_Item_Class *
_gl20_item_class_create(const char * item_style)4098 _gl20_item_class_create(const char *item_style)
4099 {
4100 Elm_Genlist_Item_Class * itc = elm_genlist_item_class_new();
4101 itc->item_style = item_style;
4102 itc->func.text_get = _gl20_text_get;
4103 itc->func.content_get = gl_content_get;
4104 itc->func.state_get = gl_state_get;
4105 itc->func.del = NULL;
4106 return itc;
4107 }
4108
4109 static void
_gl20_expand_cb(void * data EINA_UNUSED,Evas_Object * o EINA_UNUSED,void * event_info)4110 _gl20_expand_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED,
4111 void *event_info)
4112 {
4113 Elm_Object_Item *glit = event_info;
4114 Evas_Object *gl = elm_object_item_widget_get(glit);
4115 Elm_Genlist_Item_Class *itc = NULL;
4116 int i = 0;
4117
4118 itc = _gl20_item_class_create("default");
4119
4120 for (i = 50; i < 100; i++)
4121 {
4122 elm_genlist_item_append(gl, itc,
4123 (void *)(uintptr_t) i/* item data */,
4124 glit/* parent */,
4125 ELM_GENLIST_ITEM_NONE, NULL/* func */,
4126 NULL/* func data */);
4127 }
4128 elm_genlist_item_class_free(itc);
4129 }
4130
_gl20_on_keydown(void * data,Evas * evas EINA_UNUSED,Evas_Object * o EINA_UNUSED,void * einfo)4131 static void _gl20_on_keydown(void *data, Evas *evas EINA_UNUSED,
4132 Evas_Object *o EINA_UNUSED, void *einfo)
4133 {
4134 Evas_Event_Key_Down *ev = einfo;
4135 gl20_Event_Data * event_data = (gl20_Event_Data *)data;
4136
4137 if (!strcmp(ev->key, "Return"))
4138 {
4139 printf("Looking for next item\n");
4140 _gl20_search_item(data, event_data->last_item_found);
4141 }
4142 }
4143
4144 void
test_genlist20(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4145 test_genlist20(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4146 void *event_info EINA_UNUSED)
4147 {
4148 Evas_Object *win, *bx, *gl;
4149 Evas_Object *fr, *lb_frame; // info frame
4150 Evas_Object *bx_entry, *lb_entry, *en; // search line
4151 Evas_Object *tg; // "case sensitive" toggle
4152 Elm_Genlist_Item_Class *itc = NULL;
4153 gl20_Event_Data* event_data = NULL;
4154 int i = 0;
4155
4156 win = elm_win_util_standard_add("genlist-item-search-by-text",
4157 "Genlist Item Search By Text");
4158 elm_win_autodel_set(win, EINA_TRUE);
4159
4160 bx = elm_box_add(win);
4161 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4162 elm_win_resize_object_add(win, bx);
4163 evas_object_show(bx);
4164
4165 fr = elm_frame_add(bx);
4166 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4167 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4168 elm_object_text_set(fr, "Information");
4169 elm_box_pack_end(bx, fr);
4170 evas_object_show(fr);
4171
4172 lb_frame = elm_label_add(fr);
4173 elm_object_text_set(lb_frame,
4174 "<align=left>This is an example of "
4175 "elm_genlist_search_by_text_item_get() usage.<br>"
4176 "Enter search string to the entry and press Enter to "
4177 "show next search result.<br>");
4178 elm_object_content_set(fr, lb_frame);
4179 evas_object_show(lb_frame);
4180
4181 tg = elm_check_add(win);
4182 elm_object_style_set(tg, "toggle");
4183 elm_object_text_set(tg, " Case Sensitive Search");
4184 elm_check_state_set(tg, EINA_TRUE);
4185 elm_box_pack_end(bx, tg);
4186 evas_object_show(tg);
4187
4188 bx_entry = elm_box_add(win);
4189 elm_box_horizontal_set(bx_entry, EINA_TRUE);
4190 evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0);
4191 evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0);
4192 elm_box_pack_end(bx, bx_entry);
4193 evas_object_show(bx_entry);
4194
4195 lb_entry = elm_label_add(win);
4196 elm_object_text_set(lb_entry, " Search:");
4197 evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND);
4198 evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL);
4199 elm_box_pack_end(bx_entry, lb_entry);
4200 evas_object_show(lb_entry);
4201
4202 en = elm_entry_add(win);
4203 elm_entry_single_line_set(en, EINA_TRUE);
4204 elm_entry_scrollable_set(en, EINA_TRUE);
4205 elm_object_part_text_set(en, "guide", "Type item's name here to search.");
4206 evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4207 evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
4208 elm_box_pack_end(bx_entry, en);
4209 evas_object_show(en);
4210 elm_object_focus_set(en, EINA_TRUE);
4211
4212 gl = elm_genlist_add(bx);
4213
4214 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4215 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
4216 elm_box_pack_end(bx, gl);
4217 evas_object_show(gl);
4218
4219 event_data = calloc(1, sizeof(gl20_Event_Data));
4220 event_data->tg_obj = tg;
4221 event_data->en_obj = en;
4222 event_data->gl_obj = gl;
4223 event_data->last_item_found = NULL;
4224
4225 evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN,
4226 _gl20_on_keydown, (void*)event_data);
4227 evas_object_event_callback_add(gl, EVAS_CALLBACK_FREE,
4228 _gl20_del_cb, (void*)event_data);
4229 evas_object_smart_callback_add(en, "changed,user",
4230 _gl20_search_settings_changed_cb, (void*)event_data);
4231 evas_object_smart_callback_add(tg, "changed",
4232 _gl20_search_settings_changed_cb, (void*)event_data);
4233 evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl);
4234 evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl);
4235 evas_object_smart_callback_add(gl, "contracted", gl4_con, gl);
4236 evas_object_smart_callback_add(gl, "expanded", _gl20_expand_cb, gl);
4237
4238 itc = _gl20_item_class_create("tree_effect");
4239
4240 elm_genlist_item_append(gl, itc,
4241 (void *)100/* item data */,
4242 NULL/* parent */,
4243 ELM_GENLIST_ITEM_TREE,
4244 NULL/* func */,
4245 NULL/* func data */);
4246
4247 itc->item_style = "default";
4248
4249 for (i = 0; i < 50; i++)
4250 {
4251 elm_genlist_item_append(gl, itc,
4252 (void *)(uintptr_t)i/* item data */,
4253 NULL/* parent */,
4254 ELM_GENLIST_ITEM_NONE,
4255 NULL/* func */,
4256 NULL/* func data */);
4257 }
4258
4259 elm_genlist_item_class_free(itc);
4260
4261 evas_object_resize(win, 320, 500);
4262 evas_object_show(win);
4263 }
4264
4265
4266 /*** Genlist Del ***********************************************************/
4267 static void _gl_del_sel(void *data, Evas_Object *obj, void *event_info);
4268
4269 static void
_gl_del_win_del_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4270 _gl_del_win_del_cb(void *data, Evas *e EINA_UNUSED,
4271 Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
4272 {
4273 if (!data) return;
4274 elm_genlist_item_class_free(data);
4275 }
4276
4277 static void
_gl_del_unrealized_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4278 _gl_del_unrealized_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4279 void *event_info)
4280 {
4281 int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
4282 printf("unrealized item # %d\n", num);
4283 }
4284
4285 static void
_gl_del_doubleclick_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4286 _gl_del_doubleclick_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4287 void *event_info)
4288 {
4289 int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
4290 int num_category = num % 4;
4291
4292 if (num_category == 3)
4293 elm_genlist_clear(obj);
4294 }
4295 static Evas_Object *
_gl_del_genlist_add(Evas_Object * bx)4296 _gl_del_genlist_add(Evas_Object *bx)
4297 {
4298 Evas_Object *gl = NULL;
4299
4300 gl = elm_genlist_add(bx);
4301 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4302 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
4303 elm_box_pack_end(bx, gl);
4304 evas_object_show(gl);
4305 evas_object_smart_callback_add(gl, "unrealized",
4306 _gl_del_unrealized_cb, NULL);
4307 evas_object_smart_callback_add(gl, "clicked,double",
4308 _gl_del_doubleclick_cb, NULL);
4309
4310 return gl;
4311 }
4312
4313 static void
_gl_del_item_append(Evas_Object * gl,Elm_Genlist_Item_Class * itc)4314 _gl_del_item_append(Evas_Object *gl, Elm_Genlist_Item_Class *itc)
4315 {
4316 int i = 0;
4317 for (i = 0; i < 1000; i++)
4318 {
4319 elm_genlist_item_append(gl, itc,
4320 (void *)(uintptr_t)i/* item data */,
4321 NULL/* parent */,
4322 ELM_GENLIST_ITEM_NONE,
4323 _gl_del_sel/* func */,
4324 (void *)(uintptr_t)(i)/* func data */);
4325 }
4326 }
4327
4328 char *
_gl_del_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4329 _gl_del_text_get(void *data, Evas_Object *obj EINA_UNUSED,
4330 const char *part EINA_UNUSED)
4331 {
4332 char buf[256] = { 0 };
4333 int num = (int)(uintptr_t)data;
4334 int num_category = num % 10;
4335
4336 if (num_category == 3)
4337 snprintf(buf, sizeof(buf),
4338 "Item #%.02i - 1. Item Del", num);
4339 else if (num_category == 5)
4340 snprintf(buf, sizeof(buf),
4341 "Item #%.02i - 2. Genlist Clear and Item Append", num);
4342 else if (num_category == 7)
4343 snprintf(buf, sizeof(buf),
4344 "Item #%.02i - 3. Genlist Del", num);
4345 else if (num_category == 9)
4346 snprintf(buf, sizeof(buf),
4347 "Item #%.02i - 4. Genlist Clear on double-click", num);
4348 else
4349 snprintf(buf, sizeof(buf),
4350 "Item #%.02i - Normal item", num);
4351
4352 return strdup(buf);
4353 }
4354
4355 static void
_gl_del_sel(void * data,Evas_Object * obj,void * event_info)4356 _gl_del_sel(void *data, Evas_Object *obj, void *event_info)
4357 {
4358 int num = (int)(uintptr_t)data;
4359 int num_category = num % 10;
4360 Elm_Object_Item *it = event_info;
4361 Elm_Genlist_Item_Class *itc =
4362 (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(it);
4363
4364 if (num_category == 3)
4365 elm_object_item_del(it);
4366 else if (num_category == 5)
4367 {
4368 elm_genlist_clear(obj);
4369 _gl_del_item_append(obj, itc);
4370 }
4371 else if (num_category == 7)
4372 {
4373 evas_object_del(obj);
4374 }
4375 }
4376
4377 static void
_gl_del_del_cb(void * data,Evas_Object * obj EINA_UNUSED)4378 _gl_del_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
4379 {
4380 printf("deleted item # %d\n", (int)(uintptr_t)data);
4381 }
4382
4383 void
test_genlist_del(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4384 test_genlist_del(void *data EINA_UNUSED,
4385 Evas_Object *obj EINA_UNUSED,
4386 void *event_info EINA_UNUSED)
4387 {
4388 Evas_Object *win, *bx, *fr, *lb, *gl;
4389 Elm_Genlist_Item_Class *itc = NULL;
4390
4391 win = elm_win_util_standard_add("genlist-del", "Genlist Del");
4392 elm_win_autodel_set(win, EINA_TRUE);
4393
4394 bx = elm_box_add(win);
4395 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4396 elm_win_resize_object_add(win, bx);
4397 elm_box_align_set(bx, 0.5, 0.0);
4398 evas_object_show(bx);
4399
4400 fr = elm_frame_add(bx);
4401 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4402 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4403 elm_object_text_set(fr, "Information");
4404 elm_box_pack_end(bx, fr);
4405 evas_object_show(fr);
4406
4407 lb = elm_label_add(fr);
4408 elm_object_text_set(lb, "<align=left>This example tests the following cases"
4409 " on item selection.<br/>"
4410 " 1. genlist item deletion<br/>"
4411 " 2. genlist clear and item append<br/>"
4412 " 3. genlist del<br/>"
4413 " 4. genlist clear on double-click</align>");
4414 elm_object_content_set(fr, lb);
4415 evas_object_show(lb);
4416
4417 itc = elm_genlist_item_class_new();
4418 itc->item_style = "default";
4419 itc->func.text_get = _gl_del_text_get;
4420 itc->func.content_get = gl_content_get;
4421 itc->func.state_get = NULL;
4422 itc->func.del = _gl_del_del_cb;
4423 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
4424 _gl_del_win_del_cb, itc);
4425
4426 gl = _gl_del_genlist_add(bx);
4427 _gl_del_item_append(gl, itc);
4428
4429 evas_object_resize(win, 320, 500);
4430 evas_object_show(win);
4431 }
4432
4433
4434 /*** Genlist Focus *********************************************************/
4435 static unsigned _gl_focus_objects = 3;
4436 static const char *_gl_focus_object_names[] = {"None", "Square", "Button", "Check", "Box"};
4437
4438 // for the top genlist items
4439 static char *
gl_focus_top_items_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4440 gl_focus_top_items_text_get(void *data, Evas_Object *obj EINA_UNUSED,
4441 const char *part EINA_UNUSED)
4442 {
4443 if (!data) return NULL;
4444
4445 if (!strcmp(data, "do_nothing"))
4446 return strdup("Genlist Item");
4447 else if (!strcmp(data, "popup_sel"))
4448 return strdup("Create a popup on Select (popup parent is gl)");
4449 else if (!strcmp(data, "popup_mouse_down"))
4450 return strdup("Create a popup on Mouse Down (popup parent is gl)");
4451 else if (!strcmp(data, "popup_activate"))
4452 return strdup("Create a popup on Activate (popup parent is win)");
4453 else if (!strcmp(data, "clear_on_focus"))
4454 return strdup("Genlist Clear on Focus");
4455 else
4456 return NULL;
4457 }
4458
4459 static char *
gl_focus_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4460 gl_focus_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
4461 {
4462 char buf[256];
4463 unsigned char op = (uintptr_t)data % 100;
4464 unsigned char v1, v2;
4465
4466 v1 = op / 10;
4467 if (v1 > 4) v1 = 4;
4468 v2 = op % 10;
4469 if (v2 > 4) v2 = 4;
4470 snprintf(buf, sizeof(buf), " %s / %s ",
4471 _gl_focus_object_names[v1], _gl_focus_object_names[v2]);
4472 return strdup(buf);
4473 }
4474
4475 static Evas_Object *
gl_focus_content_get(void * data,Evas_Object * obj,const char * part)4476 gl_focus_content_get(void *data, Evas_Object *obj, const char *part)
4477 {
4478 Evas_Object *cnt = NULL;
4479
4480 char op = (uintptr_t)data % 100;
4481 char type = (!strcmp(part,"elm.swallow.icon")) ? op / 10 : op % 10;
4482
4483 switch(type)
4484 {
4485 case 1:
4486 cnt = elm_bg_add(obj);
4487 evas_object_color_set(cnt, 128, 18, 128, 255);
4488 break;
4489 case 2:
4490 cnt = elm_button_add(obj);
4491 break;
4492 case 3:
4493 cnt = elm_check_add(obj);
4494 break;
4495 case 4:
4496 cnt = elm_box_add(obj);
4497 evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL);
4498 elm_box_horizontal_set(cnt, EINA_TRUE);
4499 elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
4500 elm_box_pack_end(cnt, gl_focus_content_get((void *)3, obj, ""));
4501 elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
4502 break;
4503 default:
4504 break;
4505
4506 }
4507 if (cnt)
4508 {
4509 evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4510 evas_object_show(cnt);
4511 }
4512 return cnt;
4513 }
4514
4515 static void
_gl_focus_sel_popup_close_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4516 _gl_focus_sel_popup_close_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4517 void *event_info EINA_UNUSED)
4518 {
4519 evas_object_del(data);
4520 }
4521
4522 static void
_gl_focus_sel_popup_create(Evas_Object * parent)4523 _gl_focus_sel_popup_create(Evas_Object *parent)
4524 {
4525 Evas_Object *popup = NULL, *btn = NULL;
4526
4527 popup = elm_popup_add(parent);
4528 elm_object_text_set(popup, "Popup for the genlist focus test with popup creation.");
4529
4530 // popup buttons
4531 btn = elm_button_add(popup);
4532 elm_object_text_set(btn, "Close");
4533 elm_object_part_content_set(popup, "button1", btn);
4534 evas_object_smart_callback_add(btn, "clicked", _gl_focus_sel_popup_close_btn_cb, popup);
4535
4536 // popup show should be called after adding all the contents and the buttons
4537 // of popup to set the focus into popup's contents correctly.
4538 evas_object_show(popup);
4539 elm_object_focus_set(btn, EINA_TRUE);
4540 }
4541
4542 static void
_gl_focus_0_item_sel_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4543 _gl_focus_0_item_sel_cb(void *data EINA_UNUSED, Evas_Object *obj,
4544 void *event_info EINA_UNUSED)
4545 {
4546 _gl_focus_sel_popup_create(obj);
4547 }
4548
4549 static void
_gl_focus_item_loop_enable_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4550 _gl_focus_item_loop_enable_changed_cb(void *data, Evas_Object *obj,
4551 void *event_info EINA_UNUSED)
4552 {
4553 Evas_Object *gl = data;
4554 elm_object_scroll_item_loop_enabled_set(gl, elm_check_state_get(obj));
4555 }
4556
4557 static void
_gl_focus_focus_on_selection_set(Evas_Object * gl,Evas_Object * chk,Eina_Bool focus)4558 _gl_focus_focus_on_selection_set(Evas_Object *gl,
4559 Evas_Object *chk, Eina_Bool focus)
4560 {
4561 elm_genlist_focus_on_selection_set(gl, focus);
4562 elm_check_state_set(chk, focus);
4563 printf("genlist_focus_on_selection = %s\n", (focus) ? "true" : "false");
4564 }
4565
4566 static void
_gl_focus_focus_on_selection_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4567 _gl_focus_focus_on_selection_changed_cb(void *data, Evas_Object *obj,
4568 void *event_info EINA_UNUSED)
4569 {
4570 Eina_Bool nextstate = !elm_genlist_focus_on_selection_get(data);
4571 _gl_focus_focus_on_selection_set(data, obj, nextstate);
4572 }
4573
4574 static void
_gl_focus_win_auto_focus_enable_changed(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4575 _gl_focus_win_auto_focus_enable_changed(void *data EINA_UNUSED,
4576 Evas_Object *obj,
4577 void *event_info EINA_UNUSED)
4578 {
4579 elm_config_window_auto_focus_enable_set(elm_check_state_get(obj));
4580 }
4581
4582 static void
_gl_focus_win_auto_focus_animate_changed(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4583 _gl_focus_win_auto_focus_animate_changed(void *data EINA_UNUSED,
4584 Evas_Object *obj,
4585 void *event_info EINA_UNUSED)
4586 {
4587 elm_config_window_auto_focus_animate_set(elm_check_state_get(obj));
4588 }
4589
4590 static void
_gl_focus_focus_highlight_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4591 _gl_focus_focus_highlight_changed_cb(void *data, Evas_Object *obj,
4592 void *event_info EINA_UNUSED)
4593 {
4594 elm_win_focus_highlight_enabled_set(data,
4595 elm_check_state_get(obj));
4596 }
4597
4598 static void
_gl_focus_focus_animate_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4599 _gl_focus_focus_animate_changed_cb(void *data, Evas_Object *obj,
4600 void *event_info EINA_UNUSED)
4601 {
4602 elm_win_focus_highlight_animate_set(data,
4603 elm_check_state_get(obj));
4604 }
4605
4606 static void
_gl_focus_move_policy_changed_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4607 _gl_focus_move_policy_changed_cb(void *data EINA_UNUSED,
4608 Evas_Object *obj,
4609 void *event_info EINA_UNUSED)
4610 {
4611 int val = elm_radio_value_get(obj);
4612
4613 if (val == 0)
4614 elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
4615 else if (val == 1)
4616 elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
4617 }
4618
4619 static void
_gl_focus_item_focus_cb(void * data,Evas_Object * obj,void * event_info)4620 _gl_focus_item_focus_cb(void *data, Evas_Object *obj, void *event_info)
4621 {
4622 printf("item,focused: %p\n", event_info);
4623
4624 if (event_info == data)
4625 elm_genlist_clear(obj);
4626 }
4627
4628 static void
_gl_focus_item_unfocus_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4629 _gl_focus_item_unfocus_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4630 void *event_info)
4631 {
4632 printf("item,unfocused %p\n", event_info);
4633 }
4634
4635 static void
_gl_focus_item_cb(void * data,Evas_Object * obj,void * event_info)4636 _gl_focus_item_cb(void *data, Evas_Object *obj, void *event_info)
4637 {
4638 Elm_Object_Item *it = event_info;
4639
4640 printf("%s: %p\n", (char *)data, it);
4641
4642 if (!strcmp((char *)data, "activated") &&
4643 !strcmp((char *)elm_object_item_data_get(it), "popup_activate"))
4644 {
4645 _gl_focus_sel_popup_create(elm_object_top_widget_get(obj));
4646 }
4647 }
4648
4649 static void
_gl_focus_key_down_cb(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4650 _gl_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
4651 Evas_Object *obj EINA_UNUSED, void *event_info)
4652 {
4653 Evas_Event_Key_Down *ev = event_info;
4654 printf("\n=== Key Down : %s ===\n", ev->keyname);
4655 }
4656
4657 static void
_gl_focus_mouse_down_cb(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info)4658 _gl_focus_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
4659 Evas_Object *obj, void *event_info)
4660 {
4661 Evas_Event_Mouse_Down *ev = event_info;
4662 Elm_Object_Item *it = NULL;
4663 int postret = 0;
4664
4665 it = elm_genlist_at_xy_item_get(obj, ev->canvas.x, ev->canvas.y, &postret);
4666 if (!it) return;
4667
4668 if (elm_genlist_item_index_get(it) == 4)
4669 _gl_focus_sel_popup_create(obj);
4670 }
4671
4672 static Ecore_Timer *timer = NULL;
4673 static void
_gl_focus_win_del_cb(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4674 _gl_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
4675 Evas_Object *obj EINA_UNUSED,
4676 void *event_info EINA_UNUSED)
4677 {
4678 ecore_timer_del(timer);
4679 timer = NULL;
4680 }
4681
4682 static void
_gl_focus_item_select_on_focus_disable_changed_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4683 _gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
4684 void *event_info EINA_UNUSED)
4685 {
4686 elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
4687 }
4688
4689 static void
_gl_first_item_focus_on_first_focus_in_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4690 _gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
4691 void *event_info EINA_UNUSED)
4692 {
4693 elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
4694 }
4695
4696 static void
_gl_wheel_disabled_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4697 _gl_wheel_disabled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
4698 {
4699 elm_scroller_wheel_disabled_set(data, elm_check_state_get(obj));
4700 }
4701
4702 static Eina_Bool
_focus_timer_cb(void * data)4703 _focus_timer_cb(void *data)
4704 {
4705 elm_object_item_focus_set(data, EINA_TRUE);
4706 timer = NULL;
4707
4708 return ECORE_CALLBACK_CANCEL;
4709 }
4710
4711 static Eina_Bool
_select_timer_cb(void * data)4712 _select_timer_cb(void *data)
4713 {
4714 elm_genlist_item_selected_set(data, EINA_TRUE);
4715 timer = NULL;
4716
4717 return ECORE_CALLBACK_CANCEL;
4718 }
4719
4720 static void
_focus_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4721 _focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4722 void *event_info EINA_UNUSED)
4723 {
4724 ecore_timer_del(timer);
4725 timer = ecore_timer_add(1.5, _focus_timer_cb, data);
4726 }
4727
4728 static void
_sel_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4729 _sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4730 void *event_info EINA_UNUSED)
4731 {
4732 ecore_timer_del(timer);
4733 timer = ecore_timer_add(1.5, _select_timer_cb, data);
4734 }
4735
4736 static void
_dis_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4737 _dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4738 void *event_info EINA_UNUSED)
4739 {
4740 elm_object_item_disabled_set(data, EINA_TRUE);
4741 }
4742
4743 static void
_add_more_items_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4744 _add_more_items_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4745 void *event_info EINA_UNUSED)
4746 {
4747 Elm_Genlist_Item_Class *itc = NULL;
4748 int i = 0;
4749
4750 itc = elm_genlist_item_class_new();
4751 itc->item_style = "default";
4752 itc->func.text_get = gl_text_get;
4753 itc->func.content_get = NULL;
4754 itc->func.state_get = NULL;
4755 itc->func.del = NULL;
4756
4757
4758 for (i = 0; i < 1000; i++)
4759 {
4760 elm_genlist_item_append(data, itc, (void *)(uintptr_t)i,
4761 NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
4762 }
4763
4764 elm_genlist_item_class_free(itc);
4765 }
4766
4767 static void
_focus_button_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4768 _focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
4769 void *event_info EINA_UNUSED)
4770 {
4771 printf("Button clicked: %s\n", (char *)data);
4772 }
4773
4774 void
_focus_autoscroll_changed_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4775 _focus_autoscroll_changed_cb(void *data EINA_UNUSED,
4776 Evas_Object *obj,
4777 void *event_info EINA_UNUSED)
4778 {
4779 elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj));
4780 }
4781
4782 /* this function is used in another tests such as list, gengrid, and toolbar. */
4783 Evas_Object *
_focus_autoscroll_mode_frame_create(Evas_Object * parent)4784 _focus_autoscroll_mode_frame_create(Evas_Object *parent)
4785 {
4786 Evas_Object *fr, *bx, *rdg, *rd;
4787
4788 fr = elm_frame_add(parent);
4789 elm_object_text_set(fr, "Focus Autoscroll Mode");
4790 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4791 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
4792 evas_object_show(fr);
4793
4794 bx = elm_box_add(fr);
4795 elm_object_content_set(fr, bx);
4796 evas_object_show(bx);
4797
4798 rdg = rd = elm_radio_add(bx);
4799 elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW);
4800 elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW");
4801 elm_object_tooltip_text_set(rd, "Directly show the focused region<br/>"
4802 "or item automatically inside a scroller.");
4803 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4804 evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
4805 elm_box_pack_end(bx, rd);
4806 evas_object_show(rd);
4807 evas_object_smart_callback_add(rd, "changed",
4808 _focus_autoscroll_changed_cb,
4809 NULL);
4810
4811 rd = elm_radio_add(bx);
4812 elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE);
4813 elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE");
4814 elm_object_tooltip_text_set(rd, "Do not show the focused region or<br/>"
4815 "item automatically inside a scroller.");
4816 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4817 evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
4818 elm_box_pack_end(bx, rd);
4819 elm_radio_group_add(rd, rdg);
4820 evas_object_show(rd);
4821 evas_object_smart_callback_add(rd, "changed",
4822 _focus_autoscroll_changed_cb,
4823 NULL);
4824
4825
4826 rd = elm_radio_add(bx);
4827 elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN);
4828 elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN");
4829 elm_object_tooltip_text_set(rd, "Bring in the focused region or item<br/>"
4830 "automatically which might invole the scrolling.");
4831 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4832 evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
4833 elm_box_pack_end(bx, rd);
4834 elm_radio_group_add(rd, rdg);
4835 evas_object_show(rd);
4836 evas_object_smart_callback_add(rd, "changed",
4837 _focus_autoscroll_changed_cb,
4838 NULL);
4839
4840 elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get());
4841
4842 return fr;
4843 }
4844
4845 static void
_test_genlist_focus_option_panel_create(Evas_Object * win,Evas_Object * bx,Evas_Object * gl,Elm_Object_Item * it_0,Elm_Object_Item * it_2)4846 _test_genlist_focus_option_panel_create(Evas_Object *win, Evas_Object *bx,
4847 Evas_Object *gl, Elm_Object_Item *it_0,
4848 Elm_Object_Item *it_2)
4849 {
4850 Evas_Object *fr = NULL, *bx_opt = NULL, *chk = NULL;
4851 Evas_Object *bx_mv = NULL, *rd = NULL, *rdg = NULL;
4852 Evas_Object *btn_box = NULL, *btn = NULL;
4853
4854 fr = elm_frame_add(bx);
4855 elm_object_text_set(fr, "Options");
4856 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4857 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4858 elm_box_pack_end(bx, fr);
4859 evas_object_show(fr);
4860
4861 bx_opt = elm_box_add(fr);
4862 elm_box_layout_set(bx_opt, evas_object_box_layout_flow_horizontal, NULL, NULL);
4863 evas_object_size_hint_weight_set(bx_opt, EVAS_HINT_EXPAND, 0.0);
4864 evas_object_size_hint_align_set(bx_opt, EVAS_HINT_FILL, 0.0);
4865 elm_box_align_set(bx_opt, 0.0, 0.5);
4866 elm_object_content_set(fr, bx_opt);
4867 evas_object_show(bx_opt);
4868
4869 chk = elm_check_add(bx_opt);
4870 elm_object_text_set(chk, "Window Auto Focus Enable");
4871 elm_check_state_set(chk, EINA_TRUE);
4872 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4873 evas_object_smart_callback_add(chk, "changed",
4874 _gl_focus_win_auto_focus_enable_changed,
4875 NULL);
4876 elm_box_pack_end(bx_opt, chk);
4877 evas_object_show(chk);
4878
4879 chk = elm_check_add(bx_opt);
4880 elm_object_text_set(chk, "Window Auto Focus Animate");
4881 elm_check_state_set(chk, EINA_TRUE);
4882 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4883 evas_object_smart_callback_add(chk, "changed",
4884 _gl_focus_win_auto_focus_animate_changed,
4885 NULL);
4886 elm_box_pack_end(bx_opt, chk);
4887 evas_object_show(chk);
4888
4889 chk = elm_check_add(bx_opt);
4890 elm_object_text_set(chk, "Focus Highlight");
4891 elm_check_state_set(chk, EINA_FALSE);
4892 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4893 evas_object_smart_callback_add(chk, "changed",
4894 _gl_focus_focus_highlight_changed_cb,
4895 win);
4896 elm_box_pack_end(bx_opt, chk);
4897 evas_object_show(chk);
4898
4899 chk = elm_check_add(bx_opt);
4900 elm_object_text_set(chk, "Focus Animation");
4901 elm_check_state_set(chk, EINA_FALSE);
4902 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4903 evas_object_smart_callback_add(chk, "changed",
4904 _gl_focus_focus_animate_changed_cb,
4905 win);
4906 elm_box_pack_end(bx_opt, chk);
4907 evas_object_show(chk);
4908
4909 chk = elm_check_add(bx_opt);
4910 elm_object_text_set(chk, "Focus on selection");
4911 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4912 evas_object_smart_callback_add(chk, "changed",
4913 _gl_focus_focus_on_selection_changed_cb, gl);
4914 elm_box_pack_end(bx_opt, chk);
4915 evas_object_show(chk);
4916
4917 chk = elm_check_add(bx_opt);
4918 elm_object_text_set(chk, "Item Looping Enable");
4919 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4920 evas_object_smart_callback_add(chk, "changed",
4921 _gl_focus_item_loop_enable_changed_cb, gl);
4922 elm_box_pack_end(bx_opt, chk);
4923 evas_object_show(chk);
4924
4925 chk = elm_check_add(bx_opt);
4926 elm_object_text_set(chk, "Item Select on Focus disable");
4927 elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get());
4928 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4929 evas_object_smart_callback_add(chk, "changed",
4930 _gl_focus_item_select_on_focus_disable_changed_cb,
4931 NULL);
4932 elm_box_pack_end(bx_opt, chk);
4933 evas_object_show(chk);
4934
4935 chk = elm_check_add(bx_opt);
4936 elm_object_text_set(chk, "First item focus on first focus in");
4937 elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
4938 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4939 evas_object_smart_callback_add(chk, "changed",
4940 _gl_first_item_focus_on_first_focus_in_cb,
4941 NULL);
4942 elm_box_pack_end(bx_opt, chk);
4943 evas_object_show(chk);
4944
4945 chk = elm_check_add(bx_opt);
4946 elm_object_text_set(chk, "Wheel Disabled");
4947 elm_check_state_set(chk, elm_scroller_wheel_disabled_get(gl));
4948 evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4949 evas_object_smart_callback_add(chk, "changed", _gl_wheel_disabled_cb, gl);
4950 elm_box_pack_end(bx_opt, chk);
4951 evas_object_show(chk);
4952
4953 // Focus Autoscroll Mode
4954 fr = _focus_autoscroll_mode_frame_create(bx);
4955 elm_box_pack_end(bx, fr);
4956
4957 // Focus Movement Policy
4958 fr = elm_frame_add(bx);
4959 elm_object_text_set(fr, "Focus Movement Policy");
4960 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4961 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4962 elm_box_pack_end(bx, fr);
4963 evas_object_show(fr);
4964
4965 bx_mv = elm_box_add(fr);
4966 elm_box_horizontal_set(bx_mv, EINA_TRUE);
4967 elm_object_content_set(fr, bx_mv);
4968 evas_object_show(bx_mv);
4969
4970 rdg = rd = elm_radio_add(bx_mv);
4971 elm_object_text_set(rd, "Focus Move by Click");
4972 elm_radio_state_value_set(rd, 0);
4973 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4974 evas_object_smart_callback_add(rd, "changed",
4975 _gl_focus_move_policy_changed_cb,
4976 NULL);
4977 elm_box_pack_end(bx_mv, rd);
4978 evas_object_show(rd);
4979
4980 rd = elm_radio_add(bx_mv);
4981 elm_object_text_set(rd, "Focus Move by Mouse-In");
4982 elm_radio_group_add(rd, rdg);
4983 elm_radio_state_value_set(rd, 1);
4984 evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4985 evas_object_smart_callback_add(rd, "changed",
4986 _gl_focus_move_policy_changed_cb,
4987 NULL);
4988 elm_box_pack_end(bx_mv, rd);
4989 evas_object_show(rd);
4990
4991 // Options
4992 fr = elm_frame_add(bx);
4993 elm_object_text_set(fr, "Options");
4994 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4995 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4996 elm_box_pack_end(bx, fr);
4997 evas_object_show(fr);
4998
4999 btn_box = elm_box_add(fr);
5000 elm_object_content_set(fr, btn_box);
5001 evas_object_show(btn_box);
5002
5003 btn = elm_button_add(btn_box);
5004 elm_object_text_set(btn, "Focus 2nd Item after 1.5 seconds.");
5005 evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5006 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5007 elm_box_pack_end(btn_box, btn);
5008 evas_object_show(btn);
5009 evas_object_smart_callback_add(btn, "clicked", _focus_btn_cb, it_2);
5010
5011 btn = elm_button_add(btn_box);
5012 elm_object_text_set(btn, "Select 2nd Item after 1.5 seconds.");
5013 evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5014 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5015 elm_box_pack_end(btn_box, btn);
5016 evas_object_show(btn);
5017 evas_object_smart_callback_add(btn, "clicked", _sel_btn_cb, it_2);
5018
5019 btn = elm_button_add(btn_box);
5020 elm_object_text_set(btn, "Disable 1st Item.");
5021 evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5022 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5023 elm_box_pack_end(btn_box, btn);
5024 evas_object_show(btn);
5025 evas_object_smart_callback_add(btn, "clicked", _dis_btn_cb, it_0);
5026
5027
5028 btn = elm_button_add(btn_box);
5029 elm_object_text_set(btn, "Add more Genlist items");
5030 evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5031 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5032 elm_box_pack_end(btn_box, btn);
5033 evas_object_show(btn);
5034 evas_object_smart_callback_add(btn, "clicked", _add_more_items_btn_cb, gl);
5035 }
5036
5037 void
test_genlist_focus(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5038 test_genlist_focus(void *data EINA_UNUSED,
5039 Evas_Object *obj EINA_UNUSED,
5040 void *event_info EINA_UNUSED)
5041 {
5042 Evas_Object *win, *bx, *bx2, *gl, *btn;
5043 unsigned lhand, rhand;
5044 Elm_Object_Item *it = NULL, *it_1 = NULL, *it_2 = NULL;
5045 Elm_Genlist_Item_Class *itc = NULL, *itc1 = NULL, *itc2 = NULL;
5046
5047 api_data *api = calloc(1, sizeof(api_data));
5048 win = elm_win_util_standard_add("genlist-focus", "Genlist Focus");
5049 elm_win_autodel_set(win, EINA_TRUE);
5050 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
5051 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
5052 _gl_focus_win_del_cb, NULL);
5053
5054 elm_config_window_auto_focus_enable_set(EINA_TRUE);
5055 elm_config_window_auto_focus_animate_set(EINA_TRUE);
5056 elm_win_focus_highlight_enabled_set(win, EINA_FALSE);
5057 elm_win_focus_highlight_animate_set(win, EINA_FALSE);
5058
5059 bx = elm_box_add(win);
5060 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5061 elm_win_resize_object_add(win, bx);
5062 evas_object_show(bx);
5063
5064 btn = elm_button_add(bx);
5065 elm_object_text_set(btn, "Up");
5066 elm_box_pack_end(bx, btn);
5067 evas_object_smart_callback_add(btn, "clicked",
5068 _focus_button_clicked_cb, "Up");
5069 evas_object_show(btn);
5070
5071 bx2 = elm_box_add(bx);
5072 elm_box_horizontal_set(bx2, EINA_TRUE);
5073 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5074 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
5075 elm_box_pack_end(bx, bx2);
5076 evas_object_show(bx2);
5077
5078 btn = elm_button_add(bx2);
5079 elm_object_text_set(btn, "Left");
5080 elm_box_pack_end(bx2, btn);
5081 evas_object_smart_callback_add(btn, "clicked",
5082 _focus_button_clicked_cb, "Left");
5083 evas_object_show(btn);
5084
5085 gl = elm_genlist_add(bx);
5086 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5087 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5088 elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
5089 elm_box_pack_end(bx2, gl);
5090 api->gl = gl;
5091 evas_object_show(gl);
5092 evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected");
5093 evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected");
5094 evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated");
5095 evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted");
5096 evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted");
5097 evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL);
5098 evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _gl_focus_mouse_down_cb, NULL);
5099
5100 btn = elm_button_add(bx2);
5101 elm_object_text_set(btn, "Right");
5102 elm_box_pack_end(bx2, btn);
5103 evas_object_smart_callback_add(btn, "clicked",
5104 _focus_button_clicked_cb, "Right");
5105 evas_object_show(btn);
5106
5107 btn = elm_button_add(bx);
5108 elm_object_text_set(btn, "Down");
5109 elm_box_pack_end(bx, btn);
5110 evas_object_smart_callback_add(btn, "clicked",
5111 _focus_button_clicked_cb, "Down");
5112 evas_object_show(btn);
5113
5114 itc = elm_genlist_item_class_new();
5115 itc->item_style = "default";
5116 itc->func.text_get = gl_focus_top_items_text_get;
5117 itc->func.content_get = NULL;
5118 itc->func.state_get = NULL;
5119 itc->func.del = NULL;
5120
5121 itc1 = elm_genlist_item_class_new();
5122 itc1->item_style = "default";
5123 itc1->func.text_get = gl_focus_text_get;
5124 itc1->func.content_get = gl_focus_content_get;
5125 itc1->func.state_get = NULL;
5126 itc1->func.del = NULL;
5127
5128 itc2 = elm_genlist_item_class_new();
5129 itc2->item_style = "tree_effect";
5130 itc2->func.text_get = gl_focus_text_get;
5131 itc2->func.content_get = gl_focus_content_get;
5132 itc2->func.state_get = NULL;
5133 itc2->func.del = NULL;
5134
5135 it_1 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
5136 NULL, NULL);
5137 it_2 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
5138 NULL, NULL);
5139 elm_genlist_item_append(gl, itc, "popup_sel", NULL, ELM_GENLIST_ITEM_NONE,
5140 _gl_focus_0_item_sel_cb, NULL);
5141 elm_genlist_item_append(gl, itc, "popup_mouse_down", NULL, ELM_GENLIST_ITEM_NONE,
5142 NULL, NULL);
5143 elm_genlist_item_append(gl, itc, "popup_activate", NULL, ELM_GENLIST_ITEM_NONE,
5144 NULL, NULL);
5145
5146 it = elm_genlist_item_append(gl, itc, "clear_on_focus", NULL, ELM_GENLIST_ITEM_NONE,
5147 NULL, NULL);
5148 evas_object_smart_callback_add(gl, "item,focused", _gl_focus_item_focus_cb, it);
5149 evas_object_smart_callback_add(gl, "item,unfocused", _gl_focus_item_unfocus_cb, NULL);
5150
5151 for (lhand = 0; lhand < _gl_focus_objects; lhand++)
5152 {
5153 for (rhand = 0; rhand < _gl_focus_objects; rhand++)
5154 {
5155 unsigned digit1 = lhand * 10 + rhand;
5156 elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit1,
5157 NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5158
5159 unsigned digit2 = (_gl_focus_objects - lhand -1) * 10 +
5160 (_gl_focus_objects - rhand -1);
5161 it = elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit2,
5162 NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5163 if (rhand == 4)
5164 elm_object_item_disabled_set(it, EINA_TRUE);
5165
5166 if (rhand == (_gl_focus_objects - 1))
5167 elm_genlist_item_append(gl, itc2, (void*)(uintptr_t)digit1,
5168 NULL, ELM_GENLIST_ITEM_TREE, NULL, NULL);
5169 }
5170 }
5171
5172 elm_genlist_item_class_free(itc);
5173 elm_genlist_item_class_free(itc1);
5174 elm_genlist_item_class_free(itc2);
5175
5176 // Options
5177 _test_genlist_focus_option_panel_create(win, bx, gl, it_1, it_2);
5178
5179 evas_object_resize(win, 420, 600);
5180 evas_object_show(win);
5181 }
5182
5183
5184 /*** Genlist Filteer *******************************************************/
5185 char *genlist_demo_names[] = {
5186 "Aaliyah", "Aamir", "Aaralyn", "Aaron", "Abagail",
5187 "Babitha", "Bahuratna", "Bandana", "Bulbul", "Cade", "Caldwell",
5188 "Chandan", "Caster", "Dagan ", "Daulat", "Dag", "Earl", "Ebenzer",
5189 "Ellison", "Elizabeth", "Filbert", "Fitzpatrick", "Florian", "Fulton",
5190 "Frazer", "Gabriel", "Gage", "Galen", "Garland", "Gauhar", "Hadden",
5191 "Hafiz", "Hakon", "Haleem", "Hank", "Hanuman", "Jabali ", "Jaimini",
5192 "Jayadev", "Jake", "Jayatsena", "Jonathan", "Kamaal", "Jeirk",
5193 "Jasper", "Jack", "Mac", "Macy", "Marlon", "Milson",
5194 NULL
5195 };
5196
5197 static char *
glf_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)5198 glf_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
5199 {
5200 char buf[256];
5201 snprintf(buf, sizeof(buf), "%s", genlist_demo_names[((int)(uintptr_t)data)%50]);
5202 return strdup(buf);
5203 }
5204
5205 Eina_Bool
gl_filter_get(void * data,Evas_Object * obj EINA_UNUSED,void * key)5206 gl_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key)
5207 {
5208 if (!strlen((char *)key)) return EINA_TRUE;
5209
5210 if (strcasestr(genlist_demo_names[((int)(uintptr_t)data)%50], (char *)key))
5211 return EINA_TRUE;
5212 // Default case should return false (item fails filter hence will be hidden)
5213 return EINA_FALSE;
5214 }
5215
5216 static void
_gl_filter_finished_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5217 _gl_filter_finished_cb(void *data,
5218 Evas_Object *obj EINA_UNUSED,
5219 void *event_info EINA_UNUSED)
5220 {
5221 printf("Filter finished, filtered items count is %d\n", elm_genlist_filtered_items_count((Evas_Object *)data));
5222 }
5223
5224 void
_entry_change_cb(void * data,Evas_Object * obj,void * event EINA_UNUSED)5225 _entry_change_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED)
5226 {
5227 api_data *api = (api_data *)data;
5228 char buf[100];
5229 unsigned int count = 0;
5230 Elm_Object_Item *item;
5231
5232 if (api->filter_data) free(api->filter_data);
5233
5234 sprintf(buf, "%s", elm_object_text_get(obj));
5235 api->filter_data = strdup(buf);
5236 elm_genlist_filter_set(api->gl, (void *)(api->filter_data));
5237 if (!strlen(buf))
5238 {
5239 printf("Input data string empty; returning\n");
5240 return;
5241 }
5242
5243 item = elm_genlist_first_item_get(api->gl);
5244 if (!item)
5245 {
5246 printf("No matches for the key %s\n", buf);
5247 return;
5248 }
5249 while (item)
5250 {
5251 ++count;
5252 item = elm_genlist_item_next_get(item);
5253 }
5254 printf("Number of matches for %s is %d\n", buf, count);
5255 }
5256
5257 void
test_genlist_filter(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5258 test_genlist_filter(void *data EINA_UNUSED,
5259 Evas_Object *obj EINA_UNUSED,
5260 void *event_info EINA_UNUSED)
5261 {
5262 Evas_Object *win, *bx, *bx2, *entry, *gl;
5263 Elm_Genlist_Item_Class *itc = NULL;
5264 int i;
5265
5266 api_data *api = calloc(1, sizeof(api_data));
5267 win = elm_win_util_standard_add("genlist-filter", "Genlist filter");
5268 elm_win_autodel_set(win, EINA_TRUE);
5269 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
5270 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
5271 _gl_focus_win_del_cb, NULL);
5272
5273 elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
5274 elm_win_focus_highlight_animate_set(win, EINA_TRUE);
5275
5276 bx = elm_box_add(win);
5277 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5278 elm_win_resize_object_add(win, bx);
5279 evas_object_show(bx);
5280
5281 entry = elm_entry_add(bx);
5282 elm_entry_single_line_set(entry, EINA_TRUE);
5283 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
5284 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.0);
5285 elm_object_part_text_set(entry, "guide", "Search.");
5286 elm_box_pack_end(bx, entry);
5287 evas_object_show(entry);
5288
5289 bx2 = elm_box_add(bx);
5290 evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5291 evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
5292 elm_box_pack_end(bx, bx2);
5293 evas_object_show(bx2);
5294
5295 gl = elm_genlist_add(bx);
5296 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5297 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5298 elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
5299 elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
5300 elm_genlist_homogeneous_set(gl, EINA_TRUE);
5301 elm_box_pack_end(bx2, gl);
5302 api->gl = gl;
5303 evas_object_show(gl);
5304 evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected");
5305 evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected");
5306 evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated");
5307 evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted");
5308 evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted");
5309 evas_object_smart_callback_add(gl, "filter,done", _gl_filter_finished_cb, gl);
5310 evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL);
5311
5312 itc = elm_genlist_item_class_new();
5313 itc->item_style = "default";
5314 itc->func.text_get = glf_text_get;
5315 itc->func.content_get = NULL;
5316 itc->func.filter_get = gl_filter_get;
5317 itc->func.state_get = NULL;
5318 itc->func.del = NULL;
5319
5320 for (i = 0; i < 500; i++)
5321 elm_genlist_item_append(gl, itc,
5322 (void *)(intptr_t)i, NULL,
5323 ELM_GENLIST_ITEM_NONE,
5324 NULL, NULL);
5325
5326 evas_object_resize(win, 420, 600);
5327 evas_object_show(win);
5328 elm_object_focus_set(entry, EINA_TRUE);
5329 evas_object_smart_callback_add(entry, "changed,user", _entry_change_cb, api);
5330 }
5331
5332
5333 /*** Genlist Show/BringIN **************************************************/
5334 static void
_rd_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5335 _rd_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
5336 {
5337 api_data *ad = data;
5338 ad->scrollto = elm_radio_state_value_get(obj);
5339 }
5340
5341 static Evas_Object *
_scrollto_mode_frame_new(Evas_Object * win,void * data)5342 _scrollto_mode_frame_new(Evas_Object *win, void *data)
5343 {
5344 Evas_Object *fr, *bx, *rd, *rdg;
5345 api_data *sd = data;
5346
5347 fr = elm_frame_add(win);
5348 elm_object_text_set(fr, "Scrollto Mode");
5349 evas_object_show(fr);
5350
5351 bx = elm_box_add(win);
5352 elm_object_content_set(fr, bx);
5353 evas_object_show(bx);
5354
5355 rd = elm_radio_add(win);
5356 elm_radio_state_value_set(rd, 0);
5357 elm_object_text_set(rd, "SCROLLTO_NONE");
5358 evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5359 evas_object_show(rd);
5360 elm_box_pack_end(bx, rd);
5361 rdg = rd;
5362
5363 rd = elm_radio_add(win);
5364 elm_radio_state_value_set(rd, 1);
5365 elm_object_text_set(rd, "SCROLLTO_IN");
5366 elm_radio_group_add(rd, rdg);
5367 evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5368 evas_object_show(rd);
5369 elm_box_pack_end(bx, rd);
5370
5371 rd = elm_radio_add(win);
5372 elm_radio_state_value_set(rd, 2);
5373 elm_object_text_set(rd, "SCROLLTO_TOP");
5374 elm_radio_group_add(rd, rdg);
5375 evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5376 evas_object_show(rd);
5377 elm_box_pack_end(bx, rd);
5378
5379 rd = elm_radio_add(win);
5380 elm_radio_state_value_set(rd, 4);
5381 elm_object_text_set(rd, "SCROLLTO_MIDDLE");
5382 elm_radio_group_add(rd, rdg);
5383 evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5384 evas_object_show(rd);
5385 elm_box_pack_end(bx, rd);
5386
5387 rd = elm_radio_add(win);
5388 elm_radio_state_value_set(rd, 8);
5389 elm_object_text_set(rd, "SCROLLTO_BOTTOM");
5390 elm_radio_group_add(rd, rdg);
5391 evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5392 evas_object_show(rd);
5393 elm_box_pack_end(bx, rd);
5394
5395 return fr;
5396 }
5397
5398 void
_scrollto_item_show(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5399 _scrollto_item_show(void *data,
5400 Evas_Object *obj EINA_UNUSED,
5401 void *event_info EINA_UNUSED)
5402 {
5403 api_data *api = data;
5404 Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl);
5405 elm_genlist_item_show(it, api->scrollto);
5406 }
5407
5408 void
_scrollto_item_bring(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5409 _scrollto_item_bring(void *data,
5410 Evas_Object *obj EINA_UNUSED,
5411 void *event_info EINA_UNUSED)
5412 {
5413 api_data *api = data;
5414 Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl);
5415 elm_genlist_item_bring_in(it, api->scrollto);
5416 }
5417
5418 void
test_genlist_show_bring(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5419 test_genlist_show_bring(void *data EINA_UNUSED,
5420 Evas_Object *obj EINA_UNUSED,
5421 void *event_info EINA_UNUSED)
5422 {
5423 Evas_Object *win, *gl, *bt_show, *bt_bring, *bx, *bxx, *fr;
5424 Elm_Object_Item *gli;
5425 int i, max;
5426 api_data *api = calloc(1, sizeof(api_data));
5427
5428 win = elm_win_util_standard_add("genlist", "Genlist Item Show/Bring");
5429 elm_win_autodel_set(win, EINA_TRUE);
5430 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5431
5432 bxx = elm_box_add(win);
5433 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5434 elm_win_resize_object_add(win, bxx);
5435 evas_object_show(bxx);
5436
5437 bx = elm_box_add(win);
5438 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5439 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
5440 evas_object_show(bx);
5441 elm_box_pack_end(bxx, bx);
5442
5443 gl = elm_genlist_add(win);
5444 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5445 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5446 elm_box_pack_end(bx, gl);
5447 evas_object_show(gl);
5448 api->gl = gl;
5449
5450 api->itc1 = elm_genlist_item_class_new();
5451 api->itc1->item_style = "default";
5452 api->itc1->func.text_get = gl_text_get1;
5453 api->itc1->func.content_get = gl_content_get;
5454 api->itc1->func.state_get = NULL;
5455 api->itc1->func.del = NULL;
5456
5457 bt_show = elm_button_add(win);
5458 elm_object_text_set(bt_show, "Show");
5459 evas_object_smart_callback_add(bt_show, "clicked", _scrollto_item_show, api);
5460 evas_object_show(bt_show);
5461 elm_box_pack_end(bx, bt_show);
5462
5463 bt_bring = elm_button_add(win);
5464 elm_object_text_set(bt_bring, "Bring");
5465 evas_object_smart_callback_add(bt_bring, "clicked", _scrollto_item_bring, api);
5466 evas_object_show(bt_bring);
5467 elm_box_pack_end(bx, bt_bring);
5468
5469 fr = _scrollto_mode_frame_new(win, api);
5470 elm_box_pack_end(bx, fr);
5471
5472 max = 2000;
5473 for (i = 0; i < max; i++)
5474 elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5475
5476 elm_genlist_item_class_free(api->itc1);
5477 gli = elm_genlist_nth_item_get(gl, 1340);
5478 elm_genlist_item_selected_set(gli, EINA_TRUE);
5479 elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
5480
5481 evas_object_resize(win, 480, 400);
5482 explode_win_enable(win);
5483 evas_object_show(win);
5484 }
5485
5486 static Eina_Bool
_late_item_prepender(void * data)5487 _late_item_prepender(void *data)
5488 {
5489 api_data *api = (api_data*)data;
5490 int i;
5491 Elm_Object_Item *it = elm_genlist_nth_item_get(api->gl, api->show_item);
5492 for (i = 0; i <= 100; i++)
5493 elm_genlist_item_prepend(api->gl, api->itc1, (void*)(uintptr_t)i, it, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5494 elm_genlist_item_class_free(api->itc1);
5495 return ECORE_CALLBACK_CANCEL;
5496 }
5497
5498 static void
test_genlist_show_item(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5499 test_genlist_show_item(void *data,
5500 Evas_Object *obj EINA_UNUSED,
5501 void *event_info EINA_UNUSED)
5502 {
5503 Evas_Object *win, *gl;
5504 Elm_Object_Item *gli = NULL;
5505 int i, max;
5506 api_data *api = calloc(1, sizeof(api_data));
5507 api_data *g_data = (api_data*)data;
5508
5509 win = elm_win_util_standard_add("genlist", "Genlist Show Last Item");
5510 elm_win_autodel_set(win, EINA_TRUE);
5511 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5512
5513 gl = elm_genlist_add(win);
5514 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5515 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5516 evas_object_show(gl);
5517 if (g_data)
5518 elm_genlist_mode_set(gl, g_data->mode);
5519 else
5520 elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
5521 api->gl = gl;
5522 elm_win_resize_object_add(win, gl);
5523
5524 api->itc1 = elm_genlist_item_class_new();
5525 api->itc1->item_style = "default";
5526 api->itc1->func.text_get = gl_text_get1;
5527 api->itc1->func.content_get = gl_content_get;
5528 api->itc1->func.state_get = NULL;
5529 api->itc1->func.del = NULL;
5530
5531 if (g_data)
5532 {
5533 g_data->gl = gl;
5534 g_data->itc1 = api->itc1;
5535
5536 max = g_data->max_items;
5537 for (i = 0; i <= max; i++)
5538 elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5539
5540 gli = elm_genlist_nth_item_get(gl, g_data->show_item);
5541 if (!gli) gli = elm_genlist_last_item_get(gl);
5542 elm_genlist_item_show(gli, g_data->type);
5543 //prepends item while queue processing is happening
5544 ecore_timer_add(0.1, _late_item_prepender, g_data);
5545 }
5546
5547 evas_object_resize(win, 480, 400);
5548 explode_win_enable(win);
5549 evas_object_show(win);
5550 }
5551
5552 static void
test_genlist_show_tree(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5553 test_genlist_show_tree(void *data,
5554 Evas_Object *obj EINA_UNUSED,
5555 void *event_info EINA_UNUSED)
5556 {
5557 Evas_Object *win, *gl;
5558 Elm_Object_Item *gli = NULL, *show = NULL;
5559 int i, max;
5560 api_data *api = calloc(1, sizeof(api_data));
5561 api_data *g_data = (api_data*)data;
5562
5563 win = elm_win_util_standard_add("genlist", "Genlist Show Tree");
5564 elm_win_autodel_set(win, EINA_TRUE);
5565 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5566
5567 gl = elm_genlist_add(win);
5568 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5569 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5570 evas_object_show(gl);
5571 api->gl = gl;
5572 elm_win_resize_object_add(win, gl);
5573 if (g_data)
5574 elm_genlist_mode_set(gl, g_data->mode);
5575 else
5576 elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
5577
5578 api->itc1 = elm_genlist_item_class_new();
5579 api->itc1->item_style = "default";
5580 api->itc1->func.text_get = gl_text_get1;
5581 api->itc1->func.content_get = gl_content_get;
5582 api->itc1->func.state_get = NULL;
5583 api->itc1->func.del = NULL;
5584
5585 if (g_data)
5586 max = g_data->max_items;
5587 else max = 2000;
5588 for (i = 0; i <= max; i++)
5589 {
5590 if (i % (max / 20) == 0)
5591 gli = elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, gli, ELM_GENLIST_ITEM_TREE, NULL, NULL);
5592 else
5593 elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, gli, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5594 }
5595
5596 if (g_data)
5597 show = elm_genlist_nth_item_get(gl, g_data->show_item);
5598 else show = gli;
5599 elm_genlist_item_class_free(api->itc1);
5600 elm_genlist_item_show(show, g_data->type);
5601
5602 evas_object_resize(win, 480, 400);
5603 explode_win_enable(win);
5604 evas_object_show(win);
5605 }
5606
5607 static void
_entry_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5608 _entry_changed_cb(void *data,
5609 Evas_Object *obj,
5610 void *event_info EINA_UNUSED)
5611 {
5612 int *val = (int*) data;
5613 *val = atoi(elm_entry_entry_get(obj));
5614 }
5615
5616 static void
_radio_changed_type_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5617 _radio_changed_type_cb(void *data,
5618 Evas_Object *obj,
5619 void *event_info EINA_UNUSED)
5620 {
5621 int val = elm_radio_state_value_get(obj);
5622 api_data *api = (api_data*)data;
5623 api->type = val;
5624 }
5625
5626 static void
_radio_changed_mode_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5627 _radio_changed_mode_cb(void *data,
5628 Evas_Object *obj,
5629 void *event_info EINA_UNUSED)
5630 {
5631 int val = elm_radio_state_value_get(obj);
5632 api_data *api = (api_data*)data;
5633 api->mode = val;
5634 }
5635
5636 void
test_genlist_item_show(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5637 test_genlist_item_show(void *data EINA_UNUSED,
5638 Evas_Object *obj EINA_UNUSED,
5639 void *event_info EINA_UNUSED)
5640 {
5641
5642 Evas_Object *win, *bt_show, *bt_bring, *bx, *max_items, *show_item, *bxx, *rd1, *rd2, *rd3;
5643 static Elm_Entry_Filter_Accept_Set digits_filter_data;
5644 api_data *api = calloc(1, sizeof(api_data));
5645
5646 win = elm_win_util_standard_add("genlist", "Genlist Item Show");
5647 elm_win_autodel_set(win, EINA_TRUE);
5648 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5649
5650 bx = elm_box_add(win);
5651 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5652 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
5653 evas_object_show(bx);
5654 elm_win_resize_object_add(win, bx);
5655
5656 digits_filter_data.accepted = "0123456789";
5657 digits_filter_data.rejected = NULL;
5658
5659 max_items = elm_entry_add(win);
5660 elm_entry_single_line_set(max_items, EINA_TRUE);
5661 elm_entry_scrollable_set(max_items, EINA_TRUE);
5662 evas_object_size_hint_weight_set(max_items, EVAS_HINT_EXPAND, 0.0);
5663 evas_object_size_hint_align_set(max_items, EVAS_HINT_FILL, 0.5);
5664 elm_object_part_text_set(max_items, "guide", "Enter the maximum number of items needed");
5665 evas_object_smart_callback_add(max_items, "changed", _entry_changed_cb, (void*)(&(api->max_items)));
5666 elm_entry_markup_filter_append(max_items, elm_entry_filter_accept_set, &digits_filter_data);
5667 evas_object_show(max_items);
5668 elm_box_pack_end(bx, max_items);
5669
5670 show_item = elm_entry_add(win);
5671 elm_entry_single_line_set(show_item, EINA_TRUE);
5672 elm_entry_scrollable_set(show_item, EINA_TRUE);
5673 evas_object_size_hint_weight_set(show_item, EVAS_HINT_EXPAND, 0.0);
5674 evas_object_size_hint_align_set(show_item, EVAS_HINT_FILL, 0.5);
5675 elm_object_part_text_set(show_item, "guide", "Enter the number of item to be shown");
5676 evas_object_smart_callback_add(show_item, "changed", _entry_changed_cb, (void*)(&(api->show_item)));
5677 elm_entry_markup_filter_append(show_item, elm_entry_filter_accept_set, &digits_filter_data);
5678 evas_object_show(show_item);
5679 elm_box_pack_end(bx, show_item);
5680
5681 bxx = elm_box_add(win);
5682 elm_box_horizontal_set(bxx, EINA_TRUE);
5683 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, 0.0);
5684 evas_object_size_hint_align_set(bxx, EVAS_HINT_FILL, 0.5);
5685
5686 rd1 = elm_radio_add(win);
5687 elm_object_text_set(rd1, "Top");
5688 elm_radio_state_value_set(rd1, ELM_GENLIST_ITEM_SCROLLTO_TOP);
5689 evas_object_smart_callback_add(rd1, "changed", _radio_changed_type_cb, api);
5690 evas_object_show(rd1);
5691 elm_box_pack_end(bxx, rd1);
5692
5693 rd2 = elm_radio_add(win);
5694 elm_object_text_set(rd2, "Middle");
5695 evas_object_smart_callback_add(rd2, "changed", _radio_changed_type_cb, api);
5696 elm_radio_state_value_set(rd2, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
5697 elm_radio_group_add(rd2, rd1);
5698 evas_object_show(rd2);
5699 elm_box_pack_end(bxx, rd2);
5700
5701 rd3 = elm_radio_add(win);
5702 elm_object_text_set(rd3, "Bottom");
5703 evas_object_smart_callback_add(rd3, "changed", _radio_changed_type_cb, api);
5704 elm_radio_state_value_set(rd3, ELM_GENLIST_ITEM_SCROLLTO_BOTTOM);
5705 elm_radio_group_add(rd3, rd1);
5706 evas_object_show(rd3);
5707 elm_box_pack_end(bxx, rd3);
5708 evas_object_show(bxx);
5709 elm_box_pack_end(bx, bxx);
5710 elm_radio_value_set(rd1, ELM_GENLIST_ITEM_SCROLLTO_TOP);
5711 api->type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
5712
5713 bxx = elm_box_add(win);
5714 elm_box_horizontal_set(bxx, EINA_TRUE);
5715 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, 0.0);
5716 evas_object_size_hint_align_set(bxx, EVAS_HINT_FILL, 0.5);
5717
5718 rd1 = elm_radio_add(win);
5719 elm_object_text_set(rd1, "ELM_LIST_SCROLL");
5720 elm_radio_state_value_set(rd1, ELM_LIST_SCROLL);
5721 evas_object_smart_callback_add(rd1, "changed", _radio_changed_mode_cb, api);
5722 evas_object_show(rd1);
5723 elm_box_pack_end(bxx, rd1);
5724
5725 rd2 = elm_radio_add(win);
5726 elm_object_text_set(rd2, "ELM_LIST_LIMIT");
5727 evas_object_smart_callback_add(rd2, "changed", _radio_changed_mode_cb, api);
5728 elm_radio_state_value_set(rd2, ELM_LIST_LIMIT);
5729 elm_radio_group_add(rd2, rd1);
5730 evas_object_show(rd2);
5731 elm_box_pack_end(bxx, rd2);
5732
5733 rd3 = elm_radio_add(win);
5734 elm_object_text_set(rd3, "ELM_LIST_COMPRESS");
5735 evas_object_smart_callback_add(rd3, "changed", _radio_changed_mode_cb, api);
5736 elm_radio_state_value_set(rd3, ELM_LIST_COMPRESS);
5737 elm_radio_group_add(rd3, rd1);
5738 evas_object_show(rd3);
5739 elm_box_pack_end(bxx, rd3);
5740 evas_object_show(bxx);
5741 elm_box_pack_end(bx, bxx);
5742 elm_radio_value_set(rd1, ELM_LIST_SCROLL);
5743 api->mode = ELM_LIST_SCROLL;
5744
5745 bt_show = elm_button_add(win);
5746 elm_object_text_set(bt_show, "Plain Genlist");
5747 evas_object_smart_callback_add(bt_show, "clicked", test_genlist_show_item, api);
5748 evas_object_show(bt_show);
5749 elm_box_pack_end(bx, bt_show);
5750
5751 bt_bring = elm_button_add(win);
5752 elm_object_text_set(bt_bring, "Genlist Tree");
5753 evas_object_smart_callback_add(bt_bring, "clicked", test_genlist_show_tree, api);
5754 evas_object_show(bt_bring);
5755 elm_box_pack_end(bx, bt_bring);
5756
5757 evas_object_resize(win, 480, 400);
5758 explode_win_enable(win);
5759 evas_object_show(win);
5760 }
5761
5762
5763 /*** Genlist Cache *********************************************************/
5764 static char *
gl_cache_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)5765 gl_cache_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
5766 {
5767 char buf[256];
5768 int num = (int)(uintptr_t)data;
5769
5770 if ((num % 2) == 0)
5771 snprintf(buf, sizeof(buf),
5772 "<align=left> ← only icon (Item # %d)</align>", num);
5773 else
5774 snprintf(buf, sizeof(buf),
5775 "<align=right>(Item # %d) only end → </align>", num);
5776
5777 return strdup(buf);
5778 }
5779
5780 static Evas_Object *
gl_cache_content_get(void * data,Evas_Object * obj,const char * part)5781 gl_cache_content_get(void *data, Evas_Object *obj, const char *part)
5782 {
5783 char buf[PATH_MAX];
5784 Evas_Object *ic;
5785 Eina_Bool even = (((int)(uintptr_t)data % 2) == 0);
5786
5787 if (even && !strcmp(part, "elm.swallow.icon"))
5788 snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
5789 else if (!even && !strcmp(part, "elm.swallow.end"))
5790 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
5791 else
5792 return NULL;
5793
5794 ic = elm_icon_add(obj);
5795 elm_image_file_set(ic, buf, NULL);
5796 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
5797 return ic;
5798 }
5799
5800 void
test_genlist_cache(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5801 test_genlist_cache(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
5802 void *event_info EINA_UNUSED)
5803 {
5804 Evas_Object *win, *bx, *fr, *lb, *gl;
5805 Elm_Genlist_Item_Class *itc;
5806 int i;
5807
5808 win = elm_win_util_standard_add("genlist-cache", "Genlist Cache");
5809 elm_win_autodel_set(win, EINA_TRUE);
5810
5811 bx = elm_box_add(win);
5812 evas_object_size_hint_expand_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5813 elm_win_resize_object_add(win, bx);
5814 evas_object_show(bx);
5815
5816 fr = elm_frame_add(bx);
5817 elm_object_text_set(fr, "Information");
5818 elm_box_pack_end(bx, fr);
5819 evas_object_show(fr);
5820
5821 lb = elm_label_add(fr);
5822 elm_object_text_set(lb, "Even items should have only the icon (left),<br>"
5823 "while odd items should have only the end icon (right)");
5824 elm_object_content_set(fr, lb);
5825 evas_object_show(lb);
5826
5827 gl = elm_genlist_add(bx);
5828 evas_object_size_hint_expand_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5829 evas_object_size_hint_fill_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5830 elm_box_pack_end(bx, gl);
5831 evas_object_show(gl);
5832
5833 itc = elm_genlist_item_class_new();
5834 itc->item_style = "default_style";
5835 itc->func.text_get = gl_cache_text_get;
5836 itc->func.content_get = gl_cache_content_get;
5837
5838 for (i = 1; i <= 200; i++)
5839 elm_genlist_item_append(gl, itc, (void*)(uintptr_t)i, NULL,
5840 ELM_GENLIST_ITEM_NONE, NULL, NULL);
5841
5842 elm_genlist_item_class_free(itc);
5843
5844 evas_object_resize(win, 480, 400);
5845 explode_win_enable(win);
5846 evas_object_show(win);
5847 }
5848
5849
5850 /*** Genlist Reusable Contents *********************************************/
5851 static char *
gl_re2_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)5852 gl_re2_text_get(void *data, Evas_Object *obj EINA_UNUSED,
5853 const char *part EINA_UNUSED)
5854 {
5855 int num = (int)(uintptr_t)data;
5856 char buf[32];
5857
5858 snprintf(buf, sizeof(buf), "Item # %d", num);
5859 return strdup(buf);
5860 }
5861
5862 static Evas_Object *
gl_re2_content_get(void * data,Evas_Object * obj,const char * part)5863 gl_re2_content_get(void *data, Evas_Object *obj, const char *part)
5864 {
5865 int num = (int)(uintptr_t)data;
5866 Evas_Object *content = NULL;
5867 char buf[64];
5868
5869 if (!strcmp(part, "elm.swallow.icon"))
5870 {
5871 printf("Creating NEW content (icon) for item # %d\n", num);
5872 content = elm_label_add(obj);
5873 evas_object_color_set(content, 255, 0, 0, 255); // NOTE: never do this in real app
5874 snprintf(buf, sizeof(buf), "Content for item # %d", num);
5875 elm_object_text_set(content, buf);
5876 }
5877 if (!strcmp(part, "elm.swallow.end"))
5878 {
5879 printf("Creating NEW content (end) for item # %d\n", num);
5880 content = elm_button_add(obj);
5881 evas_object_color_set(content, 0, 255, 0, 255); // NOTE: never do this in real app
5882 snprintf(buf, sizeof(buf), "Content for item # %d", num);
5883 elm_object_text_set(content, buf);
5884 if ((num % 5) == 0) elm_object_disabled_set(content, EINA_TRUE);
5885 }
5886
5887 return content;
5888 }
5889
5890 static Evas_Object *
gl_re2_reusable_content_get(void * data,Evas_Object * obj,const char * part,Evas_Object * old)5891 gl_re2_reusable_content_get(void *data, Evas_Object *obj,
5892 const char *part, Evas_Object *old)
5893 {
5894 Eina_Bool enabled = (Eina_Bool)(uintptr_t)evas_object_data_get(obj, "reusable_enabled");
5895 int num = (int)(uintptr_t)data;
5896 char buf[64];
5897
5898 // Returning NULL from this callback means that content_get should be used instead.
5899 // In this case if old object is not NULL, it will be deleted by genlist.
5900 if (!enabled || !old)
5901 return NULL;
5902
5903 // Genlist preserves whole state of the old content.
5904 // But we don't know for which item it was used before. We know only that
5905 // the old item had same item_class, same tree mode and that content was created for "part".
5906 // This means that we should apply all item-specific properties to the old object.
5907 if (!strcmp(part, "elm.swallow.icon"))
5908 {
5909 printf("REUSING content (icon) for item # %d\n", num);
5910 // No need to change color, because all contents for "elm.swallow.icon"
5911 // have same red color
5912 snprintf(buf, sizeof(buf), "Reused content for item # %d", num);
5913 // But we need to set correct text, because it's different for different items
5914 elm_object_text_set(old, buf);
5915 // Object is ready for use.
5916 return old;
5917 }
5918
5919 if (!strcmp(part, "elm.swallow.end"))
5920 {
5921 printf("REUSING content (end) for item # %d\n", num);
5922 // Also not changing color, it's already correct.
5923 snprintf(buf, sizeof(buf), "Reused content for item # %d", num);
5924 // Updating text.
5925 elm_object_text_set(old, buf);
5926 // Changing disabled state of content:
5927 if ((num % 5) == 0)
5928 // disabling every 5th item's content in the same way as in content_get
5929 elm_object_disabled_set(old, EINA_TRUE);
5930 else
5931 // but also explicitly enabling other contents, because the old object
5932 // could be disabled if it was used in one of the 5th items previously
5933 elm_object_disabled_set(old, EINA_FALSE);
5934 // Object is ready for use.
5935 return old;
5936 }
5937
5938 return NULL;
5939 }
5940
5941 static void
gl_re2_check_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5942 gl_re2_check_changed_cb(void *data, Evas_Object *obj,
5943 void *event_info EINA_UNUSED)
5944 {
5945 Eina_Bool enabled = elm_check_state_get(obj);
5946 Evas_Object *gl = data;
5947
5948 evas_object_data_set(gl, "reusable_enabled", (void*)(uintptr_t)enabled);
5949 elm_genlist_realized_items_update(gl);
5950 }
5951
5952 void
test_genlist_reusable(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5953 test_genlist_reusable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
5954 void *event_info EINA_UNUSED)
5955 {
5956 Evas_Object *win, *bx, *fr, *lb, *gl, *ck;
5957 Elm_Genlist_Item_Class *itc;
5958 int i;
5959
5960 // window
5961 win = elm_win_util_standard_add("genlist-reusable", "Genlist Reusable Contents");
5962 elm_win_autodel_set(win, EINA_TRUE);
5963
5964 bx = elm_box_add(win);
5965 evas_object_size_hint_expand_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5966 elm_win_resize_object_add(win, bx);
5967 evas_object_show(bx);
5968
5969 fr = elm_frame_add(bx);
5970 evas_object_size_hint_expand_set(fr, EVAS_HINT_EXPAND, 0);
5971 evas_object_size_hint_fill_set(fr, EVAS_HINT_FILL, 0);
5972 elm_object_text_set(fr, "Information");
5973 elm_box_pack_end(bx, fr);
5974 evas_object_show(fr);
5975
5976 lb = elm_label_add(fr);
5977 elm_object_text_set(lb, "Labels in left content (icon) must be red.<br>"
5978 "Labels in right content (end) must be green.<br>"
5979 "The 3 numbers in one row should always match.");
5980 elm_object_content_set(fr, lb);
5981 evas_object_show(lb);
5982
5983 // genlist
5984 gl = elm_genlist_add(bx);
5985 elm_genlist_homogeneous_set(gl, EINA_TRUE);
5986 evas_object_size_hint_expand_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5987 evas_object_size_hint_fill_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5988 elm_box_pack_end(bx, gl);
5989 evas_object_show(gl);
5990 evas_object_data_set(gl, "reusable_enabled", (void*)EINA_TRUE);
5991
5992 itc = elm_genlist_item_class_new();
5993 itc->item_style = "default";
5994 itc->func.text_get = gl_re2_text_get;
5995 itc->func.content_get = gl_re2_content_get;
5996 itc->func.reusable_content_get = gl_re2_reusable_content_get;
5997
5998 for (i = 1; i <= 2000; i++)
5999 elm_genlist_item_append(gl, itc, (void*)(uintptr_t)i, NULL,
6000 ELM_GENLIST_ITEM_NONE, NULL, NULL);
6001
6002 elm_genlist_item_class_free(itc);
6003
6004 // buttons
6005 ck = elm_check_add(bx);
6006 elm_object_text_set(ck, "Enable reusable contents");
6007 elm_check_state_set(ck, EINA_TRUE);
6008 evas_object_smart_callback_add(ck, "changed", gl_re2_check_changed_cb, gl);
6009 elm_box_pack_end(bx, ck);
6010 evas_object_show(ck);
6011
6012 // show everything
6013 evas_object_resize(win, 400, 400);
6014 explode_win_enable(win);
6015 evas_object_show(win);
6016 }
6017