forked from enlightenment/efl
* edje: Add edje_object_preload, it will force the preload of all
image embeded inside an edje and send a signal ("preload,done", "") at the end. SVN revision: 44186
This commit is contained in:
parent
c8ecbbfeef
commit
c76b578b37
|
@ -409,6 +409,9 @@ extern "C" {
|
|||
EAPI int edje_object_load_error_get (const Evas_Object *obj);
|
||||
EAPI const char *edje_load_error_str (int error);
|
||||
|
||||
/* edje_util.c */
|
||||
EAPI Eina_Bool edje_object_preload (Evas_Object *obj, Eina_Bool cancel);
|
||||
|
||||
/* edje_program.c */
|
||||
EAPI void edje_object_signal_callback_add (Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func, void *data);
|
||||
EAPI void *edje_object_signal_callback_del (Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func);
|
||||
|
|
|
@ -705,6 +705,8 @@ struct _Edje
|
|||
|
||||
int state;
|
||||
|
||||
int preload_count;
|
||||
|
||||
unsigned short dirty : 1;
|
||||
unsigned short recalc : 1;
|
||||
unsigned short walking_callbacks : 1;
|
||||
|
|
|
@ -39,6 +39,8 @@ struct _Edje_List_Foreach_Data
|
|||
|
||||
static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
|
||||
static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
|
||||
static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
|
||||
|
||||
Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);
|
||||
|
||||
|
@ -3705,6 +3707,72 @@ edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear
|
|||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
#define EDJE_PRELOAD_EMISSION "preload,done"
|
||||
#define EDJE_PRELOAD_SOURCE NULL
|
||||
|
||||
EAPI Eina_Bool
|
||||
edje_object_preload(Evas_Object *obj, Eina_Bool cancel)
|
||||
{
|
||||
Edje *ed;
|
||||
int count;
|
||||
int i;
|
||||
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return EINA_FALSE;
|
||||
|
||||
for (i = 0, count = 0; i < ed->table_parts_size; i++)
|
||||
{
|
||||
Edje_Real_Part *rp;
|
||||
Edje_Part *ep;
|
||||
|
||||
rp = ed->table_parts[i];
|
||||
ep = rp->part;
|
||||
|
||||
if (ep->type == EDJE_PART_TYPE_IMAGE ||
|
||||
(ep->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object))
|
||||
count++;
|
||||
}
|
||||
|
||||
ed->preload_count = count;
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
for (i = 0; i < ed->table_parts_size; i++)
|
||||
{
|
||||
Edje_Real_Part *rp;
|
||||
Edje_Part *ep;
|
||||
|
||||
rp = ed->table_parts[i];
|
||||
ep = rp->part;
|
||||
|
||||
if (ep->type == EDJE_PART_TYPE_IMAGE)
|
||||
{
|
||||
evas_object_event_callback_del_full(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
|
||||
evas_object_event_callback_add(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
|
||||
evas_object_image_preload(rp->object, cancel);
|
||||
|
||||
count--;
|
||||
}
|
||||
else if (ep->type == EDJE_PART_TYPE_GROUP)
|
||||
{
|
||||
if (rp->swallowed_object) {
|
||||
edje_object_signal_callback_del(rp->swallowed_object, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
|
||||
edje_object_signal_callback_add(rp->swallowed_object, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb, ed);
|
||||
edje_object_preload(rp->swallowed_object, cancel);
|
||||
|
||||
count--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
|
||||
}
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
_edje_real_part_table_pack(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
|
||||
{
|
||||
|
@ -4239,3 +4307,29 @@ _edje_real_part_swallow_clear(Edje_Real_Part *rp)
|
|||
if (rp->part->mouse_events)
|
||||
_edje_callbacks_del(rp->swallowed_object);
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_object_preload(Edje *ed)
|
||||
{
|
||||
ed->preload_count--;
|
||||
if (!ed->preload_count)
|
||||
_edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
Edje *ed = data;
|
||||
|
||||
evas_object_event_callback_del_full(obj, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
|
||||
_edje_object_preload(ed);
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
|
||||
{
|
||||
Edje *ed = data;
|
||||
|
||||
edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
|
||||
_edje_object_preload(ed);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue