Fix focus sequence 86/37086/5
authorKim Tae Soo <taesoo46.kim@samsung.com>
Thu, 19 Mar 2015 02:53:53 +0000 (11:53 +0900)
committerKim Tae Soo <taesoo46.kim@samsung.com>
Thu, 19 Mar 2015 05:55:05 +0000 (14:55 +0900)
Change-Id: If9771620ddc6613bc66d0ee9dd4c9b5c25a147b7
Signed-off-by: Kim Tae Soo <taesoo46.kim@samsung.com>
14 files changed:
include/ExtBaseLayout.h
include/album-layout.h
include/album-songs-layout.h
include/category-layout.h
include/category-songs-layout.h
include/common.h
include/define.h
include/folder-layout.h
include/song-layout.h
src/views/album-songs-layout.cpp
src/views/base-view.cpp
src/views/category-layout.cpp
src/views/category-songs-layout.cpp
src/views/folder-layout.cpp

index e9cedd1..224aa56 100644 (file)
@@ -31,6 +31,7 @@ public:
        bool EmptyStatus(void);
 
        virtual void Update(bool flag) {}
+       virtual void SetFocus(const char *btnStr) = 0;
 };
 
 
index 6d70675..6f298cf 100644 (file)
@@ -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:
index 86b2f36..9a41155 100644 (file)
@@ -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);
index 9697f90..26d6cf0 100644 (file)
@@ -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);
index 418db0b..4dc1fda 100644 (file)
@@ -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);
index 657569f..cb21752 100644 (file)
@@ -144,7 +144,7 @@ struct SParcel {
        int updateType;
        const char *layoutId;
        const char *keyEvent;
-       const char *prevFocusedBtn;
+       const char *focusedBtn;
 };
 
 #endif /* __COMMON_H__ */
index 9b28a71..93fb8b4 100644 (file)
 #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
index 13f20ac..27d7447 100644 (file)
@@ -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);
index 5a429c7..2939623 100644 (file)
@@ -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);
index d1c5532..188b248 100644 (file)
@@ -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;
index fcd4e2c..f0d3cbb 100644 (file)
@@ -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:
index d370cef..d1335cb 100644 (file)
@@ -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;
 
index 34f1d03..34d116b 100644 (file)
@@ -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) {
index 82ee954..7a40134 100644 (file)
@@ -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;