Using different layouts to improve now playing transition.

SVN revision: 55417
This commit is contained in:
Otávio Pontes 2010-12-09 15:30:52 +00:00
parent 3be8737913
commit a9f4da614e
4 changed files with 132 additions and 121 deletions

View File

@ -32,26 +32,24 @@ _list_page_promote(List *list, Evas_Object *page)
elm_pager_content_promote(list->pager, page);
}
void
list_page_songs(Evas_Object *obj)
static void
_list_page_playing(void *data, Evas_Object *o __UNUSED__, void *event_info)
{
LIST_GET_OR_RETURN(list, obj);
List *list = data;
DBG("show songs folder %p (%s) requested by %p (%s)",
list->page.songs, page_title_get(list->page.songs),
obj, page_title_get(obj));
event_info, page_title_get(event_info));
if (list->page.songs == obj) return;
if (list->page.songs == data) return;
if (!list->page.songs) return;
EINA_SAFETY_ON_NULL_RETURN(eina_list_last(list->page.list));
if (eina_list_last(list->page.list)->data != list->page.songs)
list->page.list = eina_list_append(list->page.list, list->page.songs);
list->page.list = eina_list_append(list->page.list, list->page.songs);
_list_page_promote(list, list->page.songs);
evas_object_smart_callback_call(list->pager, "title_changed", (void *)page_title_get(list->page.current));
evas_object_smart_callback_call(list->pager, "elm,back,show", NULL);
evas_object_smart_callback_call(list->pager, "elm,playing,hide", NULL);
page_playing_hide(list->page.current);
page_back_show(list->page.current);
}
static void
@ -84,30 +82,29 @@ _list_page_add(List *list, Evas_Object *page)
list->page.list = eina_list_append(list->page.list, page);
list->page.current = page;
elm_pager_content_push(list->pager, page);
evas_object_smart_callback_call(list->pager, "title_changed", (void *)page_title_get(page));
if (eina_list_count(list->page.list) > 1)
evas_object_smart_callback_call(list->pager, "elm,back,show", NULL);
page_back_show(list->page.current);
if ((list->page.songs) && (list->page.songs != page))
evas_object_smart_callback_call(list->pager, "elm,playing,show", NULL);
page_playing_show(list->page.current);
else
evas_object_smart_callback_call(list->pager, "elm,playing,hide", NULL);
page_playing_hide(list->page.current);
return EINA_TRUE;
}
void
list_page_back(Evas_Object *obj)
static void
_list_page_back(void *data, Evas_Object *o __UNUSED__, void *event_info)
{
LIST_GET_OR_RETURN(list, obj);
DBG("page=%p (%s)", list->page.current, page_title_get(list->page.current));
List *list = data;
Evas_Object *page = event_info;
DBG("page=%p (%s)", page, page_title_get(page));
_list_page_remove(list, list->page.current);
evas_object_smart_callback_call(list->pager, "title_changed", (void *)page_title_get(list->page.current));
if (eina_list_count(list->page.list) == 1)
evas_object_smart_callback_call(list->pager, "elm,back,hide", NULL);
page_back_hide(list->page.current);
if ((list->page.songs) && (list->page.songs != list->page.current))
evas_object_smart_callback_call(list->pager, "elm,playing,show", NULL);
page_playing_show(list->page.current);
else
evas_object_smart_callback_call(list->pager, "elm,playing,hide", NULL);
page_playing_hide(list->page.current);
}
static void
@ -128,7 +125,7 @@ _list_page_song(void *data, Evas_Object *page, void *event_info)
}
list->page.songs = page;
evas_object_smart_callback_call(list->pager, "elm,playing,hide", NULL);
page_playing_hide(page);
}
evas_object_smart_callback_call(list->pager, "selected", song);
@ -142,6 +139,8 @@ _list_page_folder_songs(void *data, Evas_Object *o __UNUSED__, void *event_info)
EINA_SAFETY_ON_NULL_RETURN(page);
if (!_list_page_add(list, page)) return;
evas_object_smart_callback_add(page, "song", _list_page_song, list);
evas_object_smart_callback_add(page, "back", _list_page_back, list);
evas_object_smart_callback_add(page, "playing", _list_page_playing, list);
}
static void
@ -154,6 +153,8 @@ _list_page_folder(void *data, Evas_Object *o __UNUSED__, void *event_info)
evas_object_smart_callback_add(page, "folder", _list_page_folder, list);
evas_object_smart_callback_add
(page, "folder-songs", _list_page_folder_songs, list);
evas_object_smart_callback_add(page, "back", _list_page_back, list);
evas_object_smart_callback_add(page, "playing", _list_page_playing, list);
}
static void
@ -210,6 +211,9 @@ list_populate(Evas_Object *obj, DB *db)
evas_object_smart_callback_add(page, "folder", _list_page_folder, list);
evas_object_smart_callback_add
(page, "folder-songs", _list_page_folder_songs, list);
evas_object_smart_callback_add(page, "back", _list_page_back, list);
evas_object_smart_callback_add(page, "playing", _list_page_playing, list);
page_back_hide(list->page.current);
return EINA_TRUE;
}

View File

@ -109,8 +109,10 @@ typedef struct _Page_Class
struct _Page
{
const Page_Class *cls;
Evas_Object *layout_list;
Evas_Object *layout;
Evas_Object *edje;
Evas_Object *edje_list;
Evas_Object *list;
Evas_Object *index;
Evas_Object *parent;
@ -238,12 +240,27 @@ _page_del(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event
free(page);
}
static void
_page_action_back(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Page *page = data;
evas_object_smart_callback_call(page->layout, "back", page->layout);
}
static void
_page_action_next(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Page *page = data;
evas_object_smart_callback_call(page->layout, "playing", page->layout);
}
static Evas_Object *
_page_add(Evas_Object *parent, void *model, Eina_Iterator *it, const char *title, const Page_Class *cls)
{
Evas_Object *obj;
Evas_Object *obj_list, *obj = NULL;
Page *page;
const char *s;
Edje_External_Param param;
EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(cls, NULL);
@ -257,11 +274,17 @@ _page_add(Evas_Object *parent, void *model, Eina_Iterator *it, const char *title
DBG("creating page %s with key %s, item style %s",
cls->name, cls->key, cls->item_cls->item_style);
obj_list = elm_layout_add(parent);
if (!obj_list)
{
eina_iterator_free(it);
return NULL;
}
obj = elm_layout_add(parent);
if (!obj)
{
eina_iterator_free(it);
return NULL;
goto error_layout;
}
page = calloc(1, sizeof(*page));
@ -273,43 +296,65 @@ _page_add(Evas_Object *parent, void *model, Eina_Iterator *it, const char *title
}
evas_object_data_set(obj, "_enjoy_page", page);
evas_object_data_set(obj, cls->key, page);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _page_del, page);
page->layout = obj;
evas_object_event_callback_add(obj_list, EVAS_CALLBACK_DEL, _page_del, page);
page->layout_list = obj_list;
page->model = model;
page->iterator = it;
page->cls = cls;
page->parent = parent;
page->od_to_list_item = NULL;
page->layout = obj;
if (!elm_layout_file_set(obj, PACKAGE_DATA_DIR "/default.edj", cls->layout))
if (!elm_layout_file_set(obj_list, PACKAGE_DATA_DIR "/default.edj", cls->layout))
{
CRITICAL("no theme for '%s' at %s",
cls->layout, PACKAGE_DATA_DIR "/default.edj");
goto error;
}
page->title = eina_stringshare_add(title);
page->edje = elm_layout_edje_get(obj);
if (!elm_layout_theme_set
(obj, "layout", "application", "content-back-next"))
{
CRITICAL("no theme for 'elm/layout/application/content-back-next'.");
goto error;
}
page->list = elm_genlist_add(obj);
page->title = eina_stringshare_add(title);
page->edje_list = elm_layout_edje_get(obj_list);
page->list = elm_genlist_add(obj_list);
elm_genlist_bounce_set(page->list, EINA_FALSE, EINA_TRUE);
elm_genlist_horizontal_mode_set(page->list, ELM_LIST_COMPRESS);
elm_genlist_compress_mode_set(page->list, EINA_TRUE);
elm_object_style_set(page->list, "enjoy");
s = edje_object_data_get(page->edje, "homogeneous");
s = edje_object_data_get(page->edje_list, "homogeneous");
elm_genlist_homogeneous_set(page->list, s ? !!atoi(s) : EINA_FALSE);
elm_layout_content_set(obj, "ejy.swallow.list", page->list);
elm_layout_content_set(obj_list, "ejy.swallow.list", page->list);
if (edje_object_part_exists(page->edje, "ejy.swallow.index"))
if (edje_object_part_exists(page->edje_list, "ejy.swallow.index"))
{
page->index = elm_index_add(obj);
page->index = elm_index_add(obj_list);
evas_object_smart_callback_add
(page->index, "delay,changed", _page_index_changed, page);
elm_layout_content_set(obj, "ejy.swallow.index", page->index);
elm_layout_content_set(obj_list, "ejy.swallow.index", page->index);
}
page->edje = elm_layout_edje_get(page->layout);
elm_layout_content_set(page->layout, "elm.swallow.content", page->layout_list);
edje_object_part_text_set(page->edje,
"elm.text.title", page->title);
edje_object_signal_callback_add(page->edje, "elm,action,back", "",
_page_action_back, page);
edje_object_signal_callback_add(page->edje, "elm,action,next", "",
_page_action_next, page);
param.type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
param.name = "label";
param.s = "Playing";
edje_object_part_external_param_set (page->edje, "next", &param);
page->container = eina_iterator_container_get(it);
evas_object_data_set(page->list, "_enjoy_container", page->container);
evas_object_data_set(page->list, "_enjoy_page", page);
@ -324,8 +369,10 @@ _page_add(Evas_Object *parent, void *model, Eina_Iterator *it, const char *title
return obj;
error:
evas_object_del(obj); /* should delete everything */
error:
evas_object_del(obj);
error_layout:
evas_object_del(obj_list);
return NULL;
}
@ -576,7 +623,7 @@ _song_album_cover_size_changed(void *data, Evas *e __UNUSED__, Evas_Object *part
DBG("cover view changed size to %dx%d, query cover size %d", w, h, size);
cover = cover_album_fetch(page->layout, page->container, page->model, size, NULL, NULL);
elm_layout_content_set(page->layout, "ejy.swallow.cover", cover);
elm_layout_content_set(page->layout_list, "ejy.swallow.cover", cover);
}
static Eina_Bool
@ -584,35 +631,35 @@ _song_album_init(Page *page)
{
Album *album = page->model;
if (edje_object_part_exists(page->edje, "ejy.swallow.cover"))
if (edje_object_part_exists(page->edje_list, "ejy.swallow.cover"))
{
DB *db = _page_db_get(page->layout);
Evas_Object *cover, *part;
const char *s;
int size = 0;
s = edje_object_data_get(page->edje, "cover_size");
s = edje_object_data_get(page->edje_list, "cover_size");
if (s) size = atoi(s);
if (size < 32) size = 32;
cover = cover_album_fetch(page->layout, db, album, size, NULL, NULL);
elm_layout_content_set(page->layout, "ejy.swallow.cover", cover);
elm_layout_content_set(page->layout_list, "ejy.swallow.cover", cover);
part = (Evas_Object *)
edje_object_part_object_get(page->edje, "ejy.swallow.cover");
edje_object_part_object_get(page->edje_list, "ejy.swallow.cover");
evas_object_event_callback_add
(part, EVAS_CALLBACK_RESIZE, _song_album_cover_size_changed, page);
}
if (album->name)
edje_object_part_text_set(page->edje, "ejy.text.album", album->name);
edje_object_part_text_set(page->edje_list, "ejy.text.album", album->name);
else
edje_object_part_text_set(page->edje, "ejy.text.album", "");
edje_object_part_text_set(page->edje_list, "ejy.text.album", "");
if (album->artist)
edje_object_part_text_set(page->edje, "ejy.text.artist", album->artist);
edje_object_part_text_set(page->edje_list, "ejy.text.artist", album->artist);
else
edje_object_part_text_set(page->edje, "ejy.text.artist", "");
edje_object_part_text_set(page->edje_list, "ejy.text.artist", "");
return EINA_TRUE;
}
@ -1274,3 +1321,31 @@ page_root_add(Evas_Object *parent)
(root_items, sizeof(Static_Item), ARRAY_SIZE(root_items));
return _page_add(parent, NULL, it, "Enjoy your music!", &root_cls);
}
void
page_back_show(Evas_Object *obj)
{
PAGE_GET_OR_RETURN(page, obj);
edje_object_signal_emit(page->edje, "elm,back,show", "elm");
}
void
page_back_hide(Evas_Object *obj)
{
PAGE_GET_OR_RETURN(page, obj);
edje_object_signal_emit(page->edje, "elm,back,hide", "elm");
}
void
page_playing_show(Evas_Object *obj)
{
PAGE_GET_OR_RETURN(page, obj);
edje_object_signal_emit(page->edje, "elm,next,show", "elm");
}
void
page_playing_hide(Evas_Object *obj)
{
PAGE_GET_OR_RETURN(page, obj);
edje_object_signal_emit(page->edje, "elm,next,hide", "elm");
}

View File

@ -91,12 +91,13 @@ void list_freeze(Evas_Object *obj);
void list_thaw(Evas_Object *obj);
Song *list_song_nth_get(Evas_Object *obj, int32_t n);
int32_t list_song_selected_n_get(Evas_Object *obj);
void list_page_back(Evas_Object *obj);
void list_page_songs(Evas_Object *obj);
const char *page_title_get(const Evas_Object *obj);
void page_songs_exists_changed(Evas_Object *obj, Eina_Bool exists);
void page_back_show(Evas_Object *page);
void page_back_hide(Evas_Object *page);
void page_playing_show(Evas_Object *page);
void page_playing_hide(Evas_Object *page);
Evas_Object *page_root_add(Evas_Object *parent);

View File

@ -296,48 +296,6 @@ _win_list_selected(void *data, Evas_Object *list __UNUSED__, void *event_info)
_win_song_set(w, s);
}
static void
_win_title_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info)
{
Win *w = data;
edje_object_part_text_set(w->edje, "elm.text.title", event_info);
}
static void
_win_back_show(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Win *w = data;
edje_object_signal_emit(w->edje, "elm,back,show", "elm");
}
static void
_win_back_hide(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Win *w = data;
edje_object_signal_emit(w->edje, "elm,back,hide", "elm");
}
static void
_win_playing_show(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Win *w = data;
edje_object_signal_emit(w->edje, "elm,next,show", "elm");
}
static void
_win_playing_hide(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Win *w = data;
edje_object_signal_emit(w->edje, "elm,next,hide", "elm");
}
static void
_win_action_back(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Win *w = data;
list_page_back(w->list);
}
static void
_win_del(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
{
@ -435,13 +393,6 @@ _win_mode_nowplaying(void *data, Evas_Object *obj __UNUSED__, void *event_info _
elm_pager_content_promote(w->list, w->nowplaying);
}
static void
_win_action_next(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Win *w = data;
list_page_songs(w->list);
}
static void
_win_repeat_on(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
@ -764,7 +715,6 @@ win_new(App *app)
Evas_Coord iw = 320, ih = 240;
char path[PATH_MAX];
Evas_Object *nowplaying_edje;
Edje_External_Param param;
memset(w, 0, sizeof(*w));
@ -818,27 +768,13 @@ win_new(App *app)
elm_win_resize_object_add(w->win, w->layout);
if (!elm_layout_theme_set
(w->layout, "layout", "application", "toolbar-content-back-next"))
(w->layout, "layout", "application", "toolbar-content"))
{
ERR("could not load style 'toolbar-content-back-next' from theme");
ERR("could not load style 'toolbar-content' from theme");
goto error;
}
w->edje = elm_layout_edje_get(w->layout);
_win_playing_hide(w, NULL, NULL);
_win_back_hide(w, NULL, NULL);
edje_object_part_text_set(w->edje, "elm.text.next", "Playing");
param.type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
param.name = "label";
param.s = "Playing";
edje_object_part_external_param_set (w->edje, "next", &param);
edje_object_signal_callback_add(w->edje, "elm,action,back", "",
_win_action_back, w);
edje_object_signal_callback_add(w->edje, "elm,action,next", "",
_win_action_next, w);
w->toolbar = edje_object_part_external_object_get
(w->edje, "elm.external.toolbar");
if (!w->toolbar)
@ -874,11 +810,6 @@ win_new(App *app)
}
elm_layout_content_set(w->layout, "elm.swallow.content", w->list);
evas_object_smart_callback_add(w->list, "selected", _win_list_selected, w);
evas_object_smart_callback_add(w->list, "title_changed", _win_title_changed, w);
evas_object_smart_callback_add(w->list, "elm,back,hide", _win_back_hide, w);
evas_object_smart_callback_add(w->list, "elm,back,show", _win_back_show, w);
evas_object_smart_callback_add(w->list, "elm,playing,hide", _win_playing_hide, w);
evas_object_smart_callback_add(w->list, "elm,playing,show", _win_playing_show, w);
w->nowplaying = nowplaying_add(w->layout);
nowplaying_edje = elm_layout_edje_get(w->nowplaying);