rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=53ffca1688a52d7a723c9c5658bd6a50f1b49d2b
commit 53ffca1688a52d7a723c9c5658bd6a50f1b49d2b Author: Vitalii Vorobiov <vi.vorob...@samsung.com> Date: Mon Dec 7 16:14:52 2015 +0200 popup: make search work in popup_image_helper --- src/bin/ui/popup.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/src/bin/ui/popup.c b/src/bin/ui/popup.c index 66b981e..075787c 100644 --- a/src/bin/ui/popup.c +++ b/src/bin/ui/popup.c @@ -35,6 +35,20 @@ static const Popup_Button _btn_cancel = BTN_CANCEL; static Popup_Validator_Func validator = NULL; static void *user_data = NULL; +struct _Search_Data +{ + Evas_Object *search_entry; + Elm_Object_Item *last_item_found; +}; +typedef struct _Search_Data Search_Data; +struct _Helper_Data +{ + Evas_Object *gengrid; + Evas_Object *follow_up; + Search_Data image_search_data; +}; +typedef struct _Helper_Data Helper_Data; + /* this one is for gengrid items */ struct _Item { @@ -200,6 +214,9 @@ _helper_dismiss(void *data __UNUSED__, evas_object_event_callback_del_full(ap.win, EVAS_CALLBACK_RESIZE, _helper_win_follow, NULL); evas_object_del(helper); + + Helper_Data *helper_data = evas_object_data_get(helper, "STRUCT"); + if (helper_data) free(helper_data); } static void @@ -393,15 +410,17 @@ _done_image(void *data, Eina_List *ret_list = NULL; Elm_Object_Item *item_list; + Helper_Data *helper_data = (Helper_Data *)data; + if (dismiss_func) { - sel_list = elm_gengrid_selected_items_get(gengrid); + sel_list = elm_gengrid_selected_items_get(helper_data->gengrid); EINA_LIST_FOREACH(sel_list, l, item_list) { item = elm_object_item_data_get(item_list); ret_list = eina_list_append(ret_list, eina_stringshare_add(item->image_name)); } - res = ((Helper_Done_Cb)dismiss_func)(func_data, obj, ret_list); + res = ((Helper_Done_Cb)dismiss_func)(func_data, helper_data->gengrid, ret_list); eina_list_free(ret_list); } @@ -409,7 +428,7 @@ _done_image(void *data, { dismiss_func = NULL; func_data = NULL; - _helper_dismiss(data, NULL, NULL, NULL); + _helper_dismiss(helper_data->follow_up, NULL, NULL, NULL); } } @@ -509,18 +528,57 @@ _grid_content_get(void *data, } #undef MAX_ICON_SIZE +ITEM_SEARCH_FUNC(gengrid, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE, NULL) + +static void +_on_images_search_entry_changed_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Helper_Data *helper_data = data; + + assert(helper_data != NULL); + + _gengrid_item_search(helper_data->gengrid, &(helper_data->image_search_data), + helper_data->image_search_data.last_item_found); +} + +static void +_search_next_gengrid_item_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Helper_Data *helper_data = data; + Elm_Object_Item *start_from = NULL; + + assert(helper_data != NULL); + + if (helper_data->image_search_data.last_item_found) + { + start_from = + elm_gengrid_item_next_get(helper_data->image_search_data.last_item_found); + } + + _gengrid_item_search(helper_data->gengrid, &(helper_data->image_search_data), + start_from); +} + void popup_gengrid_image_helper(const char *title, Evas_Object *follow_up, Helper_Done_Cb func, void *data, Eina_Bool multi) { Evas_Object *entry, *icon, *button; + Helper_Data *helper_data = (Helper_Data *)mem_calloc(1, sizeof(Helper_Data)); dismiss_func = func; func_data = data; + helper_data->follow_up = follow_up; + helper = elm_layout_add(ap.win); elm_layout_theme_set(helper, "layout", "popup", title ? "hint_title" : "hint"); + evas_object_data_set(helper, "STRUCT", helper_data); elm_layout_signal_callback_add(helper, "hint,dismiss", "eflete", _helper_dismiss, follow_up); fs = elm_layout_add(helper); @@ -530,13 +588,14 @@ popup_gengrid_image_helper(const char *title, Evas_Object *follow_up, evas_object_show(fs); gengrid = elm_gengrid_add(fs); + helper_data->gengrid = gengrid; if (multi) { elm_gengrid_multi_select_set(gengrid, true); BUTTON_ADD(fs, button, _("Ok")) elm_object_part_content_set(helper, "elm.swallow.ok", button); - evas_object_smart_callback_add(button, "clicked", _done_image, follow_up); + evas_object_smart_callback_add(button, "clicked", _done_image, helper_data); evas_object_show(button); } else @@ -544,7 +603,7 @@ popup_gengrid_image_helper(const char *title, Evas_Object *follow_up, elm_gengrid_multi_select_set(gengrid, false); elm_gengrid_multi_select_mode_set(gengrid, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL); - evas_object_smart_callback_add(gengrid, "clicked,double", _done_image, follow_up); + evas_object_smart_callback_add(gengrid, "clicked,double", _done_image, helper_data); } elm_gengrid_item_size_set(gengrid, ITEM_WIDTH, ITEM_HEIGHT); elm_gengrid_align_set(gengrid, 0.0, 0.0); @@ -568,6 +627,12 @@ popup_gengrid_image_helper(const char *title, Evas_Object *follow_up, ICON_STANDARD_ADD(entry, icon, true, "search"); elm_object_part_content_set(entry, "elm.swallow.end", icon); elm_object_part_content_set(fs, "eflete.swallow.search_line", entry); + evas_object_smart_callback_add(entry, "changed", + _on_images_search_entry_changed_cb, helper_data); + evas_object_smart_callback_add(entry, "activated", + _search_next_gengrid_item_cb, helper_data); + helper_data->image_search_data.search_entry = entry; + helper_data->image_search_data.last_item_found = NULL; /* small hack, hide not necessary button */ evas_object_hide(elm_layout_content_unset(fs, "elm.swallow.cancel")); --