From 3a86a5963683a8271e3682aa24fa0010525c7fed Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Mon, 16 Mar 2015 11:50:11 +0900 Subject: [PATCH 01/16] Fix memory crash error (If source is changed in another layout, all song info data are crashed. So these data should be updated) Change-Id: Iba07e49647cecfb69c2a59c864617ffef0f3c024 Signed-off-by: Kim Tae Soo --- src/views/song-layout.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index 34e73f8..cad5988 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -601,6 +601,7 @@ void CSongLayout::t_OnShow(void) ASSERT(m); evas_object_show(Layout()); + m_UpdateSongList(false); if (!m->uri) return; -- 2.7.4 From dc8fe641bd05b54937b8473b25c4eb083fa76be7 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Mon, 16 Mar 2015 14:09:39 +0900 Subject: [PATCH 02/16] Move SetCurrentAlbum / CurrentAlbum function from CMusicController to CAlbumSongLayout Change-Id: I80e0c494af1b5393c5be96322ec2954f47f5659c Signed-off-by: Kim Tae Soo --- include/album-songs-layout.h | 3 +++ include/music-controller.h | 4 ---- src/playback/music-controller.cpp | 28 ---------------------- src/views/album-layout.cpp | 10 ++++---- src/views/album-songs-layout.cpp | 49 +++++++++++++++++++++++++++++++-------- 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/include/album-songs-layout.h b/include/album-songs-layout.h index c26dbf5..86b2f36 100644 --- a/include/album-songs-layout.h +++ b/include/album-songs-layout.h @@ -66,6 +66,9 @@ public: bool Create(CLayoutMgr *mgr); virtual void Destroy(void); + void SetCurrentAlbum(CAlbumInfo *albumInfo); + CAlbumInfo*CurrentAlbum(void); + 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/include/music-controller.h b/include/music-controller.h index 0b29bd9..d2a7cd1 100644 --- a/include/music-controller.h +++ b/include/music-controller.h @@ -91,11 +91,7 @@ public: bool GetPosition(int *const milseconds); bool SetCurrentSong(char *mediaid); - bool GetCurrentSong(CSongInfo **const sinfo); - bool SetCurrentAlbum(CAlbumInfo *alinfo); - - CAlbumInfo *CurrentAlbum(void); bool UpdatePlaylist(Eina_List *slist, int addmode); bool EmptyPlaylist(void); diff --git a/src/playback/music-controller.cpp b/src/playback/music-controller.cpp index 7ae4712..a87f470 100644 --- a/src/playback/music-controller.cpp +++ b/src/playback/music-controller.cpp @@ -825,34 +825,6 @@ bool CMusicController::SetCurrentSong(char *mediaid) } -CAlbumInfo *CMusicController::CurrentAlbum(void) -{ - if (!m) - return NULL; - - return m->alinfo; -} - - -bool CMusicController::SetCurrentAlbum(CAlbumInfo *alinfo) -{ - if (!m) - return false; - - if (alinfo) - m->alinfo->Duplicate(alinfo); - else { - CAlbumInfo *emptyInfo = new CAlbumInfo; - emptyInfo->Create(); - m->alinfo->Duplicate(emptyInfo); - emptyInfo->Destroy(); - delete emptyInfo; - } - - return true; -} - - bool CMusicController::SetPlayState(EPlayStatus state) { ASSERT(FlagCreate()); diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index 2770396..d07aa4b 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -232,8 +232,7 @@ void CAlbumLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, con return; } - m->mhandle->SetCurrentAlbum(itinfo->alinfo); - + m->layoutAlbumSongs->SetCurrentAlbum(itinfo->alinfo); m_ShowAlbumSongs(); } @@ -513,7 +512,7 @@ void CAlbumLayout::t_OnShow(void) itinfo = m_FindItemInfoById(m->it_infolist, atoi(m->album_id)); if (itinfo) { - m->mhandle->SetCurrentAlbum(itinfo->alinfo); + m->layoutAlbumSongs->SetCurrentAlbum(itinfo->alinfo); m_ShowAlbumSongs(); return; } @@ -536,12 +535,13 @@ void CAlbumLayout::Update(bool focusFlag) return; } - alinfo = m->mhandle->CurrentAlbum(); + alinfo = m->layoutAlbumSongs->CurrentAlbum(); if (alinfo) { id = alinfo->AlbumId(); itinfo = m_FindItemInfoById(m->it_infolist, id); if (itinfo) { - m->mhandle->SetCurrentAlbum(NULL); + m->layoutAlbumSongs->SetCurrentAlbum(NULL); + elm_gengrid_item_show(itinfo->item, ELM_GENGRID_ITEM_SCROLLTO_IN); elm_object_item_focus_set(itinfo->item, EINA_TRUE); diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index 0daa036..685137c 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -66,6 +66,7 @@ struct SAlbumSongsLayout { CMusicController* mhandle; CLayoutMgr *mgr; CViewMgr *vmgr; + CAlbumInfo *alinfo; SContentInfo *ctxtinfo; Eina_List *slist; Eina_List *it_infolist; @@ -250,7 +251,6 @@ void CAlbumSongsLayout::m_UpdateSongList(void) SAlbumSongsItemInfo *itinfo = NULL; Elm_Object_Item *item = NULL; int dur = 0; - CAlbumInfo *alinfo = NULL; if (!m->songlist || !m->item_class) return; @@ -258,8 +258,7 @@ void CAlbumSongsLayout::m_UpdateSongList(void) /* Remove existing songlist and prepare afresh */ m_EmptySongList(); - alinfo = m->mhandle->CurrentAlbum(); - if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) { + if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, m->alinfo, &(m->slist))) { _ERR(" Fetching song list from media failed "); return; } @@ -361,7 +360,6 @@ void CAlbumSongsLayout::m_CreateTopSection(void) Evas_Object *img = NULL; char *path = NULL; char buf[MAX_LENGTH]; - CAlbumInfo *alinfo = NULL; SBtnInfo btninfo[TOTAL_ADD_BTNS]; Evas_Object *layout = Layout(); @@ -413,11 +411,8 @@ void CAlbumSongsLayout::m_CreateTopSection(void) } elm_object_focus_set(btn[0], EINA_TRUE); - alinfo = m->mhandle->CurrentAlbum(); - if (!alinfo) - return; - path = alinfo->ThumbnailPath(); + path = m->alinfo->ThumbnailPath(); if (path) { elm_image_file_set(thumb, path, NULL); elm_image_aspect_fixed_set(thumb, EINA_FALSE); @@ -432,9 +427,9 @@ void CAlbumSongsLayout::m_CreateTopSection(void) elm_object_part_content_set(layout, MUSIC_PART_ALBUM_THUMB, thumb); elm_object_part_text_set(layout, MUSIC_PART_ALBUM_NAME, - alinfo->Name()); + m->alinfo->Name()); elm_object_part_text_set(layout, MUSIC_PART_ALBUM_ARTIST, - alinfo->Artist()); + m->alinfo->Artist()); snprintf(buf, sizeof(buf), "%d", eina_list_count(m->slist)); elm_object_part_text_set(layout, MUSIC_PART_ALBUM_SONGCOUNT, buf); @@ -551,6 +546,7 @@ bool CAlbumSongsLayout::Create(CLayoutMgr *mgr) m->vmgr = vmgr; m->mhandle = mhandle; m->mgr = mgr; + m->alinfo = new CAlbumInfo; Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN); @@ -561,6 +557,10 @@ void CAlbumSongsLayout::Destroy(void) { ASSERT(m); + if (m->alinfo->FlagCreate()) + m->alinfo->Destroy(); + delete m->alinfo; + m_EmptySongList(); CExtBaseLayout::Destroy(); evas_object_del(Layout()); @@ -571,6 +571,35 @@ void CAlbumSongsLayout::Destroy(void) } +void CAlbumSongsLayout::SetCurrentAlbum(CAlbumInfo *albumInfo) +{ + ASSERT(m); + + if (m->alinfo->FlagCreate()) + m->alinfo->Destroy(); + + m->alinfo->Create(); + + if (albumInfo) + m->alinfo->Duplicate(albumInfo); + else { + CAlbumInfo *emptyInfo = new CAlbumInfo; + emptyInfo->Create(); + m->alinfo->Duplicate(emptyInfo); + emptyInfo->Destroy(); + delete emptyInfo; + } +} + + +CAlbumInfo* CAlbumSongsLayout::CurrentAlbum(void) +{ + ASSERT(m); + + return m->alinfo; +} + + void CAlbumSongsLayout::t_OnShow(void) { ASSERT(m); -- 2.7.4 From f01451c550ea6dd315df4b5c7338519f1f7db2af Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Mon, 16 Mar 2015 15:17:57 +0900 Subject: [PATCH 03/16] Apply ASSERT + Code refactoring Change-Id: Ica842d5e84087a9cfe45678f1f7a7b3acdcde0e2 Signed-off-by: Kim Tae Soo --- include/SongStorage.h | 2 +- include/music-controller.h | 2 + src/data/SongStorage.cpp | 8 +- src/data/mediadata.cpp | 2 +- src/playback/music-controller.cpp | 156 +++++++++++++++++--------------------- 5 files changed, 78 insertions(+), 92 deletions(-) diff --git a/include/SongStorage.h b/include/SongStorage.h index 02318d2..b95fd6f 100644 --- a/include/SongStorage.h +++ b/include/SongStorage.h @@ -74,7 +74,7 @@ class CPlaylistSongStorage : public CSongStorage { public: CPlaylistSongStorage() { t_type = PLAYLIST_SONG_STORAGE; } - bool Update(CCategoryInfo *catinfo, filter_h filter); + bool Update(CCategoryInfo *catinfo); }; class CSingleSongStorage : public CSongStorage { diff --git a/include/music-controller.h b/include/music-controller.h index d2a7cd1..498017a 100644 --- a/include/music-controller.h +++ b/include/music-controller.h @@ -62,6 +62,8 @@ private: private: static void sm_CbPlaybackCompletion(void *data); void m_OnPlaybackCompletion(void); + static void sm_CbContentUpdated(void *dt); + void m_OnContentUpdated(void); protected: bool t_PlayNext(int direction, int playnext_type); diff --git a/src/data/SongStorage.cpp b/src/data/SongStorage.cpp index 013fd21..aeeec0c 100644 --- a/src/data/SongStorage.cpp +++ b/src/data/SongStorage.cpp @@ -257,6 +257,8 @@ bool CSongsSongStorage::Update(filter_h filter) bool CAlbumSongStorage::Update(CAlbumInfo *alinfo, filter_h filter) { + ASSERT(alinfo); + t_filter = filter; Delete(); @@ -267,6 +269,8 @@ bool CAlbumSongStorage::Update(CAlbumInfo *alinfo, filter_h filter) bool CFolderSongStorage::Update(CFolderInfo *finfo, filter_h filter) { + ASSERT(finfo); + t_filter = filter; Delete(); @@ -275,9 +279,9 @@ bool CFolderSongStorage::Update(CFolderInfo *finfo, filter_h filter) } -bool CPlaylistSongStorage::Update(CCategoryInfo *catinfo, filter_h filter) +bool CPlaylistSongStorage::Update(CCategoryInfo *catinfo) { - t_filter = filter; + ASSERT(catinfo); Delete(); t_GetSongList(catinfo); diff --git a/src/data/mediadata.cpp b/src/data/mediadata.cpp index d534bdf..d0d3d99 100644 --- a/src/data/mediadata.cpp +++ b/src/data/mediadata.cpp @@ -502,7 +502,7 @@ Eina_List *CMediadata::Medialist(int source_type, int listType, void *info) return m->storagePlaylist->List(); case LIST_TYPE_PLAYLISTS_SONG: - m->storagePlaylistSong->Update((CCategoryInfo *)info, m->filter); + m->storagePlaylistSong->Update((CCategoryInfo *)info); return m->storagePlaylistSong->List(); default: diff --git a/src/playback/music-controller.cpp b/src/playback/music-controller.cpp index a87f470..6a231e9 100644 --- a/src/playback/music-controller.cpp +++ b/src/playback/music-controller.cpp @@ -46,7 +46,7 @@ struct SMusicController { EShuffleStatus stateShuffle; ERepeatStatus repeatstate; - struct SCbInfo *cbinfo; + SCbInfo *cbinfo; SMusicController() { memset(this, 0, sizeof(SMusicController)); @@ -101,7 +101,7 @@ void IMusicControllerListener::sm_CbUpdateContent(void *cookie) static void _run_callback(SMusicController *m, int type) { Eina_List *l; - struct SCbInfo *cbinfo; + SCbInfo *cbinfo; void *obj; if (!m) @@ -170,7 +170,7 @@ void CMusicController::m_OnPlaybackCompletion(void) { bool r; Eina_List *l; - struct SCbInfo *cbinfo; + SCbInfo *cbinfo; void *obj; r = t_PlayNext(DIR_NEXT, E_ON_COMPLETE); @@ -185,25 +185,28 @@ void CMusicController::m_OnPlaybackCompletion(void) } -static void _content_update_cb(void *dt) +void CMusicController::sm_CbContentUpdated(void *dt) { - SMusicController *mhandle; - Eina_List *l; - struct SCbInfo *cbinfo; - void *obj; + CMusicController *root = (CMusicController *)dt; + if (root) + root->m_OnContentUpdated(); +} - if (!dt) - return; - mhandle = (SMusicController *)dt; +void CMusicController::m_OnContentUpdated(void) +{ + Eina_List *l; + SCbInfo *cbinfo; + void *obj; - EINA_LIST_FOREACH(mhandle->elListener, l, obj) { + EINA_LIST_FOREACH(m->elListener, l, obj) { cbinfo = (SCbInfo *)obj; if (cbinfo->type == E_CONTENT_UPDATE && cbinfo->cb) cbinfo->cb(cbinfo->data); } } + SMusicController *CMusicController::t_Create(void) { SMusicController *mhandle = NULL; @@ -224,7 +227,7 @@ SMusicController *CMusicController::t_Create(void) mhandle->initial_index = 0; CInfo::SetSortType(E_SORT_TITLE_A_Z); CInfo::SetSourceType(SOURCE_TYPE_ALL); - mhandle->cbinfo = mhandle->pMediadata->AddCallback(E_CONTENT_UPDATE, _content_update_cb, mhandle); + mhandle->cbinfo = mhandle->pMediadata->AddCallback(E_CONTENT_UPDATE, sm_CbContentUpdated, this); } _CHECK_FAIL{ CUsbConnectionListener::Destroy(); } @@ -264,7 +267,7 @@ bool CMusicController::Initialize(void) void CMusicController::t_Destroy(void) { - struct SCbInfo *cbinfo; + SCbInfo *cbinfo; void *obj; CUsbConnectionListener::Destroy(); @@ -317,11 +320,8 @@ CMusicController* CMusicController::GetInstance(void) bool CMusicController::UpdatePlaylist(Eina_List *slist, int addmode) { - if (!m) - return false; - - if (!slist) - return false; + ASSERT(m); + ASSERT(slist); if (m->pPlaylist->FlagCreate()) m->pPlaylist->Update(slist, addmode); @@ -335,11 +335,9 @@ bool CMusicController::UpdatePlaylist(Eina_List *slist, int addmode) bool CMusicController::AddListener(IMusicControllerListener *listener) { + ASSERT(m); ASSERT(listener); - if (!m) - return false; - m->elListener = eina_list_append(m->elListener, listener); return true; @@ -348,11 +346,9 @@ bool CMusicController::AddListener(IMusicControllerListener *listener) bool CMusicController::RemoveListener(IMusicControllerListener *listener) { + ASSERT(m); ASSERT(listener); - if (!m) - return false; - m->elListener = eina_list_remove(m->elListener, listener); return true; @@ -361,8 +357,7 @@ bool CMusicController::RemoveListener(IMusicControllerListener *listener) bool CMusicController::Start(void) { - if (!m) - return false; + ASSERT(m); const char *songpath; int index; @@ -428,8 +423,7 @@ error: bool CMusicController::Stop(void) { - if (!m) - return false; + ASSERT(m); if (!m->pPlayback->FlagCreate()) return false; @@ -448,8 +442,7 @@ bool CMusicController::Stop(void) bool CMusicController::GetCurrentSongIndex(int *ind) { - if (!m) - return false; + ASSERT(m); int index; @@ -471,8 +464,7 @@ bool CMusicController::GetCurrentSongIndex(int *ind) bool CMusicController::SetCurrentSongIndex(int index) { - if (!m) - return false; + ASSERT(m); if (!m->pPlaylist->FlagCreate()) { _ERR("NULL received"); @@ -492,8 +484,7 @@ bool CMusicController::SetCurrentSongIndex(int index) bool CMusicController::GetTotalSongs(int *ts) { - if (!m) - return false; + ASSERT(m); int count; @@ -515,8 +506,7 @@ bool CMusicController::GetTotalSongs(int *ts) bool CMusicController::GetSonginfoFromIndex(int index, CSongInfo **const csinfo) { - if (!m) - return false; + ASSERT(m); if (!m->pPlaylist->FlagCreate() || !csinfo) { _ERR("NULL received"); @@ -534,20 +524,23 @@ bool CMusicController::GetSonginfoFromIndex(int index, CSongInfo **const csinfo) bool CMusicController::PlayNextSong(void) { + ASSERT(m); + return t_PlayNext(DIR_NEXT, E_BUTTON_CLICK); } bool CMusicController::PlayPreviousSong(void) { + ASSERT(m); + return t_PlayNext(DIR_PREVIOUS, E_BUTTON_CLICK); } bool CMusicController::PlayIndexSong(int index) { - if (!m) - return false; + ASSERT(m); if (!m->pPlaylist->FlagCreate()) return false; @@ -565,8 +558,7 @@ bool CMusicController::PlayIndexSong(int index) bool CMusicController::Resume(void) { - if (!m) - return false; + ASSERT(m); if (!m->pPlayback->FlagCreate()) return false; @@ -582,8 +574,7 @@ bool CMusicController::Resume(void) bool CMusicController::Pause(void) { - if (!m) - return false; + ASSERT(m); if (!m || !m->pPlayback->FlagCreate()) return false; @@ -599,8 +590,7 @@ bool CMusicController::Pause(void) bool CMusicController::SetPosition(int milseconds) { - if (!m) - return false; + ASSERT(m); if (!m->pPlayback->FlagCreate()) return false; @@ -614,10 +604,9 @@ bool CMusicController::SetPosition(int milseconds) bool CMusicController::GetPosition(int *const milseconds) { - if (!m) - return false; + ASSERT(m); - if (!m || !m->pPlayback->FlagCreate()) + if (!m->pPlayback->FlagCreate()) return false; if (!m->pPlayback->GetPosition(milseconds)) @@ -629,8 +618,8 @@ bool CMusicController::GetPosition(int *const milseconds) bool CMusicController::RemoveSong(CSongInfo *sinfo, int index) { - if (!m) - return false; + ASSERT(m); + ASSERT(sinfo); int ind; @@ -656,8 +645,7 @@ bool CMusicController::RemoveSong(CSongInfo *sinfo, int index) bool CMusicController::EmptyPlaylist(void) { - if (!m) - return false; + ASSERT(m); if (!m->pPlaylist->FlagCreate()) return false; @@ -670,8 +658,7 @@ bool CMusicController::EmptyPlaylist(void) bool CMusicController::GetCurrentSong(CSongInfo **const sinfo) { - if (!m) - return false; + ASSERT(m); int index; @@ -694,8 +681,8 @@ bool CMusicController::GetCurrentSong(CSongInfo **const sinfo) CSongInfo *CMusicController::MediaSongByUri(char *uri) { - if (!m) - return false; + ASSERT(m); + ASSERT(uri); CSongInfo *sinfo; @@ -709,7 +696,7 @@ CSongInfo *CMusicController::MediaSongByUri(char *uri) bool CMusicController::MediaGetList(int EListType, void *info, Eina_List **list) { - ASSERT(FlagCreate()); + ASSERT(m); Eina_List *mlist; @@ -725,7 +712,9 @@ bool CMusicController::MediaGetList(int EListType, void *info, Eina_List **list) bool CMusicController::MediaInsertPlaylist(const char *name, Eina_List *idlist) { - ASSERT(FlagCreate()); + ASSERT(m); + ASSERT(name); + ASSERT(idlist); return m->pMediadata->Alloc(name, idlist); } @@ -733,10 +722,8 @@ bool CMusicController::MediaInsertPlaylist(const char *name, Eina_List *idlist) bool CMusicController::MediaExistPlaylist(const char *name) { - ASSERT(FlagCreate()); - - if (!name) - return false; + ASSERT(m); + ASSERT(name); return m->pMediadata->ExistPlaylist(name); } @@ -744,7 +731,7 @@ bool CMusicController::MediaExistPlaylist(const char *name) bool CMusicController::MediaDeletePlaylist(int id) { - ASSERT(FlagCreate()); + ASSERT(m); return m->pMediadata->Delete(id); } @@ -752,10 +739,8 @@ bool CMusicController::MediaDeletePlaylist(int id) bool CMusicController::MediaRenamePlaylist(int id, const char *name) { - ASSERT(FlagCreate()); - - if (!name) - return false; + ASSERT(m); + ASSERT(name); return m->pMediadata->Rename(id, name); } @@ -763,10 +748,8 @@ bool CMusicController::MediaRenamePlaylist(int id, const char *name) bool CMusicController::MediaAddmediaPlaylist(int id, Eina_List *idlist) { - ASSERT(FlagCreate()); - - if (!idlist) - return false; + ASSERT(m); + ASSERT(idlist); return m->pMediadata->Insert(id, idlist); } @@ -774,10 +757,8 @@ bool CMusicController::MediaAddmediaPlaylist(int id, Eina_List *idlist) bool CMusicController::MediaRemovemediaPlaylist(int id, Eina_List *idlist) { - ASSERT(FlagCreate()); - - if (!idlist) - return false; + ASSERT(m); + ASSERT(idlist); return m->pMediadata->Remove(id, idlist); } @@ -785,16 +766,14 @@ bool CMusicController::MediaRemovemediaPlaylist(int id, Eina_List *idlist) bool CMusicController::MediaAddsongsPlaylist(int lid, Eina_List *list) { - ASSERT(FlagCreate()); + ASSERT(m); + ASSERT(list); Eina_List *idlist, *l; CSongInfo *sinfo; void *obj; char *id; - if (!list) - return false; - idlist = NULL; EINA_LIST_FOREACH(list, l, obj) { sinfo = (CSongInfo *)obj; @@ -814,9 +793,10 @@ bool CMusicController::MediaAddsongsPlaylist(int lid, Eina_List *list) bool CMusicController::SetCurrentSong(char *mediaid) { - ASSERT(FlagCreate()); + ASSERT(m); + ASSERT(mediaid); - if (!m->pPlaylist->FlagCreate() || !mediaid) + if (!m->pPlaylist->FlagCreate()) return false; m->pPlaylist->SetCurrentSong(mediaid); @@ -827,7 +807,7 @@ bool CMusicController::SetCurrentSong(char *mediaid) bool CMusicController::SetPlayState(EPlayStatus state) { - ASSERT(FlagCreate()); + ASSERT(m); m->statePlay = state; @@ -837,7 +817,7 @@ bool CMusicController::SetPlayState(EPlayStatus state) EPlayStatus CMusicController::PlayState(void) { - ASSERT(FlagCreate()); + ASSERT(m); return m->statePlay; } @@ -845,7 +825,7 @@ EPlayStatus CMusicController::PlayState(void) bool CMusicController::SetShuffleState(EShuffleStatus state) { - ASSERT(FlagCreate()); + ASSERT(m); m->stateShuffle = state; if (state && m->pPlaylist->FlagCreate()) @@ -857,7 +837,7 @@ bool CMusicController::SetShuffleState(EShuffleStatus state) EShuffleStatus CMusicController::ShuffleState(void) { - ASSERT(FlagCreate()); + ASSERT(m); return m->stateShuffle; } @@ -865,7 +845,7 @@ EShuffleStatus CMusicController::ShuffleState(void) bool CMusicController::SetRepeatState(ERepeatStatus state) { - ASSERT(FlagCreate()); + ASSERT(m); m->repeatstate = state; @@ -875,7 +855,7 @@ bool CMusicController::SetRepeatState(ERepeatStatus state) ERepeatStatus CMusicController::RepeatState(void) { - ASSERT(FlagCreate()); + ASSERT(m); return m->repeatstate; } @@ -887,7 +867,7 @@ void CMusicController::OnConnect(void) return; Eina_List *l; - struct SCbInfo *cbinfo; + SCbInfo *cbinfo; void *obj; if (CInfo::SourceType() == SOURCE_TYPE_USB) { -- 2.7.4 From ee7b3d7a1d7f3585c40a9d3f0df2395a822a9544 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 10:01:01 +0900 Subject: [PATCH 04/16] Apply error checking macro to Create functions Change-Id: I8e8edc4a9d034f06ce9c260359d93f8edd30197e Signed-off-by: Kim Tae Soo --- include/category-layout.h | 2 + src/views/album-layout.cpp | 29 +++--- src/views/album-songs-layout.cpp | 111 ++++++++------------- src/views/category-layout.cpp | 192 ++++++++++++++---------------------- src/views/category-songs-layout.cpp | 109 +++++++------------- src/views/folder-layout.cpp | 125 +++++++++-------------- src/views/song-layout.cpp | 142 ++++++++++---------------- 7 files changed, 266 insertions(+), 444 deletions(-) diff --git a/include/category-layout.h b/include/category-layout.h index 848eee2..9697f90 100644 --- a/include/category-layout.h +++ b/include/category-layout.h @@ -114,6 +114,8 @@ private: void m_EmptyLayout(bool sort_flag); void m_ShowCategorySongs(void); + const char *m_CategorySongLayoutId(void); + protected: bool t_SetEdje(const char *layout); void t_UpdateLayout(bool sort_flag); diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index d07aa4b..a56e0a6 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -411,15 +411,17 @@ void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag) bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId) { ASSERT(!m); + ASSERT(mgr); - Evas_Object *base = NULL; - Evas_Object *win = NULL; - Evas_Object *layout = NULL; - CMusicController *mhandle = NULL; - CViewMgr *vmgr = NULL; - SParcel parcel; + _CREATE_BEGIN{ + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + CAlbumSongsLayout *layoutAlbumSongs = NULL; + SParcel parcel; - _CREATE_BEGIN { _CHECK(m = new SAlbumLayout) _CHECK(vmgr = CViewMgr::GetInstance()) _CHECK(base = mgr->Base()) @@ -427,11 +429,11 @@ bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId) _CHECK(mhandle = CMusicController::GetInstance()) _CHECK(layout = CCommonUI::AddBase(base, MUSIC_ALBUM_LAYOUT)) _CHECK(CExtBaseLayout::Create(layout)) - _CHECK(m->layoutAlbumSongs = new CAlbumSongsLayout(MUSIC_ALBUM_SONGS_LAYOUT)) - _CHECK(m->layoutAlbumSongs->Create(mgr)) - _CHECK(mgr->AddLayout(m->layoutAlbumSongs)) + _CHECK(layoutAlbumSongs = new CAlbumSongsLayout(MUSIC_ALBUM_SONGS_LAYOUT)) + _CHECK(layoutAlbumSongs->Create(mgr)) + _CHECK(mgr->AddLayout(layoutAlbumSongs)) - _WHEN_SUCCESS { + _WHEN_SUCCESS{ if (albumId) { m->album_id = new char[strlen(albumId) + 1]; strcpy(m->album_id, albumId); @@ -446,6 +448,7 @@ bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId) m->lmgr = mgr; m->callback.cbHandleEmptyStatus = NULL; m->callback.cookie = NULL; + m->layoutAlbumSongs = layoutAlbumSongs; m_CreateAlbumGrid(); Connect(layout, ALBUM_LAYOUT, TYPE_KEY_DOWN); @@ -457,7 +460,7 @@ bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId) m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } - _CHECK_FAIL{} + _CHECK_FAIL{ mgr->RemoveLayout(layoutAlbumSongs); } _CHECK_FAIL{ m->layoutAlbumSongs->Destroy(); } _CHECK_FAIL{ delete m->layoutAlbumSongs; } _CHECK_FAIL{ CExtBaseLayout::Destroy(); } @@ -476,6 +479,8 @@ void CAlbumLayout::Destroy(void) { ASSERT(m); + Disconnect(Layout()); + m->lmgr->RemoveLayout(m->layoutAlbumSongs); m->layoutAlbumSongs->Destroy(); delete m->layoutAlbumSongs; diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index 685137c..6d43fed 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -476,79 +476,44 @@ void CAlbumSongsLayout::m_CreateSongList(void) bool CAlbumSongsLayout::Create(CLayoutMgr *mgr) { ASSERT(!m); + ASSERT(mgr); + + _CREATE_BEGIN{ + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + CAlbumInfo *alinfo = NULL; + + _CHECK(m = new SAlbumSongsLayout) + _CHECK(vmgr = CViewMgr::GetInstance()) + _CHECK(base = mgr->Base()) + _CHECK(win = vmgr->Window()) + _CHECK(mhandle = CMusicController::GetInstance()) + _CHECK(layout = CCommonUI::AddBase(base, MUSIC_ALBUM_SONGS_LAYOUT)) + _CHECK(CExtBaseLayout::Create(layout)) + _CHECK(alinfo = new CAlbumInfo) + + _WHEN_SUCCESS{ + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->mgr = mgr; + m->alinfo = alinfo; + Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN); + } - Evas_Object *base = NULL; - Evas_Object *win = NULL; - Evas_Object *layout = NULL; - CMusicController *mhandle; - CViewMgr *vmgr; - - if (!mgr) - return false; - - m = new SAlbumSongsLayout; - if (!m) { - _ERR(" calloc failed "); - return false; - } - - vmgr = CViewMgr::GetInstance(); - if (!vmgr) { - _ERR(" get view mgr failed "); - delete m; - m = NULL; - return false; - } - - base = mgr->Base(); - if (!base) { - _ERR(" get base failed "); - delete m; - m = NULL; - return false; - } - - win = vmgr->Window(); - if (!win) { - _ERR(" vimewmgr get win failed "); - delete m; - m = NULL; - return false; - } - - mhandle = CMusicController::GetInstance(); - if (!mhandle) { - _ERR(" music controller get music instance failed "); - delete m; - m = NULL; - return false; - } - - layout = CCommonUI::AddBase(base, MUSIC_ALBUM_SONGS_LAYOUT); - if (!layout) { - _ERR(" get layout failed "); - delete m; - m = NULL; - return false; - } - - bool r = CExtBaseLayout::Create(layout); - if (!r) { - _ERR(" CBaseLayout creation failed "); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - m->win = win; - m->base = base; - m->vmgr = vmgr; - m->mhandle = mhandle; - m->mgr = mgr; - m->alinfo = new CAlbumInfo; - - Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN); + _CHECK_FAIL{ delete alinfo; } + _CHECK_FAIL{ CExtBaseLayout::Destroy(); } + _CHECK_FAIL{ evas_object_del(layout); } + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{ delete m; m = NULL; } + } _CREATE_END_AND_CATCH{ return false; } return true; } @@ -557,6 +522,8 @@ void CAlbumSongsLayout::Destroy(void) { ASSERT(m); + Disconnect(Layout()); + if (m->alinfo->FlagCreate()) m->alinfo->Destroy(); delete m->alinfo; diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index ec2a074..f32efec 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -986,6 +986,20 @@ void CCategoryLayout::m_ShowCategorySongs(void) } +const char *CCategoryLayout::m_CategorySongLayoutId(void) +{ + const char *layoutId; + + if (!strcmp(LayoutId(), MUSIC_CATEGORY_ARTIST_LAYOUT)) + layoutId = MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT; + else if (!strcmp(LayoutId(), MUSIC_CATEGORY_GENRE_LAYOUT)) + layoutId = MUSIC_CATEGORY_GENRE_SONGS_LAYOUT; + else if (!strcmp(LayoutId(), MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) + layoutId = MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT; + + return layoutId; +} + bool CCategoryLayout::t_SetEdje(const char *szLayout) { @@ -1083,127 +1097,64 @@ void CCategoryLayout::t_UpdateLayoutWithFocus(void) bool CCategoryLayout::Create(CLayoutMgr *mgr) { ASSERT(!m); + ASSERT(mgr); + + _CREATE_BEGIN{ + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *pMusicController = NULL; + CViewMgr *vmgr = NULL; + CEntryPopup *popup = NULL; + CCategorySongsLayout *layoutCatSongs = NULL; + const char *catSongLayoutId = NULL; + + _CHECK(m = new SCategoryLayout) + _CHECK(vmgr = CViewMgr::GetInstance()) + _CHECK(base = mgr->Base()) + _CHECK(win = vmgr->Window()) + _CHECK(pMusicController = CMusicController::GetInstance()) + _CHECK(layout = elm_layout_add(base)) + _CHECK(CExtBaseLayout::Create(layout)) + _CHECK(popup = new CEntryPopup) + _CHECK(catSongLayoutId = m_CategorySongLayoutId()) + _CHECK(layoutCatSongs = new CCategorySongsLayout(catSongLayoutId)) + _CHECK(layoutCatSongs->Create(mgr, this)) + _CHECK(mgr->AddLayout(layoutCatSongs)) + + _WHEN_SUCCESS{ + memset(&t, 0, sizeof(SCategoryLayoutProtected)); + + m->win = win; + t.base = base; + m->vmgr = vmgr; + m->pMusicController = pMusicController; + m->lmgr = mgr; + t.depth = E_DEPTH_CATEGORY; + m->callback.cbHandleEmptyStatus = NULL; + m->callback.cookie = NULL; + t.epopup = popup; + m->catSongLayoutId = catSongLayoutId; + m->layoutCatSongs = layoutCatSongs; + + t_UpdateLayout(false); + + Connect(Layout(), CATEGORY_LAYOUT, TYPE_KEY_DOWN); + } - Evas_Object *base = NULL; - Evas_Object *win = NULL; - Evas_Object *layout = NULL; - CMusicController *pMusicController = NULL; - CViewMgr *vmgr = NULL; - - if (!mgr) - return false; - - m = new SCategoryLayout; - if (!m) { - _ERR(" calloc failed "); - return false; - } - - memset(&t, 0, sizeof(SCategoryLayoutProtected)); - - vmgr = CViewMgr::GetInstance(); - if (!vmgr) { - _ERR(" get view mgr failed "); - delete m; - m = NULL; - return false; - } - - base = mgr->Base(); - if (!base) { - _ERR(" get base failed "); - delete m; - m = NULL; - return false; - } - - win = vmgr->Window(); - if (!win) { - _ERR(" vimewmgr get win failed "); - delete m; - m = NULL; - return false; - } - - pMusicController = CMusicController::GetInstance(); - if (!pMusicController) { - _ERR(" music controller get music instance failed "); - delete m; - m = NULL; - return false; - } - - layout = elm_layout_add(base); - if (!layout) { - _ERR(" layout creation failed "); - delete m; - m = NULL; - return false; - } - - bool r = CExtBaseLayout::Create(layout); - if (!r) { - _ERR(" CBaseLayout creation failed "); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - t.epopup = new CEntryPopup; - if (!t.epopup) { - _ERR(" CEntryPopup creation failed "); - CExtBaseLayout::Destroy(); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - if (!strcmp(LayoutId(), MUSIC_CATEGORY_ARTIST_LAYOUT)) - m->catSongLayoutId = MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT; - else if (!strcmp(LayoutId(), MUSIC_CATEGORY_GENRE_LAYOUT)) - m->catSongLayoutId = MUSIC_CATEGORY_GENRE_SONGS_LAYOUT; - else if (!strcmp(LayoutId(), MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) - m->catSongLayoutId = MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT; - - m->layoutCatSongs = new CCategorySongsLayout((const char *)m->catSongLayoutId); - if (!m->layoutCatSongs) { - _ERR(" Memory alloc failed "); - delete t.epopup; - CExtBaseLayout::Destroy(); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - r = m->layoutCatSongs->Create(mgr, this); - if (!r) { - _ERR(" CCategorySongsLayout creation failed "); - delete m->layoutCatSongs; - delete t.epopup; - CExtBaseLayout::Destroy(); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - mgr->AddLayout(m->layoutCatSongs); - - m->win = win; - t.base = base; - m->vmgr = vmgr; - m->pMusicController = pMusicController; - m->lmgr = mgr; - t.depth = E_DEPTH_CATEGORY; - m->callback.cbHandleEmptyStatus = NULL; - m->callback.cookie = NULL; - - t_UpdateLayout(false); - - Connect(Layout(), CATEGORY_LAYOUT, TYPE_KEY_DOWN); + _CHECK_FAIL{ mgr->RemoveLayout(layoutCatSongs); } + _CHECK_FAIL{ m->layoutCatSongs->Destroy(); } + _CHECK_FAIL{ delete layoutCatSongs; } + _CHECK_FAIL{} + _CHECK_FAIL{ delete popup; } + _CHECK_FAIL{ CExtBaseLayout::Destroy(); } + _CHECK_FAIL{ evas_object_del(layout); } + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{ delete m; m = NULL; } + } _CREATE_END_AND_CATCH{ return false; } return true; } @@ -1215,6 +1166,7 @@ void CCategoryLayout::Destroy(void) Disconnect(Layout()); + m->lmgr->RemoveLayout(m->layoutCatSongs); m->layoutCatSongs->Destroy(); delete m->layoutCatSongs; diff --git a/src/views/category-songs-layout.cpp b/src/views/category-songs-layout.cpp index 4da5a47..986c0fd 100644 --- a/src/views/category-songs-layout.cpp +++ b/src/views/category-songs-layout.cpp @@ -844,79 +844,42 @@ bool CCategorySongsLayout::m_SetEdje(const char *szLayout) bool CCategorySongsLayout::Create(CLayoutMgr *mgr, CCategoryLayout *parent) { ASSERT(!m); + ASSERT(mgr); + + _CREATE_BEGIN{ + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + + _CHECK(m = new SCategorySongsLayout) + _CHECK(vmgr = CViewMgr::GetInstance()) + _CHECK(base = mgr->Base()) + _CHECK(win = vmgr->Window()) + _CHECK(mhandle = CMusicController::GetInstance()) + _CHECK(layout = CCommonUI::AddBase(base, MUSIC_CATEGORY_SONGS_LAYOUT)) + _CHECK(CExtBaseLayout::Create(layout)) + + _WHEN_SUCCESS{ + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->mgr = mgr; + m->parent = parent; + + Connect(layout, CATEGORY_SONGS_LAYOUT, TYPE_KEY_DOWN); + } - Evas_Object *base = NULL; - Evas_Object *win = NULL; - Evas_Object *layout = NULL; - CMusicController *mhandle; - CViewMgr *vmgr; - - if (!mgr) - return false; - - m = new SCategorySongsLayout; - if (!m) { - _ERR(" calloc failed "); - return false; - } - - vmgr = CViewMgr::GetInstance(); - if (!vmgr) { - _ERR(" get view mgr failed "); - delete m; - m = NULL; - return false; - } - - base = mgr->Base(); - if (!base) { - _ERR(" get base failed "); - delete m; - m = NULL; - return false; - } - - win = vmgr->Window(); - if (!win) { - _ERR(" vimewmgr get win failed "); - delete m; - m = NULL; - return false; - } - - mhandle = CMusicController::GetInstance(); - if (!mhandle) { - _ERR(" music controller get music instance failed "); - delete m; - m = NULL; - return false; - } - - layout = CCommonUI::AddBase(base, MUSIC_CATEGORY_SONGS_LAYOUT); - if (!layout) { - _ERR(" get layout failed "); - delete m; - m = NULL; - return false; - } - - bool r = CExtBaseLayout::Create(layout); - if (!r) { - _ERR(" CBaseLayout creation failed "); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - m->win = win; - m->base = base; - m->vmgr = vmgr; - m->mhandle = mhandle; - m->mgr = mgr; - m->parent = parent; - - Connect(layout, CATEGORY_SONGS_LAYOUT, TYPE_KEY_DOWN); + _CHECK_FAIL{ CExtBaseLayout::Destroy(); } + _CHECK_FAIL{ evas_object_del(layout); } + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{ delete m; m = NULL; } + } _CREATE_END_AND_CATCH{ return false; } return true; } @@ -925,6 +888,8 @@ void CCategorySongsLayout::Destroy(void) { ASSERT(m); + Disconnect(Layout()); + m_RemoveFocusIdler(); m_EmptySongList(); CExtBaseLayout::Destroy(); diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index f362152..7061f07 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -717,87 +717,52 @@ void CFolderLayout::m_CreateTopsection(void) bool CFolderLayout::Create(CLayoutMgr *mgr) { ASSERT(!m); + ASSERT(mgr); + + _CREATE_BEGIN{ + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + + _CHECK(m = new SFolderLayout) + _CHECK(vmgr = CViewMgr::GetInstance()) + _CHECK(base = mgr->Base()) + _CHECK(win = vmgr->Window()) + _CHECK(mhandle = CMusicController::GetInstance()) + _CHECK(layout = CCommonUI::AddBase(base, MUSIC_FOLDER_LAYOUT)) + _CHECK(CExtBaseLayout::Create(layout)) + + _WHEN_SUCCESS{ + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->lmgr = mgr; + m->depth = E_DEPTH_FOLDER; + + m_CreateTopsection(); + m_CreateFolderGrid(); + + Connect(layout, FOLDER_LAYOUT, TYPE_KEY_DOWN); - Evas_Object *base = NULL; - Evas_Object *win = NULL; - Evas_Object *layout = NULL; - CMusicController *mhandle = NULL; - CViewMgr *vmgr = NULL; - - if (!mgr) - return false; - - m = new SFolderLayout; - if (!m) { - _ERR(" calloc failed "); - return false; - } - - vmgr = CViewMgr::GetInstance(); - if (!vmgr) { - _ERR(" get view mgr failed "); - delete m; - m = NULL; - return false; - } - - base = mgr->Base(); - if (!base) { - _ERR(" get base failed "); - delete m; - m = NULL; - return false; - } - - win = vmgr->Window(); - if (!win) { - _ERR(" vimewmgr get win failed "); - delete m; - return false; - } - - mhandle = CMusicController::GetInstance(); - if (!mhandle) { - _ERR(" music controller get music instance failed "); - delete m; - m = NULL; - return false; - } - - layout = CCommonUI::AddBase(base, MUSIC_FOLDER_LAYOUT); - if (!layout) { - _ERR(" get layout failed "); - delete m; - return false; - } - - bool r = CExtBaseLayout::Create(layout); - if (!r) { - _ERR(" CBaseLayout creation failed "); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - m->win = win; - m->base = base; - m->vmgr = vmgr; - m->mhandle = mhandle; - m->lmgr = mgr; - m->depth = E_DEPTH_FOLDER; - - m_CreateTopsection(); - m_CreateFolderGrid(); - - Connect(layout, FOLDER_LAYOUT, TYPE_KEY_DOWN); + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_LAYOUT_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + _CHECK_FAIL{ CExtBaseLayout::Destroy(); } + _CHECK_FAIL{ evas_object_del(layout); } + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{ delete m; m = NULL; } + } _CREATE_END_AND_CATCH{ return false; } return true; } @@ -807,6 +772,8 @@ void CFolderLayout::Destroy(void) { ASSERT(m); + Disconnect(Layout()); + m_RemoveFocusIdler(); m_EmptyFolderGrid(false); CExtBaseLayout::Destroy(); diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index cad5988..e97e2d9 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -483,100 +483,62 @@ void CSongLayout::m_CreateSongList(void) bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) { ASSERT(!m); + ASSERT(mgr); + + _CREATE_BEGIN{ + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + + _CHECK(m = new SSongLayout) + _CHECK(vmgr = CViewMgr::GetInstance()) + _CHECK(base = mgr->Base()) + _CHECK(win = vmgr->Window()) + _CHECK(mhandle = CMusicController::GetInstance()) + _CHECK(layout = CCommonUI::AddBase(base, MUSIC_SONG_LAYOUT)) + _CHECK(CExtBaseLayout::Create(layout)) + + _WHEN_SUCCESS{ + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ARTIST_AZ, sm_CbSortArtistAZ); + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ARTIST_ZA, sm_CbSortArtistZA); + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ALBUM_AZ, sm_CbSortAlbumAZ); + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ALBUM_ZA, sm_CbSortAlbumZA); + + if (uri) { + m->uri = new char[strlen(uri) + 1]; + strcpy(m->uri, uri); + } + else + m->uri = NULL; - Evas_Object *base = NULL; - Evas_Object *win = NULL; - Evas_Object *layout = NULL; - CMusicController *mhandle = NULL; - CViewMgr *vmgr = NULL; - - if (!mgr) - return false; - - m = new SSongLayout; - if (!m) { - _ERR(" calloc failed "); - return false; - } - - vmgr = CViewMgr::GetInstance(); - if (!vmgr) { - _ERR(" get view mgr failed "); - delete m; - m = NULL; - return false; - } - - base = mgr->Base(); - if (!base) { - _ERR(" get base failed "); - delete m; - m = NULL; - return false; - } - - win = vmgr->Window(); - if (!win) { - _ERR(" vimewmgr get win failed "); - delete m; - m = NULL; - return false; - } - - mhandle = CMusicController::GetInstance(); - if (!mhandle) { - _ERR(" music controller get music instance failed "); - delete m; - m = NULL; - return false; - } - - layout = CCommonUI::AddBase(base, MUSIC_SONG_LAYOUT); - if (!layout) { - _ERR(" get layout failed "); - delete m; - m = NULL; - return false; - } - - bool r = CExtBaseLayout::Create(layout); - if (!r) { - _ERR(" CBaseLayout creation failed "); - evas_object_del(layout); - delete m; - m = NULL; - return false; - } - - CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ARTIST_AZ, sm_CbSortArtistAZ); - CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ARTIST_ZA, sm_CbSortArtistZA); - CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ALBUM_AZ, sm_CbSortAlbumAZ); - CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ALBUM_ZA, sm_CbSortAlbumZA); - - if (uri) { - m->uri = new char[strlen(uri) + 1]; - strcpy(m->uri, uri); - } - else { - m->uri = NULL; - } + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->mgr = mgr; - m->win = win; - m->base = base; - m->vmgr = vmgr; - m->mhandle = mhandle; - m->mgr = mgr; + m_CreateSongList(); - m_CreateSongList(); + Connect(layout, SONG_LAYOUT, TYPE_KEY_DOWN); - Connect(layout, SONG_LAYOUT, TYPE_KEY_DOWN); + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = MUSIC_SONG_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = MUSIC_SONG_LAYOUT; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + _CHECK_FAIL{ CExtBaseLayout::Destroy(); } + _CHECK_FAIL{ evas_object_del(layout); } + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{ delete m; m = NULL; } + } _CREATE_END_AND_CATCH{ return false; } return true; } @@ -585,6 +547,8 @@ void CSongLayout::Destroy(void) { ASSERT(m); + Disconnect(Layout()); + CExtBaseLayout::Destroy(); evas_object_del(Layout()); -- 2.7.4 From 4d65bfdbb30aea5abb1a32bb691979d183a70d41 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 10:41:42 +0900 Subject: [PATCH 05/16] Apply error checking macro to Create function. Change-Id: I5b3abd80a33f1914b12b16b7142947043bfefd71 Signed-off-by: Kim Tae Soo --- include/base-view.h | 2 + src/views/base-view.cpp | 229 ++++++++++++++++++++++++------------------------ 2 files changed, 115 insertions(+), 116 deletions(-) diff --git a/include/base-view.h b/include/base-view.h index 5a86149..97797c1 100644 --- a/include/base-view.h +++ b/include/base-view.h @@ -64,6 +64,8 @@ private: void m_SetSourceType(void); void m_UpdateCurrentLayout(bool focusFlag); + char *m_Argument(void *data); + protected: virtual void t_OnShow(void); virtual void t_OnHide(void); diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index e519921..faece1f 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -161,14 +161,11 @@ struct SMusicBaseView { CSongLayout *layoutSong; CAlbumLayout *layoutAlbum; - CArtistLayout *layoutArtist; CGenreLayout *layoutGenre; CPlaylistLayout *layoutPlaylists; - CFolderLayout *layoutFolder; - CMusicBaseView *parent; CHandleVolume *pHandleVolume; SMusicBaseView() { @@ -675,126 +672,127 @@ void CMusicBaseView::m_UpdateCurrentLayout(bool focusFlag) } -bool CMusicBaseView::Create(void *data) +char *CMusicBaseView::m_Argument(void *data) { - ASSERT(!m); - - Evas_Object *win = NULL; - CMusicController *mhandle = NULL; - CLayoutMgr *lmgr = NULL; + SArgList *arglist = (SArgList *)data; char *arg = NULL; - m = new SMusicBaseView; - if (!m) { - _ERR(" new for SMusicBaseView failed "); - m = NULL; - return false; - } - - win = CViewMgr::GetInstance()->Window(); - if (!win) { - _ERR(" vimewmgr get win failed "); - delete m; - m = NULL; - return false; - } - - mhandle = CMusicController::GetInstance(); - if (!mhandle) { - _ERR(" music controller get music instance failed "); - delete m; - m = NULL; - return false; - } - - m->base = CCommonUI::AddBase(win, MUSIC_BASE_VIEW); - if (!m->base) { - _ERR(" add base failed "); - delete m; - m = NULL; - return false; - } - - lmgr = new CLayoutMgr; - if (!lmgr) { - evas_object_del(m->base); - delete m; - m = NULL; - return false; - } - - if (!lmgr->Create(m->base, NULL)) { - _ERR(" init layout mgr failed "); - evas_object_del(m->base); - delete m; - m = NULL; - return false; - } - - bool r = CBaseView::Create(data); - if (!r) { - _ERR(" CBaseView Creation failed "); - lmgr->Destroy(); - evas_object_del(m->base); - delete m; - m = NULL; - return false; - } - - m->win = win; - m->mhandle = mhandle; - m->lmgr = lmgr; - m->fresh_view = true; - m->arglist = (SArgList *)data; - m->parent = this; - - m->layoutSong = new CSongLayout(MUSIC_SONG_LAYOUT); - arg = NULL; - if (m->arglist && m->arglist->uri) - arg = m->arglist->uri; - m->layoutSong->Create(m->lmgr, arg); - lmgr->AddLayout(m->layoutSong); - - m->layoutAlbum = new CAlbumLayout(MUSIC_ALBUM_LAYOUT); - arg = NULL; - if (m->arglist && m->arglist->album_id) - arg = m->arglist->album_id; - m->layoutAlbum->Create(m->lmgr, arg); - m->layoutAlbum->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); - lmgr->AddLayout(m->layoutAlbum); - - m->layoutArtist = new CArtistLayout(MUSIC_CATEGORY_ARTIST_LAYOUT); - m->layoutArtist->Create(m->lmgr); - m->layoutArtist->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); - lmgr->AddLayout(m->layoutArtist); - - m->layoutGenre = new CGenreLayout(MUSIC_CATEGORY_GENRE_LAYOUT); - m->layoutGenre->Create(m->lmgr); - m->layoutGenre->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); - lmgr->AddLayout(m->layoutGenre); - - m->layoutPlaylists = new CPlaylistLayout(MUSIC_CATEGORY_PLAYLISTS_LAYOUT); - m->layoutPlaylists->Create(m->lmgr); - m->layoutPlaylists->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); - lmgr->AddLayout(m->layoutPlaylists); - - m->layoutFolder = new CFolderLayout(MUSIC_FOLDER_LAYOUT); - m->layoutFolder->Create(m->lmgr); - lmgr->AddLayout(m->layoutFolder); - - elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT); + if (arglist && arglist->uri) + arg = arglist->uri; + else if (arglist && arglist->album_id) + arg = arglist->album_id; - m_SetSourceType(); + return arg; +} - evas_object_data_set(m->base, BASE_VIEW_DATA, m); - m_CreateFullView(); - m->pHandleVolume->Create(m->base); - m_UpdateFocusSequence(); +bool CMusicBaseView::Create(void *data) +{ + ASSERT(!m); - Connect(m->base, BASE_VIEW, TYPE_KEY_DOWN | TYPE_KEY_UP); + _CREATE_BEGIN{ + Evas_Object *win = NULL; + Evas_Object *base = NULL; + CMusicController *mhandle = NULL; + CLayoutMgr *lmgr = NULL; + CSongLayout *layoutSong = NULL; + CAlbumLayout *layoutAlbum = NULL; + CArtistLayout*layoutArtist = NULL; + CGenreLayout *layoutGenre = NULL; + CPlaylistLayout *layoutPlaylists = NULL; + CFolderLayout *layoutFolder = NULL; + CHandleVolume *handleVolume = NULL; + + _CHECK(m = new SMusicBaseView) + _CHECK(win = CViewMgr::GetInstance()->Window()) + _CHECK(mhandle = CMusicController::GetInstance()) + _CHECK(base = CCommonUI::AddBase(win, MUSIC_BASE_VIEW)) + _CHECK(lmgr = new CLayoutMgr) + _CHECK(lmgr->Create(base, NULL)) + _CHECK(CBaseView::Create(data)) + _CHECK(layoutSong = new CSongLayout(MUSIC_SONG_LAYOUT)) + _CHECK(layoutSong->Create(lmgr, m_Argument(data))) + _CHECK(lmgr->AddLayout(layoutSong)) + _CHECK(layoutAlbum = new CAlbumLayout(MUSIC_ALBUM_LAYOUT)) + _CHECK(layoutAlbum->Create(lmgr, m_Argument(data))) + _CHECK(lmgr->AddLayout(layoutAlbum)) + _CHECK(layoutArtist = new CArtistLayout(MUSIC_CATEGORY_ARTIST_LAYOUT)) + _CHECK(layoutArtist->Create(lmgr)) + _CHECK(lmgr->AddLayout(layoutArtist)) + _CHECK(layoutGenre = new CGenreLayout(MUSIC_CATEGORY_GENRE_LAYOUT)) + _CHECK(layoutGenre->Create(lmgr)) + _CHECK(lmgr->AddLayout(layoutGenre)) + _CHECK(layoutPlaylists = new CPlaylistLayout(MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) + _CHECK(layoutPlaylists->Create(lmgr)) + _CHECK(lmgr->AddLayout(layoutPlaylists)) + _CHECK(layoutFolder = new CFolderLayout(MUSIC_FOLDER_LAYOUT)) + _CHECK(layoutFolder->Create(lmgr)) + _CHECK(lmgr->AddLayout(layoutFolder)) + _CHECK(handleVolume = new CHandleVolume) + _CHECK(handleVolume->Create(base)) + _CHECK(mhandle->AddListener(this)) + + _WHEN_SUCCESS{ + m->base = base; + m->win = win; + m->mhandle = mhandle; + m->lmgr = lmgr; + m->fresh_view = true; + m->arglist = (SArgList *)data; + + m->layoutSong = layoutSong; + m->layoutAlbum = layoutAlbum; + m->layoutArtist = layoutArtist; + m->layoutGenre = layoutGenre; + m->layoutPlaylists = layoutPlaylists; + m->layoutFolder = layoutFolder; + + m->layoutAlbum->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); + m->layoutArtist->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); + m->layoutGenre->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); + m->layoutPlaylists->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); + + m->pHandleVolume = handleVolume; + + elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT); + m_SetSourceType(); + evas_object_data_set(m->base, BASE_VIEW_DATA, m); + + m_CreateFullView(); + m_UpdateFocusSequence(); + + Connect(m->base, BASE_VIEW, TYPE_KEY_DOWN | TYPE_KEY_UP); + } - mhandle->AddListener(this); + _CHECK_FAIL{ m->mhandle->RemoveListener(this); } + _CHECK_FAIL{ handleVolume->Destroy(); } + _CHECK_FAIL{ delete handleVolume; } + _CHECK_FAIL{ lmgr->RemoveLayout(layoutFolder); } + _CHECK_FAIL{ layoutFolder->Destroy(); } + _CHECK_FAIL{ delete layoutFolder; } + _CHECK_FAIL{ lmgr->RemoveLayout(layoutPlaylists); } + _CHECK_FAIL{ layoutPlaylists->Destroy(); } + _CHECK_FAIL{ delete layoutPlaylists; } + _CHECK_FAIL{ lmgr->RemoveLayout(layoutGenre); } + _CHECK_FAIL{ layoutGenre->Destroy(); } + _CHECK_FAIL{ delete layoutGenre; } + _CHECK_FAIL{ lmgr->RemoveLayout(layoutArtist); } + _CHECK_FAIL{ layoutArtist->Destroy(); } + _CHECK_FAIL{ delete layoutArtist; } + _CHECK_FAIL{ lmgr->RemoveLayout(layoutAlbum); } + _CHECK_FAIL{ layoutAlbum->Destroy(); } + _CHECK_FAIL{ delete layoutAlbum; } + _CHECK_FAIL{ lmgr->RemoveLayout(layoutSong); } + _CHECK_FAIL{ layoutSong->Destroy(); } + _CHECK_FAIL{ delete layoutSong; } + _CHECK_FAIL{ CBaseView::Destroy(); } + _CHECK_FAIL{ lmgr->Destroy(); } + _CHECK_FAIL{ delete lmgr; } + _CHECK_FAIL{ evas_object_del(m->base); } + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{ delete m; m = NULL; } + } _CREATE_END_AND_CATCH{ return false; } return true; } @@ -805,7 +803,6 @@ void CMusicBaseView::Destroy(void) ASSERT(m); m->mhandle->RemoveListener(this); - m->pHandleVolume->Destroy(); m->lmgr->RemoveLayout(m->layoutFolder); -- 2.7.4 From 50443d714c78041d3630217770d048d37cdbfa33 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 11:19:53 +0900 Subject: [PATCH 06/16] Apply error checking macro to Create function + Apply ASSERT Change-Id: I03b7b29d4284d328be675090f279e9b552f73965 Signed-off-by: Kim Tae Soo --- src/views/ExtBaseLayout.cpp | 14 +++++-- src/views/context-view.cpp | 98 +++++++++++++++++---------------------------- src/views/playback-view.cpp | 39 +++++++++--------- 3 files changed, 68 insertions(+), 83 deletions(-) diff --git a/src/views/ExtBaseLayout.cpp b/src/views/ExtBaseLayout.cpp index 9a316e2..e13bffa 100644 --- a/src/views/ExtBaseLayout.cpp +++ b/src/views/ExtBaseLayout.cpp @@ -15,11 +15,13 @@ */ #include -#include "LayoutMgr.h" -#include "BaseView.h" -#include "BaseLayout.h" +#include +#include +#include +#include +#include +#include "dbg.h" #include "ExtBaseLayout.h" -#include "ViewMgr.h" CExtBaseLayout::CExtBaseLayout(const char *pLayoutId) : CBaseLayout(pLayoutId) @@ -35,11 +37,15 @@ CExtBaseLayout::~CExtBaseLayout() void CExtBaseLayout::SetEmptyStatus(bool flag) { + ASSERT(FlagCreate()); + m_bEmptyStatus = flag; } bool CExtBaseLayout::EmptyStatus(void) { + ASSERT(FlagCreate()); + return m_bEmptyStatus; } diff --git a/src/views/context-view.cpp b/src/views/context-view.cpp index 4ba8af1..35fb02b 100644 --- a/src/views/context-view.cpp +++ b/src/views/context-view.cpp @@ -111,7 +111,6 @@ struct SContextView { SContentInfo *ctxtinfo; EContextType type; int lid; - CContextView *parent; SContextView() { memset(this, 0, sizeof(SContextView)); @@ -1243,75 +1242,50 @@ void CContextView::m_HandleMoreinfoSelected(Evas_Object *obj) bool CContextView::Create(void *data) { ASSERT(!m); + ASSERT(data); - Evas_Object *base; - Evas_Object *win; - CMusicController *mhandle; - SContentInfo *ctxtinfo; - CViewMgr *mgr = CViewMgr::GetInstance(); - - if (!mgr || !data) - return false; - - win = mgr->Window(); - if (!win) { - _ERR(" vimewmgr get win failed "); - return false; - } - - mhandle = CMusicController::GetInstance(); - if (!mhandle) { - _ERR(" music controller get music instance failed "); - return false; - } - + Evas_Object *base = NULL; + Evas_Object *win = NULL; + CMusicController *mhandle = NULL; + CViewMgr *mgr = NULL; SParcel *parcel = (SParcel *)data; - ctxtinfo = parcel->ctxtInfo; + SContentInfo *ctxtinfo = parcel->ctxtInfo; + if (ctxtinfo->type < CONTEXT_TYPE_SONG || ctxtinfo->type > CONTEXT_TYPE_PLAYSONG || !ctxtinfo->context) { _ERR("Wrong context info"); return false; } - m = new SContextView; - if (!m) { - _ERR(" calloc failed "); - return false; - } - - base = CCommonUI::AddBase(win, MUSIC_CONTEXT_VIEW); - if (!base) { - _ERR(" add base failed "); - delete m; - m = NULL; - return false; - } - - bool r = CBaseView::Create(data); - if (!r) { - _ERR(" CBaseView Creation failed "); - evas_object_del(base); - delete m; - m = NULL; - return false; - } - - m->type = ctxtinfo->type; - m->vmgr = mgr; - m->win = win; - m->mhandle = mhandle; - m->base = base; - m->ctxtinfo = ctxtinfo; - m->parent = this; - - if (!m_CreateFullView()) { - _ERR(" create full failed "); - delete m; - evas_object_del(base); - return false; - } + _CREATE_BEGIN{ + _CHECK(mgr = CViewMgr::GetInstance()) + _CHECK(win = mgr->Window()) + _CHECK(mhandle = CMusicController::GetInstance()) + _CHECK(m = new SContextView) + _CHECK(base = CCommonUI::AddBase(win, MUSIC_CONTEXT_VIEW)) + _CHECK(CBaseView::Create(data)) + + _WHEN_SUCCESS{ + m->type = ctxtinfo->type; + m->vmgr = mgr; + m->win = win; + m->mhandle = mhandle; + m->base = base; + m->ctxtinfo = ctxtinfo; + + Connect(base, CONTEXT_VIEW, TYPE_KEY_DOWN); + + _CHECK(m_CreateFullView()) + _CHECK_FAIL{} + } - Connect(base, CONTEXT_VIEW, TYPE_KEY_DOWN); + _CHECK_FAIL{ CBaseView::Destroy(); } + _CHECK_FAIL{ evas_object_del(base); } + _CHECK_FAIL{ delete m; m = NULL; } + _CHECK_FAIL{} + _CHECK_FAIL{} + _CHECK_FAIL{} + } _CREATE_END_AND_CATCH{ return false; } return true; } @@ -1321,6 +1295,8 @@ void CContextView::Destroy(void) { ASSERT(m); + Disconnect(m->base); + if (m->idler) ecore_idler_del(m->idler); diff --git a/src/views/playback-view.cpp b/src/views/playback-view.cpp index 09fe230..84b6ccc 100644 --- a/src/views/playback-view.cpp +++ b/src/views/playback-view.cpp @@ -1639,7 +1639,26 @@ bool CPlaybackView::Create(void *data) _CHECK(m->hMusicController = CMusicController::GetInstance()) _CHECK(m->eoBase = CCommonUI::AddBase(m->eoWin, MUSIC_PLAYBACK_VIEW)) _CHECK(CBaseView::Create(data)) - _WHEN_SUCCESS{} + _CHECK(m->hMusicController->AddListener(this)) + + _WHEN_SUCCESS{ + m->press_status = PRESS_SHORT; + m->parent = this; + + evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m); + + m_AddControlButtons(); + m_AddEditPlaylistButtons(); + m_AddCurrentSonginfo(); + m_AddPlaylist(); + + m->pHandleVolume->Create(m->eoBase); + m_UpdatePlaymodeFocusSequence(); + + Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP); + } + + _CHECK_FAIL{ m->hMusicController->RemoveListener(this); } _CHECK_FAIL{ CBaseView::Destroy(); } _CHECK_FAIL{ evas_object_del(m->eoBase); } _CHECK_FAIL{ /* CMusicController::GetInstance())*/ } @@ -1648,23 +1667,6 @@ bool CPlaybackView::Create(void *data) _CHECK_FAIL{ delete m; m = NULL; } }_CREATE_END_AND_CATCH{ return false; } - m->press_status = PRESS_SHORT; - m->parent = this; - - evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m); - - m_AddControlButtons(); - m_AddEditPlaylistButtons(); - m_AddCurrentSonginfo(); - m_AddPlaylist(); - - m->pHandleVolume->Create(m->eoBase); - m_UpdatePlaymodeFocusSequence(); - - Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP); - - m->hMusicController->AddListener(this); - return true; } @@ -1673,6 +1675,7 @@ void CPlaybackView::Destroy(void) { ASSERT(m); + Disconnect(m->eoBase); m->hMusicController->RemoveListener(this); m_DestroyErrorPopup(); -- 2.7.4 From e09ada4f554c8c03f3b8ef3c22176368260faa0e Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 11:44:03 +0900 Subject: [PATCH 07/16] Apply ASSERT Change-Id: I8160bd71d5cd56dda607f394d2ca351b1e7c93a4 Signed-off-by: Kim Tae Soo --- include/playback-mgr.h | 24 ----- src/playback/playback-mgr.cpp | 197 ++++++++++++------------------------------ src/playback/playlist-mgr.cpp | 59 ++++--------- 3 files changed, 73 insertions(+), 207 deletions(-) diff --git a/include/playback-mgr.h b/include/playback-mgr.h index 6ad1e7a..4e37b71 100644 --- a/include/playback-mgr.h +++ b/include/playback-mgr.h @@ -46,7 +46,6 @@ public: bool Resume(void); bool Pause(void); - bool SetNextUri(const char *path); bool SetUri(const char *path); bool Prepare(void); bool Unprepare(void); @@ -54,28 +53,5 @@ public: bool SetPosition(int milsec); bool GetPosition(int *const milsec); }; -/* -struct playback; - -struct playback *playback_create(); -void playback_destroy(struct playback *plback); -int playback_start(struct playback *plback); -int playback_stop(struct playback *plback); - -int playback_add_completed_cb(struct playback *plback, - player_completed_cb on_playback_completion, void *data); -int playback_remove_completed_cb(struct playback *plback); - -int playback_set_mute(struct playback *plback, bool flag); -int playback_set_looping(struct playback *plback, bool flag); -int playback_resume(struct playback *plback); -int playback_pause(struct playback *plback); -int playback_set_next_uri(struct playback *plback, const char *path); -int playback_set_uri(struct playback *plback, const char *path); -int playback_prepare(struct playback *plback); -int playback_unprepare(struct playback *plback); -int playback_set_position(struct playback *plback, int milsec); -int playback_get_position(struct playback *plback, int *const milsec); -*/ #endif /*__PLAYBACK_MGR_H__*/ diff --git a/src/playback/playback-mgr.cpp b/src/playback/playback-mgr.cpp index 6a41d29..d87c8bf 100644 --- a/src/playback/playback-mgr.cpp +++ b/src/playback/playback-mgr.cpp @@ -15,6 +15,7 @@ */ #include +#include #include "i18n.h" #include "dbg.h" #include "playback-mgr.h" @@ -32,10 +33,9 @@ void _on_seek_completion(void *dt) bool CPlayback::Create(void) { - int r; + ASSERT(!m); - if (m) - return false; + int r; m = new SPlayback; if (!m) @@ -55,27 +55,25 @@ bool CPlayback::Create(void) void CPlayback::Destroy(void) { - if (!m) - return; + ASSERT(m); + ASSERT(m->player); int r; player_state_e state; - if (m->player) { - r = player_get_state(m->player, &state); - if (r == PLAYER_ERROR_NONE) { - if (state == PLAYER_STATE_PLAYING || - state == PLAYER_STATE_PAUSED) - player_stop(m->player); - if (state == PLAYER_STATE_READY) - player_unprepare(m->player); - } - - r = player_destroy(m->player); - if (r != PLAYER_ERROR_NONE) - _ERR("Player destroy failed"); + r = player_get_state(m->player, &state); + if (r == PLAYER_ERROR_NONE) { + if (state == PLAYER_STATE_PLAYING || + state == PLAYER_STATE_PAUSED) + player_stop(m->player); + if (state == PLAYER_STATE_READY) + player_unprepare(m->player); } + r = player_destroy(m->player); + if (r != PLAYER_ERROR_NONE) + _ERR("Player destroy failed"); + delete m; m = NULL; } @@ -83,15 +81,10 @@ void CPlayback::Destroy(void) bool CPlayback::Start(void) { - if (!m) - return false; - - int r; + ASSERT(m); + ASSERT(m->player); - if (!m->player) - return false; - - r = player_start(m->player); + int r = player_start(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("Player start failed"); return false; @@ -103,15 +96,10 @@ bool CPlayback::Start(void) bool CPlayback::Stop(void) { - if (!m) - return false; - - int r; + ASSERT(m); + ASSERT(m->player); - if (!m->player) - return false; - - r = player_stop(m->player); + int r = player_stop(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("Player stop failed"); return false; @@ -123,14 +111,10 @@ bool CPlayback::Stop(void) bool CPlayback::SetCallback(player_completed_cb on_playback_completion, void *data) { - if (!m) - return false; - - int r; - if (!m->player) - return false; + ASSERT(m); + ASSERT(m->player); - r = player_set_completed_cb(m->player, on_playback_completion, data); + int r = player_set_completed_cb(m->player, on_playback_completion, data); if (r != PLAYER_ERROR_NONE) { _ERR("Player set completed callaback failed"); return false; @@ -142,15 +126,10 @@ bool CPlayback::SetCallback(player_completed_cb on_playback_completion, void *da bool CPlayback::UnsetCallback(void) { - if (!m) - return false; + ASSERT(m); + ASSERT(m->player); - int r; - - if (!m->player) - return false; - - r = player_unset_completed_cb(m->player); + int r = player_unset_completed_cb(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("Player unset completed cb failed"); return false; @@ -162,15 +141,10 @@ bool CPlayback::UnsetCallback(void) bool CPlayback::SetMute(bool flag) { - if (!m) - return false; + ASSERT(m); + ASSERT(m->player); - int r; - - if (!m->player) - return false; - - r = player_set_mute(m->player, flag); + int r = player_set_mute(m->player, flag); if (r != PLAYER_ERROR_NONE) { _ERR("Player set mute failed"); return false; @@ -182,15 +156,10 @@ bool CPlayback::SetMute(bool flag) bool CPlayback::SetLooping(bool flag) { - if (!m) - return false; + ASSERT(m); + ASSERT(m->player); - int r; - - if (!m->player) - return false; - - r = player_set_looping(m->player, flag); + int r = player_set_looping(m->player, flag); if (r != PLAYER_ERROR_NONE) { _ERR("Player set looping failed"); return false; @@ -202,15 +171,10 @@ bool CPlayback::SetLooping(bool flag) bool CPlayback::Resume(void) { - if (!m) - return false; + ASSERT(m); + ASSERT(m->player); - int r; - - if (!m->player) - return false; - - r = player_start(m->player); + int r = player_start(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("Player start in playback resume failed"); return false; @@ -222,15 +186,10 @@ bool CPlayback::Resume(void) bool CPlayback::Pause(void) { - if (!m) - return false; + ASSERT(m); + ASSERT(m->player); - int r; - - if (!m->player) - return false; - - r = player_pause(m->player); + int r = player_pause(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("Player pause failed"); return false; @@ -240,38 +199,12 @@ bool CPlayback::Pause(void) } -bool CPlayback::SetNextUri(const char *path) -{ - // Not used - /*if (!m) - return false; - - int r; - - if (!m->player) - return false; - - r = player_set_next_uri(m->player, path); - if (r != PLAYER_ERROR_NONE) { - _ERR("Player set next uri failed"); - return false; - }*/ - - return true; -} - - bool CPlayback::SetUri(const char *path) { - if (!m) - return false; - - int r; - - if (!m->player) - return false; + ASSERT(m); + ASSERT(m->player); - r = player_set_uri(m->player, path); + int r = player_set_uri(m->player, path); if (r != PLAYER_ERROR_NONE) { _ERR("Player set uri failed"); return false; @@ -283,15 +216,10 @@ bool CPlayback::SetUri(const char *path) bool CPlayback::Prepare(void) { - if (!m) - return false; - - int r; - - if (!m->player) - return false; + ASSERT(m); + ASSERT(m->player); - r = player_prepare(m->player); + int r = player_prepare(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("Player prepare failed"); return false; @@ -303,15 +231,10 @@ bool CPlayback::Prepare(void) bool CPlayback::Unprepare(void) { - if (!m) - return false; - - int r; - - if (!m->player) - return false; + ASSERT(m); + ASSERT(m->player); - r = player_unprepare(m->player); + int r = player_unprepare(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("Player unprepare failed"); return false; @@ -323,15 +246,10 @@ bool CPlayback::Unprepare(void) bool CPlayback::SetPosition(int milsec) { - if (!m) - return false; - - int r; - - if (!m->player) - return false; + ASSERT(m); + ASSERT(m->player); - r = player_set_play_position(m->player, milsec, false, _on_seek_completion, m); + int r = player_set_play_position(m->player, milsec, false, _on_seek_completion, m); if (r != PLAYER_ERROR_NONE) { _ERR("Player set position failed"); return false; @@ -343,15 +261,10 @@ bool CPlayback::SetPosition(int milsec) bool CPlayback::GetPosition(int *const milsec) { - if (!m) - return false; - - int r; - - if (!m->player) - return false; + ASSERT(m); + ASSERT(m->player); - r = player_get_play_position(m->player, milsec); + int r = player_get_play_position(m->player, milsec); if (r != PLAYER_ERROR_NONE) { _ERR("Player set position failed"); return false; diff --git a/src/playback/playlist-mgr.cpp b/src/playback/playlist-mgr.cpp index 8e163ce..f13c79e 100644 --- a/src/playback/playlist-mgr.cpp +++ b/src/playback/playlist-mgr.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "dbg.h" #include "i18n.h" #include "song_info.h" @@ -126,8 +127,7 @@ static int _get_next(int *list, int size, int index) bool CPlaylist::Create(Eina_List *songlist) { - if (m) - return false; + ASSERT(!m); CSongInfo *sinfo; CSongInfo *d_sinfo; @@ -167,8 +167,7 @@ bool CPlaylist::Create(Eina_List *songlist) void CPlaylist::Destroy(void) { - if (!m) - return; + ASSERT(m); CSongInfo *sinfo; void *obj; @@ -191,8 +190,8 @@ void CPlaylist::Destroy(void) bool CPlaylist::Update(Eina_List *songlist, int addmode) { - if (!m) - return false; + ASSERT(m); + ASSERT(songlist); CSongInfo *sinfo; CSongInfo *d_sinfo; @@ -201,11 +200,6 @@ bool CPlaylist::Update(Eina_List *songlist, int addmode) Eina_List *l; int rindex; - if (!songlist) { - _ERR(" No m or songlist "); - return NULL; - } - if (addmode == ADD_TYPE_FRESH || (m->total_songs == 0)) { Destroy(); return Create(songlist); @@ -242,8 +236,8 @@ bool CPlaylist::Update(Eina_List *songlist, int addmode) bool CPlaylist::SetCurrentSong(char *mediaid) { - if (!m) - return false; + ASSERT(m); + ASSERT(mediaid); Eina_List *l; CSongInfo *sinfo; @@ -270,8 +264,7 @@ bool CPlaylist::SetCurrentSong(char *mediaid) bool CPlaylist::SetCurSongIndex(int index) { - if (!m) - return false; + ASSERT(m); if (index < 0 || index >= m->total_songs) { _ERR(" set index is out of range "); @@ -286,10 +279,7 @@ bool CPlaylist::SetCurSongIndex(int index) bool CPlaylist::GetCurSongIndex(int *index) { - if (!m) { - _ERR(" No play list"); - return false; - } + ASSERT(m); *index = m->cur_song_index; @@ -299,10 +289,7 @@ bool CPlaylist::GetCurSongIndex(int *index) bool CPlaylist::GetTotalSongs(int *ts) { - if (!m) { - _ERR(" No play list"); - return false; - } + ASSERT(m); *ts = m->total_songs; @@ -312,12 +299,9 @@ bool CPlaylist::GetTotalSongs(int *ts) bool CPlaylist::LoadNextSong(int shufstate) { - int index, total_songs; + ASSERT(m); - if (!m) { - _ERR(" No play list"); - return false; - } + int index, total_songs; total_songs = m->total_songs; @@ -343,12 +327,9 @@ bool CPlaylist::LoadNextSong(int shufstate) bool CPlaylist::LoadPreviousSong(int shufstate) { - int index, total_songs; + ASSERT(m); - if (!m) { - _ERR(" No play list"); - return false; - } + int index, total_songs; total_songs = m->total_songs; @@ -375,8 +356,7 @@ bool CPlaylist::LoadPreviousSong(int shufstate) const char *CPlaylist::SongpathFromIndex(int index) { - if (!m) - return NULL; + ASSERT(m); const char *path; CSongInfo *sinfo; @@ -409,8 +389,7 @@ const char *CPlaylist::SongpathFromIndex(int index) bool CPlaylist::GetSonginfoFromIndex(int index, CSongInfo **const csinfo) { - if (!m) - return false; + ASSERT(m); CSongInfo *sinfo; @@ -438,8 +417,7 @@ bool CPlaylist::GetSonginfoFromIndex(int index, CSongInfo **const csinfo) bool CPlaylist::RemoveSong(CSongInfo *sinfo, int index, int shufstate) { - if (!m) - return false; + ASSERT(m); if (!m->songlist) { _ERR(" No play list"); @@ -465,8 +443,7 @@ bool CPlaylist::RemoveSong(CSongInfo *sinfo, int index, int shufstate) bool CPlaylist::UpdateShuffle(void) { - if (!m) - return false; + ASSERT(m); int i; int *list; -- 2.7.4 From c96586312280da3c1fd0dc9314b97e4234e37f12 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 14:49:01 +0900 Subject: [PATCH 08/16] Fix focus sequence between group buttons and layouts Change-Id: Iaac6ce05c33a543fe01315fc07d3cb0f416e9aae Signed-off-by: Kim Tae Soo --- include/base-view.h | 5 +++-- src/views/base-view.cpp | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/base-view.h b/include/base-view.h index 97797c1..b8a8856 100644 --- a/include/base-view.h +++ b/include/base-view.h @@ -30,8 +30,7 @@ struct SArgList { class CMusicBaseView : public CBaseView, public IMouseMoveListener, public IMouseClickedListener, - public IMusicControllerListener -{ + public IMusicControllerListener, public IFocusedListener { private: struct SMusicBaseView* m; @@ -76,6 +75,7 @@ public: CBaseView(pViewId), IMouseMoveListener(this), IMouseClickedListener(this), + IFocusedListener(this), m(0) {} virtual ~CMusicBaseView() {} @@ -89,6 +89,7 @@ public: virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev); virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); virtual void OnMouseClicked(int id, Evas_Object *obj); + virtual void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item); protected: diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index faece1f..39d1b6f 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -629,7 +629,7 @@ void CMusicBaseView::m_CreateLeftSection(void) elm_object_style_set(m->group_btn[i], MUSIC_STYLE_GROUPBTN); elm_object_text_set(m->group_btn[i], _(btninfo[i].txt)); - Connect(m->group_btn[i], btninfo[i].type, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(m->group_btn[i], btninfo[i].type, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_FOCUSED); ic = elm_image_add(m->group_btn[i]); if (ic) { @@ -1110,6 +1110,25 @@ void CMusicBaseView::OnMouseClicked(int id, Evas_Object *obj) } +void CMusicBaseView::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case BASE_VIEW_GROUP_SONG: + case BASE_VIEW_GROUP_ALBUM: + case BASE_VIEW_GROUP_ARTIST: + case BASE_VIEW_GROUP_GENRE: + case BASE_VIEW_GROUP_FOLDER: + case BASE_VIEW_GROUP_PLAYLIST: + if (m->lmgr->Layout()) + m_UpdateCurrentLayout(false); + break; + + default: + break; + } +} + + void CMusicBaseView::t_OnComplete(void) { m_UpdatePlaysongLabel(); -- 2.7.4 From e760ae54ff5fefa97bda7f8e158b64ae80221acd Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 15:16:14 +0900 Subject: [PATCH 09/16] Fix Bug: Init album info (empty) is set. Change-Id: I1d5d618554a516fbdd2eac02ceced27f6e8edf41 Signed-off-by: Kim Tae Soo --- src/views/album-songs-layout.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index 6d43fed..df00a83 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -503,6 +503,8 @@ bool CAlbumSongsLayout::Create(CLayoutMgr *mgr) m->mgr = mgr; m->alinfo = alinfo; Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN); + + SetCurrentAlbum(NULL); } _CHECK_FAIL{ delete alinfo; } -- 2.7.4 From 0cdd22e2f987b380fa3676599cba5d31cbac2842 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 15:27:12 +0900 Subject: [PATCH 10/16] Fix focus bug when sort button is disabled. Change-Id: I7e7b49500c18ee304fcb917eb6648596a4e91978 Signed-off-by: Kim Tae Soo --- src/views/base-view.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index 39d1b6f..1b3093a 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -895,12 +895,21 @@ void CMusicBaseView::t_OnUpdate(void *data) if (!layout_id) return; - elm_object_disabled_set(m->sortbtn, EINA_FALSE); if (!strcmp(layout_id, MUSIC_ALBUM_SONGS_LAYOUT) || !strcmp(layout_id, MUSIC_CATEGORY_SONGS_LAYOUT) || !strcmp(layout_id, MUSIC_CATEGORY_ALBUM_LAYOUT) || - !strcmp(layout_id, MUSIC_CATEGORY_SELECTLIST_LAYOUT)) + !strcmp(layout_id, MUSIC_CATEGORY_SELECTLIST_LAYOUT)) { elm_object_disabled_set(m->sortbtn, EINA_TRUE); + elm_object_focus_next_object_set(m->plbackbtn, m->srcbtn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(m->srcbtn, m->plbackbtn, ELM_FOCUS_LEFT); + } + else { + elm_object_disabled_set(m->sortbtn, EINA_FALSE); + elm_object_focus_next_object_set(m->plbackbtn, m->sortbtn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(m->sortbtn, m->srcbtn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(m->srcbtn, m->sortbtn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->sortbtn, m->plbackbtn, ELM_FOCUS_LEFT); + } } else if (update_type == E_DEPTH_UPDATE) { if (!layout_id) -- 2.7.4 From e5894baa7b1eac0abeecb2085978f6a21a5ce345 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 17 Mar 2015 21:27:29 +0900 Subject: [PATCH 11/16] Modify focus sequence between upper buttons and layouts Change-Id: Ie4c63e3de17abf68e4ac629e386be5c612c59f1d Signed-off-by: Kim Tae Soo --- include/base-view.h | 10 +++-- include/common.h | 1 + include/define.h | 12 +++++- include/folder-layout.h | 4 ++ src/views/album-layout.cpp | 8 ++-- src/views/album-songs-layout.cpp | 31 +++++++++++--- src/views/base-view.cpp | 84 ++++++++++++++++++++++++++----------- src/views/category-layout.cpp | 41 ++++++++++++------ src/views/category-songs-layout.cpp | 44 ++++++++++++++----- src/views/common-ui.cpp | 4 +- src/views/folder-layout.cpp | 82 ++++++++++++++++++++++++++++++++---- src/views/playback-view.cpp | 5 +-- src/views/song-layout.cpp | 12 ++---- 13 files changed, 254 insertions(+), 84 deletions(-) diff --git a/include/base-view.h b/include/base-view.h index b8a8856..eea02fd 100644 --- a/include/base-view.h +++ b/include/base-view.h @@ -28,9 +28,12 @@ struct SArgList { }; -class CMusicBaseView : public CBaseView, - public IMouseMoveListener, public IMouseClickedListener, - public IMusicControllerListener, public IFocusedListener { +class CMusicBaseView : + public CBaseView, + public IMouseMoveListener, + public IMouseClickedListener, + public IMusicControllerListener, + public IFocusedListener { private: struct SMusicBaseView* m; @@ -91,7 +94,6 @@ public: virtual void OnMouseClicked(int id, Evas_Object *obj); virtual void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item); - protected: virtual void t_OnComplete(void); virtual void t_OnError(void); diff --git a/include/common.h b/include/common.h index b6c5a14..657569f 100644 --- a/include/common.h +++ b/include/common.h @@ -144,6 +144,7 @@ struct SParcel { int updateType; const char *layoutId; const char *keyEvent; + const char *prevFocusedBtn; }; #endif /* __COMMON_H__ */ diff --git a/include/define.h b/include/define.h index 305c877..9b28a71 100644 --- a/include/define.h +++ b/include/define.h @@ -283,7 +283,8 @@ #define MUSIC_PART_ALBUM_PLAYBTN "MUSIC_PART_ALBUM_PLAYBTN" #define MUSIC_PART_ALBUM_NEXTBTN "MUSIC_PART_ALBUM_NEXTBTN" #define MUSIC_PART_ALBUM_LASTBTN "MUSIC_PART_ALBUM_LASTBTN" - /* styles */ + +/* styles */ #define MUSIC_STYLE_ADD_PLAY_BTN "add_play_btn" #define MUSIC_STYLE_ADD_NEXT_BTN "add_next_btn" #define MUSIC_STYLE_ADD_LAST_BTN "add_last_btn" @@ -412,6 +413,11 @@ #define MUSIC_SWALLOW_ICON "elm.swallow.icon" #define MUSIC_PART_POPUP_BUTTON "button1" +/* FOR FOCUS SEQUENCE */ +#define MUSIC_FIRST_BTN "MUSIC_FIRST_BTN" // Play, Select All +#define MUSIC_SECOND_BTN "MUSIC_SECOND_BTN" // Add Next, Done +#define MUSIC_THIRD_BTN "MUSIC_THIRD_BTN" // Add Last, Cancel + /* CTXPOPUP POSITION */ #define POSITION_SORT_POPUP_X 1344 #define POSITION_SORT_POPUP_Y 155 @@ -439,6 +445,10 @@ #define KEY_BACK_REMOTE "XF86Close" #undef KEY_MENU_REMOTE #define KEY_MENU_REMOTE "XF86Send" +#undef KEY_UP +#define KEY_UP "Up" +#undef KEY_DOWN +#define KEY_DOWN "Down" /* SHOULD BE DEFINED */ #undef KEY_PLAY diff --git a/include/folder-layout.h b/include/folder-layout.h index f27bfec..13f20ac 100644 --- a/include/folder-layout.h +++ b/include/folder-layout.h @@ -37,6 +37,9 @@ private: static Eina_Bool sm_CbFocusIdler(void *dt); void m_OnFocusIdler(void); + static Eina_Bool sm_CbButtonFocusIdler(void *dt); + void m_OnButtonFocusIdler(void); + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); void m_OnCtxtUpdate(EActionType type, int lid); @@ -77,6 +80,7 @@ public: virtual void Destroy(void); virtual void Update(bool focusFlag); + void SetButtonFocus(const char *btnStr); public: virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index a56e0a6..16ae286 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -505,10 +505,9 @@ void CAlbumLayout::t_OnShow(void) m_UpdateAlbumGrid(false); SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_ALBUM_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); evas_object_show(Layout()); @@ -574,10 +573,8 @@ void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_D if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; @@ -623,6 +620,7 @@ void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_D m->ctxtinfo = ctxtinfo; SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); parcel.ctxtInfo = ctxtinfo; if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index df00a83..d1c5532 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -395,7 +395,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void) elm_object_text_set(btn[i], _(btninfo[i].name)); elm_object_style_set(btn[i], btninfo[i].style); - Connect(btn[i], btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(btn[i], btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_KEY_DOWN); img = elm_image_add(btn[i]); if (img) { @@ -581,10 +581,9 @@ void CAlbumSongsLayout::t_OnShow(void) CBaseLayout::t_OnShow(); SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } @@ -597,10 +596,9 @@ void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_ if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_DEPTH_UPDATE; parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; @@ -646,12 +644,35 @@ void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_ m->ctxtinfo = ctxtinfo; SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); parcel.ctxtInfo = ctxtinfo; if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } break; + case ALBUM_SONGS_PLAY_BUTTON: + case ALBUM_SONGS_NEXT_BUTTON: + case ALBUM_SONGS_LAST_BUTTON: + if (!strcmp(ev->keyname, KEY_UP)) { + const char *btnText = NULL; + + if (id == ALBUM_SONGS_PLAY_BUTTON) + btnText = MUSIC_FIRST_BTN; + else if (id == ALBUM_SONGS_NEXT_BUTTON) + btnText = MUSIC_SECOND_BTN; + else //ALBUM_SONGS_LAST_BUTTON + btnText = MUSIC_THIRD_BTN; + + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.updateType = E_FOCUS_UPDATE; + parcel.keyEvent = KEY_UP; + parcel.prevFocusedBtn = btnText; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + break; + default: break; } diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index 1b3093a..fcd4e2c 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -304,6 +304,12 @@ void CMusicBaseView::m_ShowCurrentLayout(void) elm_object_part_content_set(m->base, MUSIC_PART_CONTENT, evasLayout); m->lmgr->Show(layoutId); m_UpdateFocusSequence(); + + if (!strcmp(layoutId, MUSIC_FOLDER_LAYOUT)) { + elm_object_focus_next_object_set(m->plbackbtn, m->plbackbtn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->srcbtn, m->srcbtn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->sortbtn, m->sortbtn, ELM_FOCUS_DOWN); + } } } @@ -311,10 +317,8 @@ void CMusicBaseView::m_ShowCurrentLayout(void) void CMusicBaseView::m_GotoPlayback(void) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_PLAYLIST_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, &parcel)) _ERR(" viewmgr push view MUSIC_PLAYBACK_VIEW failed "); @@ -565,7 +569,8 @@ void CMusicBaseView::m_CreateTopSection(void) elm_object_style_set(btn, btninfo[i].style); elm_object_part_content_set(m->base, btninfo[i].part, btn); - Connect(btn, btninfo[i].type, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(btn, btninfo[i].type, + TYPE_KEY_DOWN | TYPE_KEY_UP | TYPE_MOUSE_MOVE | TYPE_CLICKED); if (i == BTN_PLAY) m->plbackbtn = btn; @@ -629,7 +634,8 @@ void CMusicBaseView::m_CreateLeftSection(void) elm_object_style_set(m->group_btn[i], MUSIC_STYLE_GROUPBTN); elm_object_text_set(m->group_btn[i], _(btninfo[i].txt)); - Connect(m->group_btn[i], btninfo[i].type, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_FOCUSED); + Connect(m->group_btn[i], btninfo[i].type, + TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_FOCUSED); ic = elm_image_add(m->group_btn[i]); if (ic) { @@ -886,19 +892,35 @@ void CMusicBaseView::t_OnUpdate(void *data) } SParcel *parcel = (SParcel *)data; - int update_type = parcel->updateType; - const char *layout_id = parcel->layoutId; - if (update_type == E_FOCUS_UPDATE) - elm_object_focus_set(m->c_grpbtn, EINA_TRUE); - else if (update_type == E_LAYOUT_UPDATE) { - if (!layout_id) + if (parcel->updateType == E_FOCUS_UPDATE) { + if (parcel->keyEvent && !strcmp(parcel->keyEvent, KEY_UP)) { + Evas_Object *focus = NULL; + + if (!strcmp(parcel->prevFocusedBtn, MUSIC_FIRST_BTN)) + focus = m->plbackbtn; + else if (!strcmp(parcel->prevFocusedBtn, MUSIC_SECOND_BTN)) { + if (elm_object_disabled_get(m->sortbtn)) + focus = m->srcbtn; + else + focus = m->sortbtn; + } + else if (!strcmp(parcel->prevFocusedBtn, MUSIC_THIRD_BTN)) + focus = m->srcbtn; + + elm_object_focus_set(focus, EINA_TRUE); + } + else + elm_object_focus_set(m->c_grpbtn, EINA_TRUE); + } + else if (parcel->updateType == E_LAYOUT_UPDATE) { + if (!parcel->layoutId) return; - if (!strcmp(layout_id, MUSIC_ALBUM_SONGS_LAYOUT) || - !strcmp(layout_id, MUSIC_CATEGORY_SONGS_LAYOUT) || - !strcmp(layout_id, MUSIC_CATEGORY_ALBUM_LAYOUT) || - !strcmp(layout_id, MUSIC_CATEGORY_SELECTLIST_LAYOUT)) { + if (!strcmp(parcel->layoutId, MUSIC_ALBUM_SONGS_LAYOUT) || + !strcmp(parcel->layoutId, MUSIC_CATEGORY_SONGS_LAYOUT) || + !strcmp(parcel->layoutId, MUSIC_CATEGORY_ALBUM_LAYOUT) || + !strcmp(parcel->layoutId, MUSIC_CATEGORY_SELECTLIST_LAYOUT)) { elm_object_disabled_set(m->sortbtn, EINA_TRUE); elm_object_focus_next_object_set(m->plbackbtn, m->srcbtn, ELM_FOCUS_RIGHT); elm_object_focus_next_object_set(m->srcbtn, m->plbackbtn, ELM_FOCUS_LEFT); @@ -911,14 +933,14 @@ void CMusicBaseView::t_OnUpdate(void *data) elm_object_focus_next_object_set(m->sortbtn, m->plbackbtn, ELM_FOCUS_LEFT); } } - else if (update_type == E_DEPTH_UPDATE) { - if (!layout_id) + else if (parcel->updateType == E_DEPTH_UPDATE) { + if (!parcel->layoutId) return; - if (!strcmp(layout_id, MUSIC_ALBUM_SONGS_LAYOUT) || - !strcmp(layout_id, MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT) || - !strcmp(layout_id, MUSIC_CATEGORY_GENRE_SONGS_LAYOUT) || - !strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT)) { + if (!strcmp(parcel->layoutId, MUSIC_ALBUM_SONGS_LAYOUT) || + !strcmp(parcel->layoutId, MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT) || + !strcmp(parcel->layoutId, MUSIC_CATEGORY_GENRE_SONGS_LAYOUT) || + !strcmp(parcel->layoutId, MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT)) { m_ShowCurrentLayout(); m_UpdateCurrentLayout(true); } @@ -959,9 +981,8 @@ void CMusicBaseView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key !strcmp(ev->keyname, KEY_PLAY) || !strcmp(ev->keyname, KEY_PAUSE)) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_KEY_PRESS; - parcel.layoutId = NULL; parcel.keyEvent = ev->keyname; CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); } @@ -973,6 +994,20 @@ void CMusicBaseView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) elm_object_focus_set(m->c_grpbtn, EINA_TRUE); + else if (!strcmp(ev->keyname, KEY_DOWN) && + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_FOLDER_LAYOUT)) { + const char *btnText = NULL; + + if (id == BASE_VIEW_PLAY_BUTTON) + btnText = MUSIC_FIRST_BTN; + else if (id == BASE_VIEW_SORT_BUTTON) + btnText = MUSIC_SECOND_BTN; + else //BASE_VIEW_SOURCE_BUTTON + btnText = MUSIC_THIRD_BTN; + + CFolderLayout *folderLayout = (CFolderLayout *)m->lmgr->Layout(); + folderLayout->SetButtonFocus(btnText); + } break; case BASE_VIEW_GROUP_SONG: @@ -1001,9 +1036,8 @@ void CMusicBaseView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_U if (!strcmp(ev->keyname, KEY_NEXT) || !strcmp(ev->keyname, KEY_PREVIOUS)) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_KEY_RELEASE; - parcel.layoutId = NULL; parcel.keyEvent = ev->keyname; CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); m_UpdatePlaysongLabel(); diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index f32efec..d370cef 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -185,10 +185,9 @@ void CCategoryLayout::m_OnEntrynameSet(const char *name) t_UpdateLayoutWithFocus(); SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_DEPTH_UPDATE; parcel.layoutId = MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } @@ -781,7 +780,7 @@ void CCategoryLayout::m_AddButtons(void) elm_object_text_set(m->add_btn[i], _(btninfo[i].name)); elm_object_style_set(m->add_btn[i], btninfo[i].style); - Connect(m->add_btn[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); + Connect(m->add_btn[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); img = elm_image_add(m->add_btn[i]); if (img) { @@ -988,7 +987,7 @@ void CCategoryLayout::m_ShowCategorySongs(void) const char *CCategoryLayout::m_CategorySongLayoutId(void) { - const char *layoutId; + const char *layoutId = NULL; if (!strcmp(LayoutId(), MUSIC_CATEGORY_ARTIST_LAYOUT)) layoutId = MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT; @@ -1018,7 +1017,7 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) m_EmptyLayout(sort_flag); SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); if (t.depth == E_DEPTH_SONG) { m->layoutCatSongs->SetParameter(CCategorySongsLayout::DEPTH_SONG_LIST, (CCategorySongsLayout::ESelectType)t.sel_type, t.c_catinfo, t.c_alinfo); @@ -1026,7 +1025,6 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_CATEGORY_SONGS_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } else if (t.depth == E_DEPTH_SHOW_LIST) { @@ -1035,7 +1033,6 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_CATEGORY_SONGS_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } else if (t.depth == E_DEPTH_ALBUM) { @@ -1048,7 +1045,6 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_CATEGORY_ALBUM_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } else if (t.depth == E_DEPTH_SELECT_LIST) { @@ -1057,7 +1053,6 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_CATEGORY_SELECTLIST_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } else { @@ -1069,7 +1064,6 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_CATEGORY_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } } @@ -1250,10 +1244,8 @@ void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Ke !strcmp(ev->keyname, KEY_BACK_REMOTE)) { if (t.depth == E_DEPTH_CATEGORY) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); return; } @@ -1338,12 +1330,35 @@ void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Ke t.ctxtinfo = ctxtinfo; SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); parcel.ctxtInfo = ctxtinfo; if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } break; + case CATEGORY_LAYOUT_PLAY_BUTTON: + case CATEGORY_LAYOUT_NEXT_BUTTON: + case CATEGORY_LAYOUT_LAST_BUTTON: + if (!strcmp(ev->keyname, KEY_UP)) { + const char *btnText = NULL; + + if (id == CATEGORY_LAYOUT_PLAY_BUTTON) + btnText = MUSIC_FIRST_BTN; + else if (id == CATEGORY_LAYOUT_NEXT_BUTTON) + btnText = MUSIC_SECOND_BTN; + else //CATEGORY_LAYOUT_LAST_BUTTON + btnText = MUSIC_THIRD_BTN; + + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.updateType = E_FOCUS_UPDATE; + parcel.keyEvent = KEY_UP; + parcel.prevFocusedBtn = btnText; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + break; + default: break; } diff --git a/src/views/category-songs-layout.cpp b/src/views/category-songs-layout.cpp index 986c0fd..34f1d03 100644 --- a/src/views/category-songs-layout.cpp +++ b/src/views/category-songs-layout.cpp @@ -569,7 +569,7 @@ void CCategorySongsLayout::m_AddButtons(void) elm_object_text_set(m->add_btn[i], _(btninfo[i].name)); elm_object_style_set(m->add_btn[i], btninfo[i].style); - Connect(m->add_btn[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); + Connect(m->add_btn[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); img = elm_image_add(m->add_btn[i]); if (img) { @@ -636,7 +636,7 @@ void CCategorySongsLayout::m_AddSelectlistButtons(void) elm_object_text_set(btn, _(btninfo[i].name)); elm_object_style_set(btn, btninfo[i].style); - Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_KEY_DOWN); elm_object_part_content_set(Layout(), btninfo[i].part, btn); m->select_btn[i] = btn; @@ -793,10 +793,9 @@ void CCategorySongsLayout::m_AddSelectedSongs(void) } SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_DEPTH_UPDATE; parcel.layoutId = LayoutId(); - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } @@ -821,10 +820,9 @@ void CCategorySongsLayout::m_RemoveSelectedSongs(void) } SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_DEPTH_UPDATE; parcel.layoutId = LayoutId(); - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } @@ -968,10 +966,9 @@ void CCategorySongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Eve if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_DEPTH_UPDATE; parcel.layoutId = LayoutId(); - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; @@ -1017,12 +1014,40 @@ void CCategorySongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Eve m->ctxtinfo = ctxtinfo; SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); parcel.ctxtInfo = ctxtinfo; if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } break; + case CATEGORY_SONGS_PLAY_BUTTON: + case CATEGORY_SONGS_NEXT_BUTTON: + case CATEGORY_SONGS_LAST_BUTTON: + case CATEGORY_SONGS_SELECT_ALL_BUTTON: + case CATEGORY_SONGS_DONE_BUTTON: + case CATEGORY_SONGS_CANCEL_BUTTON: + if (!strcmp(ev->keyname, KEY_UP)) { + const char *btnText = NULL; + + if (id == CATEGORY_SONGS_PLAY_BUTTON + || id == CATEGORY_SONGS_SELECT_ALL_BUTTON) + btnText = MUSIC_FIRST_BTN; + else if (id == CATEGORY_SONGS_NEXT_BUTTON + || id == CATEGORY_SONGS_DONE_BUTTON) + btnText = MUSIC_SECOND_BTN; + else //CATEGORY_SONGS_LAST_BUTTON or CATEGORY_SONGS_CANCEL_BUTTON + btnText = MUSIC_THIRD_BTN; + + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.updateType = E_FOCUS_UPDATE; + parcel.keyEvent = KEY_UP; + parcel.prevFocusedBtn = btnText; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + break; + default: break; } @@ -1129,10 +1154,9 @@ void CCategorySongsLayout::OnMouseClicked(int id, Evas_Object *obj) case CATEGORY_SONGS_CANCEL_BUTTON: { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_DEPTH_UPDATE; parcel.layoutId = LayoutId(); - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; diff --git a/src/views/common-ui.cpp b/src/views/common-ui.cpp index 1937f7b..058104b 100644 --- a/src/views/common-ui.cpp +++ b/src/views/common-ui.cpp @@ -158,10 +158,8 @@ void CCommonUI::UpdatePlaybackView(EAddType type, obj = elm_object_focused_object_get(layout); SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_PLAYLIST_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; if (!vmgr->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel)) { if (!vmgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index 7061f07..82ee954 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -89,6 +89,7 @@ struct SFolderLayout { Evas_Object *win; Evas_Object *base; Evas_Object *grid; + Evas_Object *addBtns[TOTAL_ADD_BTNS]; Elm_Object_Item *focused_item; Eina_List *flist; Eina_List *slist; @@ -102,6 +103,8 @@ struct SFolderLayout { CFolderInfo *c_finfo; CSongInfo *c_sinfo; SContentInfo *ctxtinfo; + Ecore_Idler *focusBtnIdler; + const char *focusBtnStr; int depth; SFolderLayout() { @@ -261,6 +264,34 @@ void CFolderLayout::m_OnFocusIdler(void) } +Eina_Bool CFolderLayout::sm_CbButtonFocusIdler(void *dt) +{ + CFolderLayout *root = (CFolderLayout *)dt; + + if (root) + root->m_OnButtonFocusIdler(); + + return ECORE_CALLBACK_CANCEL; +} + + +void CFolderLayout::m_OnButtonFocusIdler(void) +{ + Evas_Object *focus = NULL; + + m->focusBtnIdler = NULL; + + if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) + focus = m->addBtns[BTN_PLAY]; + else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) + focus = m->addBtns[BTN_NEXT]; + else // MUSIC_THIRD_BTN + focus = m->addBtns[BTN_LAST]; + + elm_object_focus_set(focus, EINA_TRUE); +} + + void CFolderLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) { CFolderLayout *root = (CFolderLayout *)dt; @@ -697,7 +728,7 @@ void CFolderLayout::m_CreateTopsection(void) elm_object_text_set(btn, _(btninfo[i].name)); elm_object_style_set(btn, btninfo[i].style); - Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_KEY_DOWN); img = elm_image_add(btn); if (img) { @@ -710,6 +741,8 @@ void CFolderLayout::m_CreateTopsection(void) elm_object_part_content_set(Layout(), btninfo[i].part, btn); + + m->addBtns[i] = btn; } } @@ -748,10 +781,8 @@ bool CFolderLayout::Create(CLayoutMgr *mgr) Connect(layout, FOLDER_LAYOUT, TYPE_KEY_DOWN); SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_LAYOUT_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } @@ -794,6 +825,13 @@ void CFolderLayout::t_OnShow(void) ASSERT(m); m->depth = E_DEPTH_FOLDER; m_UpdateFolderGrid(false); + + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_FOLDER_LAYOUT; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + evas_object_show(Layout()); } @@ -811,6 +849,15 @@ void CFolderLayout::Update(bool focusFlag) } +void CFolderLayout::SetButtonFocus(const char *btnStr) +{ + ASSERT(m); + + m->focusBtnStr = btnStr; + m->focusBtnIdler = ecore_idler_add(sm_CbButtonFocusIdler, this); +} + + void CFolderLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { switch (id) { @@ -909,10 +956,8 @@ void CFolderLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_ } else { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } } @@ -969,12 +1014,35 @@ void CFolderLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_ m->ctxtinfo = ctxtinfo; SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); parcel.ctxtInfo = ctxtinfo; if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } break; + case FOLDER_LAYOUT_PLAY_BUTTON: + case FOLDER_LAYOUT_NEXT_BUTTON: + case FOLDER_LAYOUT_LAST_BUTTON: + if (!strcmp(ev->keyname, KEY_UP)) { + const char *btnText = NULL; + + if (id == FOLDER_LAYOUT_PLAY_BUTTON) + btnText = MUSIC_FIRST_BTN; + else if (id == FOLDER_LAYOUT_NEXT_BUTTON) + btnText = MUSIC_SECOND_BTN; + else //FOLDER_LAYOUT_LAST_BUTTON + btnText = MUSIC_THIRD_BTN; + + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.updateType = E_FOCUS_UPDATE; + parcel.keyEvent = KEY_UP; + parcel.prevFocusedBtn = btnText; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + break; + default: break; } diff --git a/src/views/playback-view.cpp b/src/views/playback-view.cpp index 84b6ccc..bfe5a6b 100644 --- a/src/views/playback-view.cpp +++ b/src/views/playback-view.cpp @@ -633,10 +633,8 @@ void CPlaybackView::m_UpdateCtxtView(int playStatus) m->ctxtinfo->status = (EPlayStatus)playStatus; SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_SONG_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel); } } @@ -1914,6 +1912,7 @@ void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_ m->ctxtinfo = ctxtinfo; SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); parcel.ctxtInfo = ctxtinfo; if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index e97e2d9..6c4e301 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -416,10 +416,8 @@ void CSongLayout::m_EmptySongList(bool sort_flag) void CSongLayout::m_GotoPlayback(void) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_PLAYLIST_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; if (!m->vmgr->PushView(MUSIC_PLAYBACK_VIEW, &parcel)) _ERR(" viewmgr push view MUSIC_PLAYBACK_VIEW failed "); @@ -524,10 +522,9 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) Connect(layout, SONG_LAYOUT, TYPE_KEY_DOWN); SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; parcel.layoutId = MUSIC_SONG_LAYOUT; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } @@ -597,10 +594,8 @@ void CSongLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Do if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) { SParcel parcel; - parcel.ctxtInfo = NULL; + memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } } @@ -647,6 +642,7 @@ void CSongLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Do m->ctxtinfo = ctxtinfo; SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); parcel.ctxtInfo = ctxtinfo; if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); -- 2.7.4 From f165eec626688501c1a9501e7ef609c350d96ae4 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Thu, 19 Mar 2015 11:53:53 +0900 Subject: [PATCH 12/16] Fix focus sequence Change-Id: If9771620ddc6613bc66d0ee9dd4c9b5c25a147b7 Signed-off-by: Kim Tae Soo --- include/ExtBaseLayout.h | 1 + include/album-layout.h | 1 + include/album-songs-layout.h | 5 + include/category-layout.h | 1 + include/category-songs-layout.h | 2 + include/common.h | 2 +- include/define.h | 4 + include/folder-layout.h | 5 +- include/song-layout.h | 1 + src/views/album-songs-layout.cpp | 134 +++++++++++++++++-------- src/views/base-view.cpp | 55 +++++++--- src/views/category-layout.cpp | 138 +++++++++++++++++-------- src/views/category-songs-layout.cpp | 195 +++++++++++++++++++++++------------- src/views/folder-layout.cpp | 89 ++++++++-------- 14 files changed, 419 insertions(+), 214 deletions(-) diff --git a/include/ExtBaseLayout.h b/include/ExtBaseLayout.h index e9cedd1..224aa56 100644 --- a/include/ExtBaseLayout.h +++ b/include/ExtBaseLayout.h @@ -31,6 +31,7 @@ public: bool EmptyStatus(void); virtual void Update(bool flag) {} + virtual void SetFocus(const char *btnStr) = 0; }; diff --git a/include/album-layout.h b/include/album-layout.h index 6d70675..6f298cf 100644 --- a/include/album-layout.h +++ b/include/album-layout.h @@ -69,6 +69,7 @@ public: virtual void Destroy(void); virtual void Update(bool focusFlag); + virtual void SetFocus(const char *btnStr) {} void SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie); public: diff --git a/include/album-songs-layout.h b/include/album-songs-layout.h index 86b2f36..9a41155 100644 --- a/include/album-songs-layout.h +++ b/include/album-songs-layout.h @@ -40,6 +40,9 @@ private: static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info); void m_OnItemSelect(Evas_Object *obj, void *event_info); + static Eina_Bool sm_CbFocusIdler(void *dt); + void m_OnFocusIdler(void); + private: SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); void m_UpdateSongList(void); @@ -69,6 +72,8 @@ public: void SetCurrentAlbum(CAlbumInfo *albumInfo); CAlbumInfo*CurrentAlbum(void); + virtual void SetFocus(const char *btnStr); + 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/include/category-layout.h b/include/category-layout.h index 9697f90..26d6cf0 100644 --- a/include/category-layout.h +++ b/include/category-layout.h @@ -151,6 +151,7 @@ public: void CreateEntryPopup(void); void SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie); + virtual void SetFocus(const char *btnStr); public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); diff --git a/include/category-songs-layout.h b/include/category-songs-layout.h index 418db0b..4dc1fda 100644 --- a/include/category-songs-layout.h +++ b/include/category-songs-layout.h @@ -102,6 +102,8 @@ public: void SetParameter(EDepth depth, ESelectType selType, CCategoryInfo *catInfo, CAlbumInfo *albumInfo); Eina_List *CategorySongItemInfoList(void); + virtual void SetFocus(const char *btnStr); + 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/include/common.h b/include/common.h index 657569f..cb21752 100644 --- a/include/common.h +++ b/include/common.h @@ -144,7 +144,7 @@ struct SParcel { int updateType; const char *layoutId; const char *keyEvent; - const char *prevFocusedBtn; + const char *focusedBtn; }; #endif /* __COMMON_H__ */ diff --git a/include/define.h b/include/define.h index 9b28a71..93fb8b4 100644 --- a/include/define.h +++ b/include/define.h @@ -449,6 +449,10 @@ #define KEY_UP "Up" #undef KEY_DOWN #define KEY_DOWN "Down" +#undef KEY_LEFT +#define KEY_LEFT "Left" +#undef KEY_RIGHT +#define KEY_RIGHT "Right" /* SHOULD BE DEFINED */ #undef KEY_PLAY diff --git a/include/folder-layout.h b/include/folder-layout.h index 13f20ac..27d7447 100644 --- a/include/folder-layout.h +++ b/include/folder-layout.h @@ -37,9 +37,6 @@ private: static Eina_Bool sm_CbFocusIdler(void *dt); void m_OnFocusIdler(void); - static Eina_Bool sm_CbButtonFocusIdler(void *dt); - void m_OnButtonFocusIdler(void); - static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); void m_OnCtxtUpdate(EActionType type, int lid); @@ -80,7 +77,7 @@ public: virtual void Destroy(void); virtual void Update(bool focusFlag); - void SetButtonFocus(const char *btnStr); + virtual void SetFocus(const char *btnStr); public: virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); diff --git a/include/song-layout.h b/include/song-layout.h index 5a429c7..2939623 100644 --- a/include/song-layout.h +++ b/include/song-layout.h @@ -70,6 +70,7 @@ public: virtual void Destroy(void); virtual void Update(bool focusFlag); + virtual void SetFocus(const char *btnStr) {} public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index d1c5532..188b248 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -61,6 +61,7 @@ struct SAlbumSongsLayout { Evas_Object *win; Evas_Object *base; Evas_Object *songlist; + Evas_Object *addBtns[TOTAL_ADD_BTNS]; Elm_Object_Item *focused_item; CMusicController* mhandle; @@ -72,6 +73,8 @@ struct SAlbumSongsLayout { Eina_List *it_infolist; Elm_Genlist_Item_Class *item_class; int total_duration; + const char *focusBtnStr; + Ecore_Idler *focusIdler; SAlbumSongsLayout() { memset(this, 0, sizeof(SAlbumSongsLayout)); @@ -227,6 +230,34 @@ void CAlbumSongsLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) } +Eina_Bool CAlbumSongsLayout::sm_CbFocusIdler(void *dt) +{ + CAlbumSongsLayout *root = (CAlbumSongsLayout *)dt; + + if (root) + root->m_OnFocusIdler(); + + return ECORE_CALLBACK_CANCEL; +} + + +void CAlbumSongsLayout::m_OnFocusIdler(void) +{ + Evas_Object *focus = NULL; + + m->focusIdler = NULL; + + if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) + focus = m->addBtns[BTN_PLAY]; + else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) + focus = m->addBtns[BTN_NEXT]; + else // MUSIC_THIRD_BTN + focus = m->addBtns[BTN_LAST]; + + elm_object_focus_set(focus, EINA_TRUE); +} + + SAlbumSongsItemInfo *CAlbumSongsLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) { Eina_List *l = NULL; @@ -356,7 +387,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void) { Evas_Object *thumb = NULL; int i; - Evas_Object *btn[TOTAL_ADD_BTNS]; + Evas_Object *btn; Evas_Object *img = NULL; char *path = NULL; char buf[MAX_LENGTH]; @@ -386,31 +417,33 @@ void CAlbumSongsLayout::m_CreateTopSection(void) return; for (i = 0; i < TOTAL_ADD_BTNS; i++) { - btn[i] = elm_button_add(layout); - if (!btn[i]) + btn = elm_button_add(layout); + if (!btn) continue; - evas_object_size_hint_weight_set(btn[i], + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(btn[i], _(btninfo[i].name)); - elm_object_style_set(btn[i], btninfo[i].style); + elm_object_text_set(btn, _(btninfo[i].name)); + elm_object_style_set(btn, btninfo[i].style); - Connect(btn[i], btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_KEY_DOWN); + Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_KEY_DOWN); - img = elm_image_add(btn[i]); + img = elm_image_add(btn); if (img) { snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, btninfo[i].icon); elm_image_file_set(img, buf, NULL); - elm_object_part_content_set(btn[i], + elm_object_part_content_set(btn, MUSIC_PART_ELM_SWALLOWICON, img); } elm_object_part_content_set(layout, btninfo[i].part, - btn[i]); + btn); + + m->addBtns[i] = btn; } - elm_object_focus_set(btn[0], EINA_TRUE); + elm_object_focus_set(m->addBtns[BTN_PLAY], EINA_TRUE); path = m->alinfo->ThumbnailPath(); if (path) { @@ -569,6 +602,15 @@ CAlbumInfo* CAlbumSongsLayout::CurrentAlbum(void) } +void CAlbumSongsLayout::SetFocus(const char *btnStr) +{ + ASSERT(m); + + m->focusBtnStr = btnStr; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); +} + + void CAlbumSongsLayout::t_OnShow(void) { ASSERT(m); @@ -578,6 +620,9 @@ void CAlbumSongsLayout::t_OnShow(void) m_CreateSongList(); m_CreateTopSection(); + elm_object_focus_next_object_set(m->songlist, + m->addBtns[BTN_PLAY], ELM_FOCUS_UP); + CBaseLayout::t_OnShow(); SParcel parcel; @@ -608,46 +653,51 @@ void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_ Elm_Object_Item *it = NULL; SContentInfo *ctxtinfo = NULL; SAlbumSongsItemInfo *itinfo = NULL; + SParcel parcel; - if (strcmp(ev->keyname, KEY_MENU) && - strcmp(ev->keyname, KEY_MENU_REMOTE)) - return; + memset(&parcel, 0, sizeof(SParcel)); 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; + if (!strcmp(ev->keyname, KEY_LEFT)) { + parcel.updateType = E_FOCUS_UPDATE; + m->vmgr->UpdateView(MUSIC_BASE_VIEW, &parcel); } - - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, it); - if (!itinfo) { - free(ctxtinfo); - return; + else if (!strcmp(ev->keyname, KEY_MENU) || + !strcmp(ev->keyname, KEY_MENU_REMOTE)) { + 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; + + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } - - 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; - memset(&parcel, 0, sizeof(SParcel)); - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } break; @@ -668,7 +718,7 @@ void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_ memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; parcel.keyEvent = KEY_UP; - parcel.prevFocusedBtn = btnText; + parcel.focusedBtn = btnText; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index fcd4e2c..f0d3cbb 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -158,6 +158,7 @@ struct SMusicBaseView { SArgList *arglist; int btntype; bool fresh_view; + bool srcBtnFocusedBySecondBtn; CSongLayout *layoutSong; CAlbumLayout *layoutAlbum; @@ -305,7 +306,16 @@ void CMusicBaseView::m_ShowCurrentLayout(void) m->lmgr->Show(layoutId); m_UpdateFocusSequence(); - if (!strcmp(layoutId, MUSIC_FOLDER_LAYOUT)) { + // Button sequnce is processed by key event handling + // in case of layouts with 3 buttons (play, add next, add last..) + if ((!strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_FOLDER_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_ALBUM_SONGS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_SONGS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT))) { elm_object_focus_next_object_set(m->plbackbtn, m->plbackbtn, ELM_FOCUS_DOWN); elm_object_focus_next_object_set(m->srcbtn, m->srcbtn, ELM_FOCUS_DOWN); elm_object_focus_next_object_set(m->sortbtn, m->sortbtn, ELM_FOCUS_DOWN); @@ -897,16 +907,24 @@ void CMusicBaseView::t_OnUpdate(void *data) if (parcel->keyEvent && !strcmp(parcel->keyEvent, KEY_UP)) { Evas_Object *focus = NULL; - if (!strcmp(parcel->prevFocusedBtn, MUSIC_FIRST_BTN)) + if (!strcmp(parcel->focusedBtn, MUSIC_FIRST_BTN)) { + m->srcBtnFocusedBySecondBtn = false; focus = m->plbackbtn; - else if (!strcmp(parcel->prevFocusedBtn, MUSIC_SECOND_BTN)) { - if (elm_object_disabled_get(m->sortbtn)) + } + else if (!strcmp(parcel->focusedBtn, MUSIC_SECOND_BTN)) { + if (elm_object_disabled_get(m->sortbtn)) { + m->srcBtnFocusedBySecondBtn = true; focus = m->srcbtn; - else + } + else { + m->srcBtnFocusedBySecondBtn = false; focus = m->sortbtn; + } } - else if (!strcmp(parcel->prevFocusedBtn, MUSIC_THIRD_BTN)) + else if (!strcmp(parcel->focusedBtn, MUSIC_THIRD_BTN)) { + m->srcBtnFocusedBySecondBtn = false; focus = m->srcbtn; + } elm_object_focus_set(focus, EINA_TRUE); } @@ -995,18 +1013,29 @@ void CMusicBaseView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key !strcmp(ev->keyname, KEY_BACK_REMOTE)) elm_object_focus_set(m->c_grpbtn, EINA_TRUE); else if (!strcmp(ev->keyname, KEY_DOWN) && - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_FOLDER_LAYOUT)) { + (!strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_FOLDER_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_ALBUM_SONGS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_SONGS_LAYOUT) || + !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT))) { const char *btnText = NULL; if (id == BASE_VIEW_PLAY_BUTTON) btnText = MUSIC_FIRST_BTN; else if (id == BASE_VIEW_SORT_BUTTON) btnText = MUSIC_SECOND_BTN; - else //BASE_VIEW_SOURCE_BUTTON - btnText = MUSIC_THIRD_BTN; + else { //BASE_VIEW_SOURCE_BUTTON + if (m->srcBtnFocusedBySecondBtn) + btnText = MUSIC_SECOND_BTN; + else + btnText = MUSIC_THIRD_BTN; + } - CFolderLayout *folderLayout = (CFolderLayout *)m->lmgr->Layout(); - folderLayout->SetButtonFocus(btnText); + CExtBaseLayout *layout = (CExtBaseLayout *)m->lmgr->Layout(); + layout->SetFocus(btnText); } break; @@ -1162,8 +1191,10 @@ void CMusicBaseView::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) case BASE_VIEW_GROUP_GENRE: case BASE_VIEW_GROUP_FOLDER: case BASE_VIEW_GROUP_PLAYLIST: - if (m->lmgr->Layout()) + if (m->lmgr->Layout()) { + m_ShowCurrentLayout(); m_UpdateCurrentLayout(false); + } break; default: diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index d370cef..d1335cb 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -65,6 +65,11 @@ enum EIdType { ID_TYPE_MEMBER }; +enum EFocusIderType { + IDLER_TYPE_LAYOUT_UPDATE, + IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT +}; + struct SBtnInfo { const char *name; const char *part; @@ -81,13 +86,13 @@ struct SCallback { struct SCategoryLayout { Evas_Object *win; Evas_Object *layout; - Evas_Object *add_btn[TOTAL_ADD_BTNS]; + Evas_Object *addBtns[TOTAL_ADD_BTNS]; Evas_Object *def_foc_btn; Eina_List *catlist; Eina_List *alblist; Eina_List *songlist; Eina_List *it_infolist; - Ecore_Idler *focus_idler; + Ecore_Idler *focusIdler; CMusicController *pMusicController; CLayoutMgr *lmgr; CViewMgr *vmgr; @@ -97,6 +102,10 @@ struct SCategoryLayout { int total_duration; int count; + const char *focusBtnStr; + Elm_Object_Item *curItem; + EFocusIderType idlerType; + const char *catSongLayoutId; SCategoryLayout() { @@ -121,24 +130,44 @@ Eina_Bool CCategoryLayout::sm_CbFocusIdler(void *dt) void CCategoryLayout::m_OnFocusIdler(void) { - Elm_Object_Item *it = NULL; - SCatItemInfo *itinfo = NULL; + m->focusIdler = NULL; - m->focus_idler = NULL; + if (m->idlerType == IDLER_TYPE_LAYOUT_UPDATE) { + Elm_Object_Item *it = NULL; + SCatItemInfo *itinfo = NULL; - elm_object_tree_focus_allow_set(t.base, EINA_TRUE); + elm_object_tree_focus_allow_set(t.base, EINA_TRUE); - if (t.depth == E_DEPTH_CATEGORY) { - it = m_FindItemByInfo(m->it_infolist, t.c_catinfo); - if (!it) { - itinfo = (SCatItemInfo *)eina_list_nth(m->it_infolist, 0); - it = itinfo->item; + if (t.depth == E_DEPTH_CATEGORY) { + it = m_FindItemByInfo(m->it_infolist, t.c_catinfo); + if (!it) { + itinfo = (SCatItemInfo *)eina_list_nth(m->it_infolist, 0); + it = itinfo->item; + } + elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(it, EINA_TRUE); + } + else if (t.depth == E_DEPTH_ALBUM) + elm_object_focus_set(m->def_foc_btn, EINA_TRUE); + } + else { + Evas_Object *focus = NULL; + + if (t.depth == E_DEPTH_CATEGORY) { + elm_gengrid_item_show(m->curItem, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(m->curItem, EINA_TRUE); + } + else if (t.depth == E_DEPTH_ALBUM) { + if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) + focus = m->addBtns[ABTN_PLAY]; + else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) + focus = m->addBtns[ABTN_NEXT]; + else // MUSIC_THIRD_BTN + focus = m->addBtns[ABTN_LAST]; + + elm_object_focus_set(focus, EINA_TRUE); } - elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(it, EINA_TRUE); } - else if (t.depth == E_DEPTH_ALBUM) - elm_object_focus_set(m->def_foc_btn, EINA_TRUE); } @@ -526,11 +555,11 @@ int CCategoryLayout::m_ConvertToMin(int milsec) void CCategoryLayout::m_RemoveFocusIdler(void) { - if (!m->focus_idler) + if (!m->focusIdler) return; - ecore_idler_del(m->focus_idler); - m->focus_idler = NULL; + ecore_idler_del(m->focusIdler); + m->focusIdler = NULL; } @@ -771,31 +800,31 @@ void CCategoryLayout::m_AddButtons(void) } for (i = 0; i < TOTAL_ADD_BTNS; i++) { - m->add_btn[i] = elm_button_add(Layout()); - if (!m->add_btn[i]) + m->addBtns[i] = elm_button_add(Layout()); + if (!m->addBtns[i]) continue; - evas_object_size_hint_weight_set(m->add_btn[i], + evas_object_size_hint_weight_set(m->addBtns[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(m->add_btn[i], _(btninfo[i].name)); - elm_object_style_set(m->add_btn[i], btninfo[i].style); + elm_object_text_set(m->addBtns[i], _(btninfo[i].name)); + elm_object_style_set(m->addBtns[i], btninfo[i].style); - Connect(m->add_btn[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); + Connect(m->addBtns[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); - img = elm_image_add(m->add_btn[i]); + img = elm_image_add(m->addBtns[i]); if (img) { snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, btninfo[i].icon); elm_image_file_set(img, buf, NULL); - elm_object_part_content_set(m->add_btn[i], + elm_object_part_content_set(m->addBtns[i], MUSIC_PART_ELM_SWALLOWICON, img); } - elm_object_part_content_set(Layout(), btninfo[i].part, m->add_btn[i]); + elm_object_part_content_set(Layout(), btninfo[i].part, m->addBtns[i]); } - elm_object_focus_set(m->add_btn[ABTN_PLAY], EINA_TRUE); - m->def_foc_btn = m->add_btn[ABTN_PLAY]; + elm_object_focus_set(m->addBtns[ABTN_PLAY], EINA_TRUE); + m->def_foc_btn = m->addBtns[ABTN_PLAY]; } @@ -835,6 +864,7 @@ void CCategoryLayout::m_CreateAlbumgrid(void) return; } + int i = 0; EINA_LIST_FOREACH(m->alblist, l, obj) { alinfo = (CAlbumInfo *)obj; itinfo = (SCatItemInfo *)calloc(1, sizeof(*itinfo)); @@ -846,6 +876,9 @@ void CCategoryLayout::m_CreateAlbumgrid(void) itinfo->item = item; m->it_infolist = eina_list_append(m->it_infolist, itinfo); + if (i == 0) + m->curItem = item; + i++; } elm_gengrid_item_class_free(grid_item); @@ -961,9 +994,9 @@ void CCategoryLayout::m_EmptyLayout(bool sort_flag) int i; for (i = 0; i < TOTAL_ADD_BTNS; i++) { - if (m->add_btn[i]) - evas_object_del(m->add_btn[i]); - m->add_btn[i] = NULL; + if (m->addBtns[i]) + evas_object_del(m->addBtns[i]); + m->addBtns[i] = NULL; } } @@ -1043,6 +1076,9 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) m_AddButtons(); m_CreateAlbumgrid(); + elm_object_focus_next_object_set(t.grid, + m->addBtns[ABTN_PLAY], ELM_FOCUS_UP); + parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_CATEGORY_ALBUM_LAYOUT; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); @@ -1055,7 +1091,7 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) parcel.layoutId = MUSIC_CATEGORY_SELECTLIST_LAYOUT; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } - else { + else { // E_DEPTH_CATEGORY if (!t_SetEdje(MUSIC_CATEGORY_LAYOUT)) { _ERR(" get layout failed "); return; @@ -1083,7 +1119,8 @@ void CCategoryLayout::t_UpdateLayoutWithFocus(void) if (needFocusIdler) { m_RemoveFocusIdler(); - m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + m->idlerType = IDLER_TYPE_LAYOUT_UPDATE; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } } @@ -1232,6 +1269,16 @@ void CCategoryLayout::SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(vo } +void CCategoryLayout::SetFocus(const char *btnStr) +{ + ASSERT(m); + + m->idlerType = IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT; + m->focusBtnStr = btnStr; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); +} + + void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { switch (id) { @@ -1283,17 +1330,26 @@ void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Ke if (!obj) return; + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + + if (!strcmp(ev->keyname, KEY_UP) || + !strcmp(ev->keyname, KEY_DOWN) || + !strcmp(ev->keyname, KEY_LEFT) || + !strcmp(ev->keyname, KEY_RIGHT)) { + m->curItem = it; + return; + } + if ((strcmp(ev->keyname, KEY_MENU) && strcmp(ev->keyname, KEY_MENU_REMOTE)) || t.depth == E_DEPTH_SELECT_LIST || t.depth == E_DEPTH_SHOW_LIST) return; - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; - } t.focused_item = it; if (t.ctxtinfo) { @@ -1354,7 +1410,7 @@ void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Ke memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; parcel.keyEvent = KEY_UP; - parcel.prevFocusedBtn = btnText; + parcel.focusedBtn = btnText; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; @@ -1413,6 +1469,8 @@ void CCategoryLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_ if (!elm_object_item_focus_get(item)) elm_object_item_focus_set(item, EINA_TRUE); + + m->curItem = item; } break; diff --git a/src/views/category-songs-layout.cpp b/src/views/category-songs-layout.cpp index 34f1d03..34d116b 100644 --- a/src/views/category-songs-layout.cpp +++ b/src/views/category-songs-layout.cpp @@ -69,17 +69,21 @@ enum EIdType { ID_TYPE_MEMBER }; +enum EFocusIderType { + IDLER_TYPE_LAYOUT_UPDATE, + IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT +}; struct SCategorySongsLayout { Evas_Object *win; Evas_Object *base; Evas_Object *songlist; Elm_Object_Item *focused_item; - Evas_Object *add_btn[TOTAL_ADD_BTNS]; - Evas_Object *select_btn[TOTAL_SELECT_BTNS]; + Evas_Object *addBtns[TOTAL_ADD_BTNS]; + Evas_Object *selectBtns[TOTAL_SELECT_BTNS]; Evas_Object *def_foc_btn; Evas_Object *albumCover; - Ecore_Idler *focus_idler; + Ecore_Idler *focusIdler; CMusicController* mhandle; CLayoutMgr *mgr; @@ -97,6 +101,9 @@ struct SCategorySongsLayout { CCategoryInfo *catInfo; CAlbumInfo *albumInfo; + const char *focusBtnStr; + EFocusIderType idlerType; + SCategorySongsLayout() { memset(this, 0, sizeof(SCategorySongsLayout)); } @@ -128,9 +135,36 @@ Eina_Bool CCategorySongsLayout::sm_CbFocusIdler(void *dt) void CCategorySongsLayout::m_OnFocusIdler(void) { - m->focus_idler = NULL; - elm_object_tree_focus_allow_set(m->base, EINA_TRUE); - elm_object_focus_set(m->def_foc_btn, EINA_TRUE); + m->focusIdler = NULL; + + if (m->idlerType == IDLER_TYPE_LAYOUT_UPDATE) { + elm_object_tree_focus_allow_set(m->base, EINA_TRUE); + elm_object_focus_set(m->def_foc_btn, EINA_TRUE); + } + else { + Evas_Object *focus = NULL; + + if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) { + if (m->depth == DEPTH_SELECT_LIST) + focus = m->selectBtns[SBTN_SELECT_ALL]; + else + focus = m->addBtns[ABTN_PLAY]; + } + else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) { + if (m->depth == DEPTH_SELECT_LIST) + focus = m->selectBtns[SBTN_DONE]; + else + focus = m->addBtns[ABTN_NEXT]; + } + else { // MUSIC_THIRD_BTN + if (m->depth == DEPTH_SELECT_LIST) + focus = m->selectBtns[SBTN_CANCEL]; + else + focus = m->addBtns[ABTN_LAST]; + } + + elm_object_focus_set(focus, EINA_TRUE); + } } @@ -347,7 +381,7 @@ void CCategorySongsLayout::m_OnSelectlistItemSelect(Evas_Object *obj, Elm_Object tc = eina_list_count(m->it_infolist); if (itinfo->check_status) { if (tc == m->count) - elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + elm_object_text_set(m->selectBtns[SBTN_SELECT_ALL], _(MUSIC_TEXT_SELECT_ALL)); m->count = m->count - 1; elm_object_item_signal_emit(itinfo->item, @@ -357,7 +391,7 @@ void CCategorySongsLayout::m_OnSelectlistItemSelect(Evas_Object *obj, Elm_Object else { m->count = m->count + 1; if (tc == m->count) - elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + elm_object_text_set(m->selectBtns[SBTN_SELECT_ALL], _(MUSIC_TEXT_DESELECT_ALL)); elm_object_item_signal_emit(itinfo->item, MUSIC_SIGNAL_CHECK_ON, MUSIC_BASE_VIEW); @@ -368,11 +402,11 @@ void CCategorySongsLayout::m_OnSelectlistItemSelect(Evas_Object *obj, Elm_Object void CCategorySongsLayout::m_RemoveFocusIdler(void) { - if (!m->focus_idler) + if (!m->focusIdler) return; - ecore_idler_del(m->focus_idler); - m->focus_idler = NULL; + ecore_idler_del(m->focusIdler); + m->focusIdler = NULL; } @@ -459,15 +493,15 @@ void CCategorySongsLayout::m_EmptySongList(void) int i; for (i = 0; i < TOTAL_ADD_BTNS; i++) { - if (m->add_btn[i]) - evas_object_del(m->add_btn[i]); - m->add_btn[i] = NULL; + if (m->addBtns[i]) + evas_object_del(m->addBtns[i]); + m->addBtns[i] = NULL; } for (i = 0; i < TOTAL_SELECT_BTNS; i++) { - if (m->select_btn[i]) - evas_object_del(m->select_btn[i]); - m->select_btn[i] = NULL; + if (m->selectBtns[i]) + evas_object_del(m->selectBtns[i]); + m->selectBtns[i] = NULL; } m->total_duration = 0; @@ -560,31 +594,31 @@ void CCategorySongsLayout::m_AddButtons(void) } for (i = 0; i < TOTAL_ADD_BTNS; i++) { - m->add_btn[i] = elm_button_add(Layout()); - if (!m->add_btn[i]) + m->addBtns[i] = elm_button_add(Layout()); + if (!m->addBtns[i]) continue; - evas_object_size_hint_weight_set(m->add_btn[i], + evas_object_size_hint_weight_set(m->addBtns[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(m->add_btn[i], _(btninfo[i].name)); - elm_object_style_set(m->add_btn[i], btninfo[i].style); + elm_object_text_set(m->addBtns[i], _(btninfo[i].name)); + elm_object_style_set(m->addBtns[i], btninfo[i].style); - Connect(m->add_btn[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); + Connect(m->addBtns[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); - img = elm_image_add(m->add_btn[i]); + img = elm_image_add(m->addBtns[i]); if (img) { snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, btninfo[i].icon); elm_image_file_set(img, buf, NULL); - elm_object_part_content_set(m->add_btn[i], + elm_object_part_content_set(m->addBtns[i], MUSIC_PART_ELM_SWALLOWICON, img); } - elm_object_part_content_set(Layout(), btninfo[i].part, m->add_btn[i]); + elm_object_part_content_set(Layout(), btninfo[i].part, m->addBtns[i]); } - elm_object_focus_set(m->add_btn[ABTN_PLAY], EINA_TRUE); - m->def_foc_btn = m->add_btn[ABTN_PLAY]; + elm_object_focus_set(m->addBtns[ABTN_PLAY], EINA_TRUE); + m->def_foc_btn = m->addBtns[ABTN_PLAY]; } @@ -639,11 +673,11 @@ void CCategorySongsLayout::m_AddSelectlistButtons(void) Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED | TYPE_KEY_DOWN); elm_object_part_content_set(Layout(), btninfo[i].part, btn); - m->select_btn[i] = btn; + m->selectBtns[i] = btn; } - elm_object_focus_set(btn, EINA_TRUE); - m->def_foc_btn = btn; + elm_object_focus_set(m->selectBtns[SBTN_CANCEL], EINA_TRUE); + m->def_foc_btn = m->selectBtns[SBTN_CANCEL]; } @@ -918,6 +952,16 @@ Eina_List *CCategorySongsLayout::CategorySongItemInfoList(void) } +void CCategorySongsLayout::SetFocus(const char *btnStr) +{ + ASSERT(m); + + m->idlerType = IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT; + m->focusBtnStr = btnStr; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); +} + + void CCategorySongsLayout::t_OnShow(void) { ASSERT(m); @@ -931,6 +975,9 @@ void CCategorySongsLayout::t_OnShow(void) } m_CreateSongList(); m_CreateSongsTopSection(); + + elm_object_focus_next_object_set(m->songlist, + m->addBtns[ABTN_PLAY], ELM_FOCUS_UP); } else if (m->depth == DEPTH_SHOW_LIST) { if (!m_SetEdje(MUSIC_ALBUM_SONGS_LAYOUT)) { @@ -939,6 +986,9 @@ void CCategorySongsLayout::t_OnShow(void) } m_CreateSongList(); m_CreateSongsTopSection(); + + elm_object_focus_next_object_set(m->songlist, + m->addBtns[ABTN_PLAY], ELM_FOCUS_UP); } else if (m->depth == DEPTH_SELECT_LIST) { if (!m_SetEdje(MUSIC_CATEGORY_SELECTLIST_LAYOUT)) { @@ -949,12 +999,16 @@ void CCategorySongsLayout::t_OnShow(void) m_AddSelectlistButtons(); elm_object_focus_next_object_set(m->songlist, - m->select_btn[SBTN_DONE], ELM_FOCUS_RIGHT); + m->selectBtns[SBTN_DONE], ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(m->songlist, + m->selectBtns[SBTN_DONE], ELM_FOCUS_UP); } elm_object_tree_focus_allow_set(m->base, EINA_FALSE); m_RemoveFocusIdler(); - m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + m->idlerType = IDLER_TYPE_LAYOUT_UPDATE; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } @@ -979,45 +1033,50 @@ void CCategorySongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Eve SContentInfo *ctxtinfo = NULL; SCategorySongsItemsInfo *itinfo = NULL; - if (strcmp(ev->keyname, KEY_MENU) && - strcmp(ev->keyname, KEY_MENU_REMOTE)) - return; - - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; + if (!strcmp(ev->keyname, KEY_LEFT)) { + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.updateType = E_FOCUS_UPDATE; + m->vmgr->UpdateView(MUSIC_BASE_VIEW, &parcel); } - m->focused_item = it; + else if (!strcmp(ev->keyname, KEY_MENU) || + !strcmp(ev->keyname, KEY_MENU_REMOTE)) { + 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; - } + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; - itinfo = m_FindItemInfoFromItem(m->it_infolist, it); - if (!itinfo) { - free(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; + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; - m->ctxtinfo = ctxtinfo; + m->ctxtinfo = ctxtinfo; - SParcel parcel; - memset(&parcel, 0, sizeof(SParcel)); - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } } break; @@ -1043,7 +1102,7 @@ void CCategorySongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Eve memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; parcel.keyEvent = KEY_UP; - parcel.prevFocusedBtn = btnText; + parcel.focusedBtn = btnText; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; @@ -1113,7 +1172,7 @@ void CCategorySongsLayout::OnMouseClicked(int id, Evas_Object *obj) tc = eina_list_count(m->it_infolist); if (m->count == tc) { - elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + elm_object_text_set(m->selectBtns[SBTN_SELECT_ALL], _(MUSIC_TEXT_SELECT_ALL)); m->count = 0; EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { @@ -1125,7 +1184,7 @@ void CCategorySongsLayout::OnMouseClicked(int id, Evas_Object *obj) return; } - elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + elm_object_text_set(m->selectBtns[SBTN_SELECT_ALL], _(MUSIC_TEXT_DESELECT_ALL)); m->count = tc; EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index 82ee954..7a40134 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -77,6 +77,11 @@ enum EDepthType { E_DEPTH_SONG }; +enum EFocusIderType { + IDLER_TYPE_LAYOUT_UPDATE, + IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT +}; + struct SBtnInfo { const char *name; const char *part; @@ -96,16 +101,17 @@ struct SFolderLayout { Eina_List *it_infolist; Elm_Gengrid_Item_Class *item_class; Elm_Gengrid_Item_Class *songitem_class; - Ecore_Idler *focus_idler; + Ecore_Idler *focusIdler; CMusicController *mhandle; CLayoutMgr *lmgr; CViewMgr *vmgr; CFolderInfo *c_finfo; CSongInfo *c_sinfo; SContentInfo *ctxtinfo; - Ecore_Idler *focusBtnIdler; - const char *focusBtnStr; int depth; + + EFocusIderType idlerType; + const char *focusBtnStr; SFolderLayout() { memset(this, 0, sizeof(SFolderLayout)); @@ -246,49 +252,35 @@ Eina_Bool CFolderLayout::sm_CbFocusIdler(void *dt) void CFolderLayout::m_OnFocusIdler(void) { - Elm_Object_Item *it = NULL; + m->focusIdler = NULL; - m->focus_idler = NULL; + if (m->idlerType == IDLER_TYPE_LAYOUT_UPDATE) { + Elm_Object_Item *it = NULL; - if (m->depth == E_DEPTH_SONG) { - it = elm_gengrid_first_item_get(m->grid); - elm_object_item_focus_set(it, EINA_TRUE); - } - else { - it = m_FindItemByInfo(m->it_infolist, m->c_finfo); - if (it) { - elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN); + if (m->depth == E_DEPTH_SONG) { + it = elm_gengrid_first_item_get(m->grid); elm_object_item_focus_set(it, EINA_TRUE); } + else { + it = m_FindItemByInfo(m->it_infolist, m->c_finfo); + if (it) { + elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(it, EINA_TRUE); + } + } } -} - - -Eina_Bool CFolderLayout::sm_CbButtonFocusIdler(void *dt) -{ - CFolderLayout *root = (CFolderLayout *)dt; - - if (root) - root->m_OnButtonFocusIdler(); - - return ECORE_CALLBACK_CANCEL; -} - - -void CFolderLayout::m_OnButtonFocusIdler(void) -{ - Evas_Object *focus = NULL; - - m->focusBtnIdler = NULL; + else { + Evas_Object *focus = NULL; - if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) - focus = m->addBtns[BTN_PLAY]; - else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) - focus = m->addBtns[BTN_NEXT]; - else // MUSIC_THIRD_BTN - focus = m->addBtns[BTN_LAST]; + if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) + focus = m->addBtns[BTN_PLAY]; + else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) + focus = m->addBtns[BTN_NEXT]; + else // MUSIC_THIRD_BTN + focus = m->addBtns[BTN_LAST]; - elm_object_focus_set(focus, EINA_TRUE); + elm_object_focus_set(focus, EINA_TRUE); + } } @@ -413,7 +405,8 @@ void CFolderLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, co else { m->depth = E_DEPTH_SONG; m_UpdateFolderGrid(false); - m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + m->idlerType = IDLER_TYPE_LAYOUT_UPDATE; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } } @@ -448,11 +441,11 @@ int CFolderLayout::m_ConvertToMin(int milsec) void CFolderLayout::m_RemoveFocusIdler(void) { - if (!m->focus_idler) + if (!m->focusIdler) return; - ecore_idler_del(m->focus_idler); - m->focus_idler = NULL; + ecore_idler_del(m->focusIdler); + m->focusIdler = NULL; } @@ -849,12 +842,13 @@ void CFolderLayout::Update(bool focusFlag) } -void CFolderLayout::SetButtonFocus(const char *btnStr) +void CFolderLayout::SetFocus(const char *btnStr) { ASSERT(m); m->focusBtnStr = btnStr; - m->focusBtnIdler = ecore_idler_add(sm_CbButtonFocusIdler, this); + m->idlerType = IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } @@ -952,7 +946,8 @@ void CFolderLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_ m->depth = E_DEPTH_FOLDER; m_UpdateFolderGrid(false); m_RemoveFocusIdler(); - m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + m->idlerType = IDLER_TYPE_LAYOUT_UPDATE; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } else { SParcel parcel; @@ -1038,7 +1033,7 @@ void CFolderLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_ memset(&parcel, 0, sizeof(SParcel)); parcel.updateType = E_FOCUS_UPDATE; parcel.keyEvent = KEY_UP; - parcel.prevFocusedBtn = btnText; + parcel.focusedBtn = btnText; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); } break; -- 2.7.4 From f3404066293c7bd60490bac23d7eeba978d00680 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Thu, 19 Mar 2015 16:56:42 +0900 Subject: [PATCH 13/16] Fix focus sequence Change-Id: I8a58342f6e1efaebf8166c03246369369d7c9236 Signed-off-by: Kim Tae Soo --- include/album-layout.h | 6 +- include/song-layout.h | 5 +- src/views/album-layout.cpp | 128 ++++++++++++++++++++++++++++-------------- src/views/base-view.cpp | 28 +-------- src/views/category-layout.cpp | 97 ++++++++++++++------------------ src/views/song-layout.cpp | 31 ++++++++++ 6 files changed, 169 insertions(+), 126 deletions(-) diff --git a/include/album-layout.h b/include/album-layout.h index 6f298cf..7901cf7 100644 --- a/include/album-layout.h +++ b/include/album-layout.h @@ -28,6 +28,9 @@ private: struct SAlbumLayout *m; private: + static Eina_Bool sm_CbFocusIdler(void *dt); + void m_OnFocusIdler(void); + static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveGridItem(void *data, Evas_Object *obj); @@ -69,7 +72,8 @@ public: virtual void Destroy(void); virtual void Update(bool focusFlag); - virtual void SetFocus(const char *btnStr) {} + virtual void SetFocus(const char *btnStr); + void SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie); public: diff --git a/include/song-layout.h b/include/song-layout.h index 2939623..37a5f85 100644 --- a/include/song-layout.h +++ b/include/song-layout.h @@ -26,6 +26,9 @@ private: struct SSongLayout *m; private: + static Eina_Bool sm_CbFocusIdler(void *dt); + void m_OnFocusIdler(void); + static char *sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetListItemContent(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveListItem(void *data, Evas_Object *obj); @@ -70,7 +73,7 @@ public: virtual void Destroy(void); virtual void Update(bool focusFlag); - virtual void SetFocus(const char *btnStr) {} + virtual void SetFocus(const char *btnStr); public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index 16ae286..61eff05 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -62,7 +62,7 @@ struct SAlbumLayout { Evas_Object *win; Evas_Object *base; Evas_Object *grid; - Elm_Object_Item *focused_item; + Elm_Object_Item *focusedItem; Eina_List *alblist; Eina_List *it_infolist; Elm_Gengrid_Item_Class *item_class; @@ -73,6 +73,7 @@ struct SAlbumLayout { char *album_id; CAlbumSongsLayout *layoutAlbumSongs; SCallback callback; + Ecore_Idler *focusIdler; SAlbumLayout() { memset(this, 0, sizeof(SAlbumLayout)); @@ -83,6 +84,27 @@ struct SAlbumLayout { }; +Eina_Bool CAlbumLayout::sm_CbFocusIdler(void *dt) +{ + CAlbumLayout *root = (CAlbumLayout *)dt; + + if (root) + root->m_OnFocusIdler(); + + return ECORE_CALLBACK_CANCEL; +} + + +void CAlbumLayout::m_OnFocusIdler(void) +{ + m->focusIdler = NULL; + + ASSERT(m->focusedItem); + elm_gengrid_item_show(m->focusedItem, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(m->focusedItem, EINA_TRUE); +} + + char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) { SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data; @@ -192,7 +214,7 @@ void CAlbumLayout::m_OnCtxtUpdate(EActionType type, int lid) m->mhandle->SetCurrentSong(sinfo->Id()); } - CCommonUI::UpdatePlaybackView((EAddType)type, Layout(), m->focused_item); + CCommonUI::UpdatePlaybackView((EAddType)type, Layout(), m->focusedItem); } @@ -209,7 +231,7 @@ void CAlbumLayout::m_OnCtxtClose(void) { m->vmgr->PopView(); m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); - elm_object_item_focus_set(m->focused_item, EINA_TRUE); + elm_object_item_focus_set(m->focusedItem, EINA_TRUE); } @@ -394,6 +416,7 @@ void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag) m_SortAlbumGrid(); + int i = 0; EINA_LIST_FOREACH(m->alblist, l, obj) { alinfo = (CAlbumInfo *)obj; itinfo = (SAlbumItemInfo *)calloc(1, sizeof(*itinfo)); @@ -404,6 +427,9 @@ void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag) item = elm_gengrid_item_append(m->grid, m->item_class, itinfo, NULL, NULL); itinfo->item = item; m->it_infolist = eina_list_append(m->it_infolist, itinfo); + if (i == 0) + m->focusedItem = item; + i++; } } @@ -557,6 +583,13 @@ void CAlbumLayout::Update(bool focusFlag) } +void CAlbumLayout::SetFocus(const char *btnStr) +{ + ASSERT(m); + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); +} + + void CAlbumLayout::SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie) { ASSERT(m); @@ -585,45 +618,45 @@ void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_D SContentInfo *ctxtinfo = NULL; SAlbumItemInfo *itinfo = NULL; - if (strcmp(ev->keyname, KEY_MENU) && - strcmp(ev->keyname, KEY_MENU_REMOTE)) - 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_FindItemInfo(m->it_infolist, it); - if (!itinfo) { - free(ctxtinfo); - return; + m->focusedItem = it; + + if (!strcmp(ev->keyname, KEY_MENU) || + !strcmp(ev->keyname, KEY_MENU_REMOTE)) { + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_ALBUM; + ctxtinfo->context = itinfo->alinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } - - ctxtinfo->type = CONTEXT_TYPE_ALBUM; - ctxtinfo->context = itinfo->alinfo; - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - - m->ctxtinfo = ctxtinfo; - - SParcel parcel; - memset(&parcel, 0, sizeof(SParcel)); - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } break; @@ -635,15 +668,26 @@ void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_D void CAlbumLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - Elm_Object_Item *item; + switch (id) { + case ALBUM_GENGRID: + { + Elm_Object_Item *item; - item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, - ev->cur.canvas.y, NULL, NULL); - if (!item) - return; + item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); + if (!item) + return; + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + + m->focusedItem = item; + } + break; - if (!elm_object_item_focus_get(item)) - elm_object_item_focus_set(item, EINA_TRUE); + default: + break; + } } diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index f0d3cbb..5f4ffc7 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -236,9 +236,6 @@ void CMusicBaseView::m_UpdateFocusSequence(void) elm_object_focus_next_object_set(m->plbackbtn, m->c_grpbtn, ELM_FOCUS_LEFT); else elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(m->plbackbtn, m->content, ELM_FOCUS_DOWN); - elm_object_focus_next_object_set(m->srcbtn, m->content, ELM_FOCUS_DOWN); - elm_object_focus_next_object_set(m->sortbtn, m->content, ELM_FOCUS_DOWN); elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT, MUSIC_STR_EMPTY); elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT_SUB, MUSIC_STR_EMPTY); @@ -305,21 +302,6 @@ void CMusicBaseView::m_ShowCurrentLayout(void) elm_object_part_content_set(m->base, MUSIC_PART_CONTENT, evasLayout); m->lmgr->Show(layoutId); m_UpdateFocusSequence(); - - // Button sequnce is processed by key event handling - // in case of layouts with 3 buttons (play, add next, add last..) - if ((!strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_FOLDER_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_ALBUM_SONGS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_SONGS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT))) { - elm_object_focus_next_object_set(m->plbackbtn, m->plbackbtn, ELM_FOCUS_DOWN); - elm_object_focus_next_object_set(m->srcbtn, m->srcbtn, ELM_FOCUS_DOWN); - elm_object_focus_next_object_set(m->sortbtn, m->sortbtn, ELM_FOCUS_DOWN); - } } } @@ -1012,15 +994,7 @@ void CMusicBaseView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) elm_object_focus_set(m->c_grpbtn, EINA_TRUE); - else if (!strcmp(ev->keyname, KEY_DOWN) && - (!strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_FOLDER_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_ALBUM_SONGS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_ARTIST_SONGS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_GENRE_SONGS_LAYOUT) || - !strcmp(m->lmgr->Layout()->LayoutId(), MUSIC_CATEGORY_PLAYLISTS_SONGS_LAYOUT))) { + else if (!strcmp(ev->keyname, KEY_DOWN)) { const char *btnText = NULL; if (id == BASE_VIEW_PLAY_BUTTON) diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index d1335cb..c7bb8b5 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -103,7 +103,6 @@ struct SCategoryLayout { int count; const char *focusBtnStr; - Elm_Object_Item *curItem; EFocusIderType idlerType; const char *catSongLayoutId; @@ -154,8 +153,8 @@ void CCategoryLayout::m_OnFocusIdler(void) Evas_Object *focus = NULL; if (t.depth == E_DEPTH_CATEGORY) { - elm_gengrid_item_show(m->curItem, ELM_GENGRID_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(m->curItem, EINA_TRUE); + elm_gengrid_item_show(t.focused_item, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(t.focused_item, EINA_TRUE); } else if (t.depth == E_DEPTH_ALBUM) { if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) @@ -877,7 +876,7 @@ void CCategoryLayout::m_CreateAlbumgrid(void) m->it_infolist = eina_list_append(m->it_infolist, itinfo); if (i == 0) - m->curItem = item; + t.focused_item = item; i++; } elm_gengrid_item_class_free(grid_item); @@ -1076,9 +1075,6 @@ void CCategoryLayout::t_UpdateLayout(bool sort_flag) m_AddButtons(); m_CreateAlbumgrid(); - elm_object_focus_next_object_set(t.grid, - m->addBtns[ABTN_PLAY], ELM_FOCUS_UP); - parcel.updateType = E_LAYOUT_UPDATE; parcel.layoutId = MUSIC_CATEGORY_ALBUM_LAYOUT; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); @@ -1336,60 +1332,51 @@ void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Ke return; } - if (!strcmp(ev->keyname, KEY_UP) || - !strcmp(ev->keyname, KEY_DOWN) || - !strcmp(ev->keyname, KEY_LEFT) || - !strcmp(ev->keyname, KEY_RIGHT)) { - m->curItem = it; - return; - } - - if ((strcmp(ev->keyname, KEY_MENU) && - strcmp(ev->keyname, KEY_MENU_REMOTE)) || - t.depth == E_DEPTH_SELECT_LIST || - t.depth == E_DEPTH_SHOW_LIST) - return; - t.focused_item = it; - if (t.ctxtinfo) { - free(t.ctxtinfo); - t.ctxtinfo = NULL; - } + if ((!strcmp(ev->keyname, KEY_MENU) || + !strcmp(ev->keyname, KEY_MENU_REMOTE)) && + t.depth != E_DEPTH_SELECT_LIST && + t.depth != E_DEPTH_SHOW_LIST) { + if (t.ctxtinfo) { + free(t.ctxtinfo); + t.ctxtinfo = NULL; + } - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; - itinfo = m_FindItemInfo(m->it_infolist, it); - if (!itinfo || itinfo->type == CAT_TYPE_PLAYLIST_NEW) { - free(ctxtinfo); - return; - } + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo || itinfo->type == CAT_TYPE_PLAYLIST_NEW) { + free(ctxtinfo); + return; + } - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - if (t.depth == E_DEPTH_SONG) { - ctxtinfo->type = CONTEXT_TYPE_SONG; - ctxtinfo->context = itinfo->sinfo; - } - else if (t.depth == E_DEPTH_ALBUM) { - ctxtinfo->type = CONTEXT_TYPE_ALBUM; - ctxtinfo->context = itinfo->alinfo; - } - else { - ctxtinfo->type = t_ContextType(); - ctxtinfo->context = itinfo->catinfo; - } + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + if (t.depth == E_DEPTH_SONG) { + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + } + else if (t.depth == E_DEPTH_ALBUM) { + ctxtinfo->type = CONTEXT_TYPE_ALBUM; + ctxtinfo->context = itinfo->alinfo; + } + else { + ctxtinfo->type = t_ContextType(); + ctxtinfo->context = itinfo->catinfo; + } - t.ctxtinfo = ctxtinfo; + t.ctxtinfo = ctxtinfo; - SParcel parcel; - memset(&parcel, 0, sizeof(SParcel)); - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + SParcel parcel; + memset(&parcel, 0, sizeof(SParcel)); + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } } break; @@ -1470,7 +1457,7 @@ void CCategoryLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_ if (!elm_object_item_focus_get(item)) elm_object_item_focus_set(item, EINA_TRUE); - m->curItem = item; + t.focused_item = item; } break; diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index 6c4e301..7bd3f0b 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -61,6 +61,7 @@ struct SSongLayout { CViewMgr* vmgr; SContentInfo *ctxtinfo; char *uri; + Ecore_Idler *focusIdler; SSongLayout() { memset(this, 0, sizeof(SSongLayout)); @@ -71,6 +72,29 @@ struct SSongLayout { }; +Eina_Bool CSongLayout::sm_CbFocusIdler(void *dt) +{ + CSongLayout *root = (CSongLayout *)dt; + + if (root) + root->m_OnFocusIdler(); + + return ECORE_CALLBACK_CANCEL; +} + + +void CSongLayout::m_OnFocusIdler(void) +{ + m->focusIdler = NULL; + + Elm_Object_Item *item = elm_genlist_first_item_get(m->songlist); + ASSERT(item); + + elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(item, EINA_TRUE); +} + + char *CSongLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) { SSongItemInfo *itinfo = (SSongItemInfo *)data; @@ -586,6 +610,13 @@ void CSongLayout::Update(bool focusFlag) } +void CSongLayout::SetFocus(const char *btnStr) +{ + ASSERT(m); + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); +} + + void CSongLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { switch (id) { -- 2.7.4 From 035c561c758ff5812cc210ada4eed37ac81e802a Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Fri, 20 Mar 2015 07:54:49 +0900 Subject: [PATCH 14/16] Modification to move focus from upper button to contents only by key events Change-Id: I6c12fac989969e618721a0ec3fe69326a788fd03 Signed-off-by: Kim Tae Soo --- src/views/base-view.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index 5f4ffc7..f66379a 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -232,11 +232,16 @@ void CMusicBaseView::m_UpdateFocusSequence(void) elm_object_focus_next_object_set(m->group_btn[GROUP_BTN_SONG], m->group_btn[GROUP_BTN_PLAYLIST], ELM_FOCUS_UP); elm_object_focus_next_object_set(m->group_btn[GROUP_BTN_PLAYLIST], m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_DOWN); + if (m->c_grpbtn != NULL) elm_object_focus_next_object_set(m->plbackbtn, m->c_grpbtn, ELM_FOCUS_LEFT); else elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->plbackbtn, m->plbackbtn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->srcbtn, m->srcbtn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->sortbtn, m->sortbtn, ELM_FOCUS_DOWN); + elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT, MUSIC_STR_EMPTY); elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT_SUB, MUSIC_STR_EMPTY); } -- 2.7.4 From 537b28a7876a3e778316c61df04c3ba4c2c40979 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Fri, 20 Mar 2015 08:50:25 +0900 Subject: [PATCH 15/16] Fix focus error after context view is closed Change-Id: Ic2acf04abe824e2b8e57abe684d519eaf20319b1 Signed-off-by: Kim Tae Soo --- include/album-layout.h | 3 --- include/song-layout.h | 3 --- src/views/album-layout.cpp | 28 ++++------------------------ src/views/album-songs-layout.cpp | 1 - src/views/category-layout.cpp | 35 +++++++++++++++++------------------ src/views/category-songs-layout.cpp | 1 - src/views/folder-layout.cpp | 1 - src/views/song-layout.cpp | 32 ++++++-------------------------- 8 files changed, 27 insertions(+), 77 deletions(-) diff --git a/include/album-layout.h b/include/album-layout.h index 7901cf7..1b983cb 100644 --- a/include/album-layout.h +++ b/include/album-layout.h @@ -28,9 +28,6 @@ private: struct SAlbumLayout *m; private: - static Eina_Bool sm_CbFocusIdler(void *dt); - void m_OnFocusIdler(void); - static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveGridItem(void *data, Evas_Object *obj); diff --git a/include/song-layout.h b/include/song-layout.h index 37a5f85..714e1d1 100644 --- a/include/song-layout.h +++ b/include/song-layout.h @@ -26,9 +26,6 @@ private: struct SSongLayout *m; private: - static Eina_Bool sm_CbFocusIdler(void *dt); - void m_OnFocusIdler(void); - static char *sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetListItemContent(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveListItem(void *data, Evas_Object *obj); diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index 61eff05..8fe0145 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -73,7 +73,6 @@ struct SAlbumLayout { char *album_id; CAlbumSongsLayout *layoutAlbumSongs; SCallback callback; - Ecore_Idler *focusIdler; SAlbumLayout() { memset(this, 0, sizeof(SAlbumLayout)); @@ -84,27 +83,6 @@ struct SAlbumLayout { }; -Eina_Bool CAlbumLayout::sm_CbFocusIdler(void *dt) -{ - CAlbumLayout *root = (CAlbumLayout *)dt; - - if (root) - root->m_OnFocusIdler(); - - return ECORE_CALLBACK_CANCEL; -} - - -void CAlbumLayout::m_OnFocusIdler(void) -{ - m->focusIdler = NULL; - - ASSERT(m->focusedItem); - elm_gengrid_item_show(m->focusedItem, ELM_GENGRID_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(m->focusedItem, EINA_TRUE); -} - - char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) { SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data; @@ -230,7 +208,6 @@ void CAlbumLayout::sm_CbCtxtClose(void *dt) void CAlbumLayout::m_OnCtxtClose(void) { m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); elm_object_item_focus_set(m->focusedItem, EINA_TRUE); } @@ -586,7 +563,10 @@ void CAlbumLayout::Update(bool focusFlag) void CAlbumLayout::SetFocus(const char *btnStr) { ASSERT(m); - m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); + ASSERT(m->focusedItem); + + elm_gengrid_item_show(m->focusedItem, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(m->focusedItem, EINA_TRUE); } diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index 188b248..c0ea801 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -201,7 +201,6 @@ void CAlbumSongsLayout::sm_CbCtxtClose(void *dt) 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); } diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index c7bb8b5..fe23564 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -152,20 +152,14 @@ void CCategoryLayout::m_OnFocusIdler(void) else { Evas_Object *focus = NULL; - if (t.depth == E_DEPTH_CATEGORY) { - elm_gengrid_item_show(t.focused_item, ELM_GENGRID_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(t.focused_item, EINA_TRUE); - } - else if (t.depth == E_DEPTH_ALBUM) { - if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) - focus = m->addBtns[ABTN_PLAY]; - else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) - focus = m->addBtns[ABTN_NEXT]; - else // MUSIC_THIRD_BTN - focus = m->addBtns[ABTN_LAST]; - - elm_object_focus_set(focus, EINA_TRUE); - } + if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) + focus = m->addBtns[ABTN_PLAY]; + else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) + focus = m->addBtns[ABTN_NEXT]; + else // MUSIC_THIRD_BTN + focus = m->addBtns[ABTN_LAST]; + + elm_object_focus_set(focus, EINA_TRUE); } } @@ -325,7 +319,6 @@ void CCategoryLayout::sm_CbCtxtClose(void *dt) void CCategoryLayout::m_OnCtxtClose(void) { m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); elm_object_item_focus_set(t.focused_item, EINA_TRUE); } @@ -1269,9 +1262,15 @@ void CCategoryLayout::SetFocus(const char *btnStr) { ASSERT(m); - m->idlerType = IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT; - m->focusBtnStr = btnStr; - m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); + if (t.depth == E_DEPTH_CATEGORY) { + elm_gengrid_item_show(t.focused_item, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(t.focused_item, EINA_TRUE); + } + else { + m->idlerType = IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT; + m->focusBtnStr = btnStr; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); + } } diff --git a/src/views/category-songs-layout.cpp b/src/views/category-songs-layout.cpp index 34d116b..27c1b22 100644 --- a/src/views/category-songs-layout.cpp +++ b/src/views/category-songs-layout.cpp @@ -320,7 +320,6 @@ void CCategorySongsLayout::sm_CbCtxtClose(void *dt) void CCategorySongsLayout::m_OnCtxtClose(void) { m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); elm_object_item_focus_set(m->focused_item, EINA_TRUE); } diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index 7a40134..ad6c08b 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -347,7 +347,6 @@ void CFolderLayout::sm_CbCtxtClose(void *dt) void CFolderLayout::m_OnCtxtClose(void) { m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); elm_object_item_focus_set(m->focused_item, EINA_TRUE); } diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index 7bd3f0b..3a322a0 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -61,7 +61,6 @@ struct SSongLayout { CViewMgr* vmgr; SContentInfo *ctxtinfo; char *uri; - Ecore_Idler *focusIdler; SSongLayout() { memset(this, 0, sizeof(SSongLayout)); @@ -72,29 +71,6 @@ struct SSongLayout { }; -Eina_Bool CSongLayout::sm_CbFocusIdler(void *dt) -{ - CSongLayout *root = (CSongLayout *)dt; - - if (root) - root->m_OnFocusIdler(); - - return ECORE_CALLBACK_CANCEL; -} - - -void CSongLayout::m_OnFocusIdler(void) -{ - m->focusIdler = NULL; - - Elm_Object_Item *item = elm_genlist_first_item_get(m->songlist); - ASSERT(item); - - elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(item, EINA_TRUE); -} - - char *CSongLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) { SSongItemInfo *itinfo = (SSongItemInfo *)data; @@ -238,7 +214,6 @@ void CSongLayout::sm_CbCtxtClose(void *dt) 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); } @@ -613,7 +588,12 @@ void CSongLayout::Update(bool focusFlag) void CSongLayout::SetFocus(const char *btnStr) { ASSERT(m); - m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); + + Elm_Object_Item *item = elm_genlist_first_item_get(m->songlist); + ASSERT(item); + + elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(item, EINA_TRUE); } -- 2.7.4 From 9a2a4f598743c7525b0bd16d0a38cd988c753351 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Fri, 20 Mar 2015 09:23:59 +0900 Subject: [PATCH 16/16] Set focus after key event handling is finished Change-Id: I5f3cc3ad2a21949bac0c042be495c3de0286839e Signed-off-by: Kim Tae Soo --- include/album-layout.h | 3 +++ include/song-layout.h | 3 +++ src/views/album-layout.cpp | 27 +++++++++++++++++++++++---- src/views/category-layout.cpp | 34 +++++++++++++++++----------------- src/views/song-layout.cpp | 31 +++++++++++++++++++++++++------ 5 files changed, 71 insertions(+), 27 deletions(-) diff --git a/include/album-layout.h b/include/album-layout.h index 1b983cb..7901cf7 100644 --- a/include/album-layout.h +++ b/include/album-layout.h @@ -28,6 +28,9 @@ private: struct SAlbumLayout *m; private: + static Eina_Bool sm_CbFocusIdler(void *dt); + void m_OnFocusIdler(void); + static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveGridItem(void *data, Evas_Object *obj); diff --git a/include/song-layout.h b/include/song-layout.h index 714e1d1..37a5f85 100644 --- a/include/song-layout.h +++ b/include/song-layout.h @@ -26,6 +26,9 @@ private: struct SSongLayout *m; private: + static Eina_Bool sm_CbFocusIdler(void *dt); + void m_OnFocusIdler(void); + static char *sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetListItemContent(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveListItem(void *data, Evas_Object *obj); diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index 8fe0145..f1dbcb1 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -73,6 +73,7 @@ struct SAlbumLayout { char *album_id; CAlbumSongsLayout *layoutAlbumSongs; SCallback callback; + Ecore_Idler *focusIdler; SAlbumLayout() { memset(this, 0, sizeof(SAlbumLayout)); @@ -83,6 +84,27 @@ struct SAlbumLayout { }; +Eina_Bool CAlbumLayout::sm_CbFocusIdler(void *dt) +{ + CAlbumLayout *root = (CAlbumLayout *)dt; + + if (root) + root->m_OnFocusIdler(); + + return ECORE_CALLBACK_CANCEL; +} + + +void CAlbumLayout::m_OnFocusIdler(void) +{ + m->focusIdler = NULL; + + ASSERT(m->focusedItem); + elm_gengrid_item_show(m->focusedItem, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(m->focusedItem, EINA_TRUE); +} + + char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) { SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data; @@ -563,10 +585,7 @@ void CAlbumLayout::Update(bool focusFlag) void CAlbumLayout::SetFocus(const char *btnStr) { ASSERT(m); - ASSERT(m->focusedItem); - - elm_gengrid_item_show(m->focusedItem, ELM_GENGRID_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(m->focusedItem, EINA_TRUE); + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index fe23564..6041718 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -150,16 +150,22 @@ void CCategoryLayout::m_OnFocusIdler(void) elm_object_focus_set(m->def_foc_btn, EINA_TRUE); } else { - Evas_Object *focus = NULL; + if (t.depth == E_DEPTH_CATEGORY) { + elm_gengrid_item_show(t.focused_item, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(t.focused_item, EINA_TRUE); + } + else { + Evas_Object *focus = NULL; - if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) - focus = m->addBtns[ABTN_PLAY]; - else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) - focus = m->addBtns[ABTN_NEXT]; - else // MUSIC_THIRD_BTN - focus = m->addBtns[ABTN_LAST]; + if (!strcmp(m->focusBtnStr, MUSIC_FIRST_BTN)) + focus = m->addBtns[ABTN_PLAY]; + else if (!strcmp(m->focusBtnStr, MUSIC_SECOND_BTN)) + focus = m->addBtns[ABTN_NEXT]; + else // MUSIC_THIRD_BTN + focus = m->addBtns[ABTN_LAST]; - elm_object_focus_set(focus, EINA_TRUE); + elm_object_focus_set(focus, EINA_TRUE); + } } } @@ -1262,15 +1268,9 @@ void CCategoryLayout::SetFocus(const char *btnStr) { ASSERT(m); - if (t.depth == E_DEPTH_CATEGORY) { - elm_gengrid_item_show(t.focused_item, ELM_GENGRID_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(t.focused_item, EINA_TRUE); - } - else { - m->idlerType = IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT; - m->focusBtnStr = btnStr; - m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); - } + m->idlerType = IDLER_TYPE_FOCUS_MOVE_BY_USER_INPUT; + m->focusBtnStr = btnStr; + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index 3a322a0..8e776b5 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -61,6 +61,7 @@ struct SSongLayout { CViewMgr* vmgr; SContentInfo *ctxtinfo; char *uri; + Ecore_Idler *focusIdler; SSongLayout() { memset(this, 0, sizeof(SSongLayout)); @@ -71,6 +72,29 @@ struct SSongLayout { }; +Eina_Bool CSongLayout::sm_CbFocusIdler(void *dt) +{ + CSongLayout *root = (CSongLayout *)dt; + + if (root) + root->m_OnFocusIdler(); + + return ECORE_CALLBACK_CANCEL; +} + + +void CSongLayout::m_OnFocusIdler(void) +{ + m->focusIdler = NULL; + + Elm_Object_Item *item = elm_genlist_first_item_get(m->songlist); + ASSERT(item); + + elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(item, EINA_TRUE); +} + + char *CSongLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) { SSongItemInfo *itinfo = (SSongItemInfo *)data; @@ -588,12 +612,7 @@ void CSongLayout::Update(bool focusFlag) void CSongLayout::SetFocus(const char *btnStr) { ASSERT(m); - - Elm_Object_Item *item = elm_genlist_first_item_get(m->songlist); - ASSERT(item); - - elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_IN); - elm_object_item_focus_set(item, EINA_TRUE); + m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this); } -- 2.7.4