express: Add support for popup media in a channel

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2015-08-12 15:59:42 -04:00
parent 5e09435d39
commit 4f746c9c85
1 changed files with 129 additions and 0 deletions

View File

@ -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);