raster pushed a commit to branch master.

http://git.enlightenment.org/apps/rage.git/commit/?id=06cfbb082cb66626aeef127011d04c965c1d3d5f

commit 06cfbb082cb66626aeef127011d04c965c1d3d5f
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Sun Feb 16 14:33:14 2014 +0900

    add vidual video list selector
    
    this allows you to see the video playlisty live, select items from it,
    scroll around and have full live paying previews in the list
---
 data/themes/default.edc           | 157 ++++++++++++++++++
 data/themes/images/Makefile.am    |   4 +-
 data/themes/images/win_glow.png   | Bin 0 -> 604 bytes
 data/themes/images/win_shadow.png | Bin 0 -> 501 bytes
 src/bin/Makefile.am               |   3 +-
 src/bin/controls.c                |  17 ++
 src/bin/key.c                     |   5 +
 src/bin/main.c                    |   8 +
 src/bin/win.c                     |  12 ++
 src/bin/win.h                     |   1 +
 src/bin/winlist.c                 | 334 ++++++++++++++++++++++++++++++++++++++
 src/bin/winlist.h                 |  10 ++
 src/bin/winvid.c                  |  11 ++
 src/bin/winvid.h                  |   1 +
 14 files changed, 561 insertions(+), 2 deletions(-)

diff --git a/data/themes/default.edc b/data/themes/default.edc
index f7af145..bc8d870 100644
--- a/data/themes/default.edc
+++ b/data/themes/default.edc
@@ -240,6 +240,35 @@ collections {
             }
          }
          
+         part { name: "rage.list"; type: SWALLOW;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.relative: 1.0 0.0;
+               fixed: 1 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default" 0.0;
+               align: 1.0 0.5;
+               visible: 1;
+            }
+         }
+         program {
+            signal: "list,state,visible"; source: "rage";
+            action: STATE_SET "visible" 0.0;
+            transition: DECELERATE 0.3;
+            target: "rage.list";
+         }
+         program {
+            signal: "list,state,hidden"; source: "rage";
+            action: STATE_SET "default" 0.0;
+            transition: ACCELERATE 0.5;
+            target: "rage.list";
+            after: "list_hidden";
+         }
+         program { name: "list_hidden";
+            action: SIGNAL_EMIT "list,state,hidden,finished" "rage";
+         }
+         
          part { name: "poscover"; mouse_events: 0;
             scale: 1;
             description { state: "default" 0.0;
@@ -1060,6 +1089,27 @@ collections {
             target: "posclip";
          }
          
+         part { name: "listevent"; type: RECT; repeat_events: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+               rel1.relative: 0.8 0.0;
+            }
+         }
+         part { name: "listevent2"; type: RECT; repeat_events: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+               rel2.relative: 0.2 1.0;
+            }
+         }
+         program {
+            signal: "mouse,in"; source: "listevent";
+            action: SIGNAL_EMIT "list,show" "rage";
+         }
+         program {
+            signal: "mouse,in"; source: "listevent2";
+            action: SIGNAL_EMIT "list,hide" "rage";
+         }
+         
          program {
             signal: "action,newvid"; source: "rage";
             action: SIGNAL_EMIT "mouse,move" "event";
@@ -1090,4 +1140,111 @@ collections {
          }
       }
    }
+   
+   group { name: "rage/list/item";
+      images.image: "win_shadow.png" COMP;
+      images.image: "win_glow.png" COMP;
+      
+      parts {
+         part { name: "shadow"; mouse_events: 0;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               rel1.to: "clip";
+               rel2.to: "clip";
+               image.normal: "win_shadow.png";
+               image.border: 14 14 14 14;
+               image.middle: 0;
+               rel1.offset: -7  -3;
+               rel2.offset: 6 11;
+               fill.smooth: 0;
+            }
+         }
+         part { name: "base"; type: RECT; mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 32 32 32 255;
+               rel1.to: "clip";
+               rel2.to: "clip";
+            }
+         }
+         part { name: "glow"; mouse_events: 0;
+            description { state: "default" 0.0;
+               image.normal: "win_glow.png";
+               image.border: 9 9 9 9;
+               image.middle: 0;
+               rel1.to: "clip";
+               rel1.offset: -5  -5;
+               rel2.to: "clip";
+               rel2.offset: 4 4;
+               fill.smooth: 0;
+               color: 255 255 255 0;
+               visible: 0;
+            }
+            description { state: "selected" 0.0;
+               inherit: "default" 0.0;
+               color: 255 255 255 255;
+               visible: 1;
+            }
+         }
+         program {
+            signal: "rage,state,selected"; source: "rage";
+            action: STATE_SET "selected" 0.0;
+            transition: SINUSOIDAL 0.1;
+            target: "glow";
+         }
+         program {
+            signal: "rage,state,unselected"; source: "rage";
+            action: STATE_SET "default" 0.0;
+            transition: SINUSOIDAL 0.3;
+            target: "glow";
+         }
+         
+         part { name: "clip"; type: RECT;
+            description { state: "default" 0.0;
+               rel1.offset: 4 4;
+               rel2.offset: -5 -5;
+            }
+         }
+         part { name: "rage.sizer"; type: SWALLOW;
+            description { state: "default" 0.0;
+               min: 16 16;
+               rel1.to: "clip";
+               rel2.to: "clip";
+            }
+         }
+         part { name: "rage.content"; type: SWALLOW;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               rel1.to: "clip";
+               rel2.to: "clip";
+            }
+         }
+         part { name: "rage.title"; type: TEXT; mouse_events: 0;
+            effect: GLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               align: 0.0 1.0;
+               rel1.offset: 4 4;
+               rel2.offset: -5 -5;
+               color: 255 255 255 255;
+               color2: 51 153 255 128;
+               color3: 51 153 255 20;
+               text { font: "Sans"; size: 8;
+                  align: 0.0 1.0;
+                  min: 0 1;
+               }
+            }
+         }
+         part { name: "event"; type: RECT;
+            ignore_flags: ON_HOLD;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+         }
+         program {
+            signal: "mouse,clicked,1"; source: "event";
+            action: SIGNAL_EMIT "rage,selected" "rage";
+         }
+      }
+   }
 }
diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am
index dd6357c..dfa56ff 100644
--- a/data/themes/images/Makefile.am
+++ b/data/themes/images/Makefile.am
@@ -28,4 +28,6 @@ icon_spanner2.png \
 icon_volume2.png \
 pos_indicator_big.png \
 bevel_dark_out.png \
-bg_bevel.png
+bg_bevel.png \
+win_glow.png \
+win_shadow.png
diff --git a/data/themes/images/win_glow.png b/data/themes/images/win_glow.png
new file mode 100644
index 0000000..d513f66
Binary files /dev/null and b/data/themes/images/win_glow.png differ
diff --git a/data/themes/images/win_shadow.png 
b/data/themes/images/win_shadow.png
new file mode 100644
index 0000000..98f158e
Binary files /dev/null and b/data/themes/images/win_shadow.png differ
diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index 3b3797c..06f42d8 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -17,4 +17,5 @@ key.c key.h \
 main.c main.h \
 video.c video.h \
 winvid.c winvid.h \
-win.c win.h
+win.c win.h \
+winlist.c winlist.h
diff --git a/src/bin/controls.c b/src/bin/controls.c
index 3d755a1..a9b5e6e 100644
--- a/src/bin/controls.c
+++ b/src/bin/controls.c
@@ -3,6 +3,7 @@
 #include "win.h"
 #include "video.h"
 #include "controls.h"
+#include "winlist.h"
 
 static void
 _cb_drag(void *data, Evas_Object *obj EINA_UNUSED, const char *emission 
EINA_UNUSED, const char *source EINA_UNUSED)
@@ -46,6 +47,18 @@ _cb_options(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, const char *em
 }
 
 static void
+_cb_list_show(void *data, Evas_Object *obj EINA_UNUSED, const char *emission 
EINA_UNUSED, const char *source EINA_UNUSED)
+{
+   win_list_show(data);
+}
+
+static void
+_cb_list_hide(void *data, Evas_Object *obj EINA_UNUSED, const char *emission 
EINA_UNUSED, const char *source EINA_UNUSED)
+{
+   win_list_hide(data);
+}
+
+static void
 _time_print(double t, double max, int size, char *buf, Eina_Bool subsec)
 {
    double tsf;
@@ -107,6 +120,10 @@ controls_init(Evas_Object *win, Evas_Object *lay)
                                   _cb_pos_pause, win);
    elm_layout_signal_callback_add(lay, "pos,action,options", "rage",
                                   _cb_options, win);
+   elm_layout_signal_callback_add(lay, "list,show", "rage",
+                                  _cb_list_show, win);
+   elm_layout_signal_callback_add(lay, "list,hide", "rage",
+                                  _cb_list_hide, win);
    sz = 0;
    elm_coords_finger_size_adjust(1, &sz, 1, &sz);
 
diff --git a/src/bin/key.c b/src/bin/key.c
index 352d8ae..6f38702 100644
--- a/src/bin/key.c
+++ b/src/bin/key.c
@@ -3,6 +3,7 @@
 #include "win.h"
 #include "video.h"
 #include "key.h"
+#include "winlist.h"
 
 void
 key_handle(Evas_Object *win, Evas_Event_Key_Down *ev)
@@ -164,6 +165,10 @@ key_handle(Evas_Object *win, Evas_Event_Key_Down *ev)
         video_ratio_size_get(inf->vid, &w, &h);
         if ((w > 1) && (h > 1)) evas_object_resize(win, w, h);
      }
+   else if (!strcmp(ev->keyname, "backslash"))
+     {
+        win_list_toggle(win);
+     }
    else if (!strcmp(ev->keyname, "y"))
      {
         video_lowquality_set(inf->vid, !video_lowquality_get(inf->vid));
diff --git a/src/bin/main.c b/src/bin/main.c
index aa2c1fb..2a304b5 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -2,6 +2,7 @@
 #include "main.h"
 #include "win.h"
 #include "winvid.h"
+#include "winlist.h"
 
 static Eina_Bool
 _cb_show_timeout(void *data)
@@ -14,6 +15,12 @@ _cb_show_timeout(void *data)
    return EINA_FALSE;
 }
 
+static void
+_cb_resize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void 
*event_info EINA_UNUSED)
+{
+   win_list_size_update(obj);
+}
+
 EAPI_MAIN int
 elm_main(int argc, char **argv)
 {
@@ -44,6 +51,7 @@ elm_main(int argc, char **argv)
    elm_theme_overlay_add(NULL, buf);
 
    win = win_add();
+   evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _cb_resize, NULL);
    evas_object_resize(win, 320, 200);
    
    win_video_init(win);
diff --git a/src/bin/win.c b/src/bin/win.c
index 58e666e..3cbea67 100644
--- a/src/bin/win.c
+++ b/src/bin/win.c
@@ -2,6 +2,7 @@
 #include "main.h"
 #include "win.h"
 #include "winvid.h"
+#include "winlist.h"
 #include "video.h"
 #include "dnd.h"
 #include "key.h"
@@ -143,6 +144,13 @@ _restart_vid(Evas_Object *win, Evas_Object *lay, 
Evas_Object *vid, const char *f
 }
 
 void
+win_video_restart(Evas_Object *win)
+{
+   Inf *inf = evas_object_data_get(win, "inf");
+   _restart_vid(win, inf->lay, inf->vid, inf->file_cur->data);
+}
+
+void
 win_video_next(Evas_Object *win)
 {
    Inf *inf = evas_object_data_get(win, "inf");
@@ -158,6 +166,7 @@ win_video_next(Evas_Object *win)
      }
    inf->file_cur = l;
    _restart_vid(win, inf->lay, inf->vid, l->data);
+   win_list_sel_update(win);
 }
 
 void
@@ -172,6 +181,7 @@ win_video_prev(Evas_Object *win)
    if (!l) return;
    inf->file_cur = l;
    _restart_vid(win, inf->lay, inf->vid, l->data);
+   win_list_sel_update(win);
 }
 
 void
@@ -184,6 +194,7 @@ win_video_first(Evas_Object *win)
    l = inf->file_list;
    inf->file_cur = l;
    _restart_vid(win, inf->lay, inf->vid, l->data);
+   win_list_sel_update(win);
 }
 
 void
@@ -197,6 +208,7 @@ win_video_last(Evas_Object *win)
    if (!l) return;
    inf->file_cur = l;
    _restart_vid(win, inf->lay, inf->vid, l->data);
+   win_list_sel_update(win);
 }
 
 Eina_Bool
diff --git a/src/bin/win.h b/src/bin/win.h
index bfc821b..3a5edc3 100644
--- a/src/bin/win.h
+++ b/src/bin/win.h
@@ -31,6 +31,7 @@ void win_do_prev(Evas_Object *win);
 void win_do_next(Evas_Object *win);
 
 // lower level controls
+void win_video_restart(Evas_Object *win);
 void win_video_next(Evas_Object *win);
 void win_video_prev(Evas_Object *win);
 void win_video_first(Evas_Object *win);
diff --git a/src/bin/winlist.c b/src/bin/winlist.c
new file mode 100644
index 0000000..39f41b4
--- /dev/null
+++ b/src/bin/winlist.c
@@ -0,0 +1,334 @@
+#include <Elementary.h>
+#include "main.h"
+#include "win.h"
+#include "winvid.h"
+#include "winlist.h"
+#include "video.h"
+
+static Evas_Object *tb = NULL;
+static Evas_Object *mb, *sc, *rc, *bx;
+static Ecore_Timer *bring_timer = NULL;
+
+static void
+_ready(Evas_Object *obj)
+{
+   int w = 1, h = 1;
+   
+   if (evas_object_data_get(obj, "ready")) return;
+   evas_object_data_set(obj, "ready", obj);
+   video_position_set(obj, video_length_get(obj) / 2.0);
+   video_ratio_size_get(obj, &w, &h);
+   evas_object_size_hint_aspect_set(obj, EVAS_ASPECT_CONTROL_NEITHER, w, h);
+}
+
+static void
+_bring(Evas_Object *obj)
+{
+   Evas_Coord x, y, w, h, px, py;
+   
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   evas_object_geometry_get(bx, &px, &py, NULL, NULL);
+   elm_scroller_region_bring_in(sc, x - px, y - py, w, h);
+}
+
+static Eina_Bool
+_cb_bring_in(void *data)
+{
+   _bring(data);
+   bring_timer = NULL;
+   return EINA_FALSE;
+}
+
+static void
+_cb_opened(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
+{
+   _ready(obj);
+}
+
+static void
+_cb_length(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
+{
+   _ready(obj);
+}
+
+static Eina_Bool
+_cb_pos_eval(void *data)
+{
+   Evas_Object *obj = data;
+   Evas_Coord x, y, w, h, vx, vy, vw, vh;
+   
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   evas_output_viewport_get(evas_object_evas_get(obj), &vx, &vy, &vw, &vh);
+   if (ELM_RECTS_INTERSECT(x, y, w, h, vx, vy, vw, vh))
+     {
+        if (!evas_object_data_get(obj, "active"))
+          {
+             const char *f;
+             
+             f = evas_object_data_get(obj, "file");
+             video_play_set(obj, EINA_TRUE);
+             video_loop_set(obj, EINA_TRUE);
+             video_file_set(obj, f);
+             evas_object_data_set(obj, "active", obj);
+          }
+     }
+   else
+     {
+        if (evas_object_data_get(obj, "active"))
+          {
+             video_play_set(obj, EINA_FALSE);
+             video_file_set(obj, NULL);
+             video_position_set(obj, 0.0);
+             evas_object_data_del(obj, "active");
+             evas_object_data_del(obj, "ready");
+          }
+     }
+   evas_object_data_del(obj, "timer");
+   return EINA_FALSE;
+}
+
+static void
+_cb_vid_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, 
void *event_info EINA_UNUSED)
+{
+   Ecore_Timer *tim = evas_object_data_get(obj, "timer");
+   if (tim) ecore_timer_del(tim);
+   tim = ecore_timer_add(0.1, _cb_pos_eval, obj);
+   evas_object_data_set(obj, "timer", tim);
+}
+
+static void
+_cb_vid_resize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, 
void *event_info EINA_UNUSED)
+{
+   Ecore_Timer *tim = evas_object_data_get(obj, "timer");
+   if (tim) ecore_timer_del(tim);
+   tim = ecore_timer_add(0.1, _cb_pos_eval, obj);
+   evas_object_data_set(obj, "timer", tim);
+}
+
+static void
+_cb_vid_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, 
void *event_info EINA_UNUSED)
+{
+   Ecore_Timer *tim = evas_object_data_get(obj, "timer");
+   if (tim) ecore_timer_del(tim);
+   evas_object_data_del(obj, "timer");
+   if (bring_timer)
+     {
+        ecore_timer_del(bring_timer);
+        bring_timer = NULL;
+     }
+}
+
+static void
+_sel(Evas_Object *obj)
+{
+   Eina_List *items = elm_box_children_get(bx);
+   Eina_List *l;
+   Evas_Object *o;
+   
+   EINA_LIST_FOREACH(items, l, o)
+     {
+        if (evas_object_data_get(o, "selected"))
+          {
+             evas_object_data_del(o, "selected");
+             elm_layout_signal_emit(o, "rage,state,unselected", "rage");
+          }
+     }
+   elm_layout_signal_emit(obj, "rage,state,selected", "rage");
+   evas_object_data_set(obj, "selected", obj);
+}
+
+static void
+_cb_selected(void *data, Evas_Object *obj, const char *sig EINA_UNUSED, const 
char *src EINA_UNUSED)
+{
+   if (evas_object_data_get(obj, "selected")) return;
+   _sel(obj);
+   win_video_goto(data, evas_object_data_get(obj, "list"));
+}
+
+static void
+_fill_box(Evas_Object *win)
+{
+   Inf *inf = evas_object_data_get(win, "inf");
+   Eina_List *l;
+   const char *f, *s;
+   Evas_Object *o, *base, *rect;
+   char buf[4096];
+   Evas_Coord w, h, sz = 0;
+   
+   elm_coords_finger_size_adjust(1, &sz, 1, &sz);
+   evas_object_geometry_get(win, NULL, NULL, &w, &h);
+   w = w / 8;
+   h = h / 8;
+   if (w < sz) w = sz;
+   if (h < sz) h = sz;
+   EINA_LIST_FOREACH(inf->file_list, l, f)
+     {
+        base = o = elm_layout_add(win);
+        elm_object_focus_allow_set(o, EINA_FALSE);
+        snprintf(buf, sizeof(buf), "%s/themes/default.edj", 
elm_app_data_dir_get());
+        elm_layout_file_set(o, buf, "rage/list/item");
+        evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+        evas_object_size_hint_align_set(o, -1.0, 0.5);
+        elm_layout_signal_callback_add(o, "rage,selected", "rage", 
_cb_selected, win);
+        evas_object_data_set(o, "list", l);
+        
+        s = ecore_file_file_get(f);
+        if ((s) && (s[0] != 0))
+          elm_object_part_text_set(o, "rage.title", s);
+        else
+          elm_object_part_text_set(o, "rage.title", f);
+        
+        rect = o = evas_object_rectangle_add(evas_object_evas_get(win));
+        evas_object_color_set(rect, 0, 0, 0, 0);
+        elm_object_part_content_set(base, "rage.sizer", o);
+        evas_object_data_set(base, "sizer", o);
+        evas_object_size_hint_min_set(o, w, h);
+        
+        o = video_add(win);
+        evas_object_data_set(o, "base", base);
+        evas_object_data_set(base, "video", o);
+        video_mute_set(o, EINA_TRUE);
+        video_fill_set(o, EINA_TRUE);
+        video_lowquality_set(o, EINA_TRUE);
+        evas_object_smart_callback_add(o, "opened", _cb_opened, win);
+        evas_object_smart_callback_add(o, "length", _cb_length, win);
+        
+        evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _cb_vid_move, 
win);
+        evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, 
_cb_vid_resize, win);
+        evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _cb_vid_del, win);
+        
+        evas_object_data_set(o, "file", f);
+        elm_object_part_content_set(base, "rage.content", o);
+        evas_object_show(o);
+        
+        elm_box_pack_end(bx, base);
+        evas_object_show(base);
+        
+        if (l == inf->file_cur)
+          {
+             evas_object_data_set(base, "selected", base);
+             elm_layout_signal_emit(base, "rage,state,selected", "rage");
+             if (bring_timer) ecore_timer_del(bring_timer);
+             bring_timer = ecore_timer_add(0.3, _cb_bring_in, base);
+          }
+     }
+}
+
+void
+win_list_show(Evas_Object *win)
+{
+   Inf *inf = evas_object_data_get(win, "inf");
+ 
+   if (tb) return;
+   tb = elm_table_add(win);
+   evas_object_show(tb);
+
+   rc = evas_object_rectangle_add(evas_object_evas_get(win));
+   evas_object_size_hint_weight_set(rc, 1.0, 1.0);
+   evas_object_color_set(rc, 0, 0, 0, 0);
+   elm_table_pack(tb, rc, 0, 0, 1, 1);
+
+   mb = elm_mapbuf_add(win);
+   elm_object_focus_allow_set(mb, EINA_FALSE);
+   evas_object_size_hint_weight_set(mb, 1.0, 1.0);
+   evas_object_size_hint_align_set(mb, -1.0, -1.0);
+   elm_mapbuf_alpha_set(mb, EINA_TRUE);
+//   elm_mapbuf_enabled_set(mb, EINA_TRUE);
+   elm_table_pack(tb, mb, 0, 0, 1, 1);
+   evas_object_show(mb);
+   
+   sc = elm_scroller_add(win);
+   elm_object_focus_allow_set(sc, EINA_FALSE);
+   evas_object_size_hint_weight_set(sc, 1.0, 1.0);
+   evas_object_size_hint_align_set(sc, -1.0, -1.0);
+   elm_scroller_content_min_limit(sc, EINA_TRUE, EINA_FALSE);
+   elm_object_content_set(mb, sc);
+   evas_object_show(sc);
+   
+   bx = elm_box_add(win);
+   elm_object_focus_allow_set(bx, EINA_FALSE);
+   evas_object_size_hint_weight_set(bx, 1.0, 0.0);
+   evas_object_size_hint_align_set(bx, -1.0, 0.0);
+   elm_box_homogeneous_set(bx, EINA_TRUE);
+   
+   _fill_box(win);
+   
+   elm_object_content_set(sc, bx);
+   evas_object_show(bx);
+   
+   elm_object_part_content_set(inf->lay, "rage.list", tb);
+   
+   elm_layout_signal_emit(inf->lay, "list,state,visible", "rage");
+}
+
+static void
+_cb_hidden(void *data EINA_UNUSED, Evas_Object *obj, const char *sig 
EINA_UNUSED, const char *src EINA_UNUSED)
+{
+   elm_layout_signal_callback_del(obj, "list,state,hidden,finished", "rage",
+                                  _cb_hidden);
+   evas_object_del(tb);
+   tb = NULL;
+}
+
+void
+win_list_hide(Evas_Object *win)
+{
+   Inf *inf = evas_object_data_get(win, "inf");
+ 
+   if (!tb) return;
+   if (bring_timer) ecore_timer_del(bring_timer);
+   bring_timer = NULL;
+   elm_layout_signal_callback_add(inf->lay, "list,state,hidden,finished", 
"rage",
+                                  _cb_hidden, win);
+   elm_layout_signal_emit(inf->lay, "list,state,hidden", "rage");
+}
+
+void
+win_list_toggle(Evas_Object *win)
+{
+   if (tb) win_list_hide(win);
+   else win_list_show(win);
+}
+
+void
+win_list_sel_update(Evas_Object *win)
+{
+   if (!tb) return;
+   Inf *inf = evas_object_data_get(win, "inf");
+   Eina_List *items = elm_box_children_get(bx);
+   Eina_List *l;
+   Evas_Object *o;
+   
+   EINA_LIST_FOREACH(items, l, o)
+     {
+        if (inf->file_cur == evas_object_data_get(o, "list"))
+          {
+             if (evas_object_data_get(o, "selected")) return;
+             _sel(o);
+             _bring(o);
+             return;
+          }
+     }
+}
+
+void
+win_list_size_update(Evas_Object *win)
+{
+   if (!tb) return;
+   Eina_List *items = elm_box_children_get(bx);
+   Eina_List *l;
+   Evas_Object *o;
+   Evas_Coord w, h, sz = 0;
+   
+   elm_coords_finger_size_adjust(1, &sz, 1, &sz);
+   evas_object_geometry_get(win, NULL, NULL, &w, &h);
+   w = w / 8;
+   h = h / 8;
+   if (w < sz) w = sz;
+   if (h < sz) h = sz;
+   EINA_LIST_FOREACH(items, l, o)
+     {
+        Evas_Object *sizer = evas_object_data_get(o, "sizer");
+        evas_object_size_hint_min_set(sizer, w, h);
+     }
+}
diff --git a/src/bin/winlist.h b/src/bin/winlist.h
new file mode 100644
index 0000000..c06c92a
--- /dev/null
+++ b/src/bin/winlist.h
@@ -0,0 +1,10 @@
+#ifndef _WINLIST_H__
+#define _WINLIST_H__ 1
+
+void win_list_show(Evas_Object *win);
+void win_list_hide(Evas_Object *win);
+void win_list_toggle(Evas_Object *win);
+void win_list_sel_update(Evas_Object *win);
+void win_list_size_update(Evas_Object *win);
+
+#endif
diff --git a/src/bin/winvid.c b/src/bin/winvid.c
index ca18919..4f55e61 100644
--- a/src/bin/winvid.c
+++ b/src/bin/winvid.c
@@ -2,6 +2,7 @@
 #include "main.h"
 #include "win.h"
 #include "video.h"
+#include "winlist.h"
 #include "winvid.h"
 
 static void
@@ -159,3 +160,13 @@ win_video_insert(Evas_Object *win, const char *file)
      (inf->file_list, eina_stringshare_add(file), inf->file_cur);
    evas_object_data_set(win, "file_list", inf->file_list);
 }
+
+void
+win_video_goto(Evas_Object *win, Eina_List *l)
+{
+   Inf *inf = evas_object_data_get(win, "inf");
+
+   inf->file_cur = l;
+   win_video_restart(win);
+   win_list_sel_update(win);
+}
diff --git a/src/bin/winvid.h b/src/bin/winvid.h
index d204316..0c50aba 100644
--- a/src/bin/winvid.h
+++ b/src/bin/winvid.h
@@ -4,5 +4,6 @@
 void win_video_init(Evas_Object *win);
 void win_video_file_list_set(Evas_Object *win, Eina_List *list);
 void win_video_insert(Evas_Object *win, const char *file);
+void win_video_goto(Evas_Object *win, Eina_List *l);
 
 #endif

-- 


Reply via email to