# include <Emotion.h>
#endif
-/**
- * @defgroup Video Video
- *
- * This object display an player that let you control an Elm_Video object. It take care of updating
- * it's content according to what is going on inside the Emotion object. It does activate the remember
- * function on the linked Elm_Video object.
- *
- * Signals that you cann add callback for are :
- *
- * "forward,clicked" - the user clicked the forward button.
- * "info,clicked" - the user clicked the info button.
- * "next,clicked" - the user clicked the next button.
- * "pause,clicked" - the user clicked the pause button.
- * "play,clicked" - the user clicked the play button.
- * "prev,clicked" - the user clicked the prev button.
- * "rewind,clicked" - the user clicked the rewind button.
- * "stop,clicked" - the user clicked the stop button.
- */
-
typedef struct _Widget_Data Widget_Data;
struct _Widget_Data
{
}
if (!strcmp(ev->keyname, "space"))
{
- if (elm_video_is_playing(wd->video))
+ if (elm_video_is_playing_get(wd->video))
elm_video_pause(wd->video);
else
elm_video_play(wd->video);
Eina_Bool seekable;
if (!wd) return ;
- seekable = elm_video_is_seekable(wd->video);
+ seekable = elm_video_is_seekable_get(wd->video);
length = elm_video_play_length_get(wd->video);
pos = elm_video_play_position_get(wd->video);
pos += length * 0.3;
elm_video_play_position_set(wd->video, pos);
- evas_object_smart_callback_call(player, SIG_FORWARD_CLICKED, NULL);
edje_object_signal_emit(wd->layout, "elm,button,forward", "elm");
+ evas_object_smart_callback_call(player, SIG_FORWARD_CLICKED, NULL);
}
static void
if (!wd) return ;
- evas_object_smart_callback_call(player, SIG_INFO_CLICKED, NULL);
edje_object_signal_emit(wd->layout, "elm,button,info", "elm");
+ evas_object_smart_callback_call(player, SIG_INFO_CLICKED, NULL);
}
static void
pos += length * 0.1;
elm_video_play_position_set(wd->video, pos);
- evas_object_smart_callback_call(player, SIG_NEXT_CLICKED, NULL);
edje_object_signal_emit(wd->layout, "elm,button,next", "elm");
+ evas_object_smart_callback_call(player, SIG_NEXT_CLICKED, NULL);
}
static void
edje_object_signal_emit(wd->layout, "elm,player,pause", "elm");
elm_video_pause(wd->video);
- evas_object_smart_callback_call(player, SIG_PAUSE_CLICKED, NULL);
edje_object_signal_emit(wd->layout, "elm,button,pause", "elm");
+ evas_object_smart_callback_call(player, SIG_PAUSE_CLICKED, NULL);
}
static void
if (!wd) return ;
elm_video_play(wd->video);
- evas_object_smart_callback_call(player, SIG_PLAY_CLICKED, NULL);
edje_object_signal_emit(wd->layout, "elm,button,play", "elm");
+ evas_object_smart_callback_call(player, SIG_PLAY_CLICKED, NULL);
}
static void
if (!wd) return ;
elm_video_play_position_set(wd->video, 0);
- evas_object_smart_callback_call(player, SIG_REWIND_CLICKED, NULL);
edje_object_signal_emit(wd->layout, "elm,button,rewind", "elm");
+ evas_object_smart_callback_call(player, SIG_REWIND_CLICKED, NULL);
}
static void
if (!wd) return ;
- evas_object_smart_callback_call(player, SIG_STOP_CLICKED, NULL);
edje_object_signal_emit(wd->layout, "elm,button,stop", "elm");
+ evas_object_smart_callback_call(player, SIG_STOP_CLICKED, NULL);
}
static void
}
static void
-_track_video(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_track_video(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
- Widget_Data *wd = elm_widget_data_get(obj);
-
- _cleanup_callback(wd);
+ _cleanup_callback(data);
}
static void
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
+ evas_object_smart_callback_del(wd->forward, "clicked", _forward);
+ evas_object_smart_callback_del(wd->info, "clicked", _info);
+ evas_object_smart_callback_del(wd->next, "clicked", _next);
+ evas_object_smart_callback_del(wd->pause, "clicked", _pause);
+ evas_object_smart_callback_del(wd->play, "clicked", _play);
+ evas_object_smart_callback_del(wd->prev, "clicked", _prev);
+ evas_object_smart_callback_del(wd->rewind, "clicked", _rewind);
+ evas_object_smart_callback_del(wd->next, "clicked", _next);
_cleanup_callback(wd);
free(wd);
}
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
bt = elm_button_add(parent);
elm_widget_mirrored_automatic_set(bt, EINA_FALSE);
- elm_button_icon_set(bt, ic);
+ elm_object_part_content_set(bt, "icon", ic);
evas_object_size_hint_align_set(bt, 0.0, 0.0);
elm_object_style_set(bt, "anchor");
evas_object_smart_callback_add(bt, "clicked", func, obj);
}
#endif
+static void
+_content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content)
+{
+ if (part && strcmp(part, "video")) return;
+#ifdef HAVE_EMOTION
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+
+ double pos, length;
+ Eina_Bool seekable;
+
+ if (!_elm_video_check(content)) return;
+
+ _cleanup_callback(wd);
+
+ wd->video = content;
+
+ if (!wd->video)
+ {
+ wd->emotion = NULL;
+ return ;
+ }
+
+ elm_object_disabled_set(wd->slider, EINA_FALSE);
+ elm_object_disabled_set(wd->forward, EINA_FALSE);
+ elm_object_disabled_set(wd->info, EINA_FALSE);
+ elm_object_disabled_set(wd->next, EINA_FALSE);
+ elm_object_disabled_set(wd->pause, EINA_FALSE);
+ elm_object_disabled_set(wd->play, EINA_FALSE);
+ elm_object_disabled_set(wd->prev, EINA_FALSE);
+ elm_object_disabled_set(wd->rewind, EINA_FALSE);
+ elm_object_disabled_set(wd->next, EINA_FALSE);
+
+ wd->emotion = elm_video_emotion_get(wd->video);
+ emotion_object_priority_set(wd->emotion, EINA_TRUE);
+ evas_object_event_callback_add(wd->video, EVAS_CALLBACK_DEL,
+ _track_video, wd);
+
+ seekable = elm_video_is_seekable_get(wd->video);
+ length = elm_video_play_length_get(wd->video);
+ pos = elm_video_play_position_get(wd->video);
+
+ elm_object_disabled_set(wd->slider, !seekable);
+ elm_slider_min_max_set(wd->slider, 0, length);
+ elm_slider_value_set(wd->slider, pos);
+
+ if (elm_video_is_playing_get(wd->video)) edje_object_signal_emit(wd->layout, "elm,player,play", "elm");
+ else edje_object_signal_emit(wd->layout, "elm,player,pause", "elm");
+
+ evas_object_smart_callback_add(wd->emotion, "frame_decode",
+ _update_slider, obj);
+ evas_object_smart_callback_add(wd->emotion, "frame_resize",
+ _update_slider, obj);
+ evas_object_smart_callback_add(wd->emotion, "length_change",
+ _update_slider, obj);
+ evas_object_smart_callback_add(wd->emotion, "position_update",
+ _update_slider, obj);
+ evas_object_smart_callback_add(wd->emotion, "playback_started",
+ _play_started, obj);
+ evas_object_smart_callback_add(wd->emotion, "playback_finished",
+ _play_finished, obj);
+
+ /* FIXME: track info from video */
+#else
+ (void) obj;
+ (void) content;
+#endif
+
+}
+
EAPI Evas_Object *
elm_player_add(Evas_Object *parent)
{
elm_widget_theme_hook_set(obj, _theme_hook);
elm_widget_can_focus_set(obj, EINA_TRUE);
elm_widget_event_hook_set(obj, _event_hook);
+ elm_widget_content_set_hook_set(obj, _content_set_hook);
wd->layout = edje_object_add(e);
_elm_theme_object_set(obj, wd->layout, "player", "base", "default");
EAPI void
elm_player_video_set(Evas_Object *player, Evas_Object *video)
{
-#ifdef HAVE_EMOTION
- ELM_CHECK_WIDTYPE(player, widtype);
- Widget_Data *wd = elm_widget_data_get(player);
- double pos, length;
- Eina_Bool seekable;
-
- if (!_elm_video_check(video)) return ;
-
- _cleanup_callback(wd);
-
- wd->video = video;
-
- if (!wd->video)
- {
- wd->emotion = NULL;
- return ;
- }
-
- elm_object_disabled_set(wd->slider, EINA_FALSE);
- elm_object_disabled_set(wd->forward, EINA_FALSE);
- elm_object_disabled_set(wd->info, EINA_FALSE);
- elm_object_disabled_set(wd->next, EINA_FALSE);
- elm_object_disabled_set(wd->pause, EINA_FALSE);
- elm_object_disabled_set(wd->play, EINA_FALSE);
- elm_object_disabled_set(wd->prev, EINA_FALSE);
- elm_object_disabled_set(wd->rewind, EINA_FALSE);
- elm_object_disabled_set(wd->next, EINA_FALSE);
-
- wd->emotion = elm_video_emotion_get(wd->video);
- evas_object_event_callback_add(wd->video, EVAS_CALLBACK_DEL,
- _track_video, player);
-
- seekable = elm_video_is_seekable(wd->video);
- length = elm_video_play_length_get(wd->video);
- pos = elm_video_play_position_get(wd->video);
-
- elm_object_disabled_set(wd->slider, !seekable);
- elm_slider_min_max_set(wd->slider, 0, length);
- elm_slider_value_set(wd->slider, pos);
-
- if (elm_video_is_playing(wd->video)) edje_object_signal_emit(wd->layout, "elm,player,play", "elm");
- else edje_object_signal_emit(wd->layout, "elm,player,pause", "elm");
-
- evas_object_smart_callback_add(wd->emotion, "frame_decode",
- _update_slider, player);
- evas_object_smart_callback_add(wd->emotion, "frame_resize",
- _update_slider, player);
- evas_object_smart_callback_add(wd->emotion, "length_change",
- _update_slider, player);
- evas_object_smart_callback_add(wd->emotion, "position_update",
- _update_slider, player);
- evas_object_smart_callback_add(wd->emotion, "playback_started",
- _play_started, player);
- evas_object_smart_callback_add(wd->emotion, "playback_finished",
- _play_finished, player);
-
- /* FIXME: track info from video */
-#else
- (void) player;
- (void) video;
-#endif
+ _content_set_hook(player, "video", video);
}