From d9f14f194bc8697074a1fcd3f4912f8c9cc8b53e Mon Sep 17 00:00:00 2001 From: Jyotiprakash Sahoo Date: Wed, 23 Jul 2014 11:35:20 +0900 Subject: [PATCH] gengrid: Add function to search item by string. Summary: This function allows user to search for item in Gengrid. Test Plan: elementary_test -to "Gengrid Item Search By Text" Reviewers: seoz, singh.amitesh, Hermet, raster Differential Revision: https://phab.enlightenment.org/D1178 --- legacy/elementary/src/bin/test.c | 4 +- legacy/elementary/src/bin/test_gengrid.c | 198 +++++++++++++++++++++++ legacy/elementary/src/lib/elm_gengrid.c | 25 +++ legacy/elementary/src/lib/elm_gengrid.eo | 10 ++ 4 files changed, 236 insertions(+), 1 deletion(-) diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index ae3976c190..11045a19f4 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -130,8 +130,9 @@ void test_table7(void *data, Evas_Object *obj, void *event_info); void test_gengrid(void *data, Evas_Object *obj, void *event_info); void test_gengrid2(void *data, Evas_Object *obj, void *event_info); void test_gengrid3(void *data, Evas_Object *obj, void *event_info); -void test_gengrid_item_styles(void *data, Evas_Object *obj, void *event_info); void test_gengrid4(void *data, Evas_Object *obj, void *event_info); +void test_gengrid5(void *data, Evas_Object *obj, void *event_info); +void test_gengrid_item_styles(void *data, Evas_Object *obj, void *event_info); void test_gengrid_speed(void *data, Evas_Object *obj, void *event_info); void test_gengrid_focus(void *data, Evas_Object *obj, void *event_info); void test_win_state(void *data, Evas_Object *obj, void *event_info); @@ -666,6 +667,7 @@ add_tests: ADD_TEST(NULL, "Lists - Gengrid", "GenGrid 2", test_gengrid2); ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Group", test_gengrid3); ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Show/Bring_in", test_gengrid4); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Item Search by Text", test_gengrid5); ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Item Styles", test_gengrid_item_styles); ADD_TEST(NULL, "Lists - Gengrid", "Gengrid Update Speed", test_gengrid_speed); ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Focus", test_gengrid_focus); diff --git a/legacy/elementary/src/bin/test_gengrid.c b/legacy/elementary/src/bin/test_gengrid.c index 71b3ba65be..a2ca6a08bd 100644 --- a/legacy/elementary/src/bin/test_gengrid.c +++ b/legacy/elementary/src/bin/test_gengrid.c @@ -1344,6 +1344,204 @@ test_gengrid4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_ evas_object_show(win); } +typedef struct _grid5_Event_Data grid5_Event_Data; +struct _grid5_Event_Data +{ + Evas_Object *grid_obj; + Evas_Object *en_obj; + Elm_Object_Item *last_item_found; +}; + +static const char *_grid5_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 char * +_grid5_search_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[32]; + Item_Data *id = data; + + snprintf(buf, sizeof(buf), "%s", _grid5_items_text[id->mode]); + return strdup(buf); +} + +static char * +_grid5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[64]; + snprintf(buf, sizeof(buf), "%s", _grid5_search_text_get(data, NULL, NULL)); + return strdup(buf); +} + +static void +_grid5_search_item(grid5_Event_Data *event_data, Elm_Object_Item * it) +{ + const char *str = elm_entry_entry_get(event_data->en_obj); + if (!str || !strlen(str)) return; + + printf("Looking for \"%s\". ", str); + event_data->last_item_found = elm_gengrid_search_by_text_item_get(event_data->grid_obj, it, _grid5_search_text_get, NULL, str, 0); + + if (event_data->last_item_found) + { + printf("Found.\n"); + elm_gengrid_item_selected_set(event_data->last_item_found, EINA_TRUE); + elm_gengrid_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 +_grid5_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *einfo EINA_UNUSED) +{ + _grid5_search_item(data, NULL); +} + +static void +_grid5_on_keydown(void *data, Evas *evas EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + grid5_Event_Data * event_data = (grid5_Event_Data *)data; + + if (!strcmp(ev->key, "Return")) + { + printf("Looking for next item\n"); + _grid5_search_item(data, event_data->last_item_found); + } +} + +static Elm_Gengrid_Item_Class * +_grid5_item_class_create(const char *item_style) +{ + Elm_Gengrid_Item_Class * itc = elm_gengrid_item_class_new(); + itc->item_style = item_style; + itc->func.text_get = _grid5_text_get; + itc->func.content_get = grid_content_get; + itc->func.state_get = grid_state_get; + itc->func.del = NULL; + return itc; +} + +void +test_gengrid5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *grid; + Evas_Object *fr, *lb_frame; + Evas_Object *en, *bx_entry, *lb_entry; + grid5_Event_Data *event_data; + Elm_Gengrid_Item_Class *itc = NULL; + static Item_Data id[50]; + char buf[PATH_MAX]; + int i, n; + + win = elm_win_util_standard_add("gengrid-item-search-by-text", "Gengrid 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, 0.0); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + lb_frame = elm_label_add(fr); + elm_object_text_set(lb_frame, + "This is an example of elm_gengrid_search_by_text_item_get() usage.
" + "Enter search string to the entry and press Enter to show next search result.
"); + elm_object_content_set(fr, lb_frame); + evas_object_show(lb_frame); + + 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); + + grid = elm_gengrid_add(bx); + elm_gengrid_item_size_set(grid, elm_config_scale_get() * 200, elm_config_scale_get() * 150); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_box_pack_end(bx, grid); + evas_object_show(grid); + + event_data = calloc(1, sizeof(grid5_Event_Data)); + event_data->en_obj = en; + event_data->grid_obj = grid; + event_data->last_item_found = NULL; + + evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN, _grid5_on_keydown, (void*)event_data); + evas_object_smart_callback_add(en, "changed,user", _grid5_search_settings_changed_cb, (void*)event_data); + evas_object_event_callback_add(grid, EVAS_CALLBACK_FREE, _cleanup_cb, (void*)event_data); + + itc = _grid5_item_class_create("default"); + + for (i = 0, n = 0; i < 50; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id[i].mode = i; + id[i].path = eina_stringshare_add(buf); + id[i].item = elm_gengrid_item_append(grid, itc, &(id[i]), grid_sel, NULL); + if (!(i % 5)) + elm_gengrid_item_selected_set(id[i].item, EINA_TRUE); + } + elm_gengrid_item_class_free(itc); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + void test_gengrid_speed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { diff --git a/legacy/elementary/src/lib/elm_gengrid.c b/legacy/elementary/src/lib/elm_gengrid.c index 607d400fde..9d06c64e60 100644 --- a/legacy/elementary/src/lib/elm_gengrid.c +++ b/legacy/elementary/src/lib/elm_gengrid.c @@ -102,6 +102,31 @@ static const Elm_Action key_actions[] = { {NULL, NULL} }; +EOLIAN static Elm_Object_Item * +_elm_gengrid_search_by_text_item_get(Eo *obj EINA_UNUSED, + Elm_Gengrid_Data *sd, + Elm_Object_Item * item_to_search_from, + Elm_Gen_Item_Text_Get_Cb _text_get, + const char * part_name, + const char * pattern, + int flags) +{ + Elm_Gen_Item *it = NULL; + const char * str = NULL; + Eina_Inlist * start = NULL; + + if (!_text_get || !pattern) return NULL; + if (!sd->items) return NULL; + + start = (item_to_search_from) ? EINA_INLIST_GET((Elm_Gen_Item *)item_to_search_from) : sd->items; + EINA_INLIST_FOREACH(start, it) + { + str = _text_get((void *)it->base.data, VIEW(it), part_name); + if (!fnmatch(pattern, str, flags)) return (Elm_Object_Item *)it; + } + return NULL; +} + static void _item_show_region(void *data) { diff --git a/legacy/elementary/src/lib/elm_gengrid.eo b/legacy/elementary/src/lib/elm_gengrid.eo index a7c5f70376..6b125f97a5 100644 --- a/legacy/elementary/src/lib/elm_gengrid.eo +++ b/legacy/elementary/src/lib/elm_gengrid.eo @@ -655,6 +655,16 @@ class Elm_Gengrid (Elm_Layout, Elm_Interface_Scrollable, Evas.Clickable_Interfac @in Evas_Smart_Cb func; /*@ Convenience function called when the item is selected. */ @in const(void)* func_data; /*@ Data to be passed to @p func. */ } + } + search_by_text_item_get { + return Elm_Object_Item *; + params { + @in Elm_Object_Item * item_to_search_from; /*@ Pointer to item to start search from. If NULL search will be started from the first item of the genlist. */ + @in Elm_Gen_Item_Text_Get_Cb _text_get; /*@ Pointer to Elm_Gen_Item_Text_Get_Cb function to get text for comparison. */ + @in const(char)* part_name; /*@ Name of the TEXT part of genlist item to search string in. */ + @in const(char)* pattern; /*@ The search pattern. */ + @in int flags; /*@ fnmatch search flags */ + } } } implements {