#include #include "test.h" #ifdef HAVE_CONFIG_H #include "elementary_config.h" #endif #include #include "test_explode.h" Evas_Object * _elm_min_set(Evas_Object *obj, Evas_Object *parent, Evas_Coord w, Evas_Coord h); struct _api_data { unsigned int state; /* What state we are testing */ void *box; /* Use this to get box content */ Elm_Genlist_Item_Class *itc; Elm_Genlist_Item_Class *itc1; Elm_Genlist_Item_Class *itc2; void *gl; void *filter_data; /* The data used for filtering */ int scrollto; }; typedef struct _api_data api_data; enum _api_state { HORIZONTAL_SET, NO_SELECT_MODE_SET, COMPRESS_MODE_SET, BOUNCE_SET, HOMOGENEOUS_SET, SCROLLER_POLICY_SET, TOOLTIP_TEXT_SET, ITEM_CURSOR_SET, API_STATE_LAST }; typedef enum _api_state api_state; static int bounce_max = 50; static void set_api_state(api_data *api) { const Eina_List *items = elm_box_children_get(api->box); if (!eina_list_count(items)) return; Evas_Object *gl = eina_list_nth(items, 0); /* Genlist is the first item */ /* use elm_box_children_get() to get list of children */ switch(api->state) {/* Put all api-changes under switch */ case HORIZONTAL_SET: /* 0 */ elm_genlist_mode_set(gl, ELM_LIST_LIMIT); break; case NO_SELECT_MODE_SET: /* 1 */ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_NONE); elm_genlist_mode_set(gl, ELM_LIST_SCROLL); /* Back to default */ break; case COMPRESS_MODE_SET: /* 2 */ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_DEFAULT); elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); break; case BOUNCE_SET: /* 3 */ elm_scroller_bounce_set(gl, EINA_FALSE, EINA_FALSE); break; case HOMOGENEOUS_SET: /* 4 */ elm_scroller_bounce_set(gl, EINA_TRUE, EINA_TRUE); /* Back to default */ elm_genlist_homogeneous_set(gl, EINA_TRUE); break; case SCROLLER_POLICY_SET: /* 5 */ elm_genlist_homogeneous_set(gl, EINA_FALSE); /* Back to default */ elm_scroller_policy_set(gl, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); break; case TOOLTIP_TEXT_SET: /* 6 */ { elm_genlist_item_tooltip_text_set(elm_genlist_first_item_get(gl), "Tooltip text from API"); elm_genlist_item_bring_in(elm_genlist_first_item_get(gl), ELM_GENLIST_ITEM_SCROLLTO_IN); } break; case ITEM_CURSOR_SET: /* 7 */ elm_genlist_item_cursor_set(elm_genlist_first_item_get(gl), ELM_CURSOR_HAND2); break; default: return; } } static void _api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { /* Will add here a SWITCH command containing code to modify test-object */ /* in accordance a->state value. */ api_data *a = data; char str[128]; INF("clicked event on API Button: api_state=<%d>", a->state); set_api_state(a); a->state++; sprintf(str, "Next API function (%u)", a->state); elm_object_text_set(obj, str); elm_object_disabled_set(obj, a->state == API_STATE_LAST); } /* Hint: * In this example some calls to elm_genlist_item_append() are used which give the * value of an int as 'item data' and 'func data' after casting into (void*). For * sure this works only on architectures where sizeof(int)==sizeof(void*). * For real world usage you should hold a data structure or value in your * application and then give only a pointer to this data as data pointer. */ typedef struct _Testitem { Elm_Object_Item *item; int mode; int onoff; Eina_Bool checked; } Testitem; static char * gl_text_get1(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[256]; int num = (int)(uintptr_t)data; snprintf(buf, sizeof(buf), "Item # %i", num); return strdup(buf); } Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; Evas_Object *ic = elm_icon_add(obj); if (!strcmp(part, "elm.swallow.end")) snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); else snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } static void on_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { printf("button clicked\n"); } static void on_ck_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { printf("checkbox changed\n"); } Evas_Object *gl_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) { Evas_Object *fr, *bx, *ic, *bt, *ck; if (strcmp(part, "elm.swallow.content") != 0) return NULL; fr = elm_frame_add(obj); elm_layout_text_set(fr, NULL, "A Frame"); bx = elm_box_add(fr); elm_box_horizontal_set(bx, EINA_TRUE); ic = elm_icon_add(bx); elm_icon_standard_set(ic, "home"); evas_object_size_hint_min_set(ic, ELM_SCALE_SIZE(32), ELM_SCALE_SIZE(32)); evas_object_size_hint_align_set(ic, 0.5, EVAS_HINT_FILL); evas_object_show(ic); elm_box_pack_end(bx, ic); bt = elm_button_add(bx); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_smart_callback_add(bt, "clicked", on_bt_clicked, NULL); elm_layout_text_set(bt, NULL, "Click Me"); evas_object_show(bt); elm_box_pack_end(bx, bt); ck = elm_check_add(bx); evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_smart_callback_add(ck, "changed", on_ck_changed, NULL); elm_layout_text_set(ck, NULL, "some checkbox"); evas_object_show(ck); elm_box_pack_end(bx, ck); elm_layout_content_set(fr, NULL, bx); evas_object_size_hint_min_set(fr, ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100)); return fr; } Eina_Bool gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { return EINA_FALSE; } Evas_Object *gl_reusable_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part, Evas_Object *old) { if (old && !strcmp(part, "elm.swallow.end")) { // Reuse old content // Here need to add initializing and state changing // for cached content. // printf("content reuse for cached content %p, %s\n", old, part); return old; } else { // Create new content object for non-reused part. //printf("content create in reuse %p, %s\n", old, part); char buf[PATH_MAX]; Evas_Object *ic = elm_icon_add(obj); if (!strcmp(part, "elm.swallow.end")) snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); else snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } // If return NULL value, content_get will be called to get new content. // return NULL; } static void gl_sel(void *data, Evas_Object *obj, void *event_info) { printf("sel item data [%p] on genlist obj [%p], item pointer [%p], index [%d]\n", data, obj, event_info, elm_genlist_item_index_get(event_info)); } static void _move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Evas_Object *gl = data; Evas_Event_Mouse_Move *ev = event_info; int where = 0; Elm_Object_Item *gli; gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where); if (gli) INF("<%s> over %p, where %i\n", __func__, elm_object_item_data_get(gli), where); else INF("<%s> over none, where %i\n", __func__,where); } /*** Genlist ***************************************************************/ static void _bt50_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_IN); } static void _bt1500_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); } static void _gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("selected: %p\n", event_info); } static void _gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("double clicked: %p\n", event_info); } static void _gl_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("right clicked: %p\n", event_info); } static void _gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("longpress %p\n", event_info); } static void _gl_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { // printf("changed %p\n", event_info); } static void _cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = (api_data *)data; if (api->filter_data) free(api->filter_data); free(api); } typedef struct { Evas_Object *gl; Elm_Object_Item *it1, *it2; int state; } Bounce; static Eina_Bool _bounce_cb(void *data) { Bounce *bounce = data; bounce->state++; if (bounce->state & 0x1) elm_genlist_item_bring_in(bounce->it2, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); else elm_genlist_item_bring_in(bounce->it1, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); if (bounce->state > bounce_max) { if (getenv("ELM_TEST_AUTOBOUNCE")) elm_exit(); } return EINA_TRUE; } static void _btbounce_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Ecore_Timer *tim = evas_object_data_get(obj, "timer"); if (!tim) { _bounce_cb(data); tim = ecore_timer_add(0.5, _bounce_cb, data); evas_object_data_set(obj, "timer", tim); } } static void _btdel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { Bounce *bounce = data; Ecore_Timer *tim = evas_object_data_get(obj, "timer"); if (tim) { ecore_timer_del(tim); evas_object_data_del(obj, "timer"); } free(bounce); } void test_genlist(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt; Evas_Object *over; Elm_Object_Item *gli; int i, max; Bounce *bounce; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist", "Genlist"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api); bxx = elm_box_add(win); evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bxx); evas_object_show(bxx); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); api->box = bx; evas_object_show(bx); bt = elm_button_add(win); elm_object_text_set(bt, "Next API function"); evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); elm_box_pack_end(bxx, bt); elm_object_disabled_set(bt, api->state == API_STATE_LAST); evas_object_show(bt); elm_box_pack_end(bxx, bx); gl = elm_genlist_add(win); evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); evas_object_smart_callback_add(gl, "clicked,right", _gl_right_clicked, NULL); evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); evas_object_smart_callback_add(gl, "changed", _gl_changed, NULL); // FIXME: This causes genlist to resize the horiz axis very slowly :( // Reenable this and resize the window horizontally, then try to resize it back //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); evas_object_show(gl); over = evas_object_rectangle_add(evas_object_evas_get(win)); evas_object_color_set(over, 0, 0, 0, 0); evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl); evas_object_repeat_events_set(over, EINA_TRUE); evas_object_show(over); evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, over); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get1; api->itc1->func.content_get = NULL; // gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; // use content_reuse function for reusing // repeated content objects instead of content_get api->itc1->func.reusable_content_get = gl_reusable_content_get; bt_50 = elm_button_add(win); elm_object_text_set(bt_50, "Go to 50"); evas_object_show(bt_50); elm_box_pack_end(bx, bt_50); bt_1500 = elm_button_add(win); elm_object_text_set(bt_1500, "Go to 1500"); evas_object_show(bt_1500); elm_box_pack_end(bx, bt_1500); bounce = calloc(1, sizeof(Bounce)); bt = elm_button_add(win); elm_object_text_set(bt, "Bounce"); evas_object_show(bt); elm_box_pack_end(bx, bt); bounce->gl = gl; evas_object_smart_callback_add(bt, "clicked", _btbounce_cb, bounce); evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _btdel_cb, bounce); max = 2000; if (getenv("ELM_TEST_AUTOBOUNCE")) { max = 200; bounce_max = atoi(getenv("ELM_TEST_AUTOBOUNCE")); } for (i = 0; i < max; i++) { gli = elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); if (i == 50) evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli); else if (i == 1500) evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli); if (i == 100) bounce->it1 = gli; if (i == 120) bounce->it2 = gli; } elm_genlist_item_class_free(api->itc1); evas_object_resize(win, 480, 400); explode_win_enable(win); evas_object_show(win); if (max == 200) _btbounce_cb(bounce, bt, NULL); } /*** Genlist 2 *************************************************************/ static void my_gl_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_clear(data); } static char * gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[256]; snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); return strdup(buf); } static void my_gl_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; static int i = 0; if (!api->itc1) { ERR("Genlist item class should not be null. Something very bad is happening!!"); return; } api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); i++; } static void my_gl_insert_before(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; static int i = 0; Elm_Object_Item *gli_selected; if (!api->itc1) { ERR("Genlist item class should not be null. Something very bad is happening!!"); return; } api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) { printf("no item selected\n"); return ; } elm_genlist_item_insert_before(gl, api->itc1, (void *)(uintptr_t)i/* item data */, NULL/* parent */, gli_selected /* item before */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); i++; } static void my_gl_insert_after(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; static int i = 0; Elm_Object_Item *gli_selected; if (!api->itc1) { ERR("Genlist item class should not be null. Something very bad is happening!!"); return; } api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) { printf("no item selected\n"); return ; } elm_genlist_item_insert_after(gl, api->itc1, (void *)(uintptr_t)i/* item data */, NULL/* parent */, gli_selected /* item after */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); i++; } static void my_gl_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; Elm_Object_Item *gli = elm_genlist_selected_item_get(gl); if (!gli) { printf("no item selected\n"); return; } elm_object_item_del(gli); } static void my_gl_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; Elm_Object_Item *gli = elm_genlist_selected_item_get(gl); if (!gli) { printf("no item selected\n"); return; } elm_object_item_disabled_set(gli, EINA_TRUE); elm_genlist_item_selected_set(gli, EINA_FALSE); elm_genlist_item_update(gli); } static void my_gl_update_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; int i = 0; Elm_Object_Item *it = elm_genlist_first_item_get(gl); while (it) { elm_genlist_item_update(it); INF("%i", i); i++; it = elm_genlist_item_next_get(it); } } static void my_gl_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; Elm_Object_Item *gli = elm_genlist_first_item_get(gl); if (!gli) return; elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN); elm_genlist_item_selected_set(gli, 1); } static void my_gl_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; Elm_Object_Item *gli = elm_genlist_last_item_get(gl); if (!gli) return; elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN); elm_genlist_item_selected_set(gli, 1); } static Eina_Bool my_gl_flush_delay(void *data EINA_UNUSED) { elm_cache_all_flush(); return ECORE_CALLBACK_CANCEL; } static void my_gl_flush(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { ecore_timer_add(1.2, my_gl_flush_delay, NULL); } static void _genlist_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { if (!data) return; elm_genlist_item_class_free(data); } void test_genlist2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bg, *gl, *bx, *bx2, *bx3, *bt; Elm_Object_Item *gli[10]; char buf[PATH_MAX]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_add(NULL, "genlist2", ELM_WIN_BASIC); elm_win_title_set(win, "Genlist 2"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bg = elm_bg_add(win); snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); elm_bg_file_set(bg, buf, NULL); evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bg); evas_object_show(bg); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; gli[0] = elm_genlist_item_append(gl, api->itc1, (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1001/* func data */); gli[1] = elm_genlist_item_append(gl, api->itc1, (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1002/* func data */); gli[2] = elm_genlist_item_append(gl, api->itc1, (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1003/* func data */); gli[3] = elm_genlist_item_prepend(gl, api->itc1, (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1004/* func data */); gli[4] = elm_genlist_item_prepend(gl, api->itc1, (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1005/* func data */); gli[5] = elm_genlist_item_insert_before(gl, api->itc1, (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1006/* func data */); gli[6] = elm_genlist_item_insert_after(gl, api->itc1, (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1007/* func data */); elm_box_pack_end(bx, gl); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "/\\"); evas_object_smart_callback_add(bt, "clicked", my_gl_first, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "\\/"); evas_object_smart_callback_add(bt, "clicked", my_gl_last, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "#"); evas_object_smart_callback_add(bt, "clicked", my_gl_disable, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "U"); evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); elm_box_pack_end(bx, bx2); evas_object_show(bx2); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "X"); evas_object_smart_callback_add(bt, "clicked", my_gl_clear, gl); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "+"); evas_object_smart_callback_add(bt, "clicked", my_gl_add, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "-"); evas_object_smart_callback_add(bt, "clicked", my_gl_del, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); elm_box_pack_end(bx, bx2); evas_object_show(bx2); bx3 = elm_box_add(win); elm_box_horizontal_set(bx3, EINA_TRUE); elm_box_homogeneous_set(bx3, EINA_TRUE); evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "+ before"); evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx3, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "+ after"); evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx3, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "Flush"); evas_object_smart_callback_add(bt, "clicked", my_gl_flush, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx3, bt); evas_object_show(bt); elm_box_pack_end(bx, bx3); evas_object_show(bx3); evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _genlist_del_cb, api->itc1); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist 3 *************************************************************/ char * gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { const Testitem *tit = data; char buf[256]; snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); return strdup(buf); } Evas_Object * gl2_content_get(void *data, Evas_Object *obj, const char *part) { const Testitem *tit = data; char buf[PATH_MAX]; Evas_Object *ic = elm_icon_add(obj); if (!strcmp(part, "elm.swallow.icon")) { if (!(tit->mode & 0x3)) snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); else if ((tit->mode & 0x3) == 1) snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); else if ((tit->mode & 0x3) == 2) snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get()); else if ((tit->mode & 0x3) == 3) snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); } else if (!strcmp(part, "elm.swallow.end")) { if (!(tit->mode & 0x3)) snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); else if ((tit->mode & 0x3) == 1) snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); else if ((tit->mode & 0x3) == 2) snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); else if ((tit->mode & 0x3) == 3) snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); } evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } Eina_Bool gl2_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { return EINA_FALSE; } static void my_gl_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Testitem *tit = data; tit->mode++; elm_genlist_item_update(tit->item); } static void my_gl_labels_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Testitem *tit = data; tit->mode++; elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT); } static void my_gl_contents_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Testitem *tit = data; tit->mode++; elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT); } void test_genlist3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bx, *bx2, *bt; static Testitem tit[3]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist3", "Genlist 3"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl2_text_get; api->itc1->func.content_get = gl2_content_get; api->itc1->func.state_get = gl2_state_get; api->itc1->func.del = NULL; tit[0].mode = 0; tit[0].item = elm_genlist_item_append(gl, api->itc1, &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); tit[1].mode = 1; tit[1].item = elm_genlist_item_append(gl, api->itc1, &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); tit[2].mode = 2; tit[2].item = elm_genlist_item_append(gl, api->itc1, &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); elm_box_pack_end(bx, gl); evas_object_show(bx); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "[1]"); evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "labels"); evas_object_smart_callback_add(bt, "clicked", my_gl_labels_update, &(tit[1])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "contents"); evas_object_smart_callback_add(bt, "clicked", my_gl_contents_update, &(tit[2])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); elm_box_pack_end(bx, bx2); evas_object_show(bx2); elm_genlist_item_class_free(api->itc1); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist 4 *************************************************************/ static void my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Testitem *tit = data; tit->onoff = elm_check_state_get(obj); printf("item %p onoff = %i\n", tit, tit->onoff); } char * gl3_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { const Testitem *tit = data; char buf[256]; snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); return strdup(buf); } Evas_Object * gl3_content_get(void *data, Evas_Object *obj, const char *part) { const Testitem *tit = data; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *lb; lb = elm_label_add(obj); elm_label_line_wrap_set(lb, ELM_WRAP_CHAR); elm_label_wrap_width_set(lb, 201); 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"); return lb; } else if (!strcmp(part, "elm.swallow.end")) { Evas_Object *ck; ck = elm_check_add(obj); evas_object_propagate_events_set(ck, EINA_FALSE); elm_check_state_set(ck, tit->onoff); evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed, data); return ck; } return NULL; } Eina_Bool gl3_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { return EINA_FALSE; } static void _realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei) { Evas_Object *check; Eina_List *items; items = NULL; if (!ei) return; Elm_Object_Item *item = ei; check = elm_object_item_part_content_get(item, "elm.swallow.end"); if (!check) return; items = eina_list_append(items, check); elm_object_item_access_order_set(item, items); } void test_genlist4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bx, *bx2, *bt; static Testitem tit[3]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist4", "Genlist 4"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); elm_genlist_multi_select_set(gl, EINA_TRUE); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); evas_object_smart_callback_add(gl, "realized", _realized, NULL); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl3_text_get; api->itc1->func.content_get = gl3_content_get; api->itc1->func.state_get = gl3_state_get; api->itc1->func.del = NULL; tit[0].mode = 0; tit[0].item = elm_genlist_item_append(gl, api->itc1, &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); tit[1].mode = 1; tit[1].item = elm_genlist_item_append(gl, api->itc1, &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); tit[2].mode = 2; tit[2].item = elm_genlist_item_append(gl, api->itc1, &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); elm_genlist_item_class_free(api->itc1); elm_box_pack_end(bx, gl); evas_object_show(bx); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "[1]"); evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "[2]"); evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "[3]"); evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); elm_box_pack_end(bx, bx2); evas_object_show(bx2); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist 5 *************************************************************/ static void my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Testitem *tit = data; tit->onoff = elm_check_state_get(obj); printf("item %p onoff = %i\n", tit, tit->onoff); } char * gl5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part) { const Testitem *tit = data; char buf[256] = { 0 }; if (!strcmp(part, "elm.text")) { snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); } else if (!strcmp(part, "elm.text.sub")) { snprintf(buf, sizeof(buf), "%i bottles on the wall", tit->mode); } return strdup(buf); } Evas_Object * gl5_content_get(void *data, Evas_Object *obj, const char *part) { const Testitem *tit = data; char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *bx = elm_box_add(obj); Evas_Object *ic; elm_box_horizontal_set(bx, EINA_TRUE); ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); evas_object_show(ic); elm_box_pack_end(bx, ic); ic = elm_icon_add(obj); elm_image_file_set(ic, buf, NULL); elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); evas_object_show(ic); elm_box_pack_end(bx, ic); elm_box_horizontal_set(bx, EINA_TRUE); evas_object_show(bx); return bx; } else if (!strcmp(part, "elm.swallow.end")) { Evas_Object *ck; ck = elm_check_add(obj); evas_object_propagate_events_set(ck, EINA_FALSE); elm_check_state_set(ck, tit->onoff); evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed2, data); evas_object_show(ck); return ck; } return NULL; } Eina_Bool gl5_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { return EINA_FALSE; } static void item_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("drag up"); } static void item_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("drag down"); } static void item_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("drag left"); } static void item_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("drag right"); } static void scroll_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("Top edge!"); } static void scroll_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("Bottom edge!"); } static void scroll_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("Left edge!"); } static void scroll_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("Right edge!"); } static void item_drag(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("drag"); } static void item_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("drag stop"); } static void item_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { INF("longpress"); } void test_genlist5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bx, *bx2, *bt; static Testitem tit[3]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist5", "Genlist 5"); elm_win_autodel_set(win, EINA_TRUE); elm_win_focus_highlight_enabled_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "double_label"; api->itc1->func.text_get = gl5_text_get; api->itc1->func.content_get = gl5_content_get; api->itc1->func.state_get = gl5_state_get; api->itc1->func.del = NULL; tit[0].mode = 0; tit[0].item = elm_genlist_item_append(gl, api->itc1, &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); tit[1].mode = 1; tit[1].item = elm_genlist_item_append(gl, api->itc1, &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); tit[2].mode = 2; tit[2].item = elm_genlist_item_append(gl, api->itc1, &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, NULL/* func data */); elm_box_pack_end(bx, gl); evas_object_show(bx); evas_object_smart_callback_add(gl, "drag,start,up", item_drag_up, NULL); evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL); evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL); evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL); evas_object_smart_callback_add(gl, "drag", item_drag, NULL); evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL); evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "[1]"); evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "[2]"); evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "[3]"); evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2])); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); elm_box_pack_end(bx, bx2); evas_object_show(bx2); elm_genlist_item_class_free(api->itc1); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist Tree **********************************************************/ static void gl4_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; int depth = elm_genlist_item_expanded_depth_get(glit); printf("item sel callback %p - expanded depth = %d\n", glit, depth); } static void gl4_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { api_data *api = data; Elm_Object_Item *glit = event_info; Evas_Object *gl = elm_object_item_widget_get(glit); int val = (int)(uintptr_t) elm_object_item_data_get(glit); int i = 0; printf("expand %p\n", glit); val *= 10; for (i = 0; i < 30; i++) { elm_genlist_item_append(gl, api->itc2, (void *)(uintptr_t) (val + i)/* item data */, glit/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); } } static void gl4_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; const Eina_List *list = NULL, *l = NULL; Elm_Object_Item *it = NULL; printf("contract request %p\n", glit); list = elm_genlist_item_subitems_get(glit); EINA_LIST_FOREACH(list, l, it) { printf("sub item: %p %s\n", it, elm_object_item_text_get(it)); } elm_genlist_item_subitems_clear(glit); } static void gl4_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; printf("expand request %p\n", glit); elm_genlist_item_expanded_set(glit, EINA_TRUE); } static void gl4_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; elm_genlist_item_expanded_set(glit, EINA_FALSE); } static void gl4_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; printf("selected %p\n", glit); } static void gl4_activated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; printf("activated %p\n", glit); } static void gl4_unselected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; printf("unselected %p\n", glit); } static void gl4_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; printf("longpressed %p\n", glit); } static void gl4_pressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; printf("pressed %p\n", glit); } static void gl4_released(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; printf("released %p\n", glit); } char * gl4_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[256]; snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data); return strdup(buf); } Evas_Object * gl4_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); evas_object_show(ic); return ic; } else if (!strcmp(part, "elm.swallow.end")) { Evas_Object *ck; ck = elm_check_add(obj); evas_object_propagate_events_set(ck, EINA_FALSE); evas_object_show(ck); return ck; } return NULL; } Eina_Bool gl4_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { return EINA_FALSE; } void gl4_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) { printf("item deleted.\n"); } static void _tree_effect_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_genlist_tree_effect_enabled_set(data, elm_check_state_get(obj)); } static void _tree_homogeneous_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_genlist_homogeneous_set(data, elm_check_state_get(obj)); } void test_genlist6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bx, *fr, *bx2, *ck1, *ck2; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-tree", "Genlist Tree"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); fr = elm_frame_add(win); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0); elm_object_text_set(fr, "Genlist Tree Options"); elm_box_pack_end(bx, fr); evas_object_show(fr); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_content_set(fr, bx2); evas_object_show(bx2); ck1 = elm_check_add(win); elm_object_text_set(ck1, "Tree Effect"); evas_object_show(ck1); elm_box_pack_end(bx2, ck1); ck2 = elm_check_add(win); elm_object_text_set(ck2, "Homogeneous"); evas_object_show(ck2); elm_box_pack_end(bx2, ck2); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); evas_object_smart_callback_add(gl, "edge,left", scroll_left, NULL); evas_object_smart_callback_add(gl, "edge,right", scroll_right, NULL); evas_object_smart_callback_add(gl, "edge,top", scroll_top, NULL); evas_object_smart_callback_add(gl, "edge,bottom", scroll_bottom, NULL); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl4_text_get; api->itc1->func.content_get = gl4_content_get; api->itc1->func.state_get = gl4_state_get; api->itc1->func.del = gl4_del; api->itc2 = elm_genlist_item_class_new(); api->itc2->item_style = "tree_effect"; api->itc2->func.text_get = gl4_text_get; api->itc2->func.content_get = gl4_content_get; api->itc2->func.state_get = gl4_state_get; api->itc2->func.del = gl4_del; elm_genlist_item_append(gl, api->itc2, (void *)1/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc2, (void *)2/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc1, (void *)3/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_class_free(api->itc1); elm_genlist_item_class_free(api->itc2); evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, api); evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, api); evas_object_smart_callback_add(gl, "expanded", gl4_exp, api); evas_object_smart_callback_add(gl, "contracted", gl4_con, api); evas_object_smart_callback_add(gl, "selected", gl4_selected, api); evas_object_smart_callback_add(gl, "unselected", gl4_unselected, api); evas_object_smart_callback_add(gl, "activated", gl4_activated, api); evas_object_smart_callback_add(gl, "longpressed", gl4_longpressed, api); evas_object_smart_callback_add(gl, "pressed", gl4_pressed, api); evas_object_smart_callback_add(gl, "released", gl4_released, api); evas_object_smart_callback_add(ck1, "changed", _tree_effect_changed_cb, gl); evas_object_smart_callback_add(ck2, "changed", _tree_homogeneous_changed_cb, gl); elm_box_pack_end(bx, gl); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist 7 *************************************************************/ struct genlist7_data { Evas_Object *win, *naviframe; }; static void gl_sel7(void *data, Evas_Object *obj, void *event_info) { if (!event_info) return; api_data *api = data; elm_genlist_item_item_class_update(event_info, api->itc2); 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); } static void _gl7_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { struct genlist7_data *info = data; if (!info) return; elm_naviframe_item_pop(info->naviframe); } static void _gl7_swipe_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { struct genlist7_data *info = data; Evas_Object *box, *entry, *button; char item_data[] = "Just a simple test"; if ((!event_info) || (!data)) return; box = elm_box_add(info->win); elm_box_homogeneous_set(box, EINA_FALSE); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(box); entry = elm_entry_add(info->win); elm_entry_scrollable_set(entry, EINA_TRUE); elm_entry_editable_set(entry, EINA_FALSE); elm_object_text_set(entry, item_data); evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(entry); button = elm_button_add(info->win); elm_object_text_set(button, "back"); evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); evas_object_smart_callback_add(button, "clicked", _gl7_back_cb, info); evas_object_show(button); elm_box_pack_start(box, entry); elm_box_pack_end(box, button); elm_naviframe_item_simple_push(info->naviframe, box); } void test_genlist7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *naviframe; static struct genlist7_data info; static Testitem tit[3]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist7", "Genlist 7"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); info.win = win; naviframe = elm_naviframe_add(win); elm_win_resize_object_add(win, naviframe); evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(naviframe); info.naviframe = naviframe; gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_smart_callback_add(gl, "swipe", _gl7_swipe_cb, &info); api->gl = gl; evas_object_show(gl); elm_naviframe_item_simple_push(naviframe, gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl2_text_get; api->itc1->func.content_get = gl2_content_get; api->itc1->func.state_get = gl2_state_get; api->itc1->func.del = NULL; api->itc2 = elm_genlist_item_class_new(); api->itc2->item_style = "double_label"; api->itc2->func.text_get = gl5_text_get; api->itc2->func.content_get = gl5_content_get; api->itc2->func.state_get = gl5_state_get; api->itc2->func.del = NULL; tit[0].mode = 0; tit[0].item = elm_genlist_item_append(gl, api->itc1, &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, api/* func data */); tit[1].mode = 1; tit[1].item = elm_genlist_item_append(gl, api->itc1, &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, api/* func data */); tit[2].mode = 2; tit[2].item = elm_genlist_item_append(gl, api->itc1, &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, api/* func data */); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist Group *********************************************************/ char *gl8_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[256]; snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)", (int)((uintptr_t)data / 10), (int)(uintptr_t)data); return strdup(buf); } static void _bt_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_item_show(data, ELM_GENLIST_ITEM_SCROLLTO_TOP); } static void _bt_bring_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_TOP); } void test_genlist8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bt[8], *bx, *bx2, *bx3; Elm_Object_Item *gli = NULL, *git = NULL; int i, bt_num; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-group", "Genlist Group"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); api->gl = gl; evas_object_show(gl); // Use homogeneous mode for group index + homogeneous test. // Homogeneous is not mandatory for group index. elm_genlist_homogeneous_set(gl, EINA_TRUE); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; api->itc2 = elm_genlist_item_class_new(); api->itc2->item_style = "group_index"; api->itc2->func.text_get = gl8_text_get; api->itc2->func.content_get = NULL; api->itc2->func.state_get = NULL; api->itc2->func.del = NULL; bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt_num = 0; bt[bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Show 0"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx2, bt[bt_num]); bt[++bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Show 26"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx2, bt[bt_num]); bt[++bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Show 101"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx2, bt[bt_num]); bt[++bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Show 480"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx2, bt[bt_num]); elm_box_pack_end(bx, bx2); evas_object_show(bx2); bx3 = elm_box_add(win); elm_box_horizontal_set(bx3, EINA_TRUE); elm_box_homogeneous_set(bx3, EINA_TRUE); evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); bt[++bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Bring top 0"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx3, bt[bt_num]); bt[++bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Bring top 31"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx3, bt[bt_num]); bt[++bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Bring top 239"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx3, bt[bt_num]); bt[++bt_num] = elm_button_add(win); elm_object_text_set(bt[bt_num], "Bring top 477"); evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); evas_object_show(bt[bt_num]); elm_box_pack_end(bx3, bt[bt_num]); elm_box_pack_end(bx, bx3); evas_object_show(bx3); for (i = 0; i < 500; i++) { if (!(i % 10)) { gli = git = elm_genlist_item_append(gl, api->itc2, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); } else if (git) { gli = elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t)i/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); } switch (i) { case 0: evas_object_smart_callback_add(bt[0], "clicked", _bt_show_cb, gli); evas_object_smart_callback_add(bt[4], "clicked", _bt_bring_cb, gli); break; case 26: evas_object_smart_callback_add(bt[1], "clicked", _bt_show_cb, gli); break; case 31: evas_object_smart_callback_add(bt[5], "clicked", _bt_bring_cb, gli); break; case 101: evas_object_smart_callback_add(bt[2], "clicked", _bt_show_cb, gli); break; case 239: evas_object_smart_callback_add(bt[6], "clicked", _bt_bring_cb, gli); break; case 477: evas_object_smart_callback_add(bt[7], "clicked", _bt_bring_cb, gli); break; case 480: evas_object_smart_callback_add(bt[3], "clicked", _bt_show_cb, gli); break; } } elm_genlist_item_class_free(api->itc1); elm_genlist_item_class_free(api->itc2); evas_object_resize(win, 480, 800); evas_object_show(win); } /*** Genlist Group Tree ****************************************************/ static void gl9_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { api_data *api = data; Elm_Object_Item *glit = event_info; Evas_Object *gl = elm_object_item_widget_get(glit); int val = (int)(uintptr_t) elm_object_item_data_get(glit); val *= 10; elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t) (val + 1)/* item data */, glit/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t) (val + 2)/* item data */, glit/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t) (val + 3)/* item data */, glit/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); } static void gl9_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; elm_genlist_item_subitems_clear(glit); } static void gl9_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; elm_genlist_item_expanded_set(glit, EINA_TRUE); } static void gl9_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; elm_genlist_item_expanded_set(glit, EINA_FALSE); } void test_genlist9(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bx; Elm_Object_Item *git; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-group-tree", "Genlist Group Tree"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); api->gl = gl; evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; api->itc2 = elm_genlist_item_class_new(); api->itc2->item_style = "group_index"; api->itc2->func.text_get = gl8_text_get; api->itc2->func.content_get = NULL; api->itc2->func.state_get = NULL; api->itc2->func.del = NULL; git = elm_genlist_item_append(gl, api->itc2, (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); elm_genlist_item_append(gl, api->itc1, (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc1, (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc1, (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); git = elm_genlist_item_append(gl, api->itc2, (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); elm_genlist_item_append(gl, api->itc1, (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc1, (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_append(gl, api->itc1, (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_class_free(api->itc1); elm_genlist_item_class_free(api->itc2); evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, api); evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, api); evas_object_smart_callback_add(gl, "expanded", gl9_exp, api); evas_object_smart_callback_add(gl, "contracted", gl9_con, api); evas_object_resize(win, 480, 800); evas_object_show(win); } /*** Genlist Decorate Item Mode ********************************************/ static char *mode_type[] = { "slide", "rotate" }; char * gl10_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part) { char buf[256]; if (!strcmp(part, "elm.text.mode")) snprintf(buf, sizeof(buf), "Mode # %i", (int)(uintptr_t)data); else snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); return strdup(buf); } Evas_Object * gl10_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; Evas_Object *ic = elm_icon_add(obj); if (!strcmp(part, "elm.swallow.end")) snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); else snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } static void _gl_sel10(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { if (!data) return; int v = elm_radio_value_get(data); if (v == 1) elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE); } static void _my_gl_mode_right(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { if (!data) return; int v = elm_radio_value_get(data); if (v == 0) elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE); } static void _my_gl_mode_left(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { if (!data) return; int v = elm_radio_value_get(data); if (v == 0) elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_FALSE); } static void _my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { fprintf(stderr, "drag\n"); if (!data) return; int v = elm_radio_value_get(data); Elm_Object_Item *glit = elm_genlist_decorated_item_get(obj); if (glit) elm_genlist_item_decorate_mode_set(glit, mode_type[v], EINA_FALSE); } void test_genlist10(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *fr, *bx, *bx2, *rd, *rdg, *gl; int i; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-decorate-item-mode", "Genlist Decorate Item Mode"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); fr = elm_frame_add(win); elm_object_text_set(fr, "Decorate Item Mode Type"); elm_box_pack_end(bx, fr); evas_object_show(fr); bx2 = elm_box_add(win); elm_object_content_set(fr, bx2); evas_object_show(bx2); rd = elm_radio_add(win); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_radio_state_value_set(rd, 0); elm_object_text_set(rd, "Slide : Sweep genlist items to the right."); evas_object_show(rd); elm_box_pack_end(bx2, rd); rdg = rd; rd = elm_radio_add(win); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_radio_state_value_set(rd, 1); elm_object_text_set(rd, "Rotate : Click each item."); elm_radio_group_add(rd, rdg); evas_object_show(rd); elm_box_pack_end(bx2, rd); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg); evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg); evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg); evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg); api->gl = gl; evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->decorate_item_style = "mode"; api->itc1->func.text_get = gl10_text_get; api->itc1->func.content_get = gl10_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; for (i = 0; i < 50; i++) elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t)(1000 + i)/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE/* flags */, _gl_sel10/* func */, rdg/* func data */); elm_box_pack_end(bx, gl); elm_genlist_item_class_free(api->itc1); evas_object_resize(win, 520, 520); evas_object_show(win); } /*** Genlist Reorder Mode **************************************************/ static void _reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_genlist_reorder_mode_set(data, elm_check_state_get(obj)); } /** * gl_moved is called after an item was reordered. * This is only called when reorder mode is enabled. * * @param obj : the genlist object. * @param event_info : the moved item. * * the item(event_info) had been moved * */ static void _gl_reorder_moved_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { printf("\"moved\" it: %p\n", event_info); } /** * _gl_reorder_moved_after_cb is called after an item was reordered. * This is only called when reorder mode is enabled. * * @param obj : the genlist object. * @param event_info : the moved item. * * the item(event_info) had been moved after the given relative item(*rel_item) in list. * */ static void _gl_reorder_moved_after_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { // if needed, add application logic. Elm_Object_Item *it = elm_genlist_item_prev_get((Elm_Object_Item *)event_info); printf("it = %p, prev_it = %p\n", event_info, it); } /** * _gl_reorder_moved_before_cb is called after an item was reordered. * This is only called when reorder mode is enabled. * * @param obj : the genlist object. * @param event_info : the moved item. * * the item(event_info) had been moved before the given relative item(*rel_item) in list. * */ static void _gl_reorder_moved_before_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { // if needed, add application logic. Elm_Object_Item *it = elm_genlist_item_next_get((Elm_Object_Item *)event_info); printf("it = %p, next_it = %p\n", event_info, it); } static void _gl_reorder_item_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("\"item,focused\" it: %p\n", event_info); } static void _gl_reorder_item_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("\"item,unfocused\" it: %p\n", event_info); } static void _gl_reorder_item_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("\"selected\" it: %p\n", event_info); } static void _gl_reorder_item_unselected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("\"unselected\" it: %p\n", event_info); } void test_genlist_reorder(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *fr, *lb, *bx, *tg, *gl; int i; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-reorder-mode", "Genlist Reorder Mode"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); fr = elm_frame_add(win); elm_object_text_set(fr, "Reorder Mode"); elm_box_pack_end(bx, fr); evas_object_show(fr); lb = elm_label_add(win); elm_object_text_set(lb, "Enable reorder mode if you want to move item.
" "Then long press and drag item."); elm_object_content_set(fr, lb); evas_object_show(lb); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); tg = elm_check_add(win); elm_object_style_set(tg, "toggle"); elm_object_text_set(tg, "Reorder Mode:"); elm_check_state_set(tg, elm_config_mirrored_get()); evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl); elm_box_pack_end(bx, tg); evas_object_show(tg); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; evas_object_smart_callback_add(gl, "moved", _gl_reorder_moved_cb, NULL); evas_object_smart_callback_add(gl, "moved,after", _gl_reorder_moved_after_cb, NULL); evas_object_smart_callback_add(gl, "moved,before", _gl_reorder_moved_before_cb, NULL); evas_object_smart_callback_add(gl, "item,focused", _gl_reorder_item_focused_cb, NULL); evas_object_smart_callback_add(gl, "item,unfocused", _gl_reorder_item_unfocused_cb, NULL); evas_object_smart_callback_add(gl, "selected", _gl_reorder_item_selected_cb, NULL); evas_object_smart_callback_add(gl, "unselected", _gl_reorder_item_unselected_cb, NULL); for (i = 0; i < 50; i++) elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t)(1 + i)/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE/* flags */, NULL/* func */, NULL/* func data */); elm_genlist_item_class_free(api->itc1); elm_box_pack_end(bx, gl); evas_object_resize(win, 400, 500); evas_object_show(win); } /*** Genlist Textblock *****************************************************/ char *gl12_text_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { 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)."); } void test_genlist12(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *gl; int i; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-textblock", "Genlist Textblock"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); api->gl = gl; evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "message"; api->itc1->func.text_get = gl12_text_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; for (i = 0; i < 1000; i++) { elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); } elm_genlist_item_class_free(api->itc1); evas_object_resize(win, 400, 500); evas_object_show(win); } /*** Genlist Tree, Insert Sorted *******************************************/ static int gl13_cmp(const void *pa, const void *pb) { const Elm_Object_Item *ia = pa, *ib = pb; int a = (int)(uintptr_t) elm_object_item_data_get(ia); int b = (int)(uintptr_t) elm_object_item_data_get(ib); return a - b; } void test_genlist13(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Elm_Object_Item *pi[6]; Evas_Object *win, *bx, *gl; int i, base, idx[3] = {1, 10, 15}; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-tree-insert-sorted", "Genlist Tree, Insert Sorted"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(gl); api->itc2 = elm_genlist_item_class_new(); api->itc2->item_style = "default"; api->itc2->func.text_get = gl4_text_get; api->itc2->func.content_get = NULL; api->itc2->func.state_get = NULL; api->itc2->func.del = NULL; /* mixed order to test insert sorted */ for (i = 0; i < 3; i++) { pi[i] = elm_genlist_item_sorted_insert (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */); } for (i = 0, base = 100; i < 3; i++, base += 100) { int j; for (j = 0; j < 3; j++) { elm_genlist_item_sorted_insert (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */, pi[i]/* parent */, ELM_GENLIST_ITEM_NONE, gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */); } } for (i = 0; i < 3; i++) { pi[i + 3] = elm_genlist_item_sorted_insert (gl, api->itc2, (void *)(uintptr_t)(idx[i] * 2)/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */); } for (i = 0, base = 10000; i < 3; i++, base += 10000) { int j; for (j = 0; j < 3; j++) { elm_genlist_item_sorted_insert (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */, pi[i + 3]/* parent */, ELM_GENLIST_ITEM_NONE, gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */); } } elm_genlist_item_class_free(api->itc2); elm_box_pack_end(bx, gl); evas_object_show(bx); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist Tree, Insert Relative *****************************************/ static void my_gl_insert_before_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; static int i = 1000; Elm_Object_Item *gli_selected; if (!api->itc1) api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = NULL; api->itc1->func.state_get = NULL; api->itc1->func.del = NULL; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) { printf("no item selected\n"); return; } elm_genlist_item_insert_before(gl, api->itc1, (void *)(uintptr_t)i/* item data */, elm_genlist_item_parent_get(gli_selected), gli_selected/* item before */, ELM_GENLIST_ITEM_NONE, NULL/* func */, NULL/* func data */); i++; } static void my_gl_insert_after_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Evas_Object *gl = api->gl; static int i = 0; Elm_Object_Item *gli_selected; if (!api->itc1) api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get; api->itc1->func.content_get = NULL; api->itc1->func.state_get = NULL; api->itc1->func.del = NULL; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) { printf("no item selected\n"); return; } elm_genlist_item_insert_after(gl, api->itc1, (void *)(uintptr_t)i/* item data */, elm_genlist_item_parent_get(gli_selected), gli_selected/* item after */, ELM_GENLIST_ITEM_NONE, NULL/* func */, NULL/* func data */); i++; } void test_genlist14(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Elm_Object_Item *pi[6]; Evas_Object *win, *bx, *bx2, *bt, *gl; int i, base; /* index: 0, 1, 2, 3, 4, 5 * items: 1, 15, 11, 2, 33, 21 * final: 1, 2, 11, 15, 21, 33 */ const int idx[6] = {1, 15, 11, 2, 33, 21}; const int relative[6] = { 0, /* item '1' - not used */ 0, /* item '15' - insert after pi[0], item '1' */ -1, /* item '11' - insert before pi[1], item '15' */ -2, /* item '2' - insert before pi[2], item '11' */ 1, /* item '33' - insert after pi[1], item '15' */ -4 /* item '21' - insert before pi[4], item '33' */ }; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-tree-insert-relative", "Genlist Tree, Insert Relative"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); api->itc2 = elm_genlist_item_class_new(); api->itc2->item_style = "default"; api->itc2->func.text_get = gl4_text_get; api->itc2->func.content_get = NULL; api->itc2->func.state_get = NULL; api->itc2->func.del = NULL; /* mixed order to test insert sorted */ // BUG1: should be able to insert before=NULL, prepend // BUG2: should be able to insert after=NULL, append pi[0] = elm_genlist_item_append (gl, api->itc2, (void *)(uintptr_t)idx[0]/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); for (i = 1; i < 3; i++) { if (relative[i] < 0) pi[i] = elm_genlist_item_insert_before (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, NULL/* parent */, pi[-relative[i]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); else pi[i] = elm_genlist_item_insert_after (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, NULL/* parent */, pi[relative[i]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); } for (i = 0; i < 3; i++) { Elm_Object_Item *sub_glit[6]; int j; base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]); sub_glit[0] = elm_genlist_item_append (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */, ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); for (j = 1; j < 6; j++) { if (relative[j] < 0) sub_glit[j] = elm_genlist_item_insert_before (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, pi[i]/* parent */, sub_glit[-relative[j]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); else sub_glit[j] = elm_genlist_item_insert_after (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, pi[i]/* parent */, sub_glit[relative[j]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); } } for (i = 3; i < 6; i++) { if (relative[i] < 0) pi[i] = elm_genlist_item_insert_before (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */, NULL/* parent */, pi[-relative[i]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); else pi[i] = elm_genlist_item_insert_after (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */, NULL/* parent */, pi[relative[i]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); } for (i = 3; i < 6; i++) { Elm_Object_Item *sub_glit[6]; int j; base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]); sub_glit[0] = elm_genlist_item_append (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */, ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); for (j = 1; j < 6; j++) { if (relative[j] < 0) sub_glit[j] = elm_genlist_item_insert_before (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, pi[i]/* parent */, sub_glit[-relative[j]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); else sub_glit[j] = elm_genlist_item_insert_after (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, pi[i]/* parent */, sub_glit[relative[j]], ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); } } elm_box_pack_end(bx, gl); evas_object_show(bx); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "+ before"); evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "+ after"); evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, api); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); elm_box_pack_end(bx, bx2); evas_object_show(bx2); /* item_class_ref is needed for itc2. some items can be added in callbacks */ elm_genlist_item_class_ref(api->itc2); elm_genlist_item_class_free(api->itc2); evas_object_resize(win, 320, 320); evas_object_show(win); } /*** Genlist Decorate All Mode *********************************************/ static void _edit_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Elm_Object_Item *item = (Elm_Object_Item *)data; elm_object_item_del(item); } char * gl15_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { const Testitem *tit = data; char buf[256]; snprintf(buf, sizeof(buf), "Item #%i", tit->mode); return strdup(buf); } Evas_Object * gl15_content_get(void *data, Evas_Object *obj, const char *part) { Testitem *tit = data; char buf[PATH_MAX]; // "edit" EDC layout is like below. each part is swallow part. // the existing item is swllowed to elm.swallow.edit.content part. // -------------------------------------------------------------------- // | elm.edit.icon.1 | elm.swallow.decorate.content | elm.edit.icon,2 | // -------------------------------------------------------------------- if (!strcmp(part, "elm.swallow.end")) { Evas_Object *ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); elm_image_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } else if (!strcmp(part, "elm.edit.icon.1")) { Evas_Object *ck; ck = elm_check_add(obj); elm_check_state_pointer_set(ck, &tit->checked); evas_object_propagate_events_set(ck, EINA_FALSE); evas_object_show(ck); return ck; } else if (!strcmp(part, "elm.edit.icon.2")) { Evas_Object *icn = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/images/icon_06.png", elm_app_data_dir_get()); elm_image_file_set(icn, buf, NULL); evas_object_propagate_events_set(icn, EINA_FALSE); evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); evas_object_smart_callback_add(icn, "clicked", _edit_icon_clicked_cb, (void *)tit->item); return icn; } else return NULL; } static void gl15_sel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Testitem *tit = data; if (elm_genlist_decorate_mode_get(obj)) { if (!tit->checked) tit->checked = EINA_TRUE; else tit->checked = EINA_FALSE; } elm_genlist_item_update(tit->item); } static void gl15_deco_all_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_decorate_mode_set(data, EINA_TRUE); elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS); } static void gl15_normal_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_decorate_mode_set(data, EINA_FALSE); elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT); } void gl15_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) { Testitem *ti = data; printf("item deleted. (# %d)\n", ti->mode); } void test_genlist15(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *bx2, *bt, *gl; int i; static Testitem tit[100]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-decorate-all-mode", "Genlist Decorate All Mode"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl15_text_get; api->itc1->func.content_get = gl15_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = gl15_del; api->itc1->decorate_all_item_style = "edit"; for (i = 0; i < 100; i++) { tit[i].mode = i; tit[i].item = elm_genlist_item_append(gl, api->itc1, &(tit[i])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE/* flags */, gl15_sel/* func */, (void *)(uintptr_t)&(tit[i])/* func data */); } elm_genlist_item_class_free(api->itc1); elm_box_pack_end(bx, gl); evas_object_show(bx); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_homogeneous_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); bt = elm_button_add(win); elm_object_text_set(bt, "Decorate All mode"); evas_object_smart_callback_add(bt, "clicked", gl15_deco_all_mode, gl); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); bt = elm_button_add(win); elm_object_text_set(bt, "Normal mode"); evas_object_smart_callback_add(bt, "clicked", gl15_normal_mode,gl); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx2, bt); evas_object_show(bt); elm_box_pack_end(bx, bx2); evas_object_show(bx2); evas_object_resize(win, 520, 520); evas_object_show(win); } /*** Genlist Flip Mode *****************************************************/ static void _flip_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { const Testitem *tit = data; if (elm_genlist_item_flip_get(tit->item)) elm_genlist_item_flip_set(tit->item, EINA_FALSE); else elm_genlist_item_flip_set(tit->item, EINA_TRUE); } char * gl16_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { const Testitem *tit = data; char buf[256]; snprintf(buf, sizeof(buf), "Item #%i", tit->mode); return strdup(buf); } Evas_Object * gl16_content_get(void *data, Evas_Object *obj, const char *part) { Testitem *tit = data; char buf[PATH_MAX]; if (!strcmp(part, "elm.text.flip")) { Evas_Object *btn = elm_button_add(obj); elm_object_text_set(btn, "flipped content placement"); evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(btn, "clicked", _flip_icon_clicked_cb, (void *)tit); evas_object_show(btn); return btn; } else if (!strcmp(part, "elm.edit.icon.1")) { Evas_Object *icn = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/images/icon_04.png", elm_app_data_dir_get()); elm_image_file_set(icn, buf, NULL); evas_object_propagate_events_set(icn, EINA_FALSE); evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return icn; } else if (!strcmp(part, "elm.edit.icon.2")) { Evas_Object *icn = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/images/icon_09.png", elm_app_data_dir_get()); elm_image_file_set(icn, buf, NULL); evas_object_propagate_events_set(icn, EINA_FALSE); evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); evas_object_smart_callback_add(icn, "clicked", _flip_icon_clicked_cb, (void *)tit); return icn; } else return NULL; } void test_genlist16(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *gl; int i; static Testitem tit[100]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-flip-mode", "Genlist Flip Mode"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); /* note: flip mode can be used with/without edit mode */ elm_genlist_decorate_mode_set(gl, EINA_TRUE); elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl16_text_get; api->itc1->func.content_get = gl16_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; api->itc1->decorate_all_item_style = "edit"; for (i = 0; i < 100; i++) { tit[i].mode = i; tit[i].item = elm_genlist_item_append(gl, api->itc1, &(tit[i])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE/* flags */, gl_sel/* func */, (void *)(uintptr_t)&(tit[i])/* func data */); } elm_genlist_item_class_free(api->itc1); elm_box_pack_end(bx, gl); evas_object_show(bx); evas_object_resize(win, 520, 520); evas_object_show(win); } /*** Genlist Decorate Modes ************************************************/ char * gl17_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part) { const Testitem *tit = data; char buf[256]; if (!strcmp(part, "elm.text.mode")) snprintf(buf, sizeof(buf), "Mode # %i", tit->mode); else snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); return strdup(buf); } Evas_Object * _decorate_item_mode_frame_new(Evas_Object *win, Evas_Object **rdg) { Evas_Object *fr, *bx, *rd; fr = elm_frame_add(win); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_text_set(fr, "Decorate Item Mode Type"); evas_object_show(fr); bx = elm_box_add(win); elm_object_content_set(fr, bx); evas_object_show(bx); rd = elm_radio_add(win); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_radio_state_value_set(rd, 0); elm_object_text_set(rd, "Slide : Sweep genlist items to the right."); evas_object_show(rd); elm_box_pack_end(bx, rd); *rdg = rd; rd = elm_radio_add(win); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_radio_state_value_set(rd, 1); elm_object_text_set(rd, "Rotate : Click each item."); elm_radio_group_add(rd, *rdg); evas_object_show(rd); elm_box_pack_end(bx, rd); return fr; } void _decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { if (!data) return; Evas_Object *gl; gl = evas_object_data_get(obj, "gl"); if (!gl) return; if (evas_object_data_get(gl, "tree_effect")) elm_genlist_tree_effect_enabled_set(gl, EINA_FALSE); elm_genlist_decorate_mode_set(gl, EINA_TRUE); } void _decorate_all_unset_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { if (evas_object_data_get(data, "tree_effect")) elm_genlist_tree_effect_enabled_set(data, EINA_TRUE); elm_genlist_decorate_mode_set(data, EINA_FALSE); } Evas_Object * _decorate_all_mode_frame_new(Evas_Object *win, Evas_Object *rdg, Evas_Object *gl) { Evas_Object *fr, *bx, *btn; fr = elm_frame_add(win); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_text_set(fr, "Decorate All Mode Type"); evas_object_show(fr); bx = elm_box_add(win); elm_object_content_set(fr, bx); evas_object_show(bx); btn = elm_button_add(win); evas_object_data_set(btn, "gl", gl); elm_object_text_set(btn, "Set Decorate All Mode"); evas_object_smart_callback_add(btn, "clicked", _decorate_all_set_btn_clicked_cb, rdg); elm_box_pack_end(bx, btn); evas_object_show(btn); btn = elm_button_add(win); elm_object_text_set(btn, "Unset Decorate All Mode"); evas_object_smart_callback_add(btn, "clicked", _decorate_all_unset_btn_clicked_cb, gl); elm_box_pack_end(bx, btn); evas_object_show(btn); return fr; } void test_genlist17(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *fr1, *fr2, *bx, *bx2, *rdg = NULL, *gl; int i; static Testitem tit[50]; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-decorate-modes", "Genlist Decorate Modes"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); bx2 = elm_box_add(win); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_pack_end(bx, bx2); evas_object_show(bx2); fr1 = _decorate_item_mode_frame_new(win, &rdg); elm_box_pack_end(bx2, fr1); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg); evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg); evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg); evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg); api->gl = gl; evas_object_show(gl); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->decorate_item_style = "mode"; api->itc1->func.text_get = gl15_text_get; api->itc1->func.content_get = gl15_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; api->itc1->decorate_all_item_style = "edit"; for (i = 0; i < 50; i++) { tit[i].checked = EINA_FALSE; tit[i].mode = i; tit[i].item = elm_genlist_item_append(gl, api->itc1, &(tit[i])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE/* flags */, NULL/* select func */, NULL/* func data */); } elm_genlist_item_class_free(api->itc1); elm_box_pack_end(bx, gl); fr2 = _decorate_all_mode_frame_new(win, rdg, gl); elm_box_pack_end(bx2, fr2); evas_object_resize(win, 520, 520); evas_object_show(win); } /*** Genlist Tree and Decorate All Mode ************************************/ static void _tree_effect_enable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_tree_effect_enabled_set(data, EINA_TRUE); } static void _tree_effect_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_genlist_tree_effect_enabled_set(data, EINA_FALSE); } Evas_Object * _tree_effect_frame_new(Evas_Object *win, Evas_Object **rdg, Evas_Object *gl) { Evas_Object *fr, *bx, *rd; fr = elm_frame_add(win); elm_object_text_set(fr, "Genlist Tree Effect"); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(fr); bx = elm_box_add(win); elm_box_homogeneous_set(bx, EINA_TRUE); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_content_set(fr, bx); evas_object_show(bx); rd = elm_radio_add(win); elm_radio_state_value_set(rd, 0); elm_object_text_set(rd, "Enable"); evas_object_smart_callback_add(rd, "changed", _tree_effect_enable_cb, gl); evas_object_show(rd); elm_box_pack_end(bx, rd); *rdg = rd; rd = elm_radio_add(win); elm_radio_state_value_set(rd, 1); elm_radio_group_add(rd, *rdg); elm_object_text_set(rd, "Disable"); evas_object_smart_callback_add(rd, "changed", _tree_effect_disable_cb, gl); evas_object_show(rd); elm_box_pack_end(bx, rd); return fr; } static void gl18_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; int depth = elm_genlist_item_expanded_depth_get(glit); printf("expanded depth for selected item is %d\n", depth); } static void gl18_del(void *data, Evas_Object *obj EINA_UNUSED) { free(data); } static void gl18_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { api_data *api = data; Elm_Object_Item *glit = event_info; Evas_Object *gl = elm_object_item_widget_get(glit); Testitem *tit = elm_object_item_data_get(glit); int i, j, val; val = tit->mode * 10; for (i = 0; i < 100; i++) { tit = calloc(1, sizeof(Testitem)); tit->mode = val + i; tit->item = elm_genlist_item_append(gl, api->itc2, tit/* item data */, glit/* parent */, ELM_GENLIST_ITEM_TREE, gl18_sel/* func */, NULL/* func data */); } for (j = 0; j < 3; j++) { tit = calloc(1, sizeof(Testitem)); tit->mode = i; tit->item = elm_genlist_item_append(gl, api->itc1, tit/* item data */, glit/* parent */, ELM_GENLIST_ITEM_NONE, gl18_sel/* func */, NULL/* func data */); i++; } } static void gl18_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; elm_genlist_item_subitems_clear(glit); } static void gl18_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; elm_genlist_item_expanded_set(glit, EINA_TRUE); } static void gl18_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; elm_genlist_item_expanded_set(glit, EINA_FALSE); } void test_genlist18(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bx, *fr1, *fr2, *bx2, *rdg; Testitem *tit = NULL; int i, j; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-tree-decorate-all", "Genlist Tree and Decorate All Mode"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); bx2 = elm_box_add(win); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_horizontal_set(bx2, EINA_TRUE); elm_box_pack_end(bx, bx2); evas_object_show(bx2); gl = elm_genlist_add(win); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); api->gl = gl; evas_object_show(gl); elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE); evas_object_data_set(gl, "tree_effect", "true"); /* normal item */ api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "tree_effect"; /* item/tree_effect */ api->itc1->func.text_get = gl15_text_get; api->itc1->func.content_get = gl15_content_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = gl18_del; api->itc1->decorate_all_item_style = "edit"; /* expandable item */ api->itc2 = elm_genlist_item_class_new(); api->itc2->item_style = "tree_effect"; /* tree/tree_effect */ api->itc2->func.text_get = gl15_text_get; api->itc2->func.content_get = gl15_content_get; api->itc2->func.state_get = gl_state_get; api->itc2->func.del = gl18_del; api->itc2->decorate_all_item_style = "edit"; for (i = 0; i < 5; i++) { tit = calloc(1, sizeof(Testitem)); tit->mode = i; tit->item = elm_genlist_item_append(gl, api->itc2, tit/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, gl18_sel/* func */, NULL/* func data */); } for (j = 0; j < 3; j++) { tit = calloc(1, sizeof(Testitem)); tit->mode = i; tit->item = elm_genlist_item_append(gl, api->itc1, tit/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl18_sel/* func */, NULL/* func data */); i++; } elm_genlist_item_class_free(api->itc1); elm_genlist_item_class_free(api->itc2); evas_object_smart_callback_add(gl, "expand,request", gl18_exp_req, api); evas_object_smart_callback_add(gl, "contract,request", gl18_con_req, api); evas_object_smart_callback_add(gl, "expanded", gl18_exp, api); evas_object_smart_callback_add(gl, "contracted", gl18_con, api); elm_box_pack_end(bx, gl); fr1 = _tree_effect_frame_new(win, &rdg, gl); elm_box_pack_end(bx2, fr1); fr2 = _decorate_all_mode_frame_new(win, rdg, gl); elm_box_pack_end(bx2, fr2); evas_object_resize(win, 400, 800); evas_object_show(win); } /*** Genlist Full Widget ***************************************************/ void test_genlist19(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt; Evas_Object *over; Elm_Object_Item *gli; int i; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-full", "Genlist Full Widget"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); bxx = elm_box_add(win); elm_win_resize_object_add(win, bxx); evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(bxx); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); api->box = bx; evas_object_show(bx); bt = elm_button_add(win); elm_object_text_set(bt, "Next API function"); evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); elm_box_pack_end(bxx, bt); elm_object_disabled_set(bt, api->state == API_STATE_LAST); evas_object_show(bt); elm_box_pack_end(bxx, bx); gl = elm_genlist_add(win); evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); // FIXME: This causes genlist to resize the horiz axis very slowly :( // Reenable this and resize the window horizontally, then try to resize it back //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); api->gl = gl; evas_object_show(gl); over = evas_object_rectangle_add(evas_object_evas_get(win)); evas_object_color_set(over, 0, 0, 0, 0); evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl); evas_object_repeat_events_set(over, EINA_TRUE); evas_object_show(over); evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, over); api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "full"; api->itc1->func.text_get = NULL; api->itc1->func.content_get = gl_content_full_get; api->itc1->func.state_get = gl_state_get; api->itc1->func.del = NULL; bt_50 = elm_button_add(win); elm_object_text_set(bt_50, "Go to 50"); evas_object_show(bt_50); elm_box_pack_end(bx, bt_50); bt_1500 = elm_button_add(win); elm_object_text_set(bt_1500, "Go to 1500"); evas_object_show(bt_1500); elm_box_pack_end(bx, bt_1500); for (i = 0; i < 2000; i++) { gli = elm_genlist_item_append(gl, api->itc1, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); if (i == 50) evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli); else if (i == 1500) evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli); } elm_genlist_item_class_free(api->itc1); evas_object_resize(win, 480, 800); evas_object_show(win); } /*** Genlist Item Styles ***************************************************/ const char *_genlist_styles[] = { "default", "full", "one_icon", "end_icon", "no_icon", "default_style", "double_label", "icon_top_text_bottom", "message", "media", "media-album", "media-preview", NULL }; static void _genlist_renew(Evas_Object *obj, const char *style) { Elm_Genlist_Item_Class *ic; Evas_Object *check; int i; if (!obj) return; elm_genlist_clear(obj); check = evas_object_data_get(obj, "check"); if (elm_check_state_get(check)) elm_genlist_mode_set(obj, ELM_LIST_COMPRESS); else elm_genlist_mode_set(obj, ELM_LIST_SCROLL); ic = elm_genlist_item_class_new(); ic->item_style = style; ic->func.text_get = gl_text_get; ic->func.content_get = gl_content_get; ic->func.state_get = NULL; ic->func.del = NULL; for (i = 0; i < 50; i++) { elm_genlist_item_append(obj, ic, (void *)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); } elm_genlist_item_class_free(ic); } static void _item_style_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) { Evas_Object *gl = evas_object_data_get(obj, "genlist"); if (gl) _genlist_renew(gl, elm_object_item_text_get(event_info)); } static Evas_Object * _item_styles_list_create(Evas_Object *parent) { Evas_Object *list; int i = 0; list = elm_list_add(parent); evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); while (_genlist_styles[i]) { elm_list_item_append(list, _genlist_styles[i], NULL, NULL, _item_style_sel_cb, _genlist_styles[i]); i++; } return list; } void test_genlist_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *box, *gl, *list, *table, *check; win = elm_win_util_standard_add("genlist-item-styles", "Genlist Item Styles"); elm_win_autodel_set(win, EINA_TRUE); box = elm_box_add(win); elm_box_horizontal_set(box, EINA_TRUE); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, box); evas_object_show(box); list = _item_styles_list_create(box); evas_object_show(list); table = _elm_min_set(list, box, 200, 0); evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, table); evas_object_show(table); gl = elm_genlist_add(box); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, gl); evas_object_show(gl); check = elm_check_add(win); elm_object_text_set(check, "Compress"); elm_box_pack_end(box, check); evas_object_show(check); evas_object_data_set(gl, "check", check); _genlist_renew(gl, "default"); evas_object_data_set(list, "genlist", gl); evas_object_resize(win, 600, 600); evas_object_show(win); } /*** Genlist Multi Select **************************************************/ typedef struct _Genlist_Multi_Data Genlist_Multi_Data; struct _Genlist_Multi_Data { Evas_Object *gl; Evas_Object *rd1; Evas_Object *rd2; }; static void _multi_select_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Eina_Bool multi = elm_check_state_get(obj); Genlist_Multi_Data *gd = data; if (!gd) return; elm_genlist_multi_select_set(gd->gl, multi); elm_object_disabled_set(gd->rd1, !multi); elm_object_disabled_set(gd->rd2, !multi); } static void _multi_select_mode_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_genlist_multi_select_mode_set(data, elm_radio_value_get(obj)); } static void _multi_select_frame_create(Evas_Object *bx, Genlist_Multi_Data *gd) { Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg; if (!gd) return; fr = elm_frame_add(bx); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); elm_object_text_set(fr, "Multi Select Option"); elm_box_pack_end(bx, fr); evas_object_show(fr); bx2 = elm_box_add(fr); elm_object_content_set(fr, bx2); evas_object_show(bx2); tg = elm_check_add(bx2); elm_object_style_set(tg, "toggle"); elm_object_text_set(tg, "Multi Select Mode"); elm_box_pack_end(bx2, tg); evas_object_show(tg); bx3 = elm_box_add(bx2); elm_box_horizontal_set(bx3, EINA_TRUE); elm_box_pack_end(bx2, bx3); evas_object_show(bx3); gd->rd1 = rdg = rd = elm_radio_add(bx3); elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT); elm_object_text_set(rd, "Default Mode"); elm_box_pack_end(bx3, rd); evas_object_show(rd); elm_object_disabled_set(rd, EINA_TRUE); evas_object_smart_callback_add(rd, "changed", _multi_select_mode_changed_cb, gd->gl); gd->rd2 = rd = elm_radio_add(bx3); elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL); elm_radio_group_add(rd, rdg); elm_object_text_set(rd, "With Control Mode"); elm_box_pack_end(bx3, rd); evas_object_show(rd); elm_object_disabled_set(rd, EINA_TRUE); evas_object_smart_callback_add(rd, "changed", _multi_select_mode_changed_cb, gd->gl); evas_object_smart_callback_add(tg, "changed", _multi_select_changed_cb, gd); } static void _multi_data_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { free(data); } void test_genlist_multi_select(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bx; Genlist_Multi_Data *gd = calloc(1, sizeof(Genlist_Multi_Data)); Elm_Genlist_Item_Class *itc = NULL; int i = 0; win = elm_win_util_standard_add("genlist-multi-select", "Genlist Multi Select"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _multi_data_free_cb, gd); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); gd->gl = gl = elm_genlist_add(bx); _multi_select_frame_create(bx, gd); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); evas_object_show(gl); itc = elm_genlist_item_class_new(); itc->item_style = "default"; itc->func.text_get = gl_text_get; itc->func.content_get = gl_content_get; itc->func.state_get = gl_state_get; itc->func.del = NULL; for (i = 0; i < 100; i++) { elm_genlist_item_append(gl, itc, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(uintptr_t)(i * 10)/* func data */); } elm_genlist_item_class_free(itc); evas_object_resize(win, 320, 500); evas_object_show(win); } /*** Genlist Item Search By Text *******************************************/ typedef struct _gl20_Event_Data gl20_Event_Data; struct _gl20_Event_Data { Evas_Object *gl_obj; Evas_Object *tg_obj; Evas_Object *en_obj; Elm_Object_Item *last_item_found; }; static const char *_gl20_items_text[] = { "Albany", "Annapolis", "Atlanta", "Augusta", "Austin", "Baton Rouge", "Bismarck", "Boise", "Boston", "Carson City", "Charleston", "Cheyenne", "Columbia", "Columbus", "Concord", "Denver", "Des Moines", "Dover", "Frankfort", "Harrisburg", "Hartford", "Helena", "Honolulu", "Indianapolis", "Jackson", "Jefferson City", "Juneau", "Lansing", "Lincoln", "Little Rock", "Madison", "Montgomery", "Montpelier", "Nashville", "Oklahoma City", "Olympia", "Phoenix", "Pierre", "Providence", "Raleigh", "Richmond", "Sacramento", "Saint Paul", "Salem", "Salt Lake City", "Santa Fe", "Springfield", "Tallahassee", "Topeka", "Trenton" }; static void _gl20_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { free(data); } static char * _gl20_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[32]; int item_index = (int)(uintptr_t)data; if (item_index < 50) { snprintf(buf, sizeof(buf), "%s", _gl20_items_text[item_index]); return strdup(buf); } else if (item_index < 100) { snprintf(buf, sizeof(buf), "%X", (item_index - 50)); return strdup(buf); } else if (item_index == 100) return strdup("Tree Item"); return NULL; } static void _gl20_search_item(gl20_Event_Data *event_data, Elm_Object_Item * it) { const char *str = elm_entry_entry_get(event_data->en_obj); if (!str || !strlen(str)) return; Elm_Glob_Match_Flags flag = 0; if (!elm_check_state_get(event_data->tg_obj)) flag = ELM_GLOB_MATCH_NOCASE; printf("Looking for \"%s\". ", str); event_data->last_item_found = elm_genlist_search_by_text_item_get (event_data->gl_obj, it, NULL, str, flag); if (event_data->last_item_found) { printf("Found.\n"); elm_genlist_item_selected_set(event_data->last_item_found, EINA_TRUE); elm_genlist_item_bring_in(event_data->last_item_found, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); elm_object_focus_set(event_data->en_obj, EINA_TRUE); } else printf("Not Found.\n"); } static void _gl20_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *einfo EINA_UNUSED) { _gl20_search_item(data, NULL); } static Elm_Genlist_Item_Class * _gl20_item_class_create(const char *item_style) { Elm_Genlist_Item_Class * itc = elm_genlist_item_class_new(); itc->item_style = item_style; itc->func.text_get = _gl20_text_get; itc->func.content_get = gl_content_get; itc->func.state_get = gl_state_get; itc->func.del = NULL; return itc; } static void _gl20_expand_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) { Elm_Object_Item *glit = event_info; Evas_Object *gl = elm_object_item_widget_get(glit); Elm_Genlist_Item_Class *itc = NULL; int i = 0; itc = _gl20_item_class_create("default"); for (i = 50; i < 100; i++) { elm_genlist_item_append(gl, itc, (void *)(uintptr_t) i/* item data */, glit/* parent */, ELM_GENLIST_ITEM_NONE, NULL/* func */, NULL/* func data */); } elm_genlist_item_class_free(itc); } static void _gl20_on_keydown(void *data, Evas *evas EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *einfo) { Evas_Event_Key_Down *ev = einfo; gl20_Event_Data * event_data = (gl20_Event_Data *)data; if (!strcmp(ev->key, "Return")) { printf("Looking for next item\n"); _gl20_search_item(data, event_data->last_item_found); } } void test_genlist20(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *gl; Evas_Object *fr, *lb_frame; // info frame Evas_Object *bx_entry, *lb_entry, *en; // search line Evas_Object *tg; // "case sensitive" toggle Elm_Genlist_Item_Class *itc = NULL; gl20_Event_Data* event_data = NULL; int i = 0; win = elm_win_util_standard_add("genlist-item-search-by-text", "Genlist Item Search By Text"); elm_win_autodel_set(win, EINA_TRUE); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); fr = elm_frame_add(bx); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_text_set(fr, "Information"); elm_box_pack_end(bx, fr); evas_object_show(fr); lb_frame = elm_label_add(fr); elm_object_text_set(lb_frame, "This is an example of " "elm_genlist_search_by_text_item_get() usage.
" "Enter search string to the entry and press Enter to " "show next search result.
"); elm_object_content_set(fr, lb_frame); evas_object_show(lb_frame); tg = elm_check_add(win); elm_object_style_set(tg, "toggle"); elm_object_text_set(tg, " Case Sensitive Search"); elm_check_state_set(tg, EINA_TRUE); elm_box_pack_end(bx, tg); evas_object_show(tg); bx_entry = elm_box_add(win); elm_box_horizontal_set(bx_entry, EINA_TRUE); evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0); elm_box_pack_end(bx, bx_entry); evas_object_show(bx_entry); lb_entry = elm_label_add(win); elm_object_text_set(lb_entry, " Search:"); evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL); elm_box_pack_end(bx_entry, lb_entry); evas_object_show(lb_entry); en = elm_entry_add(win); elm_entry_single_line_set(en, EINA_TRUE); elm_entry_scrollable_set(en, EINA_TRUE); elm_object_part_text_set(en, "guide", "Type item's name here to search."); evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx_entry, en); evas_object_show(en); elm_object_focus_set(en, EINA_TRUE); gl = elm_genlist_add(bx); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); evas_object_show(gl); event_data = calloc(1, sizeof(gl20_Event_Data)); event_data->tg_obj = tg; event_data->en_obj = en; event_data->gl_obj = gl; event_data->last_item_found = NULL; evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN, _gl20_on_keydown, (void*)event_data); evas_object_event_callback_add(gl, EVAS_CALLBACK_FREE, _gl20_del_cb, (void*)event_data); evas_object_smart_callback_add(en, "changed,user", _gl20_search_settings_changed_cb, (void*)event_data); evas_object_smart_callback_add(tg, "changed", _gl20_search_settings_changed_cb, (void*)event_data); evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl); evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl); evas_object_smart_callback_add(gl, "contracted", gl4_con, gl); evas_object_smart_callback_add(gl, "expanded", _gl20_expand_cb, gl); itc = _gl20_item_class_create("tree_effect"); elm_genlist_item_append(gl, itc, (void *)100/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); itc->item_style = "default"; for (i = 0; i < 50; i++) { elm_genlist_item_append(gl, itc, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, NULL/* func */, NULL/* func data */); } elm_genlist_item_class_free(itc); evas_object_resize(win, 320, 500); evas_object_show(win); } /*** Genlist Del ***********************************************************/ static void _gl_del_sel(void *data, Evas_Object *obj, void *event_info); static void _gl_del_win_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { if (!data) return; elm_genlist_item_class_free(data); } static void _gl_del_unrealized_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { int num = (int)(uintptr_t)elm_object_item_data_get(event_info); printf("unrealized item # %d\n", num); } static void _gl_del_doubleclick_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { int num = (int)(uintptr_t)elm_object_item_data_get(event_info); int num_category = num % 4; if (num_category == 3) elm_genlist_clear(obj); } static Evas_Object * _gl_del_genlist_add(Evas_Object *bx) { Evas_Object *gl = NULL; gl = elm_genlist_add(bx); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); evas_object_show(gl); evas_object_smart_callback_add(gl, "unrealized", _gl_del_unrealized_cb, NULL); evas_object_smart_callback_add(gl, "clicked,double", _gl_del_doubleclick_cb, NULL); return gl; } static void _gl_del_item_append(Evas_Object *gl, Elm_Genlist_Item_Class *itc) { int i = 0; for (i = 0; i < 1000; i++) { elm_genlist_item_append(gl, itc, (void *)(uintptr_t)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, _gl_del_sel/* func */, (void *)(uintptr_t)(i)/* func data */); } } char * _gl_del_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[256] = { 0 }; int num = (int)(uintptr_t)data; int num_category = num % 10; if (num_category == 3) snprintf(buf, sizeof(buf), "Item #%.02i - 1. Item Del", num); else if (num_category == 5) snprintf(buf, sizeof(buf), "Item #%.02i - 2. Genlist Clear and Item Append", num); else if (num_category == 7) snprintf(buf, sizeof(buf), "Item #%.02i - 3. Genlist Del", num); else if (num_category == 9) snprintf(buf, sizeof(buf), "Item #%.02i - 4. Genlist Clear on double-click", num); else snprintf(buf, sizeof(buf), "Item #%.02i - Normal item", num); return strdup(buf); } static void _gl_del_sel(void *data, Evas_Object *obj, void *event_info) { int num = (int)(uintptr_t)data; int num_category = num % 10; Elm_Object_Item *it = event_info; Elm_Genlist_Item_Class *itc = (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(it); if (num_category == 3) elm_object_item_del(it); else if (num_category == 5) { elm_genlist_clear(obj); _gl_del_item_append(obj, itc); } else if (num_category == 7) { evas_object_del(obj); } } static void _gl_del_del_cb(void *data, Evas_Object *obj EINA_UNUSED) { printf("deleted item # %d\n", (int)(uintptr_t)data); } void test_genlist_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *fr, *lb, *gl; Elm_Genlist_Item_Class *itc = NULL; win = elm_win_util_standard_add("genlist-del", "Genlist Del"); elm_win_autodel_set(win, EINA_TRUE); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); elm_box_align_set(bx, 0.5, 0.0); evas_object_show(bx); fr = elm_frame_add(bx); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_text_set(fr, "Information"); elm_box_pack_end(bx, fr); evas_object_show(fr); lb = elm_label_add(fr); elm_object_text_set(lb, "This example tests the following cases" " on item selection.
" " 1. genlist item deletion
" " 2. genlist clear and item append
" " 3. genlist del
" " 4. genlist clear on double-click"); elm_object_content_set(fr, lb); evas_object_show(lb); itc = elm_genlist_item_class_new(); itc->item_style = "default"; itc->func.text_get = _gl_del_text_get; itc->func.content_get = gl_content_get; itc->func.state_get = NULL; itc->func.del = _gl_del_del_cb; evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _gl_del_win_del_cb, itc); gl = _gl_del_genlist_add(bx); _gl_del_item_append(gl, itc); evas_object_resize(win, 320, 500); evas_object_show(win); } /*** Genlist Focus *********************************************************/ static unsigned _gl_focus_objects = 3; static const char *_gl_focus_object_names[] = {"None", "Square", "Button", "Check", "Box"}; // for the top genlist items static char * gl_focus_top_items_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { if (!data) return NULL; if (!strcmp(data, "do_nothing")) return strdup("Genlist Item"); else if (!strcmp(data, "popup_sel")) return strdup("Create a popup on Select (popup parent is gl)"); else if (!strcmp(data, "popup_mouse_down")) return strdup("Create a popup on Mouse Down (popup parent is gl)"); else if (!strcmp(data, "popup_activate")) return strdup("Create a popup on Activate (popup parent is win)"); else if (!strcmp(data, "clear_on_focus")) return strdup("Genlist Clear on Focus"); else return NULL; } static char * gl_focus_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[256]; unsigned char op = (uintptr_t)data % 100; unsigned char v1, v2; v1 = op / 10; if (v1 > 4) v1 = 4; v2 = op % 10; if (v2 > 4) v2 = 4; snprintf(buf, sizeof(buf), " %s / %s ", _gl_focus_object_names[v1], _gl_focus_object_names[v2]); return strdup(buf); } static Evas_Object * gl_focus_content_get(void *data, Evas_Object *obj, const char *part) { Evas_Object *cnt = NULL; char op = (uintptr_t)data % 100; char type = (!strcmp(part,"elm.swallow.icon")) ? op / 10 : op % 10; switch(type) { case 1: cnt = elm_bg_add(obj); evas_object_color_set(cnt, 128, 18, 128, 255); break; case 2: cnt = elm_button_add(obj); break; case 3: cnt = elm_check_add(obj); break; case 4: cnt = elm_box_add(obj); evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_horizontal_set(cnt, EINA_TRUE); elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, "")); elm_box_pack_end(cnt, gl_focus_content_get((void *)3, obj, "")); elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, "")); break; default: break; } if (cnt) { evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(cnt); } return cnt; } static void _gl_focus_sel_popup_close_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { evas_object_del(data); } static void _gl_focus_sel_popup_create(Evas_Object *parent) { Evas_Object *popup = NULL, *btn = NULL; popup = elm_popup_add(parent); elm_object_text_set(popup, "Popup for the genlist focus test with popup creation."); // popup buttons btn = elm_button_add(popup); elm_object_text_set(btn, "Close"); elm_object_part_content_set(popup, "button1", btn); evas_object_smart_callback_add(btn, "clicked", _gl_focus_sel_popup_close_btn_cb, popup); // popup show should be called after adding all the contents and the buttons // of popup to set the focus into popup's contents correctly. evas_object_show(popup); elm_object_focus_set(btn, EINA_TRUE); } static void _gl_focus_0_item_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { _gl_focus_sel_popup_create(obj); } static void _gl_focus_item_loop_enable_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Evas_Object *gl = data; elm_object_scroll_item_loop_enabled_set(gl, elm_check_state_get(obj)); } static void _gl_focus_focus_on_selection_set(Evas_Object *gl, Evas_Object *chk, Eina_Bool focus) { elm_genlist_focus_on_selection_set(gl, focus); elm_check_state_set(chk, focus); printf("genlist_focus_on_selection = %s\n", (focus) ? "true" : "false"); } static void _gl_focus_focus_on_selection_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Eina_Bool nextstate = !elm_genlist_focus_on_selection_get(data); _gl_focus_focus_on_selection_set(data, obj, nextstate); } static void _gl_focus_win_auto_focus_enable_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_config_window_auto_focus_enable_set(elm_check_state_get(obj)); } static void _gl_focus_win_auto_focus_animate_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_config_window_auto_focus_animate_set(elm_check_state_get(obj)); } static void _gl_focus_focus_highlight_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_win_focus_highlight_enabled_set(data, elm_check_state_get(obj)); } static void _gl_focus_focus_animate_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_win_focus_highlight_animate_set(data, elm_check_state_get(obj)); } static void _gl_focus_move_policy_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { int val = elm_radio_value_get(obj); if (val == 0) elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); else if (val == 1) elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN); } static void _gl_focus_item_focus_cb(void *data, Evas_Object *obj, void *event_info) { printf("item,focused: %p\n", event_info); if (event_info == data) elm_genlist_clear(obj); } static void _gl_focus_item_unfocus_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("item,unfocused %p\n", event_info); } static void _gl_focus_item_cb(void *data, Evas_Object *obj, void *event_info) { Elm_Object_Item *it = event_info; printf("%s: %p\n", (char *)data, it); if (!strcmp((char *)data, "activated") && !strcmp((char *)elm_object_item_data_get(it), "popup_activate")) { _gl_focus_sel_popup_create(elm_object_top_widget_get(obj)); } } static void _gl_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Evas_Event_Key_Down *ev = event_info; printf("\n=== Key Down : %s ===\n", ev->keyname); } static void _gl_focus_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Down *ev = event_info; Elm_Object_Item *it = NULL; int postret = 0; it = elm_genlist_at_xy_item_get(obj, ev->canvas.x, ev->canvas.y, &postret); if (!it) return; if (elm_genlist_item_index_get(it) == 4) _gl_focus_sel_popup_create(obj); } static Ecore_Timer *timer = NULL; 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) { ecore_timer_del(timer); timer = NULL; } static void _gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj)); } static void _gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); } static void _gl_wheel_disabled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_scroller_wheel_disabled_set(data, elm_check_state_get(obj)); } static Eina_Bool _focus_timer_cb(void *data) { elm_object_item_focus_set(data, EINA_TRUE); timer = NULL; return ECORE_CALLBACK_CANCEL; } static Eina_Bool _select_timer_cb(void *data) { elm_genlist_item_selected_set(data, EINA_TRUE); timer = NULL; return ECORE_CALLBACK_CANCEL; } static void _focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { ecore_timer_del(timer); timer = ecore_timer_add(1.5, _focus_timer_cb, data); } static void _sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { ecore_timer_del(timer); timer = ecore_timer_add(1.5, _select_timer_cb, data); } static void _dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_object_item_disabled_set(data, EINA_TRUE); } static void _add_more_items_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Elm_Genlist_Item_Class *itc = NULL; int i = 0; itc = elm_genlist_item_class_new(); itc->item_style = "default"; itc->func.text_get = gl_text_get; itc->func.content_get = NULL; itc->func.state_get = NULL; itc->func.del = NULL; for (i = 0; i < 1000; i++) { elm_genlist_item_append(data, itc, (void *)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); } elm_genlist_item_class_free(itc); } static void _focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { printf("Button clicked: %s\n", (char *)data); } void _focus_autoscroll_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj)); } /* this function is used in another tests such as list, gengrid, and toolbar. */ Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent) { Evas_Object *fr, *bx, *rdg, *rd; fr = elm_frame_add(parent); elm_object_text_set(fr, "Focus Autoscroll Mode"); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); evas_object_show(fr); bx = elm_box_add(fr); elm_object_content_set(fr, bx); evas_object_show(bx); rdg = rd = elm_radio_add(bx); elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW); elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW"); elm_object_tooltip_text_set(rd, "Directly show the focused region
" "or item automatically inside a scroller."); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); elm_box_pack_end(bx, rd); evas_object_show(rd); evas_object_smart_callback_add(rd, "changed", _focus_autoscroll_changed_cb, NULL); rd = elm_radio_add(bx); elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE); elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE"); elm_object_tooltip_text_set(rd, "Do not show the focused region or
" "item automatically inside a scroller."); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); elm_box_pack_end(bx, rd); elm_radio_group_add(rd, rdg); evas_object_show(rd); evas_object_smart_callback_add(rd, "changed", _focus_autoscroll_changed_cb, NULL); rd = elm_radio_add(bx); elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN); elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN"); elm_object_tooltip_text_set(rd, "Bring in the focused region or item
" "automatically which might invole the scrolling."); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); elm_box_pack_end(bx, rd); elm_radio_group_add(rd, rdg); evas_object_show(rd); evas_object_smart_callback_add(rd, "changed", _focus_autoscroll_changed_cb, NULL); elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get()); return fr; } 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) { Evas_Object *fr = NULL, *bx_opt = NULL, *chk = NULL; Evas_Object *bx_mv = NULL, *rd = NULL, *rdg = NULL; Evas_Object *btn_box = NULL, *btn = NULL; fr = elm_frame_add(bx); elm_object_text_set(fr, "Options"); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, fr); evas_object_show(fr); bx_opt = elm_box_add(fr); elm_box_layout_set(bx_opt, evas_object_box_layout_flow_horizontal, NULL, NULL); evas_object_size_hint_weight_set(bx_opt, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bx_opt, EVAS_HINT_FILL, 0.0); elm_box_align_set(bx_opt, 0.0, 0.5); elm_object_content_set(fr, bx_opt); evas_object_show(bx_opt); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Window Auto Focus Enable"); elm_check_state_set(chk, EINA_TRUE); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_focus_win_auto_focus_enable_changed, NULL); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Window Auto Focus Animate"); elm_check_state_set(chk, EINA_TRUE); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_focus_win_auto_focus_animate_changed, NULL); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Focus Highlight"); elm_check_state_set(chk, EINA_FALSE); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_focus_focus_highlight_changed_cb, win); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Focus Animation"); elm_check_state_set(chk, EINA_FALSE); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_focus_focus_animate_changed_cb, win); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Focus on selection"); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_focus_focus_on_selection_changed_cb, gl); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Item Looping Enable"); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_focus_item_loop_enable_changed_cb, gl); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Item Select on Focus disable"); elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get()); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_focus_item_select_on_focus_disable_changed_cb, NULL); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "First item focus on first focus in"); elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get()); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_first_item_focus_on_first_focus_in_cb, NULL); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); chk = elm_check_add(bx_opt); elm_object_text_set(chk, "Wheel Disabled"); elm_check_state_set(chk, elm_scroller_wheel_disabled_get(gl)); evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(chk, "changed", _gl_wheel_disabled_cb, gl); elm_box_pack_end(bx_opt, chk); evas_object_show(chk); // Focus Autoscroll Mode fr = _focus_autoscroll_mode_frame_create(bx); elm_box_pack_end(bx, fr); // Focus Movement Policy fr = elm_frame_add(bx); elm_object_text_set(fr, "Focus Movement Policy"); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, fr); evas_object_show(fr); bx_mv = elm_box_add(fr); elm_box_horizontal_set(bx_mv, EINA_TRUE); elm_object_content_set(fr, bx_mv); evas_object_show(bx_mv); rdg = rd = elm_radio_add(bx_mv); elm_object_text_set(rd, "Focus Move by Click"); elm_radio_state_value_set(rd, 0); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(rd, "changed", _gl_focus_move_policy_changed_cb, NULL); elm_box_pack_end(bx_mv, rd); evas_object_show(rd); rd = elm_radio_add(bx_mv); elm_object_text_set(rd, "Focus Move by Mouse-In"); elm_radio_group_add(rd, rdg); elm_radio_state_value_set(rd, 1); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(rd, "changed", _gl_focus_move_policy_changed_cb, NULL); elm_box_pack_end(bx_mv, rd); evas_object_show(rd); // Options fr = elm_frame_add(bx); elm_object_text_set(fr, "Options"); evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, fr); evas_object_show(fr); btn_box = elm_box_add(fr); elm_object_content_set(fr, btn_box); evas_object_show(btn_box); btn = elm_button_add(btn_box); elm_object_text_set(btn, "Focus 2nd Item after 1.5 seconds."); evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(btn_box, btn); evas_object_show(btn); evas_object_smart_callback_add(btn, "clicked", _focus_btn_cb, it_2); btn = elm_button_add(btn_box); elm_object_text_set(btn, "Select 2nd Item after 1.5 seconds."); evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(btn_box, btn); evas_object_show(btn); evas_object_smart_callback_add(btn, "clicked", _sel_btn_cb, it_2); btn = elm_button_add(btn_box); elm_object_text_set(btn, "Disable 1st Item."); evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(btn_box, btn); evas_object_show(btn); evas_object_smart_callback_add(btn, "clicked", _dis_btn_cb, it_0); btn = elm_button_add(btn_box); elm_object_text_set(btn, "Add more Genlist items"); evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(btn_box, btn); evas_object_show(btn); evas_object_smart_callback_add(btn, "clicked", _add_more_items_btn_cb, gl); } void test_genlist_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *bx2, *gl, *btn; unsigned lhand, rhand; Elm_Object_Item *it = NULL, *it_1 = NULL, *it_2 = NULL; Elm_Genlist_Item_Class *itc = NULL, *itc1 = NULL, *itc2 = NULL; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-focus", "Genlist Focus"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _gl_focus_win_del_cb, NULL); elm_config_window_auto_focus_enable_set(EINA_TRUE); elm_config_window_auto_focus_animate_set(EINA_TRUE); elm_win_focus_highlight_enabled_set(win, EINA_FALSE); elm_win_focus_highlight_animate_set(win, EINA_FALSE); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); btn = elm_button_add(bx); elm_object_text_set(btn, "Up"); elm_box_pack_end(bx, btn); evas_object_smart_callback_add(btn, "clicked", _focus_button_clicked_cb, "Up"); evas_object_show(btn); bx2 = elm_box_add(bx); elm_box_horizontal_set(bx2, EINA_TRUE); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, bx2); evas_object_show(bx2); btn = elm_button_add(bx2); elm_object_text_set(btn, "Left"); elm_box_pack_end(bx2, btn); evas_object_smart_callback_add(btn, "clicked", _focus_button_clicked_cb, "Left"); evas_object_show(btn); gl = elm_genlist_add(bx); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); elm_box_pack_end(bx2, gl); api->gl = gl; evas_object_show(gl); evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected"); evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected"); evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated"); evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted"); evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted"); evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL); evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _gl_focus_mouse_down_cb, NULL); btn = elm_button_add(bx2); elm_object_text_set(btn, "Right"); elm_box_pack_end(bx2, btn); evas_object_smart_callback_add(btn, "clicked", _focus_button_clicked_cb, "Right"); evas_object_show(btn); btn = elm_button_add(bx); elm_object_text_set(btn, "Down"); elm_box_pack_end(bx, btn); evas_object_smart_callback_add(btn, "clicked", _focus_button_clicked_cb, "Down"); evas_object_show(btn); itc = elm_genlist_item_class_new(); itc->item_style = "default"; itc->func.text_get = gl_focus_top_items_text_get; itc->func.content_get = NULL; itc->func.state_get = NULL; itc->func.del = NULL; itc1 = elm_genlist_item_class_new(); itc1->item_style = "default"; itc1->func.text_get = gl_focus_text_get; itc1->func.content_get = gl_focus_content_get; itc1->func.state_get = NULL; itc1->func.del = NULL; itc2 = elm_genlist_item_class_new(); itc2->item_style = "tree_effect"; itc2->func.text_get = gl_focus_text_get; itc2->func.content_get = gl_focus_content_get; itc2->func.state_get = NULL; itc2->func.del = NULL; it_1 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); it_2 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); elm_genlist_item_append(gl, itc, "popup_sel", NULL, ELM_GENLIST_ITEM_NONE, _gl_focus_0_item_sel_cb, NULL); elm_genlist_item_append(gl, itc, "popup_mouse_down", NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); elm_genlist_item_append(gl, itc, "popup_activate", NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); it = elm_genlist_item_append(gl, itc, "clear_on_focus", NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); evas_object_smart_callback_add(gl, "item,focused", _gl_focus_item_focus_cb, it); evas_object_smart_callback_add(gl, "item,unfocused", _gl_focus_item_unfocus_cb, NULL); for (lhand = 0; lhand < _gl_focus_objects; lhand++) { for (rhand = 0; rhand < _gl_focus_objects; rhand++) { unsigned digit1 = lhand * 10 + rhand; elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit1, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); unsigned digit2 = (_gl_focus_objects - lhand -1) * 10 + (_gl_focus_objects - rhand -1); it = elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit2, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); if (rhand == 4) elm_object_item_disabled_set(it, EINA_TRUE); if (rhand == (_gl_focus_objects - 1)) elm_genlist_item_append(gl, itc2, (void*)(uintptr_t)digit1, NULL, ELM_GENLIST_ITEM_TREE, NULL, NULL); } } elm_genlist_item_class_free(itc); elm_genlist_item_class_free(itc1); elm_genlist_item_class_free(itc2); // Options _test_genlist_focus_option_panel_create(win, bx, gl, it_1, it_2); evas_object_resize(win, 420, 600); evas_object_show(win); } char *genlist_demo_names[] = { "Aaliyah", "Aamir", "Aaralyn", "Aaron", "Abagail", "Babitha", "Bahuratna", "Bandana", "Bulbul", "Cade", "Caldwell", "Chandan", "Caster", "Dagan ", "Daulat", "Dag", "Earl", "Ebenzer", "Ellison", "Elizabeth", "Filbert", "Fitzpatrick", "Florian", "Fulton", "Frazer", "Gabriel", "Gage", "Galen", "Garland", "Gauhar", "Hadden", "Hafiz", "Hakon", "Haleem", "Hank", "Hanuman", "Jabali ", "Jaimini", "Jayadev", "Jake", "Jayatsena", "Jonathan", "Kamaal", "Jeirk", "Jasper", "Jack", "Mac", "Macy", "Marlon", "Milson", NULL }; static char * glf_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { char buf[256]; snprintf(buf, sizeof(buf), "%s", genlist_demo_names[((int)(uintptr_t)data)%50]); return strdup(buf); } Eina_Bool gl_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key) { if (!strlen((char *)key)) return EINA_TRUE; if (strcasestr(genlist_demo_names[((int)(uintptr_t)data)%50], (char *)key)) return EINA_TRUE; // Default case should return false (item fails filter hence will be hidden) return EINA_FALSE; } static void _gl_filter_finished_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { printf("Filter finished, filtered items count is %d\n", elm_genlist_filtered_items_count((Evas_Object *)data)); } void _entry_change_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED) { api_data *api = (api_data *)data; char buf[100]; unsigned int count = 0; Elm_Object_Item *item; if (api->filter_data) free(api->filter_data); sprintf(buf, "%s", elm_object_text_get(obj)); api->filter_data = strdup(buf); elm_genlist_filter_set(api->gl, (void *)(api->filter_data)); if (!strlen(buf)) { printf("Input data string empty; returning\n"); return; } item = elm_genlist_first_item_get(api->gl); if (!item) { printf("No matches for the key %s\n", buf); return; } while (item) { ++count; item = elm_genlist_item_next_get(item); } printf("Number of matches for %s is %d\n", buf, count); } void test_genlist_filter(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *bx2, *entry, *gl; Elm_Genlist_Item_Class *itc = NULL; int i; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist-filter", "Genlist filter"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _gl_focus_win_del_cb, NULL); elm_win_focus_highlight_enabled_set(win, EINA_TRUE); elm_win_focus_highlight_animate_set(win, EINA_TRUE); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); entry = elm_entry_add(bx); elm_entry_single_line_set(entry, EINA_TRUE); evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.0); elm_object_part_text_set(entry, "guide", "Search."); elm_box_pack_end(bx, entry); evas_object_show(entry); bx2 = elm_box_add(bx); evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, bx2); evas_object_show(bx2); gl = elm_genlist_add(bx); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); elm_genlist_homogeneous_set(gl, EINA_TRUE); elm_box_pack_end(bx2, gl); api->gl = gl; evas_object_show(gl); evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected"); evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected"); evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated"); evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted"); evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted"); evas_object_smart_callback_add(gl, "filter,done", _gl_filter_finished_cb, gl); evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL); itc = elm_genlist_item_class_new(); itc->item_style = "default"; itc->func.text_get = glf_text_get; itc->func.content_get = NULL; itc->func.filter_get = gl_filter_get; itc->func.state_get = NULL; itc->func.del = NULL; for (i = 0; i < 500; i++) elm_genlist_item_append(gl, itc, (void *)(long)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); evas_object_resize(win, 420, 600); evas_object_show(win); elm_object_focus_set(entry, EINA_TRUE); evas_object_smart_callback_add(entry, "changed,user", _entry_change_cb, api); } static void _rd_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { api_data *ad = data; ad->scrollto = elm_radio_state_value_get(obj); } static Evas_Object * _scrollto_mode_frame_new(Evas_Object *win, void *data) { Evas_Object *fr, *bx, *rd, *rdg; api_data *sd = data; fr = elm_frame_add(win); elm_object_text_set(fr, "Scrollto Mode"); evas_object_show(fr); bx = elm_box_add(win); elm_object_content_set(fr, bx); evas_object_show(bx); rd = elm_radio_add(win); elm_radio_state_value_set(rd, 0); elm_object_text_set(rd, "SCROLLTO_NONE"); evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); evas_object_show(rd); elm_box_pack_end(bx, rd); rdg = rd; rd = elm_radio_add(win); elm_radio_state_value_set(rd, 1); elm_object_text_set(rd, "SCROLLTO_IN"); elm_radio_group_add(rd, rdg); evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); evas_object_show(rd); elm_box_pack_end(bx, rd); rd = elm_radio_add(win); elm_radio_state_value_set(rd, 2); elm_object_text_set(rd, "SCROLLTO_TOP"); elm_radio_group_add(rd, rdg); evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); evas_object_show(rd); elm_box_pack_end(bx, rd); rd = elm_radio_add(win); elm_radio_state_value_set(rd, 4); elm_object_text_set(rd, "SCROLLTO_MIDDLE"); elm_radio_group_add(rd, rdg); evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); evas_object_show(rd); elm_box_pack_end(bx, rd); rd = elm_radio_add(win); elm_radio_state_value_set(rd, 8); elm_object_text_set(rd, "SCROLLTO_BOTTOM"); elm_radio_group_add(rd, rdg); evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); evas_object_show(rd); elm_box_pack_end(bx, rd); return fr; } void _scrollto_item_show(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl); elm_genlist_item_show(it, api->scrollto); } void _scrollto_item_bring(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { api_data *api = data; Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl); elm_genlist_item_bring_in(it, api->scrollto); } void test_genlist_show_bring(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *gl, *bt_show, *bt_bring, *bx, *bxx, *fr; Elm_Object_Item *gli; int i, max; api_data *api = calloc(1, sizeof(api_data)); win = elm_win_util_standard_add("genlist", "Genlist Item Show/Bring"); elm_win_autodel_set(win, EINA_TRUE); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api); bxx = elm_box_add(win); evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bxx); evas_object_show(bxx); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(bx); elm_box_pack_end(bxx, bx); gl = elm_genlist_add(win); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, gl); evas_object_show(gl); api->gl = gl; api->itc1 = elm_genlist_item_class_new(); api->itc1->item_style = "default"; api->itc1->func.text_get = gl_text_get1; api->itc1->func.content_get = gl_content_get; api->itc1->func.state_get = NULL; api->itc1->func.del = NULL; bt_show = elm_button_add(win); elm_object_text_set(bt_show, "Show"); evas_object_smart_callback_add(bt_show, "clicked", _scrollto_item_show, api); evas_object_show(bt_show); elm_box_pack_end(bx, bt_show); bt_bring = elm_button_add(win); elm_object_text_set(bt_bring, "Bring"); evas_object_smart_callback_add(bt_bring, "clicked", _scrollto_item_bring, api); evas_object_show(bt_bring); elm_box_pack_end(bx, bt_bring); fr = _scrollto_mode_frame_new(win, api); elm_box_pack_end(bx, fr); max = 2000; for (i = 0; i < max; i++) elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); elm_genlist_item_class_free(api->itc1); gli = elm_genlist_nth_item_get(gl, 1340); elm_genlist_item_selected_set(gli, EINA_TRUE); elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); evas_object_resize(win, 480, 400); explode_win_enable(win); evas_object_show(win); }