fix exception handling
[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         ASSERT(dt);
57
58         SSliderData *data;
59
60         data = (SSliderData *)dt;
61
62         data->player->SetPosition(data->pos, sm_CbSeekComplete, data);
63         data->pos = -1;
64         data->seek = NULL;
65
66         return ECORE_CALLBACK_CANCEL;
67 }
68
69 void CVideoSlider::sm_CbSeekComplete(void *dt)
70 {
71         ASSERT(dt);
72
73         SSliderData *data;
74         char str[32];
75         int pos;
76         bool r;
77         update_action action;
78
79         data = (SSliderData *)dt;
80
81         if (data->pos != -1) {
82                 if (!data->seek) {
83                         data->seek = ecore_timer_add(TIME_INTERVAL,
84                                         sm_CbSeekSet, data);
85                 }
86                 return;
87         }
88
89         r = data->player->GetPosition(&pos);
90         if (!r) {
91                 _ERR("Get Position Failed");
92                 return;
93         }
94
95         _get_timestr(str, sizeof(str), pos);
96         elm_object_part_text_set(data->base, PART_CURTIME_TEXT, str);
97
98         action = ACTION_RESUME;
99         CViewMgr::GetInstance()->UpdateView(VIEW_ID_PLAYER, (void *)&action);
100
101         data->pos = -1;
102         data->seeking = false;
103 }
104
105 Eina_Bool CVideoSlider::sm_CbTimer(void *dt)
106 {
107         ASSERT(dt);
108
109         SSliderData *data;
110         int pos;
111         bool r;
112         char str[32];
113
114         data = (SSliderData *)dt;
115
116         if (!data->player)
117                 goto error;
118
119         r = data->player->GetPosition(&pos);
120         if (!r)
121                 goto error;
122
123         elm_slider_value_set(data->slider, pos);
124
125         _get_timestr(str, sizeof(str), pos);
126         elm_object_part_text_set(data->base, PART_CURTIME_TEXT, str);
127
128         return ECORE_CALLBACK_RENEW;
129
130 error:
131         data->timer = NULL;
132
133         return ECORE_CALLBACK_CANCEL;
134 }
135
136 void CVideoSlider::Pause(void)
137 {
138         ASSERT(m);
139
140         if (m->timer)
141                 ecore_timer_freeze(m->timer);
142 }
143
144 void CVideoSlider::Resume(void)
145 {
146         ASSERT(m);
147
148         if (m->timer)
149                 ecore_timer_thaw(m->timer);
150 }
151
152 void CVideoSlider::Reset(int duration, int position)
153 {
154         ASSERT(m);
155
156         char str[32];
157
158         ecore_timer_del(m->seek);
159         ecore_timer_del(m->timer);
160         m->timer = ecore_timer_add(TIME_INTERVAL, sm_CbTimer, m);
161
162         elm_slider_value_set(m->slider, position);
163         elm_slider_min_max_set(m->slider, 0, duration);
164         elm_slider_step_set(m->slider, SLIDER_STEP);
165
166         _get_timestr(str, sizeof(str), duration);
167         elm_object_part_text_set(m->base, PART_CURTIME_TEXT, TIME_STR_START);
168         elm_object_part_text_set(m->base, PART_TOTALTIME_TEXT, str);
169 }
170
171 bool CVideoSlider::Create(Evas_Object *base, CPlayer *player)
172 {
173         ASSERT(!m);
174         ASSERT(base);
175         ASSERT(player);
176
177         Evas_Object *slider;
178
179         m = new SSliderData;
180         if (!m) {
181                 _ERR("allocation fail");
182                 return false;
183         }
184
185         slider = elm_slider_add(base);
186         if (!slider) {
187                 _ERR("failed to add slider");
188                 delete m;
189                 m = NULL;
190                 return false;
191         }
192
193         elm_slider_indicator_show_set(slider, EINA_FALSE);
194         elm_slider_indicator_show_on_focus_set(slider, EINA_FALSE);
195         elm_object_style_set(slider, STYLE_SLIDER);
196         elm_slider_horizontal_set(slider, EINA_TRUE);
197         elm_slider_step_set(slider, SLIDER_DEFAULT);
198
199         Connect(slider, -1, TYPE_KEY_DOWN | TYPE_KEY_UP |
200                         TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP |
201                         TYPE_FOCUSED | TYPE_UNFOCUSED | TYPE_CHANGED);
202
203         elm_object_part_content_set(base, PART_SLIDER, slider);
204
205         m->base = base;
206         m->slider = slider;
207         m->player = player;
208         m->timer = NULL;
209         m->pos = -1;
210         m->seeking = false;
211         m->seek = NULL;
212
213         return true;
214 }
215
216 void CVideoSlider::Destroy(void)
217 {
218         ASSERT(m);
219
220         ecore_timer_del(m->timer);
221         ecore_timer_del(m->seek);
222
223         delete m;
224         m = NULL;
225 }
226
227 void CVideoSlider::m_SeekStart(Evas_Object *obj)
228 {
229         update_action action;
230
231         action = ACTION_PAUSE;
232         CViewMgr::GetInstance()->UpdateView(VIEW_ID_PLAYER, (void *)&action);
233 }
234
235 void CVideoSlider::m_SeekEnd(Evas_Object *obj)
236 {
237         ASSERT(m);
238
239         int v;
240
241         v = elm_slider_value_get(obj);
242
243         if (m->seeking) {
244                 m->pos = v;
245         } else {
246                 m->player->SetPosition(v, sm_CbSeekComplete, m);
247                 m->seeking = true;
248         }
249 }
250
251 void CVideoSlider::OnKeyDown(int id, Evas *e, Evas_Object *obj,
252                         Evas_Event_Key_Down *ev)
253 {
254         ASSERT(obj);
255
256         if (strcmp(ev->keyname, KEY_RIGHT) &&
257                         strcmp(ev->keyname, KEY_LEFT))
258                 return;
259
260         m_SeekStart(obj);
261 }
262
263 void CVideoSlider::OnKeyUp(int id, Evas *e, Evas_Object *obj,
264                         Evas_Event_Key_Up *ev)
265 {
266         ASSERT(obj);
267
268         if (strcmp(ev->keyname, KEY_RIGHT) &&
269                         strcmp(ev->keyname, KEY_LEFT))
270                 return;
271
272         m_SeekEnd(obj);
273 }
274
275 void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj,
276                         Evas_Event_Mouse_Down *ev)
277 {
278         ASSERT(obj);
279
280         m_SeekStart(obj);
281 }
282
283 void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj,
284                         Evas_Event_Mouse_Up *ev)
285 {
286         ASSERT(obj);
287
288         m_SeekEnd(obj);
289 }
290
291 void CVideoSlider::OnMouseMove(int id, Evas *e, Evas_Object *obj,
292                         Evas_Event_Mouse_Move *ev)
293 {
294         ASSERT(obj);
295
296         if (!elm_object_focus_get(obj))
297                 elm_object_focus_set(obj, EINA_TRUE);
298 }
299
300 void CVideoSlider::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item)
301 {
302         ASSERT(m);
303
304         elm_object_signal_emit(m->base, SIG_SLIDER_FOCUS, "");
305 }
306
307 void CVideoSlider::OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item)
308 {
309         ASSERT(m);
310
311         elm_object_signal_emit(m->base, SIG_SLIDER_UNFOCUS, "");
312 }
313
314 void CVideoSlider::OnChanged(int id, Evas_Object *obj)
315 {
316         char str[32];
317         int v;
318
319         v = elm_slider_value_get(obj);
320         _get_timestr(str, sizeof(str), v);
321         elm_object_part_text_set(m->base, PART_CURTIME_TEXT, str);
322 }