2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
20 #include "AppCommon.h"
21 #include <InputHandler.h>
26 #include "song_info.h"
27 #include "album_info.h"
28 #include "music-controller.h"
29 #include "volume-control.h"
31 #include "common-ui.h"
34 #include "playback-view.h"
35 #include "context-view.h"
36 #include "HandleVolume.h"
37 #include <app-res-defines.h>
38 #include "PlaySettingCtxPopup.h"
42 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
43 #define TITLE_FONT_SIZE 50
44 #define ARTIST_FONT_SIZE 30
45 #define TOTAL_CONTROL_BTNS 6
46 #define TOTAL_EDIT_BTNS 3
47 #define S_INTERVAL 1 /* seconds */
48 #define LP_INTERVAL 0.5 /* seconds */
49 #define WAIT_INTERVAL 0.5 /* seconds */
50 #define SLIDER_STEP 5000 /* milli seconds */
51 #define LP_CHANGE 10000 /* milli seconds */
52 #define S_INCREMENT 1000 /* milli seconds */
55 ////////////////////////////////////////////////////////////////////////////////
57 struct SSliderWidget {
58 Evas_Object *eoSlider;
61 Ecore_Timer *etSlider;
65 CMusicController controller;
76 Eina_Bool CSliderWidget::sm_CbUpdateSlider(void *dt)
78 CSliderWidget *root = (CSliderWidget*)dt;
79 Eina_Bool ret = ECORE_CALLBACK_CANCEL;
82 ret = root->m_OnUpdateSlider();
88 Eina_Bool CSliderWidget::m_OnUpdateSlider(void)
94 if (!m->controller.GetPosition(&value)) {
96 return ECORE_CALLBACK_CANCEL;
101 duration = m->pSongInfo->Duration();
103 value = value + S_INCREMENT;
104 if (value > duration) {
106 return ECORE_CALLBACK_CANCEL;
109 elm_slider_value_set(m->eoSlider, value);
110 timestr = CCommonUI::TimeStrFromMilSeconds(value);
112 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
117 return ECORE_CALLBACK_RENEW;
121 bool CSliderWidget::m_AddSlider(void)
123 Evas_Object *eoSlider = NULL;
125 eoSlider = elm_slider_add(m->eoBase);
129 elm_slider_indicator_show_set(eoSlider, EINA_FALSE);
130 elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE);
131 elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER);
132 elm_slider_horizontal_set(eoSlider, EINA_TRUE);
133 elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider);
135 Connect(eoSlider, TYPE_CHANGED | TYPE_MOUSE_MOVE);
137 evas_object_show(eoSlider);
138 m->eoSlider = eoSlider;
144 void CSliderWidget::m_RemoveTimer(void)
147 ecore_timer_del(m->etSlider);
153 void CSliderWidget::m_UpdateSongInfo(void)
155 CSongInfo *sinfo = NULL;
158 if (!m->controller.GetCurrentSongIndex(&index)) {
159 _ERR(" music get current song index failed ");
163 if (!m->controller.GetSonginfoFromIndex(index, &sinfo)) {
164 _ERR(" music get songinfo failed ");
167 m->pSongInfo = sinfo;
171 bool CSliderWidget::Create(Evas_Object *eoBase)
176 _CHECK(m = new SSliderWidget)
177 _CHECK(m->controller.Create())
178 _CHECK(m->controller.AddListener(this))
179 _CHECK(m_AddSlider())
182 _CHECK_FAIL{ m->controller.RemoveListener(this); }
183 _CHECK_FAIL{ m->controller.Destroy(); }
184 _CHECK_FAIL{ delete m; m = NULL; }
185 } _CREATE_END_AND_CATCH{ return false; }
191 void CSliderWidget::Destroy(void)
195 m->controller.RemoveListener(this);
203 Evas_Object* CSliderWidget::Base(void)
211 void CSliderWidget::Init(void)
213 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
214 elm_slider_value_set(m->eoSlider, 0);
218 void CSliderWidget::OnComplete(void)
223 void CSliderWidget::OnStartPlayback(void)
226 char *timestr = NULL;
229 elm_slider_value_set(m->eoSlider, 0);
230 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
232 elm_object_disabled_set(m->eoSlider, EINA_FALSE);
235 duration = m->pSongInfo->Duration();
238 m->etSlider = ecore_timer_add(S_INTERVAL, sm_CbUpdateSlider, this);
240 elm_slider_min_max_set(m->eoSlider, 0, duration);
241 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
243 elm_object_part_text_set(m->eoBase,
244 MUSIC_PART_FULLTIME, timestr);
248 step = (double)SLIDER_STEP / (double)duration;
249 elm_slider_step_set(m->eoSlider, step);
253 void CSliderWidget::OnStopPlayback(void)
255 elm_slider_value_set(m->eoSlider, 0);
256 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
258 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
263 void CSliderWidget::OnPausePlayback(void)
266 ecore_timer_freeze(m->etSlider);
270 void CSliderWidget::OnResumePlayback(void)
273 ecore_timer_thaw(m->etSlider);
277 void CSliderWidget::OnPosition(int milsec)
279 elm_slider_value_set(m->eoSlider, milsec);
283 void CSliderWidget::OnChanged(int id, Evas_Object *obj)
285 char *timestr = NULL;
288 if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
290 ecore_timer_freeze(m->etSlider);
293 value = elm_slider_value_get(obj);
294 m->controller.SetPosition(value);
295 timestr = CCommonUI::TimeStrFromMilSeconds(value);
297 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
302 if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
304 ecore_timer_thaw(m->etSlider);
309 void CSliderWidget::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
311 if (!elm_object_focus_get(obj))
312 elm_object_focus_set(obj, EINA_TRUE);
315 ////////////////////////////////////////////////////////////////////////////////
322 Ecore_Timer *etTimer;
325 SCookie(CTimer *timer, int _id) {
335 Eina_Bool CTimer::sm_CbTimer(void *data)
337 STimer::SCookie *cookie = (STimer::SCookie*)data;
340 cookie->root->t_OnTimer(cookie->id);
342 cookie->root->m->elList = eina_list_remove(cookie->root->m->elList, cookie);
350 void CTimer::t_OnTimer(int id)
355 bool CTimer::Create(void)
369 void CTimer::Destroy(void)
378 bool CTimer::SetTimer(int id, int ms)
383 STimer::SCookie *cookie = new STimer::SCookie(this, id);
387 m->elList = eina_list_append(m->elList, cookie);
388 cookie->etTimer = ecore_timer_add(ms, sm_CbTimer, cookie);
393 void CTimer::KillTimer(int id)
408 EO_ERROR_POPUP_BUTTON,
412 EO_DELETE, // TOTAL_EDIT_BTNS
419 EO_BTN_FORWARD, // TOTAL_CONTROL_BTNS
426 Elm_Object_Item *item;
442 struct SPlaybackView {
446 CPlaySettingCtxPopup *eoCtxPopup;
447 Evas_Object *eoErrPopup;
448 Evas_Object *eoPlaylist;
450 Elm_Object_Item *focused_item;
452 Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
453 Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
455 Evas_Object *eoAlbumCover;
456 //Evas_Object *eoSlider;
457 CSliderWidget *pSliderWidget;
458 Evas_Object *eoPressedObj;
461 Ecore_Timer *etLongPress;
463 CMusicController *pController; //! NOT NULL
466 SItemInfo *cs_itinfo;
467 SContentInfo *ctxtinfo;
468 EPressTypes press_status;
470 CHandleVolume *pHandleVolume;
473 memset(this, 0, sizeof(SPlaybackView));
515 Eina_Bool CPlaybackView::sm_CbLongpressTimer(void *dt)
517 CPlaybackView *root = (CPlaybackView *)dt;
519 root->m_OnLongpressTimer();
521 return ECORE_CALLBACK_RENEW;
525 void CPlaybackView::m_OnLongpressTimer(void)
527 m_HandleOnRepeated();
531 Eina_Bool CPlaybackView::sm_CbWaitTimer(void *dt)
533 CPlaybackView *root = (CPlaybackView *)dt;
535 root->m_OnWaitTimer();
537 return ECORE_CALLBACK_CANCEL;
541 void CPlaybackView::m_OnWaitTimer(void)
543 m->press_status = PRESS_LONG;
544 if (m->pController->PlayState() == PLAY_STATUS_PLAY) {
545 /* Handle long press */
547 m->etLongPress = ecore_timer_add(LP_INTERVAL, sm_CbLongpressTimer, this);
550 m->press_status = PRESS_LONG_PAUSE;
557 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
559 CPlaybackView *root = (CPlaybackView *)dt;
561 root->m_OnCtxtUpdate(type, lid);
565 void CPlaybackView::m_OnCtxtUpdate(EActionType type, int lid)
567 SItemInfo *itinfo = NULL;
568 Elm_Object_Item *focusedItem = NULL;
570 if (!m->ctxtinfo || !m->ctxtinfo->context)
573 itinfo = m_FindItemInfoFromSong(m->elInfo,
574 (CSongInfo *)m->ctxtinfo->context);
576 _ERR(" Unable to find song in the list ");
580 if (type == ACTION_TYPE_DELETE) {
581 itinfo->check_status = true;
582 m_DeleteSelectedItems();
584 if (!m->mgr->PopView()) {
585 _ERR("CViewMgr::PopView failed");
590 memset(&parcel, 0, sizeof(SParcel));
591 parcel.updateType = E_PLAYLIST_UPDATE;
594 focusedItem = m->cs_itinfo->item;
596 else { // ACTION_TYPE_PLAY
597 if (m->ctxtinfo->status == PLAY_STATUS_PLAY)
600 if (itinfo == m->cs_itinfo)
603 m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item);
606 if (!m->mgr->PopView()) {
607 _ERR("CViewMgr::PopView failed");
611 focusedItem = m->focused_item;
614 if (!CViewMgr::GetInstance()->HideView(MUSIC_BASE_VIEW))
615 _ERR("CViewMgr::HideView failed");
620 elm_genlist_item_show(focusedItem, ELM_GENLIST_ITEM_SCROLLTO_IN);
621 elm_object_item_focus_set(focusedItem, EINA_TRUE);
626 void CPlaybackView::sm_CbCtxtClose(void *dt)
628 CPlaybackView *root = (CPlaybackView *)dt;
630 root->m_OnCtxtClose();
634 void CPlaybackView::m_OnCtxtClose(void)
636 if (!m->mgr->PopView()) {
637 _ERR("CViewMgr::PopView failed");
641 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
645 void CPlaybackView::sm_CbCtxPopupBtnSelected(void* cookie, CCtxPopup* instance, const char* text)
647 CPlaybackView *root = (CPlaybackView *)cookie;
649 root->m_CbCtxPopupBtnSelected(instance, text);
653 void CPlaybackView::m_CbCtxPopupBtnSelected(CCtxPopup* instance, const char* text)
655 int type = CInfo::PlaybackSettingType();
659 m_FromPlaybackToEditMode();
663 m->pController->Stop();
664 m->pController->EmptyPlaylist();
665 eina_list_free(m->elInfo);
667 elm_genlist_clear(m->eoPlaylist);
668 m_UpdateEmptySongInfo();
677 void CPlaybackView::m_RemoveTimer(int timer_code)
679 ETimers timerCode = (ETimers)timer_code;
684 ecore_timer_del(m->etWait);
689 case TIMER_LONGPRESS:
690 if (m->etLongPress) {
691 ecore_timer_del(m->etLongPress);
692 m->etLongPress = NULL;
697 m->pHandleVolume->RemoveTimer();
701 _ERR(" invalid value ");
707 void CPlaybackView::m_PlaybackPause(void)
709 m->pController->Pause();
713 void CPlaybackView::m_PlaybackResume(void)
715 m->pController->Resume();
719 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
721 SItemInfo *itinfo = NULL;
725 EINA_LIST_FOREACH(list, l, obj) {
726 itinfo = (SItemInfo *)obj;
727 itinfo->edit_mode = flag;
732 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
734 SItemInfo *itinfo = NULL;
738 EINA_LIST_FOREACH(list, l, obj) {
739 itinfo = (SItemInfo *)obj;
740 itinfo->check_status = false;
745 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
747 if (!pItemInfo || !pItemInfo->item)
750 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
751 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
753 pItemInfo->select_status = true;
757 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
759 if (!pItemInfo || !pItemInfo->item)
762 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
763 MUSIC_PLAYBACK_VIEW);
765 pItemInfo->select_status = false;
769 void CPlaybackView::m_UpdateControlBtns(void)
773 state = m->pController->PlayState();
774 if (state != PLAY_STATUS_STOP) {
775 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
776 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
780 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
781 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
782 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
785 if (state == PLAY_STATUS_PLAY) {
786 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
789 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
792 state = m->pController->ShuffleState();
793 if (state == SHUFFLE_STATUS_OFF) {
794 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
797 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
800 state = m->pController->RepeatState();
801 if (state == REPEAT_STATUS_NONE) {
802 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
804 else if (state == REPEAT_STATUS_ALL) {
805 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
808 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
813 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
816 char buf[MAX_LENGTH];
818 if (!m->cs_itinfo || !m->cs_itinfo->sinfo)
821 path = m->cs_itinfo->sinfo->ThumbnailPath();
823 elm_image_file_set(m->eoAlbumCover, path, NULL);
825 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
826 MUSIC_IMAGE_DEFAULT_THUMB_450);
827 elm_image_file_set(m->eoAlbumCover, buf, NULL);
832 void CPlaybackView::m_UpdateCurrentSongLabels(void)
834 char buf[MAX_LENGTH];
839 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
842 snprintf(buf, sizeof(buf), "%s - %s", m->csinfo->Artist(),
845 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf);
849 void CPlaybackView::m_UpdateEmptySongInfo(void)
851 char buf[MAX_LENGTH];
853 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
854 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
855 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
856 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
857 m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_RIGHT);
858 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
859 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
860 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
861 elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00");
862 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
864 m->pSliderWidget->Init();
866 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
867 _(NO_PLAYLIST_MESSAGE));
868 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM,
869 _(NO_PLAYLIST_MESSAGE_SUB));
870 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
871 MUSIC_IMAGE_DEFAULT_THUMB_450);
872 elm_image_file_set(m->eoAlbumCover, buf, NULL);
873 m->pController->SetPlayState(PLAY_STATUS_INITIAL);
877 void CPlaybackView::m_UpdateCtxtView(int playStatus)
879 if (!m->cs_itinfo || !m->ctxtinfo)
882 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
885 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
886 m->ctxtinfo->status = (EPlayStatus)playStatus;
889 memset(&parcel, 0, sizeof(SParcel));
890 parcel.updateType = E_SONG_UPDATE;
891 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
896 void CPlaybackView::m_UpdateCurrentSongItem(int index)
898 SItemInfo *pItemInfo = NULL;
901 m_UnselectItem(m->cs_itinfo);
902 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
905 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
908 m->cs_itinfo = pItemInfo;
909 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
910 elm_genlist_item_bring_in(pItemInfo->item,
911 ELM_GENLIST_ITEM_SCROLLTO_IN);
914 m_SelectItem(pItemInfo);
915 m_UpdateCtxtView(PLAY_STATUS_PLAY);
921 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
923 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_LEFT);
924 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], m->eoPlaylist, ELM_FOCUS_RIGHT);
925 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_DOWN);
929 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
931 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoPlaylist, ELM_FOCUS_UP);
932 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnControl[BTN_PLAY], ELM_FOCUS_DOWN);
933 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
934 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnControl[BTN_PLAY], ELM_FOCUS_LEFT);
935 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY], m->eoPlaylist, ELM_FOCUS_RIGHT);
938 elm_object_focus_next_object_set(m->eoPlaylist,
939 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_LEFT);
940 elm_object_focus_next_object_set(m->eoBtnControl[BTN_FORWARD],
941 m->eoPlaylist, ELM_FOCUS_RIGHT);
942 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
943 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_RIGHT);
948 void CPlaybackView::m_UpdateCurrentSongInfo(void)
950 CSongInfo *sinfo = NULL;
953 if (eina_list_count(m->elInfo) == 0) {
954 m_UpdateEmptySongInfo();
958 if (!m->pController->GetCurrentSongIndex(&index)) {
959 _ERR(" music get current song index failed ");
963 if (!m->pController->GetSonginfoFromIndex(index, &sinfo)) {
964 _ERR(" music get songinfo failed ");
969 m_UpdateCurrentSongItem(index);
970 m_UpdateCurrentSongLabels();
971 m_UpdateCurrentSongThumbnail();
972 //m_UpdateCurrentSongProgressbar();
973 m_UpdateControlBtns();
974 m_UpdatePlaymodeFocusSequence();
978 void CPlaybackView::m_DisableEditButtons(bool flag)
980 /* flag - 1 means disable edit buttons and 0 means enable */
982 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
984 elm_object_disabled_set(m->eoBtnEdit[BTN_DELETE], (Eina_Bool)flag);
985 elm_object_disabled_set(m->eoBtnEdit[BTN_DESELECT], (Eina_Bool)flag);
987 m_UpdateEditmodeFocusSequence();
988 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
991 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], m->eoBtnEdit[BTN_DESELECT], ELM_FOCUS_RIGHT);
992 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_DELETE], m->eoPlaylist, ELM_FOCUS_RIGHT);
993 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[BTN_DELETE], ELM_FOCUS_LEFT);
998 void CPlaybackView::m_CreateErrorPopup(void)
1000 Evas_Object *popup = NULL, *btn = NULL, *label = NULL;
1002 popup = elm_popup_add(m->eoBase);
1006 elm_object_style_set(popup, MUSIC_STYLE_ERROR_POPUP);
1007 evas_object_show(popup);
1009 label = elm_label_add(popup);
1011 evas_object_del(popup);
1015 elm_object_style_set(label, MUSIC_STYLE_ERROR_LABEL);
1016 elm_object_text_set(label, MUSIC_TEXT_PLAYBACK_ERROR);
1017 elm_object_content_set(popup, label);
1019 btn = elm_button_add(popup);
1021 evas_object_del(popup);
1025 elm_object_style_set(btn, MUSIC_STYLE_EDIT_BTN);
1026 elm_object_text_set(btn, MUSIC_TEXT_OK);
1027 elm_object_part_content_set(popup, MUSIC_PART_POPUP_BUTTON, btn);
1029 m->eoErrPopup = popup;
1031 Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN);
1033 elm_object_focus_set(btn, EINA_TRUE);
1039 void CPlaybackView::m_DestroyErrorPopup(void)
1044 evas_object_del(m->eoErrPopup);
1045 m->eoErrPopup = NULL;
1049 void CPlaybackView::m_CreateSettingsPopup(void)
1051 CCtxPopup::SCallback cb;
1053 cb.onSelected = sm_CbCtxPopupBtnSelected;
1055 m->eoCtxPopup = new CPlaySettingCtxPopup;
1056 m->eoCtxPopup->Create(m->eoWin, &cb);
1060 void CPlaybackView::m_DestroySettingsPopup(void)
1065 if (m->eoCtxPopup->FlagCreate())
1066 m->eoCtxPopup->Destroy();
1068 delete m->eoCtxPopup;
1069 m->eoCtxPopup = NULL;
1073 void CPlaybackView::m_FromEditToPlaybackMode(void)
1075 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
1076 elm_genlist_item_bring_in(m->cs_itinfo->item,
1077 ELM_GENLIST_ITEM_SCROLLTO_IN);
1080 m_SelectItem(m->cs_itinfo);
1082 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
1083 MUSIC_PLAYBACK_VIEW);
1084 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
1086 m_ChangeEditmodeAll(m->elInfo, false);
1088 elm_genlist_realized_items_update(m->eoPlaylist);
1090 m_UpdatePlaymodeFocusSequence();
1094 void CPlaybackView::m_FromPlaybackToEditMode(void)
1096 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
1097 MUSIC_PLAYBACK_VIEW);
1099 m_DisableEditButtons(true);
1101 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1103 m_ChangeEditmodeAll(m->elInfo, true);
1105 elm_genlist_realized_items_update(m->eoPlaylist);
1107 m_UpdateEditmodeFocusSequence();
1111 void CPlaybackView::m_HandleOnRepeated(void)
1113 Evas_Object *obj = NULL;
1116 char *timestr = NULL;
1118 if (!m->eoPressedObj)
1121 obj = m->eoPressedObj;
1124 m->pController->GetPosition(&value); //value = elm_slider_value_get(m->eoSlider);
1125 duration = m->cs_itinfo->sinfo->Duration();
1127 if (obj == m->eoBtnControl[BTN_REWIND]) {
1129 m_RemoveTimer(TIMER_LONGPRESS);
1132 value = value - LP_CHANGE;
1137 if (value == duration) {
1138 m->pController->PlayNextSong();
1140 m->press_status = PRESS_LONG_PAUSE;
1141 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE,
1142 MUSIC_PLAYBACK_VIEW);
1144 m_RemoveTimer(TIMER_LONGPRESS);
1148 value = value + LP_CHANGE;
1149 if (value >= duration)
1153 m->pController->SetPosition(value);
1154 timestr = CCommonUI::TimeStrFromMilSeconds(value);
1156 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
1165 void CPlaybackView::m_DeleteSelectedItems(void)
1167 Eina_List *l = NULL, *l_next = NULL;
1168 SItemInfo *pItemInfo = NULL;
1172 m_DisableEditButtons(true);
1173 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
1174 pItemInfo = (SItemInfo *)obj;
1175 if (pItemInfo->check_status) {
1176 if (m->cs_itinfo == pItemInfo) {
1177 m_UnselectItem(m->cs_itinfo);
1178 m->cs_itinfo = NULL;
1179 m->pController->SetPlayState(PLAY_STATUS_STOP);
1180 m->pController->Stop();
1182 index = elm_genlist_item_index_get(pItemInfo->item);
1183 m->pController->RemoveSong(pItemInfo->sinfo, index);
1185 m->elInfo = eina_list_remove(m->elInfo, pItemInfo);
1186 elm_object_item_del(pItemInfo->item);
1190 if (eina_list_count(m->elInfo) == 0) {
1191 m_UpdateEmptySongInfo();
1192 elm_genlist_realized_items_update(m->eoPlaylist);
1193 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1197 elm_genlist_realized_items_update(m->eoPlaylist);
1198 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1202 void CPlaybackView::m_KeyBackPress(void)
1204 if (m->eoCtxPopup) {
1205 m_DestroySettingsPopup();
1206 //elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_FALSE);
1207 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
1213 if (!CViewMgr::GetInstance()->ShowView(MUSIC_BASE_VIEW))
1214 _ERR("CViewMgr::ShowView failed");
1216 if (CViewMgr::GetInstance()->CheckTop(MUSIC_CONTEXT_VIEW)) {
1217 if (!CViewMgr::GetInstance()->UpdateView(MUSIC_CONTEXT_VIEW, NULL))
1218 _ERR("CViewMgr::UpdateView failed");
1220 if (!CViewMgr::GetInstance()->ShowView(MUSIC_CONTEXT_VIEW))
1221 _ERR("CViewMgr::ShowView failed");
1226 void CPlaybackView::m_KeyExitPress(void)
1228 m->pController->Stop();
1233 void CPlaybackView::m_KeyPlayPress(void)
1237 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1240 state = m->pController->PlayState();
1241 if (state == PLAY_STATUS_PAUSE) {
1243 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1244 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1246 else if (state != PLAY_STATUS_PLAY) {
1247 m->pController->Start();
1252 void CPlaybackView::m_KeyPausePress(void)
1256 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1259 state = m->pController->PlayState();
1260 if (state == PLAY_STATUS_PLAY) {
1261 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1262 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1268 void CPlaybackView::m_KeyNextPress(void)
1270 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1273 m_HandleOnPressed(m->eoBtnControl[BTN_FORWARD]);
1277 void CPlaybackView::m_KeyPreviousPress(void)
1279 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1282 m_HandleOnPressed(m->eoBtnControl[BTN_REWIND]);
1286 void CPlaybackView::m_KeyNextUnpress(void)
1288 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1291 m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]);
1295 void CPlaybackView::m_KeyPreviousUnpress(void)
1297 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1300 m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]);
1304 void CPlaybackView::m_HandleKeyPress(char *keyname)
1306 if (!strcmp(keyname, (char *)KEY_EXIT))
1308 else if (!strcmp(keyname, (char *)KEY_BACK) ||
1309 !strcmp(keyname, (char *)KEY_BACK_REMOTE))
1311 else if (!strcmp(keyname, (char *)KEY_PLAY))
1313 else if (!strcmp(keyname, (char *)KEY_PAUSE))
1315 else if (!strcmp(keyname, (char *)KEY_NEXT))
1317 else if (!strcmp(keyname, (char *)KEY_PREVIOUS))
1318 m_KeyPreviousPress();
1319 else if (!strcmp(keyname, (char *)KEY_VOLUMEUP))
1320 m->pHandleVolume->Up();
1321 else if (!strcmp(keyname, (char *)KEY_VOLUMEDOWN))
1322 m->pHandleVolume->Down();
1323 else if (!strcmp(keyname, (char *)KEY_MUTE))
1324 m->pHandleVolume->Mute();
1328 void CPlaybackView::m_HandleKeyUnpress(char *keyname)
1330 if (!strcmp(keyname, KEY_PREVIOUS))
1331 m_KeyPreviousUnpress();
1332 else if (!strcmp(keyname, KEY_NEXT))
1337 void CPlaybackView::m_AddAlbumCover(void)
1339 Evas_Object *eoAlbumCover = NULL;
1341 eoAlbumCover = elm_image_add(m->eoBase);
1345 evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND,
1347 elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE);
1349 elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER,
1351 evas_object_show(eoAlbumCover);
1352 m->eoAlbumCover = eoAlbumCover;
1357 void CPlaybackView::m_AddCurrentSonginfo(void)
1361 m->pSliderWidget = new CSliderWidget;
1362 m->pSliderWidget->Create(m->eoBase);
1367 void CPlaybackView::m_AddEditPlaylistButtons(void)
1369 Evas_Object *box = NULL;
1371 SBtnInfo btninfo[TOTAL_EDIT_BTNS];
1373 btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL;
1374 btninfo[BTN_CANCEL].type = EO_CANCEL;
1376 btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT;
1377 btninfo[BTN_DESELECT].type = EO_DESELECT;
1379 btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE;
1380 btninfo[BTN_DELETE].type = EO_DELETE;
1382 box = CCommonUI::AddBox(m->eoBase);
1386 elm_box_horizontal_set(box, EINA_TRUE);
1387 elm_box_padding_set(box, MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0);
1389 for (i = 0; i < TOTAL_EDIT_BTNS; i++) {
1390 m->eoBtnEdit[i] = elm_button_add(m->eoBase);
1391 if (!m->eoBtnEdit[i])
1394 elm_object_style_set(m->eoBtnEdit[i], MUSIC_STYLE_EDIT_BTN);
1395 evas_object_size_hint_weight_set(m->eoBtnEdit[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1396 elm_box_pack_end(box, m->eoBtnEdit[i]);
1397 elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt));
1399 Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1401 evas_object_show(m->eoBtnEdit[i]);
1403 elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box);
1404 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE, MUSIC_PLAYBACK_VIEW);
1408 void CPlaybackView::m_AddControlButtons(void)
1410 Evas_Object *box = NULL;
1412 SBtnInfo btninfo[TOTAL_CONTROL_BTNS];
1414 btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS;
1415 btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS;
1417 btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE;
1418 btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE;
1420 btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT;
1421 btninfo[BTN_REPEAT].type = EO_BTN_REPEAT;
1423 btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND;
1424 btninfo[BTN_REWIND].type = EO_BTN_REWIND;
1426 btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY;
1427 btninfo[BTN_PLAY].type = EO_BTN_PLAY;
1429 btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD;
1430 btninfo[BTN_FORWARD].type = EO_BTN_FORWARD;
1432 box = elm_box_add(m->eoBase);
1436 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
1437 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
1438 elm_box_horizontal_set(box, EINA_TRUE);
1439 elm_box_padding_set(box,
1440 MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0);
1442 for (i = 0; i < TOTAL_CONTROL_BTNS; i++) {
1443 m->eoBtnControl[i] = elm_button_add(m->eoBase);
1444 if (!m->eoBtnControl[i])
1447 elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt);
1448 evas_object_size_hint_weight_set(m->eoBtnControl[i],
1449 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1450 elm_box_pack_end(box, m->eoBtnControl[i]);
1452 if (i == BTN_REWIND || i == BTN_FORWARD) {
1453 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE);
1456 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1458 evas_object_show(m->eoBtnControl[i]);
1461 elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box);
1465 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
1467 Eina_List *l = NULL;
1468 SItemInfo *itinfo = NULL;
1471 EINA_LIST_FOREACH(list, l, obj) {
1472 itinfo = (SItemInfo *)obj;
1473 if (itinfo->sinfo == sinfo)
1481 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
1483 Eina_List *l = NULL;
1484 SItemInfo *itinfo = NULL;
1487 EINA_LIST_FOREACH(list, l, obj) {
1488 itinfo = (SItemInfo *)obj;
1489 if (itinfo->item == item)
1497 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
1500 _ERR(" No item info to Update check ");
1504 if (itinfo->check_status) {
1505 elm_object_item_signal_emit(itinfo->item,
1506 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1507 itinfo->check_status = false;
1511 elm_object_item_signal_emit(itinfo->item,
1512 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1513 itinfo->check_status = true;
1517 class CElmGenlistItemClass {
1519 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
1521 CSongInfo *sinfo = NULL;
1522 SItemInfo *pItemInfo = (SItemInfo *)data;
1523 char buf[MAX_LENGTH];
1524 char *timestr = NULL;
1528 if (!pItemInfo || !obj)
1531 sinfo = pItemInfo->sinfo;
1533 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
1535 if (!strcmp(part, "elm.text0")) {
1536 index = elm_genlist_item_index_get(pItemInfo->item);
1537 snprintf(buf, sizeof(buf), "%d", index);
1539 else if (!strcmp(part, "elm.text1"))
1540 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
1541 else if (!strcmp(part, "elm.text2"))
1542 snprintf(buf, sizeof(buf), "%s - %s",
1545 else if (!strcmp(part, "elm.text3")) {
1546 duration = sinfo->Duration();
1547 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
1549 snprintf(buf, sizeof(buf), "%s", timestr);
1554 if (strcmp(buf, MUSIC_STR_EMPTY))
1559 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
1561 CSongInfo *sinfo = NULL;
1562 SItemInfo *pItemInfo = (SItemInfo *)data;
1563 Evas_Object *img = NULL;
1565 char buf[MAX_LENGTH];
1567 if (!pItemInfo || !obj)
1570 sinfo = pItemInfo->sinfo;
1572 img = elm_image_add(obj);
1576 elm_image_aspect_fixed_set(img, EINA_FALSE);
1578 if (!strcmp(part, "elm.swallow.icon")) {
1579 path = sinfo->ThumbnailPath();
1581 elm_image_file_set(img, path, "NULL");
1583 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
1584 MUSIC_IMAGE_DEFAULT_THUMB_126);
1585 elm_image_file_set(img, buf, "NULL");
1592 static void sm_CbDel(void *data, Evas_Object *obj)
1599 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
1601 Elm_Genlist_Item_Class *list_item = NULL;
1603 list_item = elm_genlist_item_class_new();
1605 _ERR(" elm_genlist_item_class_new failed ");
1609 list_item->item_style = MUSIC_STYLE_PLAYLIST;
1610 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
1611 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
1612 list_item->func.state_get = NULL;
1613 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
1619 void CPlaybackView::m_AddGenlist(void)
1621 Evas_Object *genlist = NULL;
1622 Evas_Object *eoBase = NULL;
1625 genlist = elm_genlist_add(eoBase);
1629 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1630 evas_object_size_hint_weight_set(genlist,
1631 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1632 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
1633 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
1634 elm_genlist_multi_select_set(genlist, EINA_FALSE);
1636 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_MOUSE_MOVE |
1637 TYPE_KEY_DOWN | TYPE_ACTIVATED);
1639 evas_object_show(genlist);
1640 m->eoPlaylist = genlist;
1644 void CPlaybackView::m_AddPlaylist(void)
1646 Elm_Genlist_Item_Class *list_item = NULL;
1649 CSongInfo *sinfo = NULL;
1650 Elm_Object_Item *item = NULL;
1651 SItemInfo *pItemInfo = NULL;
1657 list_item = m_GetItemClass();
1659 evas_object_del(m->eoPlaylist);
1663 if (!m->pController->GetTotalSongs(&ts)) {
1664 _ERR(" music get total songs failed ");
1668 if (!m->pController->GetCurrentSongIndex(&index))
1669 _ERR(" music get current song index failed ");
1671 for (i = 0; i < ts; i++) {
1672 if (!m->pController->GetSonginfoFromIndex(i, &sinfo)) {
1673 _ERR(" music get songinfo failed ");
1676 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
1679 pItemInfo->sinfo = sinfo;
1680 pItemInfo->edit_mode = false;
1681 pItemInfo->check_status = false;
1682 pItemInfo->select_status = false;
1684 // event handling will be done in OnActivated function
1685 item = elm_genlist_item_append(m->eoPlaylist, list_item,
1686 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
1688 pItemInfo->item = item;
1691 pItemInfo->select_status = true;
1692 m->cs_itinfo = pItemInfo;
1694 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
1699 void CPlaybackView::m_RemovePlaylist(void)
1701 if (m->eoPlaylist) {
1702 elm_genlist_clear(m->eoPlaylist);
1703 m->eoPlaylist = NULL;
1707 eina_list_free(m->elInfo);
1713 void CPlaybackView::m_HandleRewindBtnClicked(Evas_Object *obj)
1715 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1716 MUSIC_PLAYBACK_VIEW);
1718 if (m->pController->PlayState() == PLAY_STATUS_STOP)
1721 if (!m->pController->PlayPreviousSong()){
1722 _ERR(" music play previous song failed ");
1728 void CPlaybackView::m_HandleForwardBtnClicked(Evas_Object *obj)
1730 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1731 MUSIC_PLAYBACK_VIEW);
1733 if (m->pController->PlayState() == PLAY_STATUS_STOP)
1736 if (!m->pController->PlayNextSong()) {
1737 _ERR(" music play next song failed ");
1743 void CPlaybackView::m_HandleOnPressed(Evas_Object *obj)
1745 m->press_status = PRESS_SHORT;
1746 m->eoPressedObj = obj;
1748 m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, this);
1752 void CPlaybackView::m_HandleOnUnpressed(Evas_Object *obj)
1754 m_RemoveTimer(TIMER_WAIT);
1755 m_RemoveTimer(TIMER_LONGPRESS);
1757 if (m->press_status == PRESS_SHORT) {
1758 /* Handle song change */
1759 if (m->pController->PlayState() == PLAY_STATUS_PLAY)
1762 if (obj == m->eoBtnControl[BTN_FORWARD])
1763 m_HandleForwardBtnClicked(obj);
1765 m_HandleRewindBtnClicked(obj);
1767 if (m->pController->PlayState() != PLAY_STATUS_PLAY)
1770 else if (m->press_status == PRESS_LONG) {
1771 if (m->pController->PlayState() != PLAY_STATUS_PLAY)
1775 m->press_status = PRESS_SHORT;
1779 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
1782 SItemInfo *itinfo = NULL;
1784 if (!obj || !genListItem)
1787 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
1789 _ERR(" no item info found ");
1793 if (itinfo->edit_mode) {
1794 m_UpdateItemCheck(itinfo);
1795 m_DisableEditButtons(false);
1799 index = elm_genlist_item_index_get(genListItem);
1801 m->pController->PlayIndexSong(--index);
1805 bool CPlaybackView::Create(void *data)
1810 _CHECK(m = new SPlaybackView)
1811 _CHECK(m->mgr = CViewMgr::GetInstance())
1812 _CHECK(m->eoWin = m->mgr->Window())
1813 _CHECK(m->pController = new CMusicController)
1814 _CHECK(m->pController->Create())
1815 _CHECK(m->eoBase = CCommonUI::AddBase(m->eoWin, MUSIC_PLAYBACK_VIEW))
1816 _CHECK(CBaseView::Create(data))
1817 _CHECK(CTimer::Create());
1818 _CHECK(m->pController->AddListener(this))
1821 m->press_status = PRESS_SHORT;
1822 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
1824 m_AddControlButtons();
1825 m_AddEditPlaylistButtons();
1826 m_AddCurrentSonginfo();
1829 m->pHandleVolume = new CHandleVolume;
1830 m->pHandleVolume->Create(m->eoBase);
1831 m_UpdatePlaymodeFocusSequence();
1833 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
1836 _CHECK_FAIL{ m->pController->RemoveListener(this); }
1837 _CHECK_FAIL{ CTimer::Destroy(); }
1838 _CHECK_FAIL{ CBaseView::Destroy(); }
1839 _CHECK_FAIL{ evas_object_del(m->eoBase); }
1840 _CHECK_FAIL{ m->pController->Destroy(); }
1841 _CHECK_FAIL{ delete m->pController; }
1842 _CHECK_FAIL{ /* mgr->Window() */ }
1843 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
1844 _CHECK_FAIL{ delete m; m = NULL; }
1845 }_CREATE_END_AND_CATCH{ return false; }
1851 void CPlaybackView::Destroy(void)
1855 Disconnect(m->eoBase);
1856 m->pController->RemoveListener(this);
1858 m_DestroyErrorPopup();
1860 m->pSliderWidget->Destroy();
1862 m_RemoveTimer(TIMER_WAIT);
1863 m_RemoveTimer(TIMER_LONGPRESS);
1864 m_DestroySettingsPopup();
1866 m->pHandleVolume->Destroy();
1867 delete m->pHandleVolume;
1868 CBaseView::Destroy();
1869 evas_object_del(m->eoBase);
1877 Evas_Object* CPlaybackView::Base(void)
1885 void CPlaybackView::t_OnClickedSettings(Evas_Object *obj)
1887 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1889 if (eina_list_count(m->elInfo) == 0)
1892 elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW);
1893 m_DestroySettingsPopup();
1894 m_CreateSettingsPopup();
1898 void CPlaybackView::t_OnClickedShuffle(Evas_Object *obj)
1900 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1902 switch (m->pController->ShuffleState()) {
1903 case SHUFFLE_STATUS_OFF:
1904 m->pController->SetShuffleState(SHUFFLE_STATUS_ON);
1905 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
1909 m->pController->SetShuffleState(SHUFFLE_STATUS_OFF);
1910 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
1916 void CPlaybackView::t_OnClickedRepeat(Evas_Object *obj)
1918 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1920 switch (m->pController->RepeatState()) {
1921 case REPEAT_STATUS_NONE:
1922 m->pController->SetRepeatState(REPEAT_STATUS_ALL);
1923 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
1926 case REPEAT_STATUS_ALL:
1927 m->pController->SetRepeatState(REPEAT_STATUS_ONE);
1928 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
1932 m->pController->SetRepeatState(REPEAT_STATUS_NONE);
1933 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
1939 void CPlaybackView::t_OnClickedPlay(Evas_Object *obj)
1941 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1943 switch (m->pController->PlayState()) {
1944 case PLAY_STATUS_PAUSE:
1946 elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1949 case PLAY_STATUS_PLAY:
1950 elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1956 m->pController->Start();
1962 void CPlaybackView::t_OnShow(void)
1968 m_UpdateCurrentSongInfo();
1970 state = m->pController->PlayState();
1971 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
1974 m->pController->Start();
1978 elm_genlist_item_show(m->cs_itinfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
1979 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
1982 evas_object_show(m->eoBase);
1986 void CPlaybackView::t_OnUpdate(void *data)
1990 SParcel *parcel = (SParcel *)data;
1992 char *keyEvent = NULL;
1995 updateType = E_PLAYLIST_UPDATE;
1997 updateType = parcel->updateType;
1998 keyEvent = (char *)parcel->keyEvent;
2001 switch (updateType) {
2002 case E_PLAYLIST_UPDATE:
2005 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
2006 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
2007 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_FALSE);
2008 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
2009 m->eoBtnControl[BTN_REWIND], ELM_FOCUS_RIGHT);
2010 m_FromEditToPlaybackMode();
2014 m_HandleKeyPress(keyEvent);
2018 m_HandleKeyUnpress(keyEvent);
2027 void CPlaybackView::t_OnHide(void)
2031 evas_object_hide(m->eoBase);
2035 void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
2039 m_HandleKeyPress(ev->keyname);
2042 case EO_ERROR_POPUP_BUTTON:
2043 if (!strcmp(ev->keyname, KEY_BACK) ||
2044 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
2045 m_DestroyErrorPopup();
2046 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
2052 Elm_Object_Item *it = NULL;
2053 SContentInfo *ctxtinfo = NULL;
2054 SItemInfo *itinfo = NULL;
2056 if (strcmp(ev->keyname, KEY_MENU) &&
2057 strcmp(ev->keyname, KEY_MENU_REMOTE))
2060 it = elm_object_focused_item_get(obj);
2062 _ERR(" unable to get focused item ");
2065 m->focused_item = it;
2072 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
2076 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
2082 if (m->pController->PlayState() == PLAY_STATUS_PLAY &&
2083 itinfo == m->cs_itinfo)
2084 ctxtinfo->status = PLAY_STATUS_PLAY;
2086 ctxtinfo->status = PLAY_STATUS_PAUSE;
2088 ctxtinfo->cbdata = this;
2089 ctxtinfo->update = sm_CbCtxtUpdate;
2090 ctxtinfo->close = sm_CbCtxtClose;
2091 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
2092 ctxtinfo->context = itinfo->sinfo;
2094 m->ctxtinfo = ctxtinfo;
2097 memset(&parcel, 0, sizeof(SParcel));
2098 parcel.ctxtInfo = ctxtinfo;
2099 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
2100 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
2109 void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
2113 m_HandleKeyUnpress(ev->keyname);
2122 void CPlaybackView::OnMouseClicked(int id, Evas_Object *obj)
2125 case EO_ERROR_POPUP_BUTTON:
2126 m_DestroyErrorPopup();
2127 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
2131 m_DisableCheckAll(m->elInfo);
2132 m_DisableEditButtons(true);
2133 m_FromEditToPlaybackMode();
2137 m_DisableCheckAll(m->elInfo);
2138 m_DisableEditButtons(true);
2139 elm_genlist_realized_items_update(m->eoPlaylist);
2140 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
2144 m_DeleteSelectedItems();
2147 case EO_BTN_SETTINGS:
2148 t_OnClickedSettings(obj);
2151 case EO_BTN_SHUFFLE:
2152 t_OnClickedShuffle(obj);
2156 t_OnClickedRepeat(obj);
2160 t_OnClickedPlay(obj);
2169 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
2175 case EO_BTN_FORWARD:
2179 case EO_BTN_SETTINGS:
2180 case EO_BTN_SHUFFLE:
2181 if (!elm_object_focus_get(obj))
2182 elm_object_focus_set(obj, EINA_TRUE);
2187 Elm_Object_Item *item;
2189 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
2190 ev->cur.canvas.y, NULL);
2194 if (!elm_object_item_focus_get(item))
2195 elm_object_item_focus_set(item, EINA_TRUE);
2205 void CPlaybackView::OnPressed(int id, Evas_Object *obj)
2208 case EO_BTN_FORWARD:
2210 m_HandleOnPressed(obj);
2219 void CPlaybackView::OnUnpressed(int id, Evas_Object *obj)
2222 case EO_BTN_FORWARD:
2224 m_HandleOnUnpressed(obj);
2233 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2238 int index = elm_genlist_item_index_get(item);
2239 if ((index & 1) == 1)
2240 elm_object_item_signal_emit(item,
2241 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
2243 elm_object_item_signal_emit(item,
2244 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
2246 SItemInfo *itInfo = m_FindItemInfoFromItem(m->elInfo, item);
2247 if (itInfo->select_status)
2248 elm_object_item_signal_emit(item,
2249 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
2251 elm_object_item_signal_emit(item,
2252 MUSIC_SIGNAL_UNSELECT_ITEM, MUSIC_PLAYBACK_VIEW);
2254 if (itInfo->edit_mode) {
2255 elm_object_item_signal_emit(item,
2256 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
2257 if (itInfo->check_status) {
2258 elm_object_item_signal_emit(item,
2259 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
2262 elm_object_item_signal_emit(item,
2263 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
2266 elm_object_item_signal_emit(item,
2267 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
2277 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
2281 m_HandleGenlistItemActivated(obj, item);
2290 void CPlaybackView::OnComplete(void)
2292 m_UpdateCurrentSongInfo();
2296 void CPlaybackView::OnError(void)
2298 m_CreateErrorPopup();
2302 void CPlaybackView::OnUsbStatusChanged(SUsbStorageStatus status)
2307 void CPlaybackView::OnUpdateContent(void)
2312 void CPlaybackView::OnStartPlayback(void)
2314 m_UpdateCurrentSongInfo();
2318 void CPlaybackView::OnStopPlayback(void)
2320 m_UpdateCurrentSongInfo();