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
This commit is contained in:
parent
274a2c9928
commit
d9f14f194b
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
"<align=left>This is an example of elm_gengrid_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);
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue