devilhorns pushed a commit to branch master.

http://git.enlightenment.org/apps/express.git/commit/?id=4f746c9c85e39015f8cfe8882e7aad944fe8e02f

commit 4f746c9c85e39015f8cfe8882e7aad944fe8e02f
Author: Chris Michael <cp.mich...@samsung.com>
Date:   Wed Aug 12 15:59:42 2015 -0400

    express: Add support for popup media in a channel
    
    Signed-off-by: Chris Michael <cp.mich...@samsung.com>
---
 src/bin/channel.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 129 insertions(+)

diff --git a/src/bin/channel.c b/src/bin/channel.c
index 6668aa8..7be2383 100644
--- a/src/bin/channel.c
+++ b/src/bin/channel.c
@@ -6,6 +6,8 @@
 #include "grid.h"
 #include "utils.h"
 #include "commands.h"
+#include "dbus.h"
+#include "media.h"
 
 struct _Channel
 {
@@ -23,6 +25,7 @@ struct _Channel
    Evas_Object *o_tabregion_base;
    Evas_Object *o_img;
    Evas_Object *o_entry;
+   Evas_Object *o_popmedia;
 
    struct
      {
@@ -59,16 +62,125 @@ struct _Channel
    int min_w, min_h;
    int req_w, req_h;
 
+   Eina_List *popmedia_queue;
+
    Eina_Bool active : 1;
    Eina_Bool size_done : 1;
    Eina_Bool translucent : 1;
    Eina_Bool focused : 1;
    Eina_Bool unswallowed : 1;
    Eina_Bool missed : 1;
+   Eina_Bool popmedia_deleted : 1;
 
    Express_Network *net;
 };
 
+static void _channel_popmedia(Channel *chl, const char *src);
+
+static void
+_cb_popmedia_loop(void *data, Evas_Object *obj EINA_UNUSED, void *event 
EINA_UNUSED)
+{
+   Channel *chl;
+
+   chl = data;
+   if (chl->popmedia_queue)
+     {
+        if (chl->o_popmedia) _media_play_set(chl->o_popmedia, EINA_FALSE);
+        edje_object_signal_emit(chl->o_bg, "popmedia,off", PACKAGE_NAME);
+     }
+}
+
+static void
+_cb_popmedia_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event EINA_UNUSED)
+{
+   Channel *chl;
+
+   chl = data;
+   chl->o_popmedia = NULL;
+   chl->popmedia_deleted = EINA_TRUE;
+   edje_object_signal_emit(chl->o_bg, "popmedia,off", PACKAGE_NAME);
+}
+
+static void
+_channel_popmedia_queue_process(Channel *chl)
+{
+   const char *src;
+
+   if (!chl->popmedia_queue) return;
+   src = chl->popmedia_queue->data;
+   chl->popmedia_queue =
+     eina_list_remove_list(chl->popmedia_queue, chl->popmedia_queue);
+   if (!src) return;
+   _channel_popmedia(chl, src);
+   eina_stringshare_del(src);
+}
+
+static void
+_cb_popmedia_done(void *data, Evas_Object *obj EINA_UNUSED, const char 
*emission EINA_UNUSED, const char *src EINA_UNUSED)
+{
+   Channel *chl;
+
+   chl = data;
+   if ((chl->o_popmedia) || (chl->popmedia_deleted))
+     {
+        if (chl->o_popmedia)
+          {
+             evas_object_event_callback_del(chl->o_popmedia, EVAS_CALLBACK_DEL,
+                                            _cb_popmedia_del);
+             evas_object_del(chl->o_popmedia);
+             chl->o_popmedia = NULL;
+          }
+        chl->popmedia_deleted = EINA_FALSE;
+        _channel_popmedia_queue_process(chl);
+     }
+}
+
+static void
+_channel_popmedia_show(Channel *chl, const char *src, Media_Type type)
+{
+   _dbus_link_hide();
+
+   if (chl->o_popmedia)
+     {
+        const char *s;
+
+        EINA_LIST_FREE(chl->popmedia_queue, s)
+          eina_stringshare_del(s);
+
+        chl->popmedia_queue =
+          eina_list_append(chl->popmedia_queue, eina_stringshare_add(src));
+
+        edje_object_signal_emit(chl->o_bg, "popmedia,off", PACKAGE_NAME);
+
+        return;
+     }
+
+   chl->o_popmedia = _media_add(chl->o_win, src, MEDIA_POP, type);
+   chl->popmedia_deleted = EINA_FALSE;
+   evas_object_smart_callback_add(chl->o_popmedia, "loop",
+                                  _cb_popmedia_loop, chl);
+   evas_object_event_callback_add(chl->o_popmedia, EVAS_CALLBACK_DEL,
+                                  _cb_popmedia_del, chl);
+   edje_object_part_swallow(chl->o_bg, "express.popmedia", chl->o_popmedia);
+   evas_object_show(chl->o_popmedia);
+
+   edje_object_signal_emit(chl->o_bg, "popmedia,on", PACKAGE_NAME);
+}
+
+static void
+_channel_popmedia(Channel *chl, const char *src)
+{
+   Media_Type type;
+
+   type = _media_src_type_get(src);
+   if (type == MEDIA_TYPE_UNKNOWN)
+     {
+        
+     }
+   else
+     _channel_popmedia_show(chl, src, type);
+}
+
 static void 
 _cb_theme_reload(Channel *chl)
 {
@@ -138,6 +250,19 @@ _cb_next(void *data, Evas_Object *obj EINA_UNUSED, void 
*event EINA_UNUSED)
      }
 }
 
+static void
+_cb_popup(void *data, Evas_Object *obj EINA_UNUSED, void *event)
+{
+   Channel *chl;
+   const char *src;
+
+   chl = data;
+   src = event;
+   if (!src) src = _grid_link_get(chl->o_grid);
+   if (!src) return;
+   _channel_popmedia(chl, src);
+}
+
 static void 
 _cb_count_go(void *data, Evas_Object *obj EINA_UNUSED, const char *sig 
EINA_UNUSED, const char *source EINA_UNUSED)
 {
@@ -646,6 +771,7 @@ _channel_create(Evas *evas, Evas_Object *win, const char 
*name, const char *serv
    evas_object_smart_callback_add(chl->o_grid, "options", _cb_options, chl);
    evas_object_smart_callback_add(chl->o_grid, "prev", _cb_prev, chl);
    evas_object_smart_callback_add(chl->o_grid, "next", _cb_next, chl);
+   evas_object_smart_callback_add(chl->o_grid, "popup", _cb_popup, chl);
 
    /* swallow parts */
    edje_object_part_swallow(chl->o_base, "channel.content", chl->o_grid);
@@ -658,6 +784,8 @@ _channel_create(Evas *evas, Evas_Object *win, const char 
*name, const char *serv
                                    _cb_count_prev, chl);
    edje_object_signal_callback_add(chl->o_bg, "chlcount,next", PACKAGE_NAME, 
                                    _cb_count_next, chl);
+   edje_object_signal_callback_add(chl->o_bg, "popmedia,done", PACKAGE_NAME,
+                                   _cb_popmedia_done, chl);
 
    /* add handlers for userlist signals */
    edje_object_signal_callback_add(chl->o_bg, "userlist,go", PACKAGE_NAME, 
@@ -688,6 +816,7 @@ _channel_destroy(Channel *chl)
    if (chl->userlist.o_frame) evas_object_del(chl->userlist.o_frame);
 
    /* delete channel objects */
+   if (chl->o_popmedia) evas_object_del(chl->o_popmedia);
    if (chl->o_img) evas_object_del(chl->o_img);
    if (chl->o_spacer) evas_object_del(chl->o_spacer);
    if (chl->o_entry) evas_object_del(chl->o_entry);

-- 


Reply via email to