Some more stuff in externals, little api change there, may change some more later.

SVN revision: 43379
This commit is contained in:
Iván Briano 2009-10-31 18:07:08 +00:00
parent 00d1eab6d8
commit 2ba79e04af
5 changed files with 86 additions and 9 deletions

View File

@ -250,8 +250,13 @@ typedef struct _Edje_External_Param Edje_External_Param;
struct _Edje_External_Type
{
Evas_Object *(*add) (void *data, Evas *evas, Evas_Object *parent, const Eina_List *params);
void (*state_set) (void *data, Evas_Object *obj, const Eina_List *from_params, const Eina_List *to_params, float pos);
void (*state_set) (void *data, Evas_Object *obj, const void *from_params, const void *to_params, float pos);
void (*signal_emit) (void *data, Evas_Object *obj, const char *emission, const char *source);
void *(*params_parse) (void *data, const Eina_List *params);
void (*params_free) (void *params);
Evas_Object *(*icon_get) (void *data, Evas *e);
const char *(*label_get) (void *data);
void *data;
};
@ -400,7 +405,11 @@ extern "C" {
/* edje_external.c */
EAPI Eina_Bool edje_external_type_register(const char *type_name, Edje_External_Type *type_info);
EAPI Eina_Bool edje_external_type_unregister(const char *type_name);
EAPI Eina_Iterator *edje_external_iterator_get(void);
EAPI Edje_External_Param *edje_external_param_find(const Eina_List *params, const char *key);
EAPI Eina_Bool edje_external_param_int_get(const Eina_List *params, const char *key, int *ret);
EAPI Eina_Bool edje_external_param_double_get(const Eina_List *params, const char *key, double *ret);
EAPI Eina_Bool edje_external_param_string_get(const Eina_List *params, const char *key, const char **ret);
#ifdef __cplusplus
}

View File

@ -110,10 +110,15 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
{
if (!ep->param2)
ep->param2 = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
else if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
_edje_external_parsed_params_free(ep->swallowed_object, ep->param2->external_params);
ep->param2->external_params = NULL;
}
else
if (ep->param2)
{
if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
_edje_external_parsed_params_free(ep->swallowed_object, ep->param2->external_params);
eina_mempool_free(_edje_real_part_state_mp, ep->param2);
ep->param2 = NULL;
}
@ -133,6 +138,13 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
if (ep->param1.description->rel2.id_y >= 0)
ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->rel2.id_y % ed->table_parts_size];
if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
{
if (ep->param1.external_params)
_edje_external_parsed_params_free(ep->swallowed_object, ep->param1.external_params);
ep->param1.external_params = _edje_external_params_parse(ep->swallowed_object, ep->param1.description->external_params);
}
if (ep->param2)
{
ep->param2->description = epd2;
@ -150,6 +162,9 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
ep->param2->rel2_to_x = ed->table_parts[ep->param2->description->rel2.id_x % ed->table_parts_size];
if (ep->param2->description->rel2.id_y >= 0)
ep->param2->rel2_to_y = ed->table_parts[ep->param2->description->rel2.id_y % ed->table_parts_size];
if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
ep->param2->external_params = _edje_external_params_parse(ep->swallowed_object, ep->param2->description->external_params);
}
if (ep->description_pos != 0.0)

View File

@ -24,6 +24,12 @@ edje_external_type_unregister(const char *type_name)
return eina_hash_del_by_key(type_registry, type_name);
}
EAPI Eina_Iterator *
edje_external_iterator_get(void)
{
return eina_hash_iterator_tuple_new(type_registry);
}
EAPI Edje_External_Param *
edje_external_param_find(const Eina_List *params, const char *key)
{
@ -172,6 +178,7 @@ _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep,
Edje_Part_Description *chosen_desc)
{
Edje_External_Type *type;
void *params1, *params2 = NULL;
if (!ep->swallowed_object) return;
type = evas_object_data_get(ep->swallowed_object, "Edje_External_Type");
@ -180,8 +187,38 @@ _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (!type->state_set) return;
params1 = ep->param1.external_params ? ep->param1.external_params : ep->param1.description->external_params;
if (ep->param2 && ep->param2->description)
params2 = ep->param2->external_params ? ep->param2->external_params : ep->param2->description->external_params;
type->state_set(type->data, ep->swallowed_object,
ep->param1.description->external_params,
(ep->param2 && ep->param2->description ? ep->param2->description->external_params : NULL),
ep->description_pos);
params1, params2, ep->description_pos);
}
void *
_edje_external_params_parse(Evas_Object *obj, const Eina_List *params)
{
Edje_External_Type *type;
type = evas_object_data_get(obj, "Edje_External_Type");
if (!type) return NULL;
if (!type->params_parse) return NULL;
return type->params_parse(type->data, params);
}
void
_edje_external_parsed_params_free(Evas_Object *obj, void *params)
{
Edje_External_Type *type;
if (!params) return;
type = evas_object_data_get(obj, "Edje_External_Type");
if (!type) return;
if (!type->params_free) return;
type->params_free(params);
}

View File

@ -600,7 +600,11 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
{
Evas_Object *child_obj;
child_obj = _edje_external_type_add(rp->part->source, evas_object_evas_get(ed->obj), ed->obj, rp->part->default_desc->external_params);
if (child_obj) _edje_real_part_swallow(rp, child_obj);
if (child_obj)
{
_edje_real_part_swallow(rp, child_obj);
rp->param1.external_params = _edje_external_params_parse(child_obj, rp->param1.description->external_params);
}
}
continue;
default:
@ -847,8 +851,17 @@ _edje_file_del(Edje *ed)
/* Objects swallowed by the app do not get deleted,
but those internally swallowed (GROUP type) do. */
if (rp->part->type == EDJE_PART_TYPE_GROUP || rp->part->type == EDJE_PART_TYPE_EXTERNAL)
evas_object_del(rp->swallowed_object);
switch (rp->part->type)
{
case EDJE_PART_TYPE_EXTERNAL:
_edje_external_parsed_params_free(rp->swallowed_object, rp->param1.external_params);
if (rp->param2)
_edje_external_parsed_params_free(rp->swallowed_object, rp->param2->external_params);
case EDJE_PART_TYPE_GROUP:
evas_object_del(rp->swallowed_object);
default:
break;
}
rp->swallowed_object = NULL;
}

View File

@ -740,8 +740,9 @@ struct _Edje_Real_Part_State
int state; // 4
Edje_Calc_Params p; // 96
#endif
}; // 20
// WITH EDJE_CALC_CACHE 120
void *external_params; // 4
}; // 24
// WITH EDJE_CALC_CACHE 124
struct _Edje_Real_Part_Drag
{
@ -1345,5 +1346,7 @@ Evas_Object *_edje_external_type_add(const char *type_name, Evas *evas, Evas_Obj
void _edje_external_signal_emit(Evas_Object *obj, const char *emission, const char *source);
void _edje_external_params_free(Eina_List *params, unsigned int free_strings);
void _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description *chosen_desc);
void *_edje_external_params_parse(Evas_Object *obj, const Eina_List *params);
void _edje_external_parsed_params_free(Evas_Object *obj, void *params);
#endif