#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;
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);
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);
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);
};
#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;
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);
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);
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);
};
#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 {
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;
}
};
}
-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;
}
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)
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) {
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();
list_item->func.del = sm_CbRemoveListItem;
m->item_class = list_item;
- m->pHandlerGenlist->UpdateSongList();
+ m_UpdateSongList();
}
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;
}
{
ASSERT(m);
- m->pHandlerGenlist->EmptySongList();
+ m_EmptySongList();
CExtBaseLayout::Destroy();
evas_object_del(Layout());
{
ASSERT(m);
- m->pHandlerGenlist->EmptySongList();
+ m_EmptySongList();
m_CreateSongList();
m_CreateTopSection();
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
#include "song-layout.h"
#include "base-view.h"
+
+enum EObjectType {
+ SONG_LAYOUT,
+ SONG_LAYOUT_GENLIST,
+};
+
struct SSongItemInfo {
SSongInfo *sinfo;
Elm_Object_Item *item;
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;
}
};
}
-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))
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();
list_item->func.del = sm_CbRemoveListItem;
m->item_class = list_item;
- m->pHandlerGenlist->UpdateSongList(false);
+ m_UpdateSongList(false);
}
m_CreateSongList();
- Connect(layout);
+ Connect(layout, SONG_LAYOUT, TYPE_KEY_DOWN);
SParcel parcel;
parcel.ctxtInfo = NULL;
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;
}
ASSERT(m);
if (!focusFlag) {
- m->pHandlerGenlist->UpdateSongList(true);
+ m_UpdateSongList(true);
return;
}
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