Fix focus sequence 02/37102/1 accepted/tizen/tv/20150319.091918 submit/tizen_tv/20150319.080046
authorKim Tae Soo <taesoo46.kim@samsung.com>
Thu, 19 Mar 2015 07:56:42 +0000 (16:56 +0900)
committerKim Tae Soo <taesoo46.kim@samsung.com>
Thu, 19 Mar 2015 07:56:42 +0000 (16:56 +0900)
Change-Id: I8a58342f6e1efaebf8166c03246369369d7c9236
Signed-off-by: Kim Tae Soo <taesoo46.kim@samsung.com>
include/album-layout.h
include/song-layout.h
src/views/album-layout.cpp
src/views/base-view.cpp
src/views/category-layout.cpp
src/views/song-layout.cpp

index 6f298cf..7901cf7 100644 (file)
@@ -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:
index 2939623..37a5f85 100644 (file)
@@ -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);
index 16ae286..61eff05 100644 (file)
@@ -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;
+       }
 }
 
 
index f0d3cbb..5f4ffc7 100644 (file)
@@ -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)
index d1335cb..c7bb8b5 100644 (file)
@@ -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;
 
index 6c4e301..7bd3f0b 100644 (file)
@@ -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) {