2007-05-16 05:06:03 -07:00
|
|
|
#include "News.h"
|
|
|
|
|
2008-10-22 06:53:03 -07:00
|
|
|
static Eina_List *_popups_warn;
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
static void _check_overlap(int *px, int *py, int *pw, int *ph, int tries, int org_x, int org_y);
|
2007-05-23 16:32:37 -07:00
|
|
|
static void _try_close(News_Popup *popw);
|
2007-05-16 05:06:03 -07:00
|
|
|
|
2010-07-07 17:57:17 -07:00
|
|
|
static Eina_Bool _cb_timer(void *data);
|
2007-05-16 05:06:03 -07:00
|
|
|
static void _cb_edje_close(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _cb_edje_desactivate(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
/*
|
|
|
|
* Public functions
|
|
|
|
*/
|
|
|
|
|
|
|
|
int
|
2007-05-23 16:32:37 -07:00
|
|
|
news_popup_init(void)
|
2007-05-16 05:06:03 -07:00
|
|
|
{
|
|
|
|
_popups_warn = NULL;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2007-05-23 16:32:37 -07:00
|
|
|
news_popup_shutdown(void)
|
2007-05-16 05:06:03 -07:00
|
|
|
{
|
2008-10-22 06:53:03 -07:00
|
|
|
Eina_List *l;
|
2007-05-16 05:06:03 -07:00
|
|
|
|
2008-10-22 06:53:03 -07:00
|
|
|
for (l = _popups_warn; l; l = eina_list_next(l))
|
2007-05-16 05:06:03 -07:00
|
|
|
{
|
2007-05-23 16:32:37 -07:00
|
|
|
News_Popup *p;
|
2008-10-22 06:53:03 -07:00
|
|
|
p = eina_list_data_get(l);
|
2007-05-23 16:32:37 -07:00
|
|
|
news_popup_del(p);
|
2007-05-16 05:06:03 -07:00
|
|
|
}
|
2008-10-22 06:53:03 -07:00
|
|
|
eina_list_free(_popups_warn);
|
2007-05-16 05:06:03 -07:00
|
|
|
_popups_warn = NULL;
|
|
|
|
}
|
|
|
|
|
2007-05-23 16:32:37 -07:00
|
|
|
News_Popup *
|
2010-07-05 21:26:52 -07:00
|
|
|
news_popup_add(int type, const char *title, const char *text, int timer, int (*func_close) (News_Popup *popw, void *data), void (*func_desactivate) (News_Popup *popw, void *data), void *data)
|
2007-05-16 05:06:03 -07:00
|
|
|
{
|
|
|
|
E_Zone *zone;
|
2007-05-23 16:32:37 -07:00
|
|
|
News_Popup *popw;
|
2007-05-16 05:06:03 -07:00
|
|
|
int fw, fh;
|
|
|
|
int ecanvas_w, ecanvas_h;
|
|
|
|
|
2007-05-23 16:32:37 -07:00
|
|
|
popw = E_NEW(News_Popup, 1);
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
popw->type = type;
|
|
|
|
popw->timer_org = timer;
|
|
|
|
|
|
|
|
zone = e_util_zone_current_get(e_manager_current_get());
|
|
|
|
news_util_ecanvas_geometry_get(&ecanvas_w, &ecanvas_h);
|
|
|
|
|
|
|
|
/* pop */
|
|
|
|
popw->pop = e_popup_new(zone, 0, 0, 1, 1);
|
|
|
|
if (!popw->pop)
|
|
|
|
{
|
2007-05-23 16:32:37 -07:00
|
|
|
news_popup_del(popw);
|
2007-05-16 05:06:03 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
evas_event_freeze(popw->pop->evas);
|
|
|
|
e_popup_layer_set(popw->pop, 255);
|
|
|
|
|
|
|
|
|
|
|
|
/* face and tb */
|
|
|
|
popw->face = edje_object_add(popw->pop->evas);
|
|
|
|
news_theme_edje_set(popw->face, NEWS_THEME_POPW);
|
|
|
|
edje_object_signal_callback_add(popw->face, "close", "popup",
|
|
|
|
_cb_edje_close, popw);
|
|
|
|
edje_object_signal_callback_add(popw->face, "desactivate", "popup",
|
|
|
|
_cb_edje_desactivate, popw);
|
|
|
|
// TODO
|
|
|
|
|
|
|
|
/* log */
|
|
|
|
// TODO
|
|
|
|
|
|
|
|
/* update times */
|
|
|
|
// TODO
|
|
|
|
|
|
|
|
/* type */
|
|
|
|
edje_object_message_send(popw->face, EDJE_MESSAGE_INT,
|
2007-05-23 16:32:37 -07:00
|
|
|
NEWS_POPUP_EDJE_MESSAGE_TYPE,
|
2007-05-16 05:06:03 -07:00
|
|
|
&type);
|
|
|
|
|
|
|
|
/* pos */
|
|
|
|
popw->x = ecanvas_w - (fw + 20);;
|
|
|
|
popw->y = ecanvas_h - (fh + 20);;
|
|
|
|
popw->w = fw;
|
|
|
|
popw->h = fh;
|
|
|
|
|
|
|
|
/* timer */
|
|
|
|
if (timer)
|
|
|
|
popw->timer = ecore_timer_add(timer, _cb_timer, popw);
|
|
|
|
|
|
|
|
/* close and desactivate functions */
|
|
|
|
popw->func_close = func_close;
|
|
|
|
if (func_desactivate)
|
|
|
|
{
|
|
|
|
int show_desactivate = 1;
|
|
|
|
|
|
|
|
popw->func_desactivate = func_desactivate;
|
|
|
|
edje_object_message_send(popw->face, EDJE_MESSAGE_INT,
|
2007-05-23 16:32:37 -07:00
|
|
|
NEWS_POPUP_EDJE_MESSAGE_SHOW_DESACTIVATE,
|
2007-05-16 05:06:03 -07:00
|
|
|
&show_desactivate);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* attach data */
|
|
|
|
popw->data = data;
|
|
|
|
|
|
|
|
/* check for popup overlaps */
|
|
|
|
_check_overlap(&popw->x, &popw->y, &popw->w, &popw->h, 0, popw->x, popw->y);
|
|
|
|
e_popup_move_resize(popw->pop, popw->x, popw->y, popw->w, popw->h);
|
2007-05-24 00:26:23 -07:00
|
|
|
DPOP(("New: %dx%d : %dx%d", popw->x, popw->y, popw->w, popw->h));
|
|
|
|
DPOP(("New face: %dx%d", fw, fh));
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
/* go ! */
|
|
|
|
evas_object_show(popw->face);
|
|
|
|
e_popup_edje_bg_object_set(popw->pop, popw->face);
|
|
|
|
evas_event_thaw(popw->pop->evas);
|
|
|
|
e_popup_show(popw->pop);
|
|
|
|
|
2008-10-22 06:53:03 -07:00
|
|
|
_popups_warn = eina_list_append(_popups_warn, popw);
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
return popw;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2007-05-23 16:32:37 -07:00
|
|
|
news_popup_del(News_Popup *popw)
|
2007-05-16 05:06:03 -07:00
|
|
|
{
|
|
|
|
if (popw->timer)
|
|
|
|
ecore_timer_del(popw->timer);
|
|
|
|
if (popw->tb)
|
|
|
|
evas_object_del(popw->tb);
|
|
|
|
if (popw->face)
|
|
|
|
evas_object_del(popw->face);
|
|
|
|
if (popw->pop)
|
|
|
|
e_object_del(E_OBJECT(popw->pop));
|
|
|
|
|
2008-10-22 06:53:03 -07:00
|
|
|
_popups_warn = eina_list_remove(_popups_warn, popw);
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
free(popw);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Private functions
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
static void
|
|
|
|
_check_overlap(int *px, int *py, int *pw, int *ph, int tries, int org_x, int org_y)
|
|
|
|
{
|
2008-10-22 06:53:03 -07:00
|
|
|
Eina_List *l;
|
2007-05-23 16:32:37 -07:00
|
|
|
News_Popup *p;
|
2007-05-16 05:06:03 -07:00
|
|
|
int pxw, pyh;
|
|
|
|
int p_xw, p_yh;
|
|
|
|
|
|
|
|
pxw = *px + *pw;
|
|
|
|
pyh = *py + *ph;
|
2008-10-22 06:53:03 -07:00
|
|
|
for (l = _popups_warn; l; l = eina_list_next(l))
|
2007-05-16 05:06:03 -07:00
|
|
|
{
|
2008-10-22 06:53:03 -07:00
|
|
|
p = eina_list_data_get(l);
|
2007-05-16 05:06:03 -07:00
|
|
|
p_xw = p->x + p->w;
|
|
|
|
p_yh = p->y + p->h;
|
|
|
|
if (((p->x >= *px) && (p->x <= pxw) &&
|
|
|
|
(p->y >= *py) && (p->y <= pyh))
|
|
|
|
||
|
|
|
|
((*px >= p->x) && (*px <= p_xw) &&
|
|
|
|
(*py >= p->y) && (*py <= p_yh)))
|
|
|
|
{
|
|
|
|
/* overlap ! correct coords */
|
|
|
|
/* try upper, and then on the left */
|
|
|
|
/* TODO...: try down and right, maybe placement policy ? */
|
2007-05-24 00:26:23 -07:00
|
|
|
DPOP(("Overlap !"));
|
2007-05-23 16:32:37 -07:00
|
|
|
*py = p->y - (*ph + NEWS_POPUP_OVERLAP_BORDER);
|
2007-05-16 05:06:03 -07:00
|
|
|
if (*py < 0)
|
|
|
|
{
|
|
|
|
*py = org_y;
|
2007-05-23 16:32:37 -07:00
|
|
|
*px = *px - (*px + NEWS_POPUP_OVERLAP_BORDER);
|
2007-05-16 05:06:03 -07:00
|
|
|
if (*px < 0) break;
|
|
|
|
}
|
|
|
|
tries++;
|
2007-05-23 16:32:37 -07:00
|
|
|
if (tries > NEWS_POPUP_OVERLAP_CHECK_MAX)
|
2007-05-16 05:06:03 -07:00
|
|
|
return;
|
|
|
|
else
|
|
|
|
_check_overlap(px, py, pw, ph, tries, org_x, org_y);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-05-23 16:32:37 -07:00
|
|
|
_try_close(News_Popup *popw)
|
2007-05-16 05:06:03 -07:00
|
|
|
{
|
|
|
|
int del = 1;
|
|
|
|
|
|
|
|
if (popw->func_close)
|
|
|
|
{
|
|
|
|
if (!popw->func_close(popw, popw->data))
|
|
|
|
del = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (del)
|
2007-05-23 16:32:37 -07:00
|
|
|
news_popup_del(popw);
|
2007-05-16 05:06:03 -07:00
|
|
|
}
|
|
|
|
|
2010-07-07 17:57:17 -07:00
|
|
|
static Eina_Bool
|
2007-05-16 05:06:03 -07:00
|
|
|
_cb_timer(void *data)
|
|
|
|
{
|
2007-05-23 16:32:37 -07:00
|
|
|
News_Popup *popw;
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
popw = data;
|
|
|
|
_try_close(popw);
|
|
|
|
|
2010-07-07 17:57:17 -07:00
|
|
|
return EINA_FALSE;
|
2007-05-16 05:06:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_cb_edje_close(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
2007-05-23 16:32:37 -07:00
|
|
|
News_Popup *popw;
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
popw = data;
|
|
|
|
_try_close(popw);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_cb_edje_desactivate(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
2007-05-23 16:32:37 -07:00
|
|
|
News_Popup *popw;
|
2007-05-16 05:06:03 -07:00
|
|
|
|
|
|
|
popw = data;
|
|
|
|
if (popw->func_desactivate)
|
|
|
|
popw->func_desactivate(popw, popw->data);
|
|
|
|
}
|