From ecb92cf4e78320c57e401bd67956cf3c598c83fc Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 13 Apr 2015 21:23:14 +0900 Subject: [PATCH] slider: add key up/down handlers for seek from slider bar using keys Change-Id: Ic8840a595dd83738f467d3e0130660aeb44466f8 Signed-off-by: Minkyu Kang --- include/slider.h | 13 ++++++++++++ src/playermgr.cpp | 12 +++++++++++ src/slider.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++--------- src/view_player.cpp | 4 ++++ 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/include/slider.h b/include/slider.h index 7dc00fd..f338b0b 100644 --- a/include/slider.h +++ b/include/slider.h @@ -21,6 +21,8 @@ struct SSliderData; class CVideoSlider : public CListenerMgr, + public IKeyDownListener, + public IKeyUpListener, public IMouseMoveListener, public IMouseDownListener, public IMouseUpListener, @@ -31,10 +33,17 @@ private: SSliderData *m; private: + void m_SeekStart(Evas_Object *obj); + void m_SeekEnd(Evas_Object *obj); + +private: static Eina_Bool sm_CbTimer(void *dt); + static void sm_SeekCb(void *dt); public: CVideoSlider(void) : + IKeyDownListener(this), + IKeyUpListener(this), IMouseMoveListener(this), IMouseDownListener(this), IMouseUpListener(this), @@ -76,6 +85,10 @@ public: void Pause(void); /* Listeners */ + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Up *ev); virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); virtual void OnMouseDown(int id, Evas *e, Evas_Object *obj, diff --git a/src/playermgr.cpp b/src/playermgr.cpp index 3609aad..b18aab2 100644 --- a/src/playermgr.cpp +++ b/src/playermgr.cpp @@ -278,9 +278,15 @@ const char *CPlayer::GetPath(void) bool CPlayer::Pause(void) { + player_state_e state; + ASSERT(m); ASSERT(m->player); + GetState(&state); + if (state == PLAYER_STATE_PAUSED) + return true; + if (player_pause(m->player) != PLAYER_ERROR_NONE) { _ERR("Player pause error"); return false; @@ -291,9 +297,15 @@ bool CPlayer::Pause(void) bool CPlayer::Resume(void) { + player_state_e state; + ASSERT(m); ASSERT(m->player); + GetState(&state); + if (state == PLAYER_STATE_PLAYING) + return true; + if (player_start(m->player) != PLAYER_ERROR_NONE) { _ERR("Player resume error"); return false; diff --git a/src/slider.cpp b/src/slider.cpp index f74e554..c4f44d0 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -28,7 +28,8 @@ #define TIME_STR_START "00:00:00" #define TIME_INTERVAL 0.1 -#define SLIDER_STEP 0.05 +#define SLIDER_DEFAULT 0.05 +#define SLIDER_STEP 0.03 struct SSliderData { Evas_Object *base; @@ -47,7 +48,7 @@ static void _get_timestr(char *str, int size, unsigned int ms) sec / 3600, (sec % 3600) / 60, sec % 60); } -static void _slider_seek_completed(void *dt) +void CVideoSlider::sm_SeekCb(void *dt) { SSliderData *data; char str[32]; @@ -132,6 +133,7 @@ void CVideoSlider::Reset(int duration, int position) elm_slider_value_set(m->slider, position); elm_slider_min_max_set(m->slider, 0, duration); + elm_slider_step_set(m->slider, SLIDER_STEP); _get_timestr(str, sizeof(str), duration); elm_object_part_text_set(m->base, PART_CURTIME_TEXT, TIME_STR_START); @@ -162,9 +164,10 @@ bool CVideoSlider::Create(Evas_Object *base, CPlayer *player) elm_slider_indicator_show_on_focus_set(slider, EINA_FALSE); elm_object_style_set(slider, STYLE_SLIDER); elm_slider_horizontal_set(slider, EINA_TRUE); - elm_slider_step_set(slider, SLIDER_STEP); + elm_slider_step_set(slider, SLIDER_DEFAULT); - Connect(slider, -1, TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP | + Connect(slider, -1, TYPE_KEY_DOWN | TYPE_KEY_UP | + TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP | TYPE_FOCUSED | TYPE_UNFOCUSED | TYPE_CHANGED); elm_object_part_content_set(base, PART_SLIDER, slider); @@ -186,8 +189,7 @@ void CVideoSlider::Destroy(void) m = NULL; } -void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj, - Evas_Event_Mouse_Down *ev) +void CVideoSlider::m_SeekStart(Evas_Object *obj) { update_action action; @@ -195,13 +197,44 @@ void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj, CViewMgr::GetInstance()->UpdateView(VIEW_ID_PLAYER, (void *)&action); } -void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj, - Evas_Event_Mouse_Up *ev) +void CVideoSlider::m_SeekEnd(Evas_Object *obj) { int v; v = elm_slider_value_get(obj); - m->player->SetPosition(v, _slider_seek_completed, m); + m->player->SetPosition(v, sm_SeekCb, m); +} + +void CVideoSlider::OnKeyDown(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (strcmp(ev->keyname, KEY_RIGHT) && + strcmp(ev->keyname, KEY_LEFT)) + return; + + m_SeekStart(obj); +} + +void CVideoSlider::OnKeyUp(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Up *ev) +{ + if (strcmp(ev->keyname, KEY_RIGHT) && + strcmp(ev->keyname, KEY_LEFT)) + return; + + m_SeekEnd(obj); +} + +void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Down *ev) +{ + m_SeekStart(obj); +} + +void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Up *ev) +{ + m_SeekEnd(obj); } void CVideoSlider::OnMouseMove(int id, Evas *e, Evas_Object *obj, @@ -226,4 +259,10 @@ void CVideoSlider::OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) void CVideoSlider::OnChanged(int id, Evas_Object *obj) { + char str[32]; + int v; + + v = elm_slider_value_get(obj); + _get_timestr(str, sizeof(str), v); + elm_object_part_text_set(m->base, PART_CURTIME_TEXT, str); } diff --git a/src/view_player.cpp b/src/view_player.cpp index b371223..1537620 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -711,10 +711,14 @@ void CPlayerView::t_OnUpdate(void *dt) case ACTION_RESUME: m->player->Resume(); m->slider->Resume(); + m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, ""); + timeout_handler_reset(m->timeout_handle); break; case ACTION_PAUSE: m->player->Pause(); m->slider->Pause(); + m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, ""); + timeout_handler_reset(m->timeout_handle); break; case ACTION_INIT: m_PlayerInit(); -- 2.7.4