Multimedia controls for terminology. When a video is playing on the bg you will have controls to play/pause/stop and change volume.

SVN revision: 72761
This commit is contained in:
Davide Andreoli 2012-06-24 09:49:23 +00:00
parent 23e9852efa
commit 604b3b78f1
11 changed files with 251 additions and 8 deletions

View File

@ -544,7 +544,157 @@ collections {
}
}
}
//////////////////////////////////////////////////////////////////////////////
//// the multimedia controls
group { name: "terminology/mediactrl";
images {
image: "media_bg.png" COMP;
image: "media_play.png" COMP;
image: "media_stop.png" COMP;
image: "media_pause.png" COMP;
image: "media_line.png" COMP;
}
parts {
part { name: "media_clip"; type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "media_bg";
rel2.to: "media_bg";
}
}
part { name: "media_bg";
clip_to: "media_clip";
description { state: "default" 0.0;
image.normal: "media_bg.png";
image.border: 11 11 11 11;
max: 24 24;
align: 0.0 1.0;
}
description { state: "expanded" 0.0;
inherit: "default" 0.0;
min: 200 24;
max: 200 24;
}
}
part { name: "play";
mouse_events: 1;
repeat_events: 1;
clip_to: "media_clip";
description { state: "default" 0.0;
image.normal: "media_pause.png";
max: 24 24;
align: 0.0 1.0;
}
description { state: "paused" 0.0;
inherit: "default" 0.0;
image.normal: "media_play.png";
}
}
part { name: "stop";
mouse_events: 1;
repeat_events: 1;
clip_to: "media_clip";
description { state: "default" 0.0;
image.normal: "media_stop.png";
max: 24 24;
rel1.to: "play";
rel2.to: "play";
rel1.offset: 16 0;
rel2.offset: 16 0;
}
}
part { name: "volline";
mouse_events: 0;
repeat_events: 1;
clip_to: "media_clip";
description { state: "default" 0.0;
image.normal: "media_line.png";
min: 150 10;
max: 150 10;
rel1.to: "stop";
rel2.to: "stop";
rel1.offset: 25 0;
rel2.offset: 150 0;
}
}
part { name: "terminology.voldrag"; type: RECT;
mouse_events: 1;
repeat_events: 1;
clip_to: "media_clip";
dragable {
confine: "volline";
x: 1 1 0;
y: 0 0 0;
}
description { state: "default" 0.0;
color: 255 0 0 150;
min: 10 10;
max: 10 10;
}
description { state: "muted" 0.0;
visible: 0;
}
}
programs {
program { name: "media_mouse_in";
signal: "mouse,in";
source: "media_bg";
action: STATE_SET "expanded" 0.0;
transition: SINUSOIDAL 0.4 CURRENT;
target: "media_bg";
}
program { name: "media_mouse_out";
signal: "mouse,out";
source: "media_bg";
action: STATE_SET "default" 0.0;
transition: SINUSOIDAL 0.4 CURRENT;
target: "media_bg";
}
program { name: "media_pause_click";
signal: "mouse,up,*";
source: "play";
filter: "play" "default";
action: SIGNAL_EMIT "pause" "";
}
program { name: "media_play_click";
signal: "mouse,up,1";
source: "play";
filter: "play" "paused";
action: SIGNAL_EMIT "play" "";
}
program { name: "media_stop_click";
signal: "mouse,up,1";
source: "stop";
action: SIGNAL_EMIT "stop" "";
}
program { name: "media_signal_pause";
signal: "pause,set";
source: "terminology";
action: STATE_SET "paused" 0.0;
target: "play";
}
program { name: "media_signal_play";
signal: "play,set";
source: "terminology";
action: STATE_SET "default" 0.0;
target: "play";
}
program { name: "media_signal_mute";
signal: "mute,set";
source: "terminology";
action: STATE_SET "muted" 0.0;
target: "terminology.voldrag";
}
program { name: "media_signal_unmute";
signal: "mute,unset";
source: "terminology";
action: STATE_SET "default" 0.0;
target: "terminology.voldrag";
}
}
}
}
//////////////////////////////////////////////////////////////////////////////
//// used in the font selection dialog to give a base for black text
//// previews so they are always visible

View File

@ -11,4 +11,9 @@ cr_fill.png \
cr_key.png \
cr_out.png \
cr_pulse.png \
fn_shadow.png
fn_shadow.png \
media_bg.png \
media_line.png \
media_pause.png \
media_play.png \
media_stop.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Binary file not shown.

View File

@ -11,7 +11,7 @@ typedef struct _Media Media;
struct _Media
{
Evas_Object_Smart_Clipped_Data __clipped_data;
Evas_Object *clip, *o_img, *o_tmp;
Evas_Object *clip, *o_img, *o_tmp, *o_ctrl;
Ecore_Timer *anim;
Ecore_Job *restart_job;
const char *src;
@ -363,10 +363,40 @@ _cb_mov_ref(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
emotion_object_ref_num_get(sd->o_img));
}
static void
_cb_media_play(void *data, Evas_Object *obj, const char *emission, const char *source)
{
media_play_set(data, EINA_TRUE);
}
static void
_cb_media_pause(void *data, Evas_Object *obj, const char *emission, const char *source)
{
media_play_set(data, EINA_FALSE);
}
static void
_cb_media_stop(void *data, Evas_Object *obj, const char *emission, const char *source)
{
media_play_set(data, EINA_FALSE);
media_position_set(data, 0.0);
}
static void
_cb_media_vol(void *data, Evas_Object *obj, const char *emission, const char *source)
{
double vx, vy;
Media *sd = evas_object_smart_data_get(data);
if (!sd) return;
edje_object_part_drag_value_get(sd->o_ctrl, "terminology.voldrag", &vx, &vy);
media_volume_set(data, vx + vy);
}
static void
_type_mov_init(Evas_Object *obj)
{
Evas_Object *o;
double vol;
char *modules[] =
{
NULL,
@ -406,9 +436,26 @@ _type_mov_init(Evas_Object *obj)
emotion_object_file_set(o, sd->src);
evas_object_smart_member_add(o, obj);
evas_object_clip_set(o, sd->clip);
emotion_object_position_set(o, 0.0);
emotion_object_play_set(o, EINA_TRUE);
if (sd->config->mute) emotion_object_audio_mute_set(o, EINA_TRUE);
o = sd->o_ctrl = edje_object_add(evas_object_evas_get(obj));
theme_apply(o, sd->config, "terminology/mediactrl");
vol = emotion_object_audio_volume_get(sd->o_img);
edje_object_part_drag_value_set(o, "terminology.voldrag", vol, vol);
edje_object_signal_callback_add(o, "play", "", _cb_media_play, obj);
edje_object_signal_callback_add(o, "pause", "", _cb_media_pause, obj);
edje_object_signal_callback_add(o, "stop", "", _cb_media_stop, obj);
edje_object_signal_callback_add(o, "drag", "terminology.voldrag", _cb_media_vol, obj);
/* TODO where to stack the object in the ui? controls cannot be part of
* the 'media smart obj' becouse controls need to be on top of the term obj.
*
* I think we need to swallow inside the bg object. but how to
* retrive the edje bg object from here?
* */
evas_object_show(o);
media_position_set(obj, 0.0);
media_play_set(obj, EINA_TRUE);
if (sd->config->mute) media_mute_set(obj, EINA_TRUE);
}
static void
@ -416,6 +463,10 @@ _type_mov_calc(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_
{
Media *sd = evas_object_smart_data_get(obj);
if (!sd) return;
evas_object_move(sd->o_ctrl, x, y);
evas_object_resize(sd->o_ctrl, w, h);
emotion_object_size_get(sd->o_img, &(sd->iw), &(sd->ih));
if ((w <= 0) || (h <= 0) || (sd->iw <= 0) || (sd->ih <= 0))
{
@ -481,6 +532,7 @@ _smart_del(Evas_Object *obj)
if (sd->clip) evas_object_del(sd->clip);
if (sd->o_img) evas_object_del(sd->o_img);
if (sd->o_tmp) evas_object_del(sd->o_tmp);
if (sd->o_ctrl) evas_object_del(sd->o_ctrl);
if (sd->anim) ecore_timer_del(sd->anim);
if (sd->restart_job) ecore_job_del(sd->restart_job);
_meida_sc.del(obj);
@ -586,7 +638,40 @@ void
media_mute_set(Evas_Object *obj, Eina_Bool mute)
{
Media *sd = evas_object_smart_data_get(obj);
if (!sd) return;
if (sd->type != TYPE_MOV) return;
if ((!sd) || (sd->type != TYPE_MOV)) return;
emotion_object_audio_mute_set(sd->o_img, mute);
if (mute)
edje_object_signal_emit(sd->o_ctrl, "mute,set", "terminology");
else
edje_object_signal_emit(sd->o_ctrl, "mute,unset", "terminology");
}
void
media_play_set(Evas_Object *obj, Eina_Bool play)
{
Media *sd = evas_object_smart_data_get(obj);
if ((!sd) || (sd->type != TYPE_MOV)) return;
emotion_object_play_set(sd->o_img, play);
if (play)
edje_object_signal_emit(sd->o_ctrl, "play,set", "terminology");
else
edje_object_signal_emit(sd->o_ctrl, "pause,set", "terminology");
}
void
media_position_set(Evas_Object *obj, double pos)
{
Media *sd = evas_object_smart_data_get(obj);
if ((!sd) || (sd->type != TYPE_MOV)) return;
emotion_object_position_set(sd->o_img, pos);
edje_object_part_drag_value_set(sd->o_ctrl, "terminology.posdrag", pos, pos);
}
void
media_volume_set(Evas_Object *obj, double vol)
{
Media *sd = evas_object_smart_data_get(obj);
if ((!sd) || (sd->type != TYPE_MOV)) return;
emotion_object_audio_volume_set(sd->o_img, vol);
edje_object_part_drag_value_set(sd->o_ctrl, "terminology.voldrag", vol, vol);
}

View File

@ -12,5 +12,8 @@
Evas_Object *media_add(Evas_Object *parent, const char *src, const Config *config, int mode, int *type);
void media_mute_set(Evas_Object *obj, Eina_Bool mute);
void media_play_set(Evas_Object *obj, Eina_Bool play);
void media_position_set(Evas_Object *obj, double pos);
void media_volume_set(Evas_Object *obj, double vol);
#endif