diff options
author | David Walter Seikel | 2012-04-22 09:20:32 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-04-22 09:20:32 +1000 |
commit | 3ad3455551be0d7859ecb02290376206d5e66498 (patch) | |
tree | 497917e12b4d7f458dff9765d9b53f64c4e03fc3 /libraries/elementary/src/lib/elc_player.c | |
parent | Update EFL to latest beta. (diff) | |
download | SledjHamr-3ad3455551be0d7859ecb02290376206d5e66498.zip SledjHamr-3ad3455551be0d7859ecb02290376206d5e66498.tar.gz SledjHamr-3ad3455551be0d7859ecb02290376206d5e66498.tar.bz2 SledjHamr-3ad3455551be0d7859ecb02290376206d5e66498.tar.xz |
And actually include new files, plus elementary libraries.
Diffstat (limited to 'libraries/elementary/src/lib/elc_player.c')
-rw-r--r-- | libraries/elementary/src/lib/elc_player.c | 590 |
1 files changed, 590 insertions, 0 deletions
diff --git a/libraries/elementary/src/lib/elc_player.c b/libraries/elementary/src/lib/elc_player.c new file mode 100644 index 0000000..a6327c3 --- /dev/null +++ b/libraries/elementary/src/lib/elc_player.c | |||
@@ -0,0 +1,590 @@ | |||
1 | #include <Elementary.h> | ||
2 | #include "elm_priv.h" | ||
3 | |||
4 | #ifdef HAVE_EMOTION | ||
5 | # include <Emotion.h> | ||
6 | #endif | ||
7 | |||
8 | typedef struct _Widget_Data Widget_Data; | ||
9 | struct _Widget_Data | ||
10 | { | ||
11 | Evas_Object *layout; | ||
12 | Evas_Object *video; | ||
13 | Evas_Object *emotion; | ||
14 | |||
15 | Evas_Object *forward; | ||
16 | Evas_Object *info; | ||
17 | Evas_Object *next; | ||
18 | Evas_Object *pause; | ||
19 | Evas_Object *play; | ||
20 | Evas_Object *prev; | ||
21 | Evas_Object *rewind; | ||
22 | Evas_Object *stop; | ||
23 | |||
24 | Evas_Object *slider; | ||
25 | }; | ||
26 | |||
27 | #ifdef HAVE_EMOTION | ||
28 | static const char *widtype = NULL; | ||
29 | |||
30 | static const char SIG_FORWARD_CLICKED[] = "forward,clicked"; | ||
31 | static const char SIG_INFO_CLICKED[] = "info,clicked"; | ||
32 | static const char SIG_NEXT_CLICKED[] = "next,clicked"; | ||
33 | static const char SIG_PAUSE_CLICKED[] = "pause,clicked"; | ||
34 | static const char SIG_PLAY_CLICKED[] = "play,clicked"; | ||
35 | static const char SIG_PREV_CLICKED[] = "prev,clicked"; | ||
36 | static const char SIG_REWIND_CLICKED[] = "rewind,clicked"; | ||
37 | static const char SIG_STOP_CLICKED[] = "stop,clicked"; | ||
38 | |||
39 | static const Evas_Smart_Cb_Description _signals[] = { | ||
40 | { SIG_FORWARD_CLICKED, "" }, | ||
41 | { SIG_INFO_CLICKED, "" }, | ||
42 | { SIG_NEXT_CLICKED, "" }, | ||
43 | { SIG_PAUSE_CLICKED, "" }, | ||
44 | { SIG_PLAY_CLICKED, "" }, | ||
45 | { SIG_PREV_CLICKED, "" }, | ||
46 | { SIG_REWIND_CLICKED, "" }, | ||
47 | { SIG_STOP_CLICKED, "" }, | ||
48 | { NULL, NULL } | ||
49 | }; | ||
50 | |||
51 | static void _del_hook(Evas_Object *obj); | ||
52 | static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl); | ||
53 | static void _theme_hook(Evas_Object *obj); | ||
54 | static void _sizing_eval(Evas_Object *obj); | ||
55 | static void _on_focus_hook(void *data, Evas_Object *obj); | ||
56 | static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, | ||
57 | Evas_Callback_Type type, void *event_info); | ||
58 | |||
59 | static Eina_Bool | ||
60 | _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) | ||
61 | { | ||
62 | if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; | ||
63 | Evas_Event_Key_Down *ev = event_info; | ||
64 | Widget_Data *wd = elm_widget_data_get(obj); | ||
65 | if (!wd) return EINA_FALSE; | ||
66 | if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; | ||
67 | if (elm_widget_disabled_get(obj)) return EINA_FALSE; | ||
68 | if (!wd->video) return EINA_FALSE; | ||
69 | if ((!strcmp(ev->keyname, "Left")) || | ||
70 | ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string))) | ||
71 | { | ||
72 | double current, last; | ||
73 | |||
74 | current = elm_video_play_position_get(wd->video); | ||
75 | last = elm_video_play_length_get(wd->video); | ||
76 | |||
77 | if (current < last) | ||
78 | { | ||
79 | current += last / 100; | ||
80 | elm_video_play_position_set(wd->video, current); | ||
81 | } | ||
82 | |||
83 | ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; | ||
84 | return EINA_TRUE; | ||
85 | } | ||
86 | if ((!strcmp(ev->keyname, "Right")) || | ||
87 | ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string))) | ||
88 | { | ||
89 | double current, last; | ||
90 | |||
91 | current = elm_video_play_position_get(wd->video); | ||
92 | last = elm_video_play_length_get(wd->video); | ||
93 | |||
94 | if (current > 0) | ||
95 | { | ||
96 | current -= last / 100; | ||
97 | if (current < 0) current = 0; | ||
98 | elm_video_play_position_set(wd->video, current); | ||
99 | } | ||
100 | |||
101 | ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; | ||
102 | return EINA_TRUE; | ||
103 | } | ||
104 | if (!strcmp(ev->keyname, "space")) | ||
105 | { | ||
106 | if (elm_video_is_playing_get(wd->video)) | ||
107 | elm_video_pause(wd->video); | ||
108 | else | ||
109 | elm_video_play(wd->video); | ||
110 | ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; | ||
111 | return EINA_TRUE; | ||
112 | } | ||
113 | fprintf(stderr, "keyname: '%s' not handle\n", ev->keyname); | ||
114 | return EINA_FALSE; | ||
115 | } | ||
116 | |||
117 | static void | ||
118 | _on_focus_hook(void *data __UNUSED__, Evas_Object *obj) | ||
119 | { | ||
120 | Widget_Data *wd = elm_widget_data_get(obj); | ||
121 | if (!wd) return; | ||
122 | if (elm_widget_focus_get(obj)) | ||
123 | { | ||
124 | edje_object_signal_emit(wd->layout, "elm,action,focus", "elm"); | ||
125 | evas_object_focus_set(wd->layout, EINA_TRUE); | ||
126 | } | ||
127 | else | ||
128 | { | ||
129 | edje_object_signal_emit(wd->layout, "elm,action,unfocus", "elm"); | ||
130 | evas_object_focus_set(wd->layout, EINA_FALSE); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | static void | ||
135 | _mirrored_set(Evas_Object *obj, Eina_Bool rtl) | ||
136 | { | ||
137 | Widget_Data *wd = elm_widget_data_get(obj); | ||
138 | if (!wd) return; | ||
139 | edje_object_mirrored_set(wd->layout, rtl); | ||
140 | } | ||
141 | |||
142 | static void | ||
143 | _theme_hook(Evas_Object *obj) | ||
144 | { | ||
145 | Widget_Data *wd = elm_widget_data_get(obj); | ||
146 | if (!wd) return; | ||
147 | _elm_widget_mirrored_reload(obj); | ||
148 | _mirrored_set(obj, elm_widget_mirrored_get(obj)); | ||
149 | _elm_theme_object_set(obj, wd->layout, "video", "base", elm_widget_style_get(obj)); | ||
150 | edje_object_scale_set(wd->layout, elm_widget_scale_get(obj) * | ||
151 | _elm_config->scale); | ||
152 | |||
153 | #define UPDATE_THEME(Obj, Target, Layout, Name) \ | ||
154 | if (Target) \ | ||
155 | { \ | ||
156 | elm_object_style_set(Target, elm_widget_style_get(Obj)); \ | ||
157 | if (!edje_object_part_swallow(Layout, Name, Target)) \ | ||
158 | evas_object_hide(Target); \ | ||
159 | elm_object_disabled_set(Target, elm_widget_disabled_get(Obj)); \ | ||
160 | } | ||
161 | |||
162 | UPDATE_THEME(obj, wd->forward, wd->layout, "media_player/forward"); | ||
163 | UPDATE_THEME(obj, wd->info, wd->layout, "media_player/info"); | ||
164 | UPDATE_THEME(obj, wd->next, wd->layout, "media_player/next"); | ||
165 | UPDATE_THEME(obj, wd->pause, wd->layout, "media_player/pause"); | ||
166 | UPDATE_THEME(obj, wd->play, wd->layout, "media_player/play"); | ||
167 | UPDATE_THEME(obj, wd->prev, wd->layout, "media_player/prev"); | ||
168 | UPDATE_THEME(obj, wd->rewind, wd->layout, "media_player/rewind"); | ||
169 | UPDATE_THEME(obj, wd->next, wd->layout, "media_player/next"); | ||
170 | UPDATE_THEME(obj, wd->slider, wd->layout, "media_player/slider"); | ||
171 | |||
172 | _sizing_eval(obj); | ||
173 | } | ||
174 | |||
175 | static void | ||
176 | _sizing_eval(Evas_Object *obj) | ||
177 | { | ||
178 | Widget_Data *wd = elm_widget_data_get(obj); | ||
179 | Evas_Coord w, h; | ||
180 | |||
181 | if (!wd) return; | ||
182 | edje_object_size_min_get(wd->layout, &w, &h); | ||
183 | edje_object_size_min_restricted_calc(wd->layout, &w, &h, w, h); | ||
184 | evas_object_size_hint_min_set(obj, w, h); | ||
185 | } | ||
186 | |||
187 | static void | ||
188 | _update_slider(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
189 | { | ||
190 | Evas_Object *player = data; | ||
191 | Widget_Data *wd = elm_widget_data_get(player); | ||
192 | double pos, length; | ||
193 | Eina_Bool seekable; | ||
194 | |||
195 | if (!wd) return ; | ||
196 | seekable = elm_video_is_seekable_get(wd->video); | ||
197 | length = elm_video_play_length_get(wd->video); | ||
198 | pos = elm_video_play_position_get(wd->video); | ||
199 | |||
200 | elm_object_disabled_set(wd->slider, !seekable); | ||
201 | elm_slider_min_max_set(wd->slider, 0, length); | ||
202 | elm_slider_value_set(wd->slider, pos); | ||
203 | } | ||
204 | |||
205 | static void | ||
206 | _update_position(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
207 | { | ||
208 | Evas_Object *player = data; | ||
209 | Widget_Data *wd = elm_widget_data_get(player); | ||
210 | |||
211 | if (!wd) return ; | ||
212 | elm_video_play_position_set(wd->video, elm_slider_value_get(wd->slider)); | ||
213 | } | ||
214 | |||
215 | static void | ||
216 | _forward(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
217 | { | ||
218 | Evas_Object *player = data; | ||
219 | Widget_Data *wd = elm_widget_data_get(player); | ||
220 | double pos, length; | ||
221 | |||
222 | if (!wd) return ; | ||
223 | |||
224 | pos = elm_video_play_position_get(wd->video); | ||
225 | length = elm_video_play_length_get(wd->video); | ||
226 | |||
227 | pos += length * 0.3; | ||
228 | elm_video_play_position_set(wd->video, pos); | ||
229 | |||
230 | edje_object_signal_emit(wd->layout, "elm,button,forward", "elm"); | ||
231 | evas_object_smart_callback_call(player, SIG_FORWARD_CLICKED, NULL); | ||
232 | } | ||
233 | |||
234 | static void | ||
235 | _info(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
236 | { | ||
237 | Evas_Object *player = data; | ||
238 | Widget_Data *wd = elm_widget_data_get(player); | ||
239 | |||
240 | if (!wd) return ; | ||
241 | |||
242 | edje_object_signal_emit(wd->layout, "elm,button,info", "elm"); | ||
243 | evas_object_smart_callback_call(player, SIG_INFO_CLICKED, NULL); | ||
244 | } | ||
245 | |||
246 | static void | ||
247 | _next(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
248 | { | ||
249 | Evas_Object *player = data; | ||
250 | Widget_Data *wd = elm_widget_data_get(player); | ||
251 | double pos, length; | ||
252 | |||
253 | if (!wd) return ; | ||
254 | |||
255 | pos = elm_video_play_position_get(wd->video); | ||
256 | length = elm_video_play_length_get(wd->video); | ||
257 | |||
258 | pos += length * 0.1; | ||
259 | elm_video_play_position_set(wd->video, pos); | ||
260 | |||
261 | edje_object_signal_emit(wd->layout, "elm,button,next", "elm"); | ||
262 | evas_object_smart_callback_call(player, SIG_NEXT_CLICKED, NULL); | ||
263 | } | ||
264 | |||
265 | static void | ||
266 | _pause(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
267 | { | ||
268 | Evas_Object *player = data; | ||
269 | Widget_Data *wd = elm_widget_data_get(player); | ||
270 | |||
271 | if (!wd) return ; | ||
272 | |||
273 | edje_object_signal_emit(wd->layout, "elm,player,pause", "elm"); | ||
274 | elm_video_pause(wd->video); | ||
275 | |||
276 | edje_object_signal_emit(wd->layout, "elm,button,pause", "elm"); | ||
277 | evas_object_smart_callback_call(player, SIG_PAUSE_CLICKED, NULL); | ||
278 | } | ||
279 | |||
280 | static void | ||
281 | _play(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
282 | { | ||
283 | Evas_Object *player = data; | ||
284 | Widget_Data *wd = elm_widget_data_get(player); | ||
285 | |||
286 | if (!wd) return ; | ||
287 | elm_video_play(wd->video); | ||
288 | edje_object_signal_emit(wd->layout, "elm,button,play", "elm"); | ||
289 | evas_object_smart_callback_call(player, SIG_PLAY_CLICKED, NULL); | ||
290 | } | ||
291 | |||
292 | static void | ||
293 | _prev(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
294 | { | ||
295 | Evas_Object *player = data; | ||
296 | Widget_Data *wd = elm_widget_data_get(player); | ||
297 | double pos, length; | ||
298 | |||
299 | if (!wd) return ; | ||
300 | |||
301 | pos = elm_video_play_position_get(wd->video); | ||
302 | length = elm_video_play_length_get(wd->video); | ||
303 | |||
304 | pos -= length * 0.1; | ||
305 | elm_video_play_position_set(wd->video, pos); | ||
306 | evas_object_smart_callback_call(player, SIG_PREV_CLICKED, NULL); | ||
307 | edje_object_signal_emit(wd->layout, "elm,button,prev", "elm"); | ||
308 | } | ||
309 | |||
310 | static void | ||
311 | _rewind(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
312 | { | ||
313 | Evas_Object *player = data; | ||
314 | Widget_Data *wd = elm_widget_data_get(player); | ||
315 | |||
316 | if (!wd) return ; | ||
317 | elm_video_play_position_set(wd->video, 0); | ||
318 | edje_object_signal_emit(wd->layout, "elm,button,rewind", "elm"); | ||
319 | evas_object_smart_callback_call(player, SIG_REWIND_CLICKED, NULL); | ||
320 | } | ||
321 | |||
322 | static void | ||
323 | _stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
324 | { | ||
325 | Evas_Object *player = data; | ||
326 | Widget_Data *wd = elm_widget_data_get(player); | ||
327 | |||
328 | if (!wd) return ; | ||
329 | |||
330 | edje_object_signal_emit(wd->layout, "elm,button,stop", "elm"); | ||
331 | evas_object_smart_callback_call(player, SIG_STOP_CLICKED, NULL); | ||
332 | } | ||
333 | |||
334 | static void | ||
335 | _play_started(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
336 | { | ||
337 | Evas_Object *player = data; | ||
338 | Widget_Data *wd = elm_widget_data_get(player); | ||
339 | |||
340 | if (!wd) return ; | ||
341 | |||
342 | edje_object_signal_emit(wd->layout, "elm,player,play", "elm"); | ||
343 | } | ||
344 | |||
345 | static void | ||
346 | _play_finished(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
347 | { | ||
348 | Evas_Object *player = data; | ||
349 | Widget_Data *wd = elm_widget_data_get(player); | ||
350 | |||
351 | if (!wd) return ; | ||
352 | |||
353 | edje_object_signal_emit(wd->layout, "elm,player,pause", "elm"); | ||
354 | } | ||
355 | |||
356 | static void | ||
357 | _cleanup_callback(Widget_Data *wd) | ||
358 | { | ||
359 | if (!wd || !wd->emotion) return; | ||
360 | |||
361 | evas_object_smart_callback_del(wd->emotion, "frame_decode", | ||
362 | _update_slider); | ||
363 | evas_object_smart_callback_del(wd->emotion, "frame_resize", | ||
364 | _update_slider); | ||
365 | evas_object_smart_callback_del(wd->emotion, "length_change", | ||
366 | _update_slider); | ||
367 | evas_object_smart_callback_del(wd->emotion, "position_update", | ||
368 | _update_slider); | ||
369 | evas_object_smart_callback_del(wd->emotion, "playback_started", | ||
370 | _play_started); | ||
371 | evas_object_smart_callback_del(wd->emotion, "playback_finished", | ||
372 | _play_finished); | ||
373 | elm_object_disabled_set(wd->slider, EINA_TRUE); | ||
374 | elm_object_disabled_set(wd->forward, EINA_TRUE); | ||
375 | elm_object_disabled_set(wd->info, EINA_TRUE); | ||
376 | elm_object_disabled_set(wd->next, EINA_TRUE); | ||
377 | elm_object_disabled_set(wd->pause, EINA_TRUE); | ||
378 | elm_object_disabled_set(wd->play, EINA_TRUE); | ||
379 | elm_object_disabled_set(wd->prev, EINA_TRUE); | ||
380 | elm_object_disabled_set(wd->rewind, EINA_TRUE); | ||
381 | elm_object_disabled_set(wd->next, EINA_TRUE); | ||
382 | wd->video = NULL; | ||
383 | wd->emotion = NULL; | ||
384 | } | ||
385 | |||
386 | static void | ||
387 | _track_video(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) | ||
388 | { | ||
389 | _cleanup_callback(data); | ||
390 | } | ||
391 | |||
392 | static void | ||
393 | _del_hook(Evas_Object *obj) | ||
394 | { | ||
395 | Widget_Data *wd = elm_widget_data_get(obj); | ||
396 | |||
397 | if (!wd) return; | ||
398 | evas_object_smart_callback_del(wd->forward, "clicked", _forward); | ||
399 | evas_object_smart_callback_del(wd->info, "clicked", _info); | ||
400 | evas_object_smart_callback_del(wd->next, "clicked", _next); | ||
401 | evas_object_smart_callback_del(wd->pause, "clicked", _pause); | ||
402 | evas_object_smart_callback_del(wd->play, "clicked", _play); | ||
403 | evas_object_smart_callback_del(wd->prev, "clicked", _prev); | ||
404 | evas_object_smart_callback_del(wd->rewind, "clicked", _rewind); | ||
405 | evas_object_smart_callback_del(wd->next, "clicked", _next); | ||
406 | _cleanup_callback(wd); | ||
407 | free(wd); | ||
408 | } | ||
409 | |||
410 | static Evas_Object * | ||
411 | _player_button_add(Evas_Object *parent, Evas_Object *obj, Evas_Object *layout, const char *name, Evas_Smart_Cb func) | ||
412 | { | ||
413 | Evas_Object *ic; | ||
414 | Evas_Object *bt; | ||
415 | |||
416 | ic = elm_icon_add(parent); | ||
417 | elm_icon_standard_set(ic, name); | ||
418 | evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); | ||
419 | bt = elm_button_add(parent); | ||
420 | elm_widget_mirrored_automatic_set(bt, EINA_FALSE); | ||
421 | elm_object_part_content_set(bt, "icon", ic); | ||
422 | evas_object_size_hint_align_set(bt, 0.0, 0.0); | ||
423 | elm_object_style_set(bt, "anchor"); | ||
424 | evas_object_smart_callback_add(bt, "clicked", func, obj); | ||
425 | elm_widget_sub_object_add(obj, bt); | ||
426 | |||
427 | if (!edje_object_part_swallow(layout, name, bt)) | ||
428 | evas_object_hide(bt); | ||
429 | return bt; | ||
430 | } | ||
431 | |||
432 | static char * | ||
433 | _double_to_time(double value) | ||
434 | { | ||
435 | char buf[256]; | ||
436 | int ph, pm, ps, pf; | ||
437 | |||
438 | ph = value / 3600; | ||
439 | pm = value / 60 - (ph * 60); | ||
440 | ps = value - (pm * 60); | ||
441 | pf = value * 100 - (ps * 100) - (pm * 60 * 100) - (ph * 60 * 60 * 100); | ||
442 | if (ph) | ||
443 | snprintf(buf, sizeof(buf), "%i:%02i:%02i.%02i", | ||
444 | ph, pm, ps, pf); | ||
445 | else if (pm) | ||
446 | snprintf(buf, sizeof(buf), "%02i:%02i.%02i", | ||
447 | pm, ps, pf); | ||
448 | else | ||
449 | snprintf(buf, sizeof(buf), "%02i.%02i", | ||
450 | ps, pf); | ||
451 | |||
452 | return (char *)eina_stringshare_add(buf); | ||
453 | } | ||
454 | |||
455 | static void | ||
456 | _value_free(char *data) | ||
457 | { | ||
458 | eina_stringshare_del(data); | ||
459 | } | ||
460 | #endif | ||
461 | |||
462 | #ifdef HAVE_EMOTION | ||
463 | static void | ||
464 | _content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content) | ||
465 | { | ||
466 | if (part && strcmp(part, "video")) return; | ||
467 | ELM_CHECK_WIDTYPE(obj, widtype); | ||
468 | Widget_Data *wd = elm_widget_data_get(obj); | ||
469 | if (!wd) return; | ||
470 | double pos, length; | ||
471 | Eina_Bool seekable; | ||
472 | |||
473 | if (!_elm_video_check(content)) return; | ||
474 | if (wd->video == content) return; | ||
475 | |||
476 | if (wd->video) evas_object_del(wd->video); | ||
477 | _cleanup_callback(wd); | ||
478 | |||
479 | wd->video = content; | ||
480 | |||
481 | if (!wd->video) | ||
482 | { | ||
483 | wd->emotion = NULL; | ||
484 | return ; | ||
485 | } | ||
486 | |||
487 | elm_object_disabled_set(wd->slider, EINA_FALSE); | ||
488 | elm_object_disabled_set(wd->forward, EINA_FALSE); | ||
489 | elm_object_disabled_set(wd->info, EINA_FALSE); | ||
490 | elm_object_disabled_set(wd->next, EINA_FALSE); | ||
491 | elm_object_disabled_set(wd->pause, EINA_FALSE); | ||
492 | elm_object_disabled_set(wd->play, EINA_FALSE); | ||
493 | elm_object_disabled_set(wd->prev, EINA_FALSE); | ||
494 | elm_object_disabled_set(wd->rewind, EINA_FALSE); | ||
495 | elm_object_disabled_set(wd->next, EINA_FALSE); | ||
496 | |||
497 | wd->emotion = elm_video_emotion_get(wd->video); | ||
498 | emotion_object_priority_set(wd->emotion, EINA_TRUE); | ||
499 | evas_object_event_callback_add(wd->video, EVAS_CALLBACK_DEL, | ||
500 | _track_video, wd); | ||
501 | |||
502 | seekable = elm_video_is_seekable_get(wd->video); | ||
503 | length = elm_video_play_length_get(wd->video); | ||
504 | pos = elm_video_play_position_get(wd->video); | ||
505 | |||
506 | elm_object_disabled_set(wd->slider, !seekable); | ||
507 | elm_slider_min_max_set(wd->slider, 0, length); | ||
508 | elm_slider_value_set(wd->slider, pos); | ||
509 | |||
510 | if (elm_video_is_playing_get(wd->video)) edje_object_signal_emit(wd->layout, "elm,player,play", "elm"); | ||
511 | else edje_object_signal_emit(wd->layout, "elm,player,pause", "elm"); | ||
512 | |||
513 | evas_object_smart_callback_add(wd->emotion, "frame_decode", | ||
514 | _update_slider, obj); | ||
515 | evas_object_smart_callback_add(wd->emotion, "frame_resize", | ||
516 | _update_slider, obj); | ||
517 | evas_object_smart_callback_add(wd->emotion, "length_change", | ||
518 | _update_slider, obj); | ||
519 | evas_object_smart_callback_add(wd->emotion, "position_update", | ||
520 | _update_slider, obj); | ||
521 | evas_object_smart_callback_add(wd->emotion, "playback_started", | ||
522 | _play_started, obj); | ||
523 | evas_object_smart_callback_add(wd->emotion, "playback_finished", | ||
524 | _play_finished, obj); | ||
525 | |||
526 | /* FIXME: track info from video */ | ||
527 | } | ||
528 | #endif | ||
529 | |||
530 | EAPI Evas_Object * | ||
531 | elm_player_add(Evas_Object *parent) | ||
532 | { | ||
533 | #ifdef HAVE_EMOTION | ||
534 | Evas_Object *obj; | ||
535 | Evas *e; | ||
536 | Widget_Data *wd; | ||
537 | |||
538 | ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL); | ||
539 | ELM_SET_WIDTYPE(widtype, "player"); | ||
540 | elm_widget_type_set(obj, "player"); | ||
541 | elm_widget_sub_object_add(parent, obj); | ||
542 | elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL); | ||
543 | elm_widget_data_set(obj, wd); | ||
544 | elm_widget_del_hook_set(obj, _del_hook); | ||
545 | elm_widget_theme_hook_set(obj, _theme_hook); | ||
546 | elm_widget_can_focus_set(obj, EINA_TRUE); | ||
547 | elm_widget_event_hook_set(obj, _event_hook); | ||
548 | elm_widget_content_set_hook_set(obj, _content_set_hook); | ||
549 | /* TODO: add content_unset and content_get hook */ | ||
550 | |||
551 | wd->layout = edje_object_add(e); | ||
552 | _elm_theme_object_set(obj, wd->layout, "player", "base", "default"); | ||
553 | elm_widget_resize_object_set(obj, wd->layout); | ||
554 | elm_widget_sub_object_add(obj, wd->layout); | ||
555 | evas_object_show(wd->layout); | ||
556 | evas_object_size_hint_weight_set(wd->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | ||
557 | |||
558 | wd->forward = _player_button_add(parent, obj, wd->layout, "media_player/forward", _forward); | ||
559 | wd->info = _player_button_add(parent, obj, wd->layout, "media_player/info", _info); | ||
560 | wd->next = _player_button_add(parent, obj, wd->layout, "media_player/next", _next); | ||
561 | wd->pause = _player_button_add(parent, obj, wd->layout, "media_player/pause", _pause); | ||
562 | wd->play = _player_button_add(parent, obj, wd->layout, "media_player/play", _play); | ||
563 | wd->prev = _player_button_add(parent, obj, wd->layout, "media_player/prev", _prev); | ||
564 | wd->rewind = _player_button_add(parent, obj, wd->layout, "media_player/rewind", _rewind); | ||
565 | wd->stop = _player_button_add(parent, obj, wd->layout, "media_player/stop", _stop); | ||
566 | |||
567 | wd->slider = elm_slider_add(parent); | ||
568 | elm_widget_sub_object_add(obj, wd->slider); | ||
569 | elm_slider_indicator_format_function_set(wd->slider, _double_to_time, _value_free); | ||
570 | elm_slider_units_format_function_set(wd->slider, _double_to_time, _value_free); | ||
571 | elm_slider_min_max_set(wd->slider, 0, 0); | ||
572 | elm_slider_value_set(wd->slider, 0); | ||
573 | elm_object_disabled_set(wd->slider, EINA_TRUE); | ||
574 | evas_object_size_hint_align_set(wd->slider, EVAS_HINT_FILL, 0.5); | ||
575 | evas_object_size_hint_weight_set(wd->slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | ||
576 | edje_object_part_swallow(wd->layout, "media_player/slider", wd->slider); | ||
577 | evas_object_smart_callback_add(wd->slider, "changed", _update_position, obj); | ||
578 | |||
579 | wd->emotion = NULL; | ||
580 | wd->video = NULL; | ||
581 | |||
582 | _mirrored_set(obj, elm_widget_mirrored_get(obj)); | ||
583 | _sizing_eval(obj); | ||
584 | |||
585 | return obj; | ||
586 | #else | ||
587 | (void) parent; | ||
588 | return NULL; | ||
589 | #endif | ||
590 | } | ||