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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #6
0
			.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);