From: Kim Tae Soo Date: Mon, 2 Feb 2015 01:32:39 +0000 (+0900) Subject: Apply Modified Listener X-Git-Tag: submit/tizen_tv/20150202.020111^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=613a23dac12d5b9f5968d42d98a14ac127397f2f;p=profile%2Ftv%2Fapps%2Fnative%2Fmusicplayer.git Apply Modified Listener Change-Id: Id1c42a79f5f12494fbf85662fd5339b7de24933e Signed-off-by: Kim Tae Soo --- diff --git a/include/album-songs-layout.h b/include/album-songs-layout.h index 373852d..4db5a4f 100644 --- a/include/album-songs-layout.h +++ b/include/album-songs-layout.h @@ -18,7 +18,10 @@ #define __ALBUM_SONGS_LAYOUT_H__ -class CAlbumSongsLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +struct SAlbumSongsItemInfo; + +class CAlbumSongsLayout : public CExtBaseLayout, public CListenerMgr, + public IKeyDownListener, public IMouseMoveListener, public IMouseClickedListener { private: struct SAlbumSongsLayout *m; @@ -27,7 +30,19 @@ private: static void sm_CbRemoveListItem(void *data, Evas_Object *obj); static void sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId); + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); + void m_OnCtxtUpdate(EActionType type, int lid); + + static void sm_CbCtxtClose(void *dt); + void m_OnCtxtClose(void); + + static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info); + void m_OnItemSelect(Evas_Object *obj, void *event_info); + private: + SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); + void m_UpdateSongList(void); + void m_EmptySongList(void); inline int m_ConvertToMin(int milsec); void m_GotoPlayback(int mode, char *id); Evas_Object *m_AddAlbumCover(void); @@ -38,7 +53,12 @@ protected: virtual void t_OnShow(void); public: - CAlbumSongsLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + CAlbumSongsLayout(const char *pLayoutId) : + CExtBaseLayout(pLayoutId), + IKeyDownListener(this), + IMouseMoveListener(this), + IMouseClickedListener(this), + m(0) {} virtual ~CAlbumSongsLayout() {} bool Create(CLayoutMgr *mgr); @@ -46,6 +66,8 @@ public: public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnMouseClicked(int id, Evas_Object *obj); }; diff --git a/include/song-layout.h b/include/song-layout.h index fe1be2b..25e7d41 100644 --- a/include/song-layout.h +++ b/include/song-layout.h @@ -18,7 +18,10 @@ #define __SONG_LAYOUT_H__ -class CSongLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +struct SSongItemInfo; + +class CSongLayout : public CExtBaseLayout, public CListenerMgr, + public IKeyDownListener, public IMouseMoveListener { private: struct SSongLayout *m; @@ -28,10 +31,20 @@ private: static void sm_CbRemoveListItem(void *data, Evas_Object *obj); static void sm_CbGenlistKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei); - static void sm_CbSelectItem(void *cookie); - void m_OnSelectItem(void); + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); + void m_OnCtxtUpdate(EActionType type, int lid); + + static void sm_CbCtxtClose(void *dt); + void m_OnCtxtClose(void); + + static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info); + void m_OnItemSelect(Evas_Object *obj, void *event_info); private: + SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); + void m_UpdateSongList(bool sort_flag); + void m_SortSongList(void); + void m_EmptySongList(bool sort_flag); void m_GotoPlayback(void); void m_GotoPlaybackUri(void); void m_CreateSongList(void); @@ -40,7 +53,11 @@ protected: virtual void t_OnShow(void); public: - CSongLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + CSongLayout(const char *pLayoutId) : + CExtBaseLayout(pLayoutId), + IKeyDownListener(this), + IMouseMoveListener(this), + m(0) {} virtual ~CSongLayout() {} bool Create(CLayoutMgr *mgr, const char *uri); @@ -50,6 +67,7 @@ public: public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); }; diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index 1364485..cc87998 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -37,10 +37,12 @@ #define TOTAL_ADD_BTNS 3 -enum EBtnType { - ABTN_PLAY, - ABTN_NEXT, - ABTN_LAST +enum EObjectType { + ALBUM_SONGS_PLAY_BUTTON, + ALBUM_SONGS_NEXT_BUTTON, + ALBUM_SONGS_LAST_BUTTON, + ALBUM_SONGS_LAYOUT, + ALBUM_SONGS_GENLIST, }; struct SAlbumSongsItemInfo { @@ -64,312 +66,11 @@ struct SAlbumSongsLayout { int total_duration; CAlbumSongsLayout *parent; - class CHandlerButton : public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener { - public: - struct SCallback { - void(*gotoPlayBackView)(void* cookie, int mode, char *mediaId); - void* cookie; - }; - - private: - SAlbumSongsLayout *m; - - protected: - SCallback m_callback; - - public: - CHandlerButton(SAlbumSongsLayout *ins) : - IMouseMoveListener(this), - IMouseClickedListener(this) { - m = ins; - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) - { - if (!obj) - return; - - if (!elm_object_focus_get(obj)) - elm_object_focus_set(obj, EINA_TRUE); - } - - virtual void OnMouseClicked(int id, Evas_Object *obj) { - EBtnType type = (EBtnType)id; - - switch (type) - { - case ABTN_PLAY: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_FRESH, NULL); - break; - - case ABTN_NEXT: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_NEXT, NULL); - break; - - case ABTN_LAST: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_END, NULL); - break; - - default: - _ERR("Invalid Button Type"); - ASSERT(0); - break; - } - } - } *pHandlerButton; - - class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener { - public: - struct SCallback { - void(*gotoPlaybackView)(void* cookie, int mode, char *mediaId); - void* cookie; - }; - - private: - SAlbumSongsLayout *m; - SCallback m_callback; - - private: - SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) - { - Eina_List *l = NULL; - SAlbumSongsItemInfo *itinfo = NULL; - void *obj = NULL; - - EINA_LIST_FOREACH(list, l, obj) { - itinfo = (SAlbumSongsItemInfo *)obj; - if (itinfo->item == item) - return itinfo; - } - - return NULL; - } - - static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtUpdate(type, lid); - } - - void m_OnCtxtUpdate(EActionType type, int lid) - { - Eina_List *list = NULL; - EAddType mode; - - if (!m->ctxtinfo || !m->ctxtinfo->context) - return; - - if (type == ACTION_TYPE_ADDNEXT) - mode = ADD_TYPE_NEXT; - else - mode = ADD_TYPE_END; - - list = eina_list_append(list, m->ctxtinfo->context); - if (type == ACTION_TYPE_ADDTO) { - if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) - _ERR(" Adding songs to playlist failed "); - else - _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); - - return; - } - - m->mhandle->UpdatePlaylist(list, mode); - eina_list_free(list); - - if (type == ACTION_TYPE_PLAY) { - m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); - } - - _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); - } - - static void sm_CbCtxtClose(void *dt) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtClose(); - } - - void m_OnCtxtClose(void) - { - m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); - elm_object_item_focus_set(m->focused_item, EINA_TRUE); - } - - static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) - { - CHandlerGenlist *root = (CHandlerGenlist*)data; - - if (root) - root->m_OnItemSelect(obj, event_info); - } - - void m_OnItemSelect(Evas_Object *obj, void *event_info) - { - SAlbumSongsItemInfo *itinfo = NULL; - char *mediaId = NULL; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); - if (!itinfo) { - _ERR(" no item info found "); - return; - } - - mediaId = song_info_get_media_id(itinfo->sinfo); - - if (m_callback.gotoPlaybackView) { - m_callback.gotoPlaybackView(m_callback.cookie, ADD_TYPE_FRESH, mediaId); - } - } - - public: - CHandlerGenlist(SAlbumSongsLayout *ins) : - IMouseMoveListener(this), - IKeyDownListener(this) { - m = ins; - } - - virtual ~CHandlerGenlist() { - EmptySongList(); - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - Elm_Object_Item *item; - - item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, - ev->cur.canvas.y, NULL); - - if (!elm_object_item_focus_get(item)) - elm_object_item_focus_set(item, EINA_TRUE); - } - - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - Elm_Object_Item *it = NULL; - SContentInfo *ctxtinfo = NULL; - SAlbumSongsItemInfo *itinfo = NULL; - - if (strcmp(ev->keyname, KEY_MENU)) - return; - - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; - } - m->focused_item = it; - - if (m->ctxtinfo) { - free(m->ctxtinfo); - m->ctxtinfo = NULL; - } - - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, it); - if (!itinfo) { - free(ctxtinfo); - return; - } - - ctxtinfo->type = CONTEXT_TYPE_SONG; - ctxtinfo->context = itinfo->sinfo; - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - - m->ctxtinfo = ctxtinfo; - - SParcel parcel; - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); - } - - void UpdateSongList(void) - { - SSongInfo *sinfo = NULL; - void *obj = NULL; - Eina_List *l = NULL; - SAlbumSongsItemInfo *itinfo = NULL; - Elm_Object_Item *item = NULL; - int dur = 0; - album_info *alinfo = NULL; - - if (!m->songlist || !m->item_class) - return; - - /* Remove existing songlist and prepare afresh */ - EmptySongList(); - - alinfo = m->mhandle->CurrentAlbum(); - if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) { - _ERR(" Fetching song list from media failed "); - return; - } - - EINA_LIST_FOREACH(m->slist, l, obj) { - sinfo = (SSongInfo *)obj; - itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo)); - if (!itinfo) - return; - - itinfo->sinfo = sinfo; - item = elm_genlist_item_append(m->songlist, m->item_class, - itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this); - itinfo->item = item; - m->it_infolist = eina_list_append(m->it_infolist, itinfo); - song_info_get_duration(sinfo, &dur); - m->total_duration = m->total_duration + dur; - } - } - - void EmptySongList(void) - { - if (m->songlist) - elm_genlist_clear(m->songlist); - - if (m->slist) { - eina_list_free(m->slist); - m->slist = NULL; - } - - if (m->it_infolist) { - eina_list_free(m->it_infolist); - m->it_infolist = NULL; - } - - m->total_duration = 0; - } - } *pHandlerGenlist; - SAlbumSongsLayout() { memset(this, 0, sizeof(SAlbumSongsLayout)); - pHandlerGenlist = new CHandlerGenlist(this); - pHandlerButton = new CHandlerButton(this); } ~SAlbumSongsLayout() { - delete pHandlerGenlist; - delete pHandlerButton; } }; @@ -437,11 +138,158 @@ void CAlbumSongsLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj) } -void CAlbumSongsLayout::sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId) +void CAlbumSongsLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) { - CAlbumSongsLayout *root = (CAlbumSongsLayout *)cookie; + CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt; + if (root) - root->m_GotoPlayback(mode, mediaId); + root->m_OnCtxtUpdate(type, lid); +} + +void CAlbumSongsLayout::m_OnCtxtUpdate(EActionType type, int lid) +{ + Eina_List *list = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + list = eina_list_append(list, m->ctxtinfo->context); + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); +} + +void CAlbumSongsLayout::sm_CbCtxtClose(void *dt) +{ + CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt; + + if (root) + root->m_OnCtxtClose(); +} + +void CAlbumSongsLayout::m_OnCtxtClose(void) +{ + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); +} + +void CAlbumSongsLayout::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) +{ + CAlbumSongsLayout *root = (CAlbumSongsLayout*)data; + + if (root) + root->m_OnItemSelect(obj, event_info); +} + +void CAlbumSongsLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) +{ + SAlbumSongsItemInfo *itinfo = NULL; + char *mediaId = NULL; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + mediaId = song_info_get_media_id(itinfo->sinfo); + + m_GotoPlayback(ADD_TYPE_FRESH, mediaId); +} + + +SAlbumSongsItemInfo *CAlbumSongsLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) +{ + Eina_List *l = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SAlbumSongsItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; +} + + +void CAlbumSongsLayout::m_UpdateSongList(void) +{ + SSongInfo *sinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + Elm_Object_Item *item = NULL; + int dur = 0; + album_info *alinfo = NULL; + + if (!m->songlist || !m->item_class) + return; + + /* Remove existing songlist and prepare afresh */ + m_EmptySongList(); + + alinfo = m->mhandle->CurrentAlbum(); + if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) { + _ERR(" Fetching song list from media failed "); + return; + } + + EINA_LIST_FOREACH(m->slist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->sinfo = sinfo; + item = elm_genlist_item_append(m->songlist, m->item_class, + itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + song_info_get_duration(sinfo, &dur); + m->total_duration = m->total_duration + dur; + } +} + +void CAlbumSongsLayout::m_EmptySongList(void) +{ + if (m->songlist) + elm_genlist_clear(m->songlist); + + if (m->slist) { + eina_list_free(m->slist); + m->slist = NULL; + } + + if (m->it_infolist) { + eina_list_free(m->it_infolist); + m->it_infolist = NULL; + } + + m->total_duration = 0; } @@ -511,20 +359,20 @@ void CAlbumSongsLayout::m_CreateTopSection(void) SBtnInfo btninfo[TOTAL_ADD_BTNS]; Evas_Object *layout = Layout(); - btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY; - btninfo[ABTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN; - btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; - btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[ALBUM_SONGS_PLAY_BUTTON].name = MUSIC_STR_PLAY; + btninfo[ALBUM_SONGS_PLAY_BUTTON].part = MUSIC_PART_ALBUM_PLAYBTN; + btninfo[ALBUM_SONGS_PLAY_BUTTON].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[ALBUM_SONGS_PLAY_BUTTON].icon = MUSIC_IMAGE_ADD_PLAY; - btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT; - btninfo[ABTN_NEXT].part = MUSIC_PART_ALBUM_NEXTBTN; - btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; - btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[ALBUM_SONGS_NEXT_BUTTON].name = MUSIC_STR_ADDNEXT; + btninfo[ALBUM_SONGS_NEXT_BUTTON].part = MUSIC_PART_ALBUM_NEXTBTN; + btninfo[ALBUM_SONGS_NEXT_BUTTON].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[ALBUM_SONGS_NEXT_BUTTON].icon = MUSIC_IMAGE_ADD_NEXT; - btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST; - btninfo[ABTN_LAST].part = MUSIC_PART_ALBUM_LASTBTN; - btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; - btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[ALBUM_SONGS_LAST_BUTTON].name = MUSIC_STR_ADDLAST; + btninfo[ALBUM_SONGS_LAST_BUTTON].part = MUSIC_PART_ALBUM_LASTBTN; + btninfo[ALBUM_SONGS_LAST_BUTTON].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[ALBUM_SONGS_LAST_BUTTON].icon = MUSIC_IMAGE_ADD_LAST; thumb = m_AddAlbumCover(); if (!thumb) @@ -540,7 +388,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void) elm_object_text_set(btn[i], _(btninfo[i].name)); elm_object_style_set(btn[i], btninfo[i].style); - m->pHandlerButton->Connect(btn[i], i); + Connect(btn[i], i, TYPE_MOUSE_MOVE | TYPE_CLICKED); img = elm_image_add(btn[i]); if (img) { @@ -601,7 +449,7 @@ void CAlbumSongsLayout::m_CreateSongList(void) evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_part_content_set(layout, MUSIC_PART_SONGLIST, genlist); - m->pHandlerGenlist->Connect(genlist); + Connect(genlist, ALBUM_SONGS_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); m->songlist = genlist; list_item = elm_genlist_item_class_new(); @@ -617,7 +465,7 @@ void CAlbumSongsLayout::m_CreateSongList(void) list_item->func.del = sm_CbRemoveListItem; m->item_class = list_item; - m->pHandlerGenlist->UpdateSongList(); + m_UpdateSongList(); } @@ -696,17 +544,7 @@ bool CAlbumSongsLayout::Create(CLayoutMgr *mgr) m->mgr = mgr; m->parent = this; - Connect(layout); - - SAlbumSongsLayout::CHandlerGenlist::SCallback listCb; - listCb.gotoPlaybackView = &sm_CbGoToPlaybackView; - listCb.cookie = this; - m->pHandlerGenlist->SetCallback(&listCb); - - SAlbumSongsLayout::CHandlerButton::SCallback btnCb; - btnCb.gotoPlayBackView = &sm_CbGoToPlaybackView; - btnCb.cookie = this; - m->pHandlerButton->SetCallback(&btnCb); + Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN); return true; } @@ -715,7 +553,7 @@ void CAlbumSongsLayout::Destroy(void) { ASSERT(m); - m->pHandlerGenlist->EmptySongList(); + m_EmptySongList(); CExtBaseLayout::Destroy(); evas_object_del(Layout()); @@ -729,7 +567,7 @@ void CAlbumSongsLayout::t_OnShow(void) { ASSERT(m); - m->pHandlerGenlist->EmptySongList(); + m_EmptySongList(); m_CreateSongList(); m_CreateTopSection(); @@ -747,12 +585,118 @@ void CAlbumSongsLayout::t_OnShow(void) void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) { - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_DEPTH_UPDATE; - parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + switch (id) + { + case ALBUM_SONGS_LAYOUT: + if (!strcmp(ev->keyname, KEY_BACK)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_DEPTH_UPDATE; + parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + break; + + case ALBUM_SONGS_GENLIST: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + break; + + default: + break; + } +} + + +void CAlbumSongsLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case ALBUM_SONGS_GENLIST: + { + Elm_Object_Item *item; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + break; + + case ALBUM_SONGS_PLAY_BUTTON: + case ALBUM_SONGS_NEXT_BUTTON: + case ALBUM_SONGS_LAST_BUTTON: + { + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + break; + + default: + break; + } +} + + +void CAlbumSongsLayout::OnMouseClicked(int id, Evas_Object *obj) +{ + switch (id) + { + case ALBUM_SONGS_PLAY_BUTTON: + m_GotoPlayback(ADD_TYPE_FRESH, NULL); + break; + + case ALBUM_SONGS_NEXT_BUTTON: + m_GotoPlayback(ADD_TYPE_NEXT, NULL); + break; + + case ALBUM_SONGS_LAST_BUTTON: + m_GotoPlayback(ADD_TYPE_END, NULL); + break; + + default: + break; } } \ No newline at end of file diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index db8e9c1..36f763d 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -33,6 +33,12 @@ #include "song-layout.h" #include "base-view.h" + +enum EObjectType { + SONG_LAYOUT, + SONG_LAYOUT_GENLIST, +}; + struct SSongItemInfo { SSongInfo *sinfo; Elm_Object_Item *item; @@ -53,268 +59,11 @@ struct SSongLayout { char *uri; CSongLayout *parent; - class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener { - public: - struct SCallback { - void(*cb)(void* cookie); - void* cookie; - }; - - private: - SSongLayout *m; - SCallback m_callback; - - private: - SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) - { - Eina_List *l; - SSongItemInfo *itinfo = NULL; - void *obj = NULL; - - EINA_LIST_FOREACH(list, l, obj) { - itinfo = (SSongItemInfo *)obj; - if (itinfo->item == item) - return itinfo; - } - - return NULL; - } - - static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) - { - CHandlerGenlist *root = (CHandlerGenlist*)data; - - if (root) - root->m_OnItemSelect(obj, event_info); - } - - void m_OnItemSelect(Evas_Object *obj, void *event_info) - { - SSongItemInfo *itinfo = NULL; - char *mediaId = NULL; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); - if (!itinfo) { - _ERR(" no item info found "); - return; - } - - mediaId = song_info_get_media_id(itinfo->sinfo); - - m->mhandle->Stop(); - m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH); - m->mhandle->SetCurrentSong(mediaId); - - if (m_callback.cb) { - m_callback.cb(m_callback.cookie); - } - } - - static void sm_CbCtxtClose(void *dt) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtClose(); - } - - void m_OnCtxtClose(void) - { - m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); - elm_object_item_focus_set(m->focused_item, EINA_TRUE); - } - - static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtUpdate(type, lid); - } - - void m_OnCtxtUpdate(EActionType type, int lid) - { - Eina_List *list = NULL; - EAddType mode; - - if (!m->ctxtinfo || !m->ctxtinfo->context) - return; - - if (type == ACTION_TYPE_ADDNEXT) - mode = ADD_TYPE_NEXT; - else - mode = ADD_TYPE_END; - - list = eina_list_append(list, m->ctxtinfo->context); - if (type == ACTION_TYPE_ADDTO) { - if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) - _ERR(" Adding songs to playlist failed "); - else - _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); - - return; - } - - m->mhandle->UpdatePlaylist(list, mode); - eina_list_free(list); - - if (type == ACTION_TYPE_PLAY) { - m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); - } - - _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); - } - - void m_SortSongList(void) - { - int sort_type; - - int(*_sort_fn[])(const void *d1, const void *d2) = { - sortsongs_title_az, - sortsongs_title_za, - sortsongs_artist_az, - sortsongs_artist_za, - sortsongs_album_az, - sortsongs_album_za - }; - - sort_type = m->mhandle->SortType(); - - m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]); - } - - void m_EmptySongList(bool sort_flag) - { - if (m->songlist) - elm_genlist_clear(m->songlist); - - if (!sort_flag) { - eina_list_free(m->slist); - m->slist = NULL; - } - - eina_list_free(m->it_infolist); - m->it_infolist = NULL; - } - - public: - CHandlerGenlist(SSongLayout *ins) : - IMouseMoveListener(this), - IKeyDownListener(this) { - m = ins; - } - - virtual ~CHandlerGenlist() { - m_EmptySongList(false); - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - Elm_Object_Item *item; - - item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, - ev->cur.canvas.y, NULL); - - if (!elm_object_item_focus_get(item)) - elm_object_item_focus_set(item, EINA_TRUE); - } - - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - Elm_Object_Item *it = NULL; - SContentInfo *ctxtinfo = NULL; - SSongItemInfo *itinfo = NULL; - - if (strcmp(ev->keyname, KEY_MENU)) - return; - - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; - } - m->focused_item = it; - - if (m->ctxtinfo) { - free(m->ctxtinfo); - m->ctxtinfo = NULL; - } - - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, it); - if (!itinfo) { - free(ctxtinfo); - return; - } - - ctxtinfo->type = CONTEXT_TYPE_SONG; - ctxtinfo->context = itinfo->sinfo; - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - - m->ctxtinfo = ctxtinfo; - - SParcel parcel; - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); - } - - void UpdateSongList(bool sort_flag) - { - bool r; - struct SSongInfo *sinfo; - void *obj; - Eina_List *l; - struct SSongItemInfo *itinfo; - Elm_Object_Item *item; - - /* Remove existing songlist and prepare afresh */ - m_EmptySongList(sort_flag); - - if (!sort_flag) { - r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &(m->slist)); - if (r == false || eina_list_count(m->slist) == 0) { - _ERR(" Fetching song list from media failed "); - - m->parent->SetEmptyStatus(true); - return; - } - } - - m_SortSongList(); - - EINA_LIST_FOREACH(m->slist, l, obj) { - sinfo = (SSongInfo *)obj; - itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo)); - if (!itinfo) - return; - - itinfo->sinfo = sinfo; - item = elm_genlist_item_append(m->songlist, m->item_class, - itinfo, NULL, ELM_GENLIST_ITEM_NONE, - sm_CbItemSelect, this); - itinfo->item = item; - m->it_infolist = eina_list_append(m->it_infolist, itinfo); - } - } - } *pHandlerGenlist; - SSongLayout() { memset(this, 0, sizeof(SSongLayout)); - pHandlerGenlist = new CHandlerGenlist(this); } ~SSongLayout() { - delete pHandlerGenlist; } }; @@ -407,21 +156,184 @@ void CSongLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj) } -void CSongLayout::sm_CbSelectItem(void *cookie) +void CSongLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) { - CSongLayout *root = (CSongLayout *)cookie; + CSongLayout *root = (CSongLayout *)dt; if (root) - root->m_OnSelectItem(); + root->m_OnCtxtUpdate(type, lid); } -void CSongLayout::m_OnSelectItem(void) +void CSongLayout::m_OnCtxtUpdate(EActionType type, int lid) { + Eina_List *list = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + list = eina_list_append(list, m->ctxtinfo->context); + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); +} + + +void CSongLayout::sm_CbCtxtClose(void *dt) +{ + CSongLayout *root = (CSongLayout *)dt; + + if (root) + root->m_OnCtxtClose(); +} + + +void CSongLayout::m_OnCtxtClose(void) +{ + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); +} + + +void CSongLayout::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) +{ + CSongLayout *root = (CSongLayout*)data; + + if (root) + root->m_OnItemSelect(obj, event_info); +} + +void CSongLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) +{ + SSongItemInfo *itinfo = NULL; + char *mediaId = NULL; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + mediaId = song_info_get_media_id(itinfo->sinfo); + + m->mhandle->Stop(); + m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH); + m->mhandle->SetCurrentSong(mediaId); + m_GotoPlayback(); } +SSongItemInfo *CSongLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) +{ + Eina_List *l; + SSongItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SSongItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; +} + + +void CSongLayout::m_UpdateSongList(bool sort_flag) +{ + bool r; + struct SSongInfo *sinfo; + void *obj; + Eina_List *l; + struct SSongItemInfo *itinfo; + Elm_Object_Item *item; + + /* Remove existing songlist and prepare afresh */ + m_EmptySongList(sort_flag); + + if (!sort_flag) { + r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &(m->slist)); + if (r == false || eina_list_count(m->slist) == 0) { + _ERR(" Fetching song list from media failed "); + + m->parent->SetEmptyStatus(true); + return; + } + } + + m_SortSongList(); + + EINA_LIST_FOREACH(m->slist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->sinfo = sinfo; + item = elm_genlist_item_append(m->songlist, m->item_class, + itinfo, NULL, ELM_GENLIST_ITEM_NONE, + sm_CbItemSelect, this); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + } +} + +void CSongLayout::m_SortSongList(void) +{ + int sort_type; + + int(*_sort_fn[])(const void *d1, const void *d2) = { + sortsongs_title_az, + sortsongs_title_za, + sortsongs_artist_az, + sortsongs_artist_za, + sortsongs_album_az, + sortsongs_album_za + }; + + sort_type = m->mhandle->SortType(); + + m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]); +} + +void CSongLayout::m_EmptySongList(bool sort_flag) +{ + if (m->songlist) + elm_genlist_clear(m->songlist); + + if (!sort_flag) { + eina_list_free(m->slist); + m->slist = NULL; + } + + eina_list_free(m->it_infolist); + m->it_infolist = NULL; +} + + void CSongLayout::m_GotoPlayback(void) { if (!m->vmgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) @@ -463,7 +375,7 @@ void CSongLayout::m_CreateSongList(void) evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_part_content_set(Layout(), MUSIC_PART_SONGLIST, genlist); - m->pHandlerGenlist->Connect(genlist); + Connect(genlist, SONG_LAYOUT_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); m->songlist = genlist; list_item = elm_genlist_item_class_new(); @@ -479,7 +391,7 @@ void CSongLayout::m_CreateSongList(void) list_item->func.del = sm_CbRemoveListItem; m->item_class = list_item; - m->pHandlerGenlist->UpdateSongList(false); + m_UpdateSongList(false); } @@ -568,7 +480,7 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) m_CreateSongList(); - Connect(layout); + Connect(layout, SONG_LAYOUT, TYPE_KEY_DOWN); SParcel parcel; parcel.ctxtInfo = NULL; @@ -577,11 +489,6 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); - SSongLayout::CHandlerGenlist::SCallback cb; - cb.cb = &sm_CbSelectItem; - cb.cookie = this; - m->pHandlerGenlist->SetCallback(&cb); - return true; } @@ -619,7 +526,7 @@ void CSongLayout::Update(bool focusFlag) ASSERT(m); if (!focusFlag) { - m->pHandlerGenlist->UpdateSongList(true); + m_UpdateSongList(true); return; } @@ -629,12 +536,88 @@ void CSongLayout::Update(bool focusFlag) void CSongLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) { - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + switch (id) { + case SONG_LAYOUT: + { + if (!strcmp(ev->keyname, KEY_BACK)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + } + break; + + case SONG_LAYOUT_GENLIST: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SSongItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + break; + + default: + break; + } +} + + +void CSongLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case SONG_LAYOUT_GENLIST: + { + Elm_Object_Item *item; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + break; + + default: + break; } } \ No newline at end of file