Modify focus sequence between upper buttons and layouts 55/36955/3 accepted/tizen/tv/20150318.025643 accepted/tizen/tv/20150318.030026 accepted/tizen/tv/20150319.020410 submit/tizen/20150318.012427 submit/tizen/20150318.020412 submit/tizen/20150318.022002 submit/tizen_tv/20150317.124258 submit/tizen_tv/20150319.000236 submit/tizen_tv/20150319.002351
authorKim Tae Soo <taesoo46.kim@samsung.com>
Tue, 17 Mar 2015 12:27:29 +0000 (21:27 +0900)
committerKim Tae Soo <taesoo46.kim@samsung.com>
Tue, 17 Mar 2015 12:39:39 +0000 (21:39 +0900)
Change-Id: Ie4c63e3de17abf68e4ac629e386be5c612c59f1d
Signed-off-by: Kim Tae Soo <taesoo46.kim@samsung.com>
13 files changed:
include/base-view.h
include/common.h
include/define.h
include/folder-layout.h
src/views/album-layout.cpp
src/views/album-songs-layout.cpp
src/views/base-view.cpp
src/views/category-layout.cpp
src/views/category-songs-layout.cpp
src/views/common-ui.cpp
src/views/folder-layout.cpp
src/views/playback-view.cpp
src/views/song-layout.cpp

index b8a8856..eea02fd 100644 (file)
@@ -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);
index b6c5a14..657569f 100644 (file)
@@ -144,6 +144,7 @@ struct SParcel {
        int updateType;
        const char *layoutId;
        const char *keyEvent;
+       const char *prevFocusedBtn;
 };
 
 #endif /* __COMMON_H__ */
index 305c877..9b28a71 100644 (file)
 #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"
 #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
 #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
index f27bfec..13f20ac 100644 (file)
@@ -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);
index a56e0a6..16ae286 100644 (file)
@@ -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");
index df00a83..d1c5532 100644 (file)
@@ -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;
        }
index 1b3093a..fcd4e2c 100644 (file)
@@ -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();
index f32efec..d370cef 100644 (file)
@@ -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;
        }
index 986c0fd..34f1d03 100644 (file)
@@ -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;
index 1937f7b..058104b 100644 (file)
@@ -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))
index 7061f07..82ee954 100644 (file)
@@ -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;
        }
index 84b6ccc..bfe5a6b 100644 (file)
@@ -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");
index e97e2d9..6c4e301 100644 (file)
@@ -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");