diff options
Diffstat (limited to 'src/bin/elementary/test_genlist.c')
-rw-r--r-- | src/bin/elementary/test_genlist.c | 5300 |
1 files changed, 5300 insertions, 0 deletions
diff --git a/src/bin/elementary/test_genlist.c b/src/bin/elementary/test_genlist.c new file mode 100644 index 0000000000..4c69be277d --- /dev/null +++ b/src/bin/elementary/test_genlist.c @@ -0,0 +1,5300 @@ +#include <Elementary_Cursor.h> +#include "test.h" +#ifdef HAVE_CONFIG_H +#include "elementary_config.h" +#endif +#include <Elementary.h> + +#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.<br/>" + "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, + "<align=left>This is an example of " + "elm_genlist_search_by_text_item_get() usage.<br>" + "Enter search string to the entry and press Enter to " + "show next search result.<br>"); + 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, "<align=left>This example tests the following cases" + " on item selection.<br/>" + " 1. genlist item deletion<br/>" + " 2. genlist clear and item append<br/>" + " 3. genlist del<br/>" + " 4. genlist clear on double-click</align>"); + 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<br/>" + "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<br/>" + "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<br/>" + "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); +} + |