elm player - this breaks elm player theme api. it was broken to begin with

now elm player is a much mroe useful widget with nice auto-show/hide
controls and can in future be extended to do more. dark theme has full
support now.
This commit is contained in:
Carsten Haitzler 2013-07-23 19:15:50 +09:00
parent 943b897425
commit e487976dce
2 changed files with 89 additions and 121 deletions

View File

@ -1,4 +1,3 @@
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include "elementary_config.h" # include "elementary_config.h"
#endif #endif
@ -18,39 +17,10 @@ my_bt_open(void *data, Evas_Object *obj __UNUSED__, void *event_info)
} }
} }
static void
_notify_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
{
Evas_Coord w, h;
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
evas_object_resize(data, w, h);
}
static void
_notify_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
evas_object_show(data);
}
static void
_notify_block(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
elm_notify_timeout_set(data, 0.0);
evas_object_show(data);
}
static void
_notify_unblock(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
elm_notify_timeout_set(data, 10.0);
evas_object_show(data);
}
void void
test_video(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) test_video(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{ {
Evas_Object *win, *bg, *video, *bt, *tb, *notify, *player, *grid, *rect; Evas_Object *win, *bg, *video, *bt, *tb, *player;
win = elm_win_add(NULL, "video", ELM_WIN_BASIC); win = elm_win_add(NULL, "video", ELM_WIN_BASIC);
elm_win_title_set(win, "Video"); elm_win_title_set(win, "Video");
@ -63,20 +33,18 @@ test_video(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info
video = elm_video_add(win); video = elm_video_add(win);
evas_object_size_hint_weight_set(video, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_weight_set(video, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, video);
evas_object_show(video); evas_object_show(video);
notify = elm_notify_add(win);
elm_notify_align_set(notify, 0.5, 1.0);
player = elm_player_add(win); player = elm_player_add(win);
evas_object_size_hint_weight_set(player, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(player, video); elm_object_content_set(player, video);
elm_object_content_set(notify, player); elm_win_resize_object_add(win, player);
evas_object_show(player); evas_object_show(player);
tb = elm_table_add(win); tb = elm_table_add(win);
evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, tb); elm_win_resize_object_add(win, tb);
evas_object_show(tb);
bt = elm_fileselector_button_add(win); bt = elm_fileselector_button_add(win);
elm_object_text_set(bt, "Select Video"); elm_object_text_set(bt, "Select Video");
@ -85,25 +53,7 @@ test_video(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info
evas_object_size_hint_align_set(bt, 0.5, 0.1); evas_object_size_hint_align_set(bt, 0.5, 0.1);
elm_table_pack(tb, bt, 0, 0, 1, 1); elm_table_pack(tb, bt, 0, 0, 1, 1);
evas_object_show(bt); evas_object_show(bt);
evas_object_show(tb);
grid = elm_grid_add(win);
evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_grid_size_set(grid, 100, 100);
evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _notify_resize, grid);
evas_object_layer_set(grid, 32767);
evas_object_show(grid);
rect = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_color_set(rect, 0, 0, 0, 0);
evas_object_repeat_events_set(rect, EINA_TRUE);
elm_grid_pack(grid, rect, 0, 75, 100, 25);
evas_object_show(rect);
evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_MOVE, _notify_show, notify);
evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_IN, _notify_block, notify);
evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_OUT, _notify_unblock, notify);
evas_object_resize(win, 800, 500); evas_object_resize(win, 800, 500);
evas_object_show(win); evas_object_show(win);
} }

View File

@ -124,6 +124,38 @@ _elm_player_smart_event(Eo *obj, void *_pd, va_list *list)
} }
} }
static void
_update_theme_button(Evas_Object *obj, Evas_Object *bt, const char *name)
{
Evas_Object *ic;
char buf[256];
ic = evas_object_data_get(bt, "icon");
snprintf(buf, sizeof(buf), "media_player/%s/%s", name,
elm_widget_style_get(obj));
elm_icon_standard_set(ic, buf);
snprintf(buf, sizeof(buf), "media_player/%s/%s", name,
elm_widget_style_get(obj));
elm_object_style_set(bt, buf);
snprintf(buf, sizeof(buf), "elm.swallow.media_player.%s", name);
if (!elm_layout_content_set(obj, buf, bt))
evas_object_hide(bt);
elm_object_disabled_set(bt, elm_widget_disabled_get(obj));
}
static void
_update_theme_slider(Evas_Object *obj, Evas_Object *sl, const char *name)
{
char buf[256];
snprintf(buf, sizeof(buf), "media_player/%s/%s", name,
elm_widget_style_get(obj));
elm_object_style_set(sl, buf);
snprintf(buf, sizeof(buf), "elm.swallow.media_player.%s", name);
if (!elm_layout_content_set(obj, buf, sl))
evas_object_hide(sl);
elm_object_disabled_set(sl, elm_widget_disabled_get(obj));
}
static void static void
_elm_player_smart_theme(Eo *obj, void *_pd, va_list *list) _elm_player_smart_theme(Eo *obj, void *_pd, va_list *list)
@ -135,26 +167,16 @@ _elm_player_smart_theme(Eo *obj, void *_pd, va_list *list)
Elm_Player_Smart_Data *sd = _pd; Elm_Player_Smart_Data *sd = _pd;
eo_do_super(obj, MY_CLASS, elm_wdg_theme(&int_ret)); eo_do_super(obj, MY_CLASS, elm_wdg_theme(&int_ret));
if (!int_ret) return; if (!int_ret) return;
_update_theme_button(obj, sd->forward, "forward");
#define UPDATE_THEME(Target, Name) \ _update_theme_button(obj, sd->info, "info");
if (Target) \ _update_theme_button(obj, sd->next, "next");
{ \ _update_theme_button(obj, sd->pause, "pause");
elm_object_style_set(Target, elm_widget_style_get(obj)); \ _update_theme_button(obj, sd->play, "play");
if (!elm_layout_content_set(obj, Name, Target)) \ _update_theme_button(obj, sd->prev, "prev");
evas_object_hide(Target); \ _update_theme_button(obj, sd->rewind, "rewind");
elm_object_disabled_set(Target, elm_widget_disabled_get(obj)); \ _update_theme_button(obj, sd->next, "next");
} _update_theme_button(obj, sd->stop, "stop");
_update_theme_slider(obj, sd->slider, "slider");
UPDATE_THEME(sd->forward, "media_player/forward");
UPDATE_THEME(sd->info, "media_player/info");
UPDATE_THEME(sd->next, "media_player/next");
UPDATE_THEME(sd->pause, "media_player/pause");
UPDATE_THEME(sd->play, "media_player/play");
UPDATE_THEME(sd->prev, "media_player/prev");
UPDATE_THEME(sd->rewind, "media_player/rewind");
UPDATE_THEME(sd->next, "media_player/next");
UPDATE_THEME(sd->slider, "media_player/slider");
elm_layout_sizing_eval(obj); elm_layout_sizing_eval(obj);
if (ret) *ret = EINA_TRUE; if (ret) *ret = EINA_TRUE;
@ -188,7 +210,8 @@ _update_slider(void *data,
length = elm_video_play_length_get(sd->video); length = elm_video_play_length_get(sd->video);
pos = elm_video_play_position_get(sd->video); pos = elm_video_play_position_get(sd->video);
elm_object_disabled_set(sd->slider, !seekable); elm_object_disabled_set(sd->slider,
(!seekable) | elm_widget_disabled_get(data));
elm_slider_min_max_set(sd->slider, 0, length); elm_slider_min_max_set(sd->slider, 0, length);
if ((elm_slider_value_get(sd->slider) != pos) && if ((elm_slider_value_get(sd->slider) != pos) &&
(!sd->dragging)) (!sd->dragging))
@ -242,13 +265,12 @@ _forward(void *data,
void *event_info __UNUSED__) void *event_info __UNUSED__)
{ {
double pos, length; double pos, length;
ELM_PLAYER_DATA_GET(data, sd); ELM_PLAYER_DATA_GET(data, sd);
pos = elm_video_play_position_get(sd->video);
length = elm_video_play_length_get(sd->video); length = elm_video_play_length_get(sd->video);
pos = elm_video_play_position_get(sd->video);
pos += length * 0.3; pos += 30.0;
if (pos > length) pos = length;
elm_video_play_position_set(sd->video, pos); elm_video_play_position_set(sd->video, pos);
elm_layout_signal_emit(data, "elm,button,forward", "elm"); elm_layout_signal_emit(data, "elm,button,forward", "elm");
@ -269,16 +291,6 @@ _next(void *data,
Evas_Object *obj __UNUSED__, Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__) void *event_info __UNUSED__)
{ {
double pos, length;
ELM_PLAYER_DATA_GET(data, sd);
pos = elm_video_play_position_get(sd->video);
length = elm_video_play_length_get(sd->video);
pos += length * 0.1;
elm_video_play_position_set(sd->video, pos);
elm_layout_signal_emit(data, "elm,button,next", "elm"); elm_layout_signal_emit(data, "elm,button,next", "elm");
evas_object_smart_callback_call(data, SIG_NEXT_CLICKED, NULL); evas_object_smart_callback_call(data, SIG_NEXT_CLICKED, NULL);
} }
@ -312,15 +324,6 @@ _prev(void *data,
Evas_Object *obj __UNUSED__, Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__) void *event_info __UNUSED__)
{ {
double pos, length;
ELM_PLAYER_DATA_GET(data, sd);
pos = elm_video_play_position_get(sd->video);
length = elm_video_play_length_get(sd->video);
pos -= length * 0.1;
elm_video_play_position_set(sd->video, pos);
evas_object_smart_callback_call(data, SIG_PREV_CLICKED, NULL); evas_object_smart_callback_call(data, SIG_PREV_CLICKED, NULL);
elm_layout_signal_emit(data, "elm,button,prev", "elm"); elm_layout_signal_emit(data, "elm,button,prev", "elm");
} }
@ -330,9 +333,14 @@ _rewind(void *data,
Evas_Object *obj __UNUSED__, Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__) void *event_info __UNUSED__)
{ {
double pos;
ELM_PLAYER_DATA_GET(data, sd); ELM_PLAYER_DATA_GET(data, sd);
elm_video_play_position_set(sd->video, 0); pos = elm_video_play_position_get(sd->video);
pos -= 30.0;
if (pos < 0.0) pos = 0.0;
elm_video_play_position_set(sd->video, pos);
elm_layout_signal_emit(data, "elm,button,rewind", "elm"); elm_layout_signal_emit(data, "elm,button,rewind", "elm");
evas_object_smart_callback_call(data, SIG_REWIND_CLICKED, NULL); evas_object_smart_callback_call(data, SIG_REWIND_CLICKED, NULL);
} }
@ -395,24 +403,29 @@ _player_button_add(Evas_Object *obj,
{ {
Evas_Object *ic; Evas_Object *ic;
Evas_Object *bt; Evas_Object *bt;
char buf[1024];
ic = elm_icon_add(obj); ic = elm_icon_add(obj);
elm_icon_standard_set(ic, name); snprintf(buf, sizeof(buf), "media_player/%s/%s", name,
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_widget_style_get(obj));
elm_icon_standard_set(ic, buf);
bt = elm_button_add(obj); bt = elm_button_add(obj);
elm_widget_mirrored_automatic_set(bt, EINA_FALSE); elm_widget_mirrored_automatic_set(bt, EINA_FALSE);
elm_object_part_content_set(bt, "icon", ic); elm_object_content_set(bt, ic);
evas_object_size_hint_align_set(bt, 0.0, 0.0); evas_object_show(ic);
elm_object_style_set(bt, "anchor");
snprintf(buf, sizeof(buf), "media_player/%s/%s", name,
elm_widget_style_get(obj));
elm_object_style_set(bt, buf);
evas_object_smart_callback_add(bt, "clicked", func, obj); evas_object_smart_callback_add(bt, "clicked", func, obj);
snprintf(buf, sizeof(buf), "elm.swallow.media_player.%s", name);
if (!elm_layout_content_set(obj, name, bt)) if (!elm_layout_content_set(obj, buf, bt))
{ {
elm_widget_sub_object_add(obj, bt); elm_widget_sub_object_add(obj, bt);
evas_object_hide(bt); evas_object_hide(bt);
} }
evas_object_show(bt);
return bt; return bt;
} }
@ -457,19 +470,23 @@ _elm_player_smart_content_set(Eo *obj, void *_pd, va_list *list)
Eina_Bool *ret = va_arg(*list, Eina_Bool *); Eina_Bool *ret = va_arg(*list, Eina_Bool *);
if (ret) *ret = EINA_FALSE; if (ret) *ret = EINA_FALSE;
Eina_Bool int_ret = EINA_FALSE; Eina_Bool int_ret = EINA_FALSE;
Elm_Player_Smart_Data *sd = _pd;
double pos, length; double pos, length;
Eina_Bool seekable; Eina_Bool seekable;
if (part && strcmp(part, "video")) if (part && strcmp(part, "video"))
{ {
eo_do_super(obj, MY_CLASS, elm_obj_container_content_set(part, content, &int_ret)); eo_do_super(obj, MY_CLASS,
elm_obj_container_content_set(part, content, &int_ret));
if (ret) *ret = int_ret; if (ret) *ret = int_ret;
return; return;
} }
if ((!part) || (!strcmp(part, "video"))) part = "elm.swallow.content";
Elm_Player_Smart_Data *sd = _pd; eo_do_super(obj, MY_CLASS,
elm_obj_container_content_set(part, content, &int_ret));
if (ret) *ret = int_ret;
if (!_elm_video_check(content)) return; if (!_elm_video_check(content)) return;
if (sd->video == content) goto end; if (sd->video == content) goto end;
@ -534,14 +551,14 @@ _elm_player_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
if (!elm_layout_theme_set(obj, "player", "base", elm_widget_style_get(obj))) if (!elm_layout_theme_set(obj, "player", "base", elm_widget_style_get(obj)))
CRITICAL("Failed to set layout!"); CRITICAL("Failed to set layout!");
priv->forward = _player_button_add(obj, "media_player/forward", _forward); priv->forward = _player_button_add(obj, "forward", _forward);
priv->info = _player_button_add(obj, "media_player/info", _info); priv->info = _player_button_add(obj, "info", _info);
priv->next = _player_button_add(obj, "media_player/next", _next); priv->next = _player_button_add(obj, "next", _next);
priv->pause = _player_button_add(obj, "media_player/pause", _pause); priv->pause = _player_button_add(obj, "pause", _pause);
priv->play = _player_button_add(obj, "media_player/play", _play); priv->play = _player_button_add(obj, "play", _play);
priv->prev = _player_button_add(obj, "media_player/prev", _prev); priv->prev = _player_button_add(obj, "prev", _prev);
priv->rewind = _player_button_add(obj, "media_player/rewind", _rewind); priv->rewind = _player_button_add(obj, "rewind", _rewind);
priv->stop = _player_button_add(obj, "media_player/stop", _stop); priv->stop = _player_button_add(obj, "stop", _stop);
priv->slider = elm_slider_add(obj); priv->slider = elm_slider_add(obj);
elm_slider_indicator_show_set(priv->slider, EINA_TRUE); elm_slider_indicator_show_set(priv->slider, EINA_TRUE);
@ -556,7 +573,8 @@ _elm_player_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
evas_object_size_hint_weight_set evas_object_size_hint_weight_set
(priv->slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); (priv->slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_layout_content_set(obj, "media_player/slider", priv->slider); elm_layout_content_set(obj, "elm.swallow.media_player.slider",
priv->slider);
evas_object_smart_callback_add evas_object_smart_callback_add
(priv->slider, "changed", _update_position, obj); (priv->slider, "changed", _update_position, obj);
evas_object_smart_callback_add evas_object_smart_callback_add