--- /dev/null
+/*
+ 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);
+ }
+ }
+ }
+ }
+ }
+}