Using different layouts to improve now playing transition.
SVN revision: 55417
This commit is contained in:
parent
3be8737913
commit
a9f4da614e
|
@ -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;
|
||||
}
|
||||
|
|
123
src/bin/page.c
123
src/bin/page.c
|
@ -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", ¶m);
|
||||
|
||||
|
||||
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");
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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", ¶m);
|
||||
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue