diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c index c8342f3097..426be4740f 100644 --- a/src/bin/elementary/test.c +++ b/src/bin/elementary/test.c @@ -133,6 +133,7 @@ void test_genlist_del(void *data, Evas_Object *obj, void *event_info); void test_genlist_filter(void *data, Evas_Object *obj, void *event_info); void test_genlist_show_bring(void *data, Evas_Object *obj, void *event_info); void test_genlist_cache(void *data, Evas_Object *obj, void *event_info); +void test_genlist_reusable(void *data, Evas_Object *obj, void *event_info); void test_gesture_layer(void *data, Evas_Object *obj, void *event_info); void test_gesture_layer2(void *data, Evas_Object *obj, void *event_info); void test_gesture_layer3(void *data, Evas_Object *obj, void *event_info); @@ -787,6 +788,7 @@ add_tests: ADD_TEST(NULL, "Lists - Genlist", "Genlist Filter", test_genlist_filter); ADD_TEST(NULL, "Lists - Genlist", "Genlist Show/Bring", test_genlist_show_bring); ADD_TEST(NULL, "Lists - Genlist", "Genlist Cache", test_genlist_cache); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Reusable Contents", test_genlist_reusable); //------------------------------// diff --git a/src/bin/elementary/test_genlist.c b/src/bin/elementary/test_genlist.c index 3be11a1f27..fece0ee580 100644 --- a/src/bin/elementary/test_genlist.c +++ b/src/bin/elementary/test_genlist.c @@ -5392,3 +5392,130 @@ test_genlist_cache(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, explode_win_enable(win); evas_object_show(win); } + + +/*** Genlist Reusable Contents *********************************************/ +static char * +gl_re2_text_get(void *data, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + int num = (int)(uintptr_t)data; + char buf[256]; + + snprintf(buf, sizeof(buf), "Item # %d", num); + return strdup(buf); +} + +static Evas_Object * +gl_re2_content_get(void *data, Evas_Object *obj, const char *part) +{ + int num = (int)(uintptr_t)data; + Evas_Object *cont = NULL; + char buf[256]; + + if (!strcmp(part, "elm.swallow.icon")) + { + cont = elm_icon_add(obj); + elm_icon_standard_set(cont, "user-home"); + } + else if (!strcmp(part, "elm.swallow.end")) + { + printf("Creating NEW content for item # %d\n", num); + cont = elm_label_add(obj); + snprintf(buf, sizeof(buf), "Content for item # %d", num); + elm_object_text_set(cont, buf); + } + + return cont; +} + +static Evas_Object * +gl_re2_reusable_content_get(void *data, Evas_Object *obj, + const char *part, Evas_Object *old) +{ + Eina_Bool enabled = (Eina_Bool)(uintptr_t)evas_object_data_get(obj, "reusable_enabled"); + int num = (int)(uintptr_t)data; + + if (enabled && old && !strcmp(part, "elm.swallow.end")) + { + printf("REUSING content for item # %d\n", num); + return old; + } + + return NULL; +} + +static void +gl_re2_check_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool enabled = elm_check_state_get(obj); + Evas_Object *gl = data; + + evas_object_data_set(gl, "reusable_enabled", (void*)(uintptr_t)enabled); + elm_genlist_realized_items_update(gl); +} + +void +test_genlist_reusable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *fr, *lb, *gl, *ck; + Elm_Genlist_Item_Class *itc; + int i; + + // window + win = elm_win_util_standard_add("genlist-reusable", "Genlist Reusable Contents"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_expand_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_expand_set(fr, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(fr, EVAS_HINT_FILL, 0); + 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, "Numbers on the left should always match the one on the right"); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + // genlist + gl = elm_genlist_add(bx); + elm_genlist_homogeneous_set(gl, EINA_TRUE); + evas_object_size_hint_expand_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + evas_object_data_set(gl, "reusable_enabled", (void*)EINA_TRUE); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = gl_re2_text_get; + itc->func.content_get = gl_re2_content_get; + itc->func.reusable_content_get = gl_re2_reusable_content_get; + + for (i = 1; i <= 2000; i++) + elm_genlist_item_append(gl, itc, (void*)(uintptr_t)i, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + + elm_genlist_item_class_free(itc); + + // buttons + ck = elm_check_add(bx); + elm_object_text_set(ck, "Enable reusable contents"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", gl_re2_check_changed_cb, gl); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + // show everything + evas_object_resize(win, 400, 400); + explode_win_enable(win); + evas_object_show(win); +}