forked from enlightenment/efl
240 lines
7.6 KiB
Plaintext
240 lines
7.6 KiB
Plaintext
/*
|
|
Super-concise video player example using Edje/Emotion/Elementary.
|
|
|
|
This is all in Edje by means of type:EXTERNAL, you don't need any C
|
|
code other than emotion and edje installed with edje_external
|
|
support enabled.
|
|
|
|
Compile: edje_cc external-emotion-elm.edc
|
|
Run....: edje_player external-emotion-elm.edj
|
|
|
|
*/
|
|
collections {
|
|
group { name: "main";
|
|
min: 350 200; /* set a min window size */
|
|
|
|
externals { /* declare the modules you want to load */
|
|
external: "emotion"; /* video player engine */
|
|
external: "elm"; /* toolkit/widgets */
|
|
}
|
|
|
|
parts {
|
|
part { name: "bg"; /* dark gray rectangle as background */
|
|
type: RECT;
|
|
description { state: "default" 0.0;
|
|
color: 64 64 64 255;
|
|
}
|
|
}
|
|
|
|
part { name: "video"; /* video object */
|
|
type: EXTERNAL;
|
|
source: "emotion";
|
|
description { state: "default" 0.0;
|
|
params {
|
|
/* explicitly select the emotion engine
|
|
* ['xine', 'gstreamer' or 'vlc']
|
|
* or comment the line to autoselect the engine */
|
|
// choice: "engine" "gstreamer";
|
|
}
|
|
}
|
|
}
|
|
|
|
part { name: "title";
|
|
type: TEXT;
|
|
effect: SOFT_SHADOW;
|
|
description { state: "default" 0.0;
|
|
color: 255 255 255 0;
|
|
color3: 0 0 0 0;
|
|
align: 0.5 0.0;
|
|
rel1 {
|
|
relative: 0.0 0.0;
|
|
offset: 10 2;
|
|
}
|
|
rel2 {
|
|
relative: 1.0 0.0;
|
|
offset: -11 10;
|
|
}
|
|
text {
|
|
font: "Sans:style=Bold";
|
|
align: 0.5 0.0;
|
|
size: 10;
|
|
min: 0 1;
|
|
text: "";
|
|
}
|
|
}
|
|
description { state: "visible" 0.0;
|
|
inherit: "default" 0.0;
|
|
color: 255 255 255 255;
|
|
color3: 0 0 0 255;
|
|
}
|
|
}
|
|
|
|
part { name: "controls-clipper"; /* clipper to control visibility */
|
|
type: RECT;
|
|
description { state: "default" 0.0;
|
|
color: 255 255 255 32;
|
|
}
|
|
description { state: "visible" 0.0;
|
|
color: 255 255 255 255;
|
|
}
|
|
}
|
|
|
|
part { name: "controls-bg"; /* controls background as
|
|
semi-transparent black at bottom edge */
|
|
type: RECT;
|
|
clip_to: "controls-clipper";
|
|
description { state: "default" 0.0;
|
|
color: 0 0 0 128;
|
|
rel1 {
|
|
relative: 0.0 1.0;
|
|
offset: 0 -40;
|
|
}
|
|
rel2 {
|
|
relative: 1.0 1.0;
|
|
offset: -1 -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
part { name: "play"; /* play button at bottom-left (relative
|
|
to controls-bg) */
|
|
type: EXTERNAL;
|
|
source: "elm/button";
|
|
clip_to: "controls-clipper";
|
|
description { state: "default" 0.0;
|
|
rel1 {
|
|
relative: 0.0 0.0;
|
|
offset: 0 0;
|
|
to: "controls-bg";
|
|
}
|
|
rel2 {
|
|
relative: 0.0 1.0;
|
|
offset: 50 -1;
|
|
to: "controls-bg";
|
|
}
|
|
params.string: "icon" "apps";
|
|
}
|
|
}
|
|
|
|
part { name: "open"; /* open file button next to play button */
|
|
type: EXTERNAL;
|
|
source: "elm/fileselector_button";
|
|
clip_to: "controls-clipper";
|
|
description { state: "default" 0.0;
|
|
rel1 {
|
|
relative: 0.0 0.0;
|
|
offset: 52 0;
|
|
to: "controls-bg";
|
|
}
|
|
rel2 {
|
|
relative: 0.0 1.0;
|
|
offset: 102 -1;
|
|
to: "controls-bg";
|
|
}
|
|
params.string: "icon" "folder";
|
|
}
|
|
}
|
|
|
|
part { name: "time"; /* time/progress */
|
|
type: EXTERNAL;
|
|
source: "elm/slider";
|
|
clip_to: "controls-clipper";
|
|
description { state: "default" 0.0;
|
|
rel1 {
|
|
relative: 0.0 0.0;
|
|
offset: 104 0;
|
|
to: "controls-bg";
|
|
}
|
|
rel2 {
|
|
relative: 1.0 1.0;
|
|
offset: -1 -1;
|
|
to: "controls-bg";
|
|
}
|
|
}
|
|
}
|
|
|
|
part { name: "controls-eventarea"; /* event area so we catch mouse in
|
|
and out, repeat events so
|
|
buttons get them */
|
|
type: RECT;
|
|
repeat_events: 1;
|
|
description {
|
|
state: "default" 0.0;
|
|
color: 255 255 255 0; /* fully transparent as we don't
|
|
need any visual feedback */
|
|
rel1.to: "controls-bg";
|
|
rel2.to: "controls-bg";
|
|
}
|
|
}
|
|
|
|
programs {
|
|
/* animated 0.2 linear fade in/out if mouse is over controls */
|
|
program { signal: "mouse,in";
|
|
source: "controls-eventarea";
|
|
action: STATE_SET "visible" 0.0;
|
|
transition: LINEAR 0.2;
|
|
target: "controls-clipper";
|
|
target: "title";
|
|
}
|
|
program { signal: "mouse,out";
|
|
source: "controls-eventarea";
|
|
action: STATE_SET "default" 0.0;
|
|
transition: LINEAR 0.2;
|
|
target: "controls-clipper";
|
|
target: "title";
|
|
}
|
|
|
|
/* toggle video playing state when play is clicked */
|
|
program { name: "toggle-play-video";
|
|
signal: "clicked";
|
|
source: "play";
|
|
script {
|
|
new v = external_param_get_bool(PART:"video", "play");
|
|
external_param_set_bool(PART:"video", "play", !v);
|
|
}
|
|
}
|
|
|
|
/* whenever file is chosen, set and play it */
|
|
program { signal: "file,chosen";
|
|
source: "open";
|
|
action: PARAM_COPY "open" "path" "video" "file";
|
|
after: "play-video";
|
|
after: "set-title";
|
|
}
|
|
program { name: "play-video";
|
|
action: PARAM_SET "video" "play" "1";
|
|
}
|
|
program { name: "set-title";
|
|
action: PARAM_COPY "open" "path" "title" "text";
|
|
}
|
|
|
|
/* if position changes, set slider (time) */
|
|
program { signal: "position_update";
|
|
source: "video";
|
|
script {
|
|
new Float:p, Float:len;
|
|
|
|
p = external_param_get_float(PART:"video", "position");
|
|
len = external_param_get_float(PART:"video", "play_length");
|
|
if (len > 0.0)
|
|
external_param_set_float(PART:"time", "value", p / len);
|
|
}
|
|
}
|
|
|
|
/* if slider (time) changes, set the position (seek) */
|
|
program { signal: "changed";
|
|
source: "time";
|
|
script {
|
|
new Float:v, Float:len;
|
|
|
|
v = external_param_get_float(PART:"time", "value");
|
|
len = external_param_get_float(PART:"video", "play_length");
|
|
if (len > 0.0)
|
|
external_param_set_float(PART:"video", "position", v * len);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|