8a873b18aba427b8d11db0ea393bbfb9a5b2a647
[profile/tv/apps/native/videoplayer.git] / src / slider.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include <Elementary.h>
18 #include <Eina.h>
19 #include <dbg.h>
20 #include <AppCommon.h>
21 #include <ViewMgr.h>
22 #include <BaseView.h>
23 #include <InputHandler.h>
24 #include "define.h"
25 #include "playermgr.h"
26 #include "slider.h"
27 #include "view_player.h"
28
29 #define TIME_STR_START "00:00:00"
30 #define TIME_INTERVAL 0.1
31 #define SLIDER_DEFAULT 0.05
32 #define SLIDER_STEP 0.03
33
34 struct SSliderData {
35         Evas_Object *base;
36         Evas_Object *slider;
37         Ecore_Timer *timer;
38         Ecore_Timer *seek;
39         CPlayer *player;
40         int pos;
41         bool seeking;
42 };
43
44 static void _get_timestr(char *str, int size, unsigned int ms)
45 {
46         int sec;
47
48         sec = ms / 1000;
49
50         snprintf(str, size, "%02d:%02d:%02d",
51                         sec / 3600, (sec % 3600) / 60, sec % 60);
52 }
53
54 Eina_Bool CVideoSlider::sm_CbSeekSet(void *dt)
55 {
56         SSliderData *data;
57
58         if (!dt)
59                 return ECORE_CALLBACK_CANCEL;
60
61         data = (SSliderData *)dt;
62
63         data->player->SetPosition(data->pos, sm_CbSeekComplete, data);
64         data->pos = -1;
65         data->seek = NULL;
66
67         return ECORE_CALLBACK_CANCEL;
68 }
69
70 void CVideoSlider::sm_CbSeekComplete(void *dt)
71 {
72         SSliderData *data;
73         char str[32];
74         int pos;
75         bool r;
76         update_action action;
77
78         if (!dt)
79                 return;
80
81         data = (SSliderData *)dt;
82
83         if (data->pos != -1) {
84                 if (!data->seek) {
85                         data->seek = ecore_timer_add(TIME_INTERVAL,
86                                         sm_CbSeekSet, data);
87                 }
88                 return;
89         }
90
91         r = data->player->GetPosition(&pos);
92         if (!r) {
93                 _ERR("Get Position Failed");
94                 return;
95         }
96
97         _get_timestr(str, sizeof(str), pos);
98         elm_object_part_text_set(data->base, PART_CURTIME_TEXT, str);
99
100         action = ACTION_RESUME;
101         CViewMgr::GetInstance()->UpdateView(VIEW_ID_PLAYER, (void *)&action);
102
103         data->pos = -1;
104         data->seeking = false;
105 }
106
107 Eina_Bool CVideoSlider::sm_CbTimer(void *dt)
108 {
109         SSliderData *data;
110         int pos;
111         bool r;
112         char str[32];
113
114         if (!dt)
115                 return ECORE_CALLBACK_CANCEL;
116
117         data = (SSliderData *)dt;
118
119         if (!data->player)
120                 goto error;
121
122         r = data->player->GetPosition(&pos);
123         if (!r)
124                 goto error;
125
126         elm_slider_value_set(data->slider, pos);
127
128         _get_timestr(str, sizeof(str), pos);
129         elm_object_part_text_set(data->base, PART_CURTIME_TEXT, str);
130
131         return ECORE_CALLBACK_RENEW;
132
133 error:
134         data->timer = NULL;
135
136         return ECORE_CALLBACK_CANCEL;
137 }
138
139 void CVideoSlider::Pause(void)
140 {
141         ASSERT(m);
142
143         if (m->timer)
144                 ecore_timer_freeze(m->timer);
145 }
146
147 void CVideoSlider::Resume(void)
148 {
149         ASSERT(m);
150
151         if (m->timer)
152                 ecore_timer_thaw(m->timer);
153 }
154
155 void CVideoSlider::Reset(int duration, int position)
156 {
157         ASSERT(m);
158
159         char str[32];
160
161         ecore_timer_del(m->seek);
162         ecore_timer_del(m->timer);
163         m->timer = ecore_timer_add(TIME_INTERVAL, sm_CbTimer, m);
164
165         elm_slider_value_set(m->slider, position);
166         elm_slider_min_max_set(m->slider, 0, duration);
167         elm_slider_step_set(m->slider, SLIDER_STEP);
168
169         _get_timestr(str, sizeof(str), duration);
170         elm_object_part_text_set(m->base, PART_CURTIME_TEXT, TIME_STR_START);
171         elm_object_part_text_set(m->base, PART_TOTALTIME_TEXT, str);
172 }
173
174 bool CVideoSlider::Create(Evas_Object *base, CPlayer *player)
175 {
176         ASSERT(!m);
177         ASSERT(base);
178         ASSERT(player);
179
180         Evas_Object *slider;
181
182         m = new SSliderData;
183         if (!m) {
184                 _ERR("failed to add slider");
185                 return false;
186         }
187
188         slider = elm_slider_add(base);
189         if (!slider) {
190                 _ERR("failed to add slider");
191                 return true;
192         }
193
194         elm_slider_indicator_show_set(slider, EINA_FALSE);
195         elm_slider_indicator_show_on_focus_set(slider, EINA_FALSE);
196         elm_object_style_set(slider, STYLE_SLIDER);
197         elm_slider_horizontal_set(slider, EINA_TRUE);
198         elm_slider_step_set(slider, SLIDER_DEFAULT);
199
200         Connect(slider, -1, TYPE_KEY_DOWN | TYPE_KEY_UP |
201                         TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP |
202                         TYPE_FOCUSED | TYPE_UNFOCUSED | TYPE_CHANGED);
203
204         elm_object_part_content_set(base, PART_SLIDER, slider);
205
206         m->base = base;
207         m->slider = slider;
208         m->player = player;
209         m->timer = NULL;
210         m->pos = -1;
211         m->seeking = false;
212         m->seek = NULL;
213
214         return true;
215 }
216
217 void CVideoSlider::Destroy(void)
218 {
219         ASSERT(m);
220
221         ecore_timer_del(m->timer);
222         ecore_timer_del(m->seek);
223
224         delete m;
225         m = NULL;
226 }
227
228 void CVideoSlider::m_SeekStart(Evas_Object *obj)
229 {
230         update_action action;
231
232         action = ACTION_PAUSE;
233         CViewMgr::GetInstance()->UpdateView(VIEW_ID_PLAYER, (void *)&action);
234 }
235
236 void CVideoSlider::m_SeekEnd(Evas_Object *obj)
237 {
238         int v;
239
240         v = elm_slider_value_get(obj);
241
242         if (m->seeking) {
243                 m->pos = v;
244         } else {
245                 m->player->SetPosition(v, sm_CbSeekComplete, m);
246                 m->seeking = true;
247         }
248 }
249
250 void CVideoSlider::OnKeyDown(int id, Evas *e, Evas_Object *obj,
251                         Evas_Event_Key_Down *ev)
252 {
253         if (strcmp(ev->keyname, KEY_RIGHT) &&
254                         strcmp(ev->keyname, KEY_LEFT))
255                 return;
256
257         m_SeekStart(obj);
258 }
259
260 void CVideoSlider::OnKeyUp(int id, Evas *e, Evas_Object *obj,
261                         Evas_Event_Key_Up *ev)
262 {
263         if (strcmp(ev->keyname, KEY_RIGHT) &&
264                         strcmp(ev->keyname, KEY_LEFT))
265                 return;
266
267         m_SeekEnd(obj);
268 }
269
270 void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj,
271                         Evas_Event_Mouse_Down *ev)
272 {
273         m_SeekStart(obj);
274 }
275
276 void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj,
277                         Evas_Event_Mouse_Up *ev)
278 {
279         m_SeekEnd(obj);
280 }
281
282 void CVideoSlider::OnMouseMove(int id, Evas *e, Evas_Object *obj,
283                         Evas_Event_Mouse_Move *ev)
284 {
285         if (!obj)
286                 return;
287
288         if (!elm_object_focus_get(obj))
289                 elm_object_focus_set(obj, EINA_TRUE);
290 }
291
292 void CVideoSlider::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item)
293 {
294         elm_object_signal_emit(m->base, SIG_SLIDER_FOCUS, "");
295 }
296
297 void CVideoSlider::OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item)
298 {
299         elm_object_signal_emit(m->base, SIG_SLIDER_UNFOCUS, "");
300 }
301
302 void CVideoSlider::OnChanged(int id, Evas_Object *obj)
303 {
304         char str[32];
305         int v;
306
307         v = elm_slider_value_get(obj);
308         _get_timestr(str, sizeof(str), v);
309         elm_object_part_text_set(m->base, PART_CURTIME_TEXT, str);
310 }