static void _index_refresh(void *data) { int i, num_index; page_data *pd = (page_data *)data; num_index = pd->max_page + 1; elm_index_item_clear(pd->index); if (pd->cur_page < pd->min_page) { for(i = pd->cur_page ; i < pd->cur_page + num_index ; i++) { printf("Added : %d\n", i); elm_index_item_append(pd->index, NULL, NULL, (void *) i); } pd->min_page = pd->cur_page; pd->min_page = pd->cur_page + num_index - 1; } else { for(i = pd->cur_page - num_index + 1; i < pd->cur_page + 1 ; i++) { printf("Added : %d\n", i); elm_index_item_append(pd->index, NULL, NULL, (void *) i); } pd->min_page = pd->cur_page - num_index; pd->min_page = pd->cur_page - 1; } elm_index_level_go(pd->index, 0); _index_sync(pd); }
static Eina_Bool _page_populate(void *data) { Page *page = data; const Page_Class *cls = page->cls; unsigned int count; page->od_to_list_item = eina_hash_pointer_new(NULL); for (count = 0; count < cls->populate_iteration_count; count++) { Elm_Genlist_Item *it; char letter; void *id, *od; const char **letter_str; if (!eina_iterator_next(page->iterator, &id)) goto end; // TODO: evaluate if we should keep a full copy or just store // fields of interest such as id, title, artist and album od = cls->data_from_itr(id); if (!od) goto end; it = elm_genlist_item_append (page->list, cls->item_cls, od, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); letter_str = (const char **)(((char *)od) + cls->data_letter_offset); letter = toupper((*letter_str)[0]); if ((page->index) && (isalpha(letter) && (page->last_index_letter[0] != letter))) { if ((page->first) && (!page->last_index_letter[0])) elm_index_item_append(page->index, "Special", page->first); page->last_index_letter[0] = letter; elm_index_item_append(page->index, page->last_index_letter, it); } if (!page->first) page->first = it; eina_hash_set(page->od_to_list_item, od, it); page->num_elements++; } return EINA_TRUE; end: if (cls->after_populate) cls->after_populate(page); page->populate = NULL; return EINA_FALSE; }
void contact_list_fill_index(struct ContactListData *list_data) { static const int index_button_height = 25; /*FIXME: get actual size*/ int limit = 1; Evas_Object *win; Elm_Object_Item *glit, *current_index_item = NULL; GHashTable *entry; char *idx, *current_index = NULL; char *name; int init_index_count, index_count; Eina_Bool new_index; int height; win = ui_utils_view_window_get(list_data->view); if (list_data->index) { evas_object_del(list_data->index); } list_data->index = elm_index_add(win); elm_win_resize_object_add(win, list_data->index); evas_object_size_hint_weight_set(list_data->index, 1.0, 0.0); evas_object_smart_callback_add(list_data->index, "delay,changed", gl_index_changed, NULL); evas_object_smart_callback_add(list_data->index, "selected", gl_index_selected, NULL); evas_object_geometry_get(list_data->index, NULL, NULL, NULL, &height); limit = height / index_button_height; init_index_count = list_data->count / (limit - 1); /* The number of indexes excluding the first */ index_count = 0; /* Add the first as well */ glit = elm_genlist_first_item_get(list_data->list); while (glit) { entry = (GHashTable *)elm_object_item_data_get(glit); name = phoneui_utils_contact_display_name_get(entry); idx = _new_get_index(name); if (idx) { if (!current_index || strcmp(idx, current_index)) { if (current_index) { free(current_index); } current_index = idx; current_index_item = glit; new_index = TRUE; } else { new_index = FALSE; free(idx); } if (index_count < 1 && new_index) { g_debug("Adding index %s", current_index); elm_index_item_append(list_data->index, current_index, NULL, current_index_item); index_count = init_index_count; } index_count--; } glit = elm_genlist_item_next_get(glit); } if (list_data->layout) { elm_object_part_content_set(list_data->layout, "contacts_index", list_data->index); } evas_object_show(list_data->index); }
static void _create_view_layout(Evas_Object *parent, char *layout_file, char *index_style, char it_style[][20], Eina_Bool even_num) { Evas_Object *layout, *scroller, *box, *left_right_rect, *img, *page_layout, *index; Elm_Object_Item *nf_it; char img_path[PATH_MAX]; int i, max_items; page_data *pd = (page_data *)calloc(1, sizeof(page_data)); /* Create Layout */ layout = elm_layout_add(parent); elm_layout_file_set(layout, ELM_DEMO_EDJ, layout_file); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(layout); evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, _layout_del_cb, pd); pd->main_layout = layout; /* Create Scroller */ scroller = elm_scroller_add(layout); elm_scroller_loop_set(scroller, EINA_FALSE, EINA_FALSE); evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); elm_scroller_page_scroll_limit_set(scroller, 1, 0); elm_object_scroll_lock_y_set(scroller, EINA_TRUE); elm_object_part_content_set(layout, "scroller", scroller); evas_object_show(scroller); evas_object_smart_callback_add(scroller, "scroll", _scroll, pd); pd->scroller = scroller; /* Create Box */ box = elm_box_add(scroller); elm_box_horizontal_set(box, EINA_TRUE); elm_object_content_set(scroller, box); evas_object_show(box); pd->box = box; /* Create Rect object for page_layout center align in Box */ left_right_rect = evas_object_rectangle_add(evas_object_evas_get(box)); elm_box_pack_end(box, left_right_rect); /* Create Pages */ if (even_num) max_items = NUM_INDEX_CIRCLE_EVEN; else max_items = NUM_ITEMS; for (i = 0; i < max_items; ++i) { page_layout = elm_layout_add(box); pd->page_layout[i] = page_layout; evas_object_size_hint_weight_set(page_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(page_layout, 0, EVAS_HINT_FILL); elm_layout_theme_set(page_layout, "layout", "body_thumbnail", "default"); evas_object_show(page_layout); img = elm_image_add(page_layout); snprintf(img_path, sizeof(img_path), "%s/100_%d.jpg", ICON_DIR, (i % 6) + 1); elm_image_file_set(img, img_path, NULL); elm_object_part_content_set(page_layout, "elm.icon", img); /* Make unselect state all of the pages except first one */ if (i) elm_object_signal_emit(page_layout, "elm,state,thumbnail,unselect", "elm"); elm_box_pack_end(box, page_layout); } /*Add resize callback for get a actual size of layout and main layout */ evas_object_event_callback_add(pd->page_layout[0], EVAS_CALLBACK_RESIZE, _layout_resize_cb, pd); elm_box_pack_end(box, left_right_rect); pd->left_right_rect = left_right_rect; /* Add animator for page transfer effect */ ecore_animator_add(animator_cb, pd); /* Create Index */ index = elm_index_add(layout); elm_object_style_set(index, index_style); evas_object_size_hint_weight_set(index, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(index, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_index_horizontal_set(index, EINA_TRUE); elm_index_autohide_disabled_set(index, EINA_TRUE); elm_object_part_content_set(layout, "controller", index); for (i = 0; i < max_items; ++i) { pd->it[i] = elm_index_item_append(index, NULL, NULL, (void *) i); if (it_style) elm_object_item_style_set(pd->it[i], it_style[i]); } pd->min_page = 0; pd->max_page = max_items - 1; elm_index_level_go(index, 0); elm_index_item_selected_set(pd->it[0], EINA_TRUE); pd->cur_page = 0; pd->index = index; pd->last_it = pd->it[0]; evas_object_event_callback_add(index, EVAS_CALLBACK_MOUSE_DOWN, _on_index_mouse_down_cb, pd); evas_object_event_callback_add(index, EVAS_CALLBACK_MOUSE_MOVE, _on_index_mouse_move_cb, pd); evas_object_event_callback_add(index, EVAS_CALLBACK_MOUSE_UP, _on_index_mouse_up_cb, pd); nf_it = elm_naviframe_item_push(parent, NULL, NULL, NULL, layout, NULL); elm_naviframe_item_title_enabled_set(nf_it, EINA_FALSE, EINA_FALSE); }