void page_destroy(Evas_Object *scroller, Evas_Object *page) { Evas_Object *mapbuf; Evas_Object *bg; Evas_Object *item; Evas_Object *box; Evas_Object *index; Evas_Object *tab; Eina_List *pending_list; register unsigned int i; int page_max_app; unsigned int count; evas_object_event_callback_del(page, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints_cb); page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); for (i = 0; i < page_max_app; i ++) { item = page_unpack_item_at(page, i); if (!item) continue; item_destroy(item); } pending_list = evas_object_data_get(page, "pending,list"); eina_list_free(pending_list); bg = evas_object_data_get(page, "bg"); evas_object_del(bg); box = evas_object_data_get(scroller, "box"); ret_if(NULL == box); mapbuf = mapbuf_get_mapbuf(page); if (mapbuf) { elm_box_unpack(box, mapbuf); mapbuf_unbind(mapbuf); } else { elm_box_unpack(box, page); } index = evas_object_data_get(scroller, "index"); if (index) { tab = evas_object_data_get(scroller, "tab"); count = page_scroller_count_page(scroller); index_update(tab, index, count); } evas_object_data_del(page, "win"); evas_object_data_del(page, "layout"); evas_object_data_del(page, "controlbar"); evas_object_data_del(page, "tab"); evas_object_data_del(page, "scroller"); evas_object_data_del(page, "page_edje"); evas_object_data_del(page, "page_max_app"); evas_object_data_del(page, "bg"); evas_object_data_del(page, "pending,list"); evas_object_data_del(page, "dirty"); layout_unload_edj(page); }
static menu_screen_error_e _insert_page_at(Evas_Object *scroller, Evas_Object *page, int index) { unsigned int nr_of_pages; Evas_Object *mapbuf; Evas_Object *box; retv_if(NULL == page, MENU_SCREEN_ERROR_FAIL); if (index < 0) { _D("Out of range"); index = 0; } box = evas_object_data_get(scroller, "box"); retv_if(NULL == box, MENU_SCREEN_ERROR_FAIL); nr_of_pages = page_scroller_count_page(scroller); if (index >= nr_of_pages) { _D("Out of range. index : %d, total : %d", index, nr_of_pages); mapbuf = evas_object_data_get(page, "mapbuf"); if (mapbuf) { elm_box_pack_end(box, mapbuf); } else { elm_box_pack_end(box, page); } } else { Evas_Object *current; Evas_Object *current_mapbuf; const Eina_List *page_list; page_list = elm_box_children_get(box); retv_if(NULL == page_list, MENU_SCREEN_ERROR_FAIL); current = eina_list_nth(page_list, index); retv_if(NULL == current, MENU_SCREEN_ERROR_FAIL); current_mapbuf = mapbuf_get_mapbuf(current); mapbuf = mapbuf_get_mapbuf(page); if (current_mapbuf && mapbuf) { elm_box_pack_before(box, mapbuf, current_mapbuf); } else if (!current_mapbuf && !mapbuf) { elm_box_pack_before(box, page, current); } else { _D("Page has mapbuf, invalid"); } } page_mark_dirty(page); return MENU_SCREEN_ERROR_OK; }
static menu_screen_error_e _find_position_by_name(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) { Evas_Object *page; Evas_Object *item; register int page_no; register int position_no; unsigned int nr_of_pages; int page_max_app; app_info_t *ai = data; retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == data, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == ai->name, MENU_SCREEN_ERROR_INVALID_PARAMETER); *candidate_page = 0; *candidate_pos = 0; nr_of_pages = page_scroller_count_page(scroller); page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); for (page_no = 0; page_no < nr_of_pages; page_no ++) { page = page_scroller_get_page_at(scroller, page_no); if (!page) { _D("Page is not found at %d", page_no); return MENU_SCREEN_ERROR_FAIL; } for (position_no = 0; position_no < page_max_app; position_no ++) { char *name; item = page_get_item_at(page, position_no); if (!item) { *candidate_page = page_no; *candidate_pos = position_no; return MENU_SCREEN_ERROR_OK; } else if ((name = item_get_name(item)) && strcmp(name, ai->name) > 0) { *candidate_page = page_no; *candidate_pos = position_no; return MENU_SCREEN_ERROR_OK; } } } return MENU_SCREEN_ERROR_OK; }
static menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) { Evas_Object *page; Evas_Object *item; register unsigned int page_no; register unsigned int position_no; unsigned int nr_of_pages; int page_max_app; retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER); *candidate_page = 0; *candidate_pos = 0; nr_of_pages = page_scroller_count_page(scroller); page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); for (page_no = 0; page_no < nr_of_pages; page_no ++) { page = page_scroller_get_page_at(scroller, page_no); if (!page) { _D("Page is not found at %d", page_no); return MENU_SCREEN_ERROR_FAIL; } for (position_no = 0; position_no < page_max_app; position_no ++) { item = page_get_item_at(page, position_no); if (!item) { *candidate_page = page_no; *candidate_pos = position_no; return MENU_SCREEN_ERROR_OK; } } } *candidate_page = page_no; *candidate_pos = 0; return MENU_SCREEN_ERROR_OK; }
Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) { Evas_Object *page; Evas_Object *bg; Evas_Object *index; Evas_Object *tab; Evas_Object *mapbuf; Evas_Object *box; char *page_edje; bool enable_bg_image; unsigned int count; int page_height; int page_width; _D("Create a new page[%d]", idx); page_edje = evas_object_data_get(scroller, "page_edje"); enable_bg_image = (bool) evas_object_data_get(scroller, "enable_bg_image"); page = layout_load_edj(scroller, page_edje, PAGE_GROUP_NAME); retv_if(!page, NULL); evas_object_event_callback_add(page, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints_cb, NULL); edje_object_signal_callback_add(_EDJ(page), "dim,down", "menu", _dim_down_cb, NULL); edje_object_signal_callback_add(_EDJ(page), "dim,up", "menu", _dim_up_cb, NULL); box = evas_object_data_get(scroller, "box"); mapbuf = mapbuf_bind(box, page); if (!mapbuf) { _D("Failed to bind the object with mapbuf"); } bg = evas_object_rectangle_add(menu_screen_get_evas()); if (!bg) { evas_object_del(page); return NULL; } evas_object_color_set(bg, 0, 0, 0, 0); page_width = menu_screen_get_root_width(); page_height = (int) ((double) PROP_PORTRAIT_HEIGHT * ((double) menu_screen_get_root_height())); evas_object_size_hint_min_set(bg, page_width, page_height); evas_object_size_hint_max_set(bg, page_width, page_height); elm_object_part_content_set(page, "bg", bg); evas_object_data_set(page, "win", evas_object_data_get(scroller, "win")); evas_object_data_set(page, "layout", evas_object_data_get(scroller, "layout")); evas_object_data_set(page, "controlbar", evas_object_data_get(scroller, "controlbar")); evas_object_data_set(page, "tab", evas_object_data_get(scroller, "tab")); evas_object_data_set(page, "scroller", scroller); evas_object_data_set(page, "page_edje", page_edje); evas_object_data_set(page, "page_max_app", evas_object_data_get(scroller, "page_max_app")); evas_object_data_set(page, "bg", bg); evas_object_data_set(page, "pending,list", NULL); evas_object_data_set(page, "dirty", (void *) 0); if (_insert_page_at(scroller, page, idx) != MENU_SCREEN_ERROR_OK) { evas_object_del(bg); evas_object_del(page); return NULL; } index = evas_object_data_get(scroller, "index"); if (index) { tab = evas_object_data_get(scroller, "tab"); count = page_scroller_count_page(scroller); index_update(tab, index, count); } return page; }
.sort_func = _find_position_by_package, }, { .sort_type = PAGE_SCROLLER_SORT_BY_NAME, .sort_func = _find_position_by_name, }, { .sort_type = PAGE_SCROLLER_SORT_MAX, .sort_func = NULL, }, }; sort_type = (int) evas_object_data_get(scroller, "sort_type"); sort_type_map[sort_type].sort_func(scroller, &candidate_page, &candidate_pos, ai); nr_of_pages = page_scroller_count_page(scroller); for (i = nr_of_pages; i <= candidate_page; i ++) { Evas_Object *new_page; int rotate; rotate = (int) evas_object_data_get(scroller, "rotate"); new_page = page_create(scroller, nr_of_pages, rotate); retv_if(NULL == new_page, NULL); mapbuf_enable(new_page, 0); } item = item_create(scroller, ai); retv_if(NULL == item, NULL); page = page_scroller_get_page_at(scroller, candidate_page);