From 6e1ada98507b9a90992f0cdf4fdbe494649bda70 Mon Sep 17 00:00:00 2001 From: Jonathan Atton Date: Sun, 1 Aug 2010 17:27:31 +0000 Subject: [PATCH] Edje: now we can refer to the content of a external type SVN revision: 50730 --- legacy/edje/src/lib/Edje.h | 2 ++ legacy/edje/src/lib/edje_external.c | 43 ++++++++++++++++++++++++++++- legacy/edje/src/lib/edje_private.h | 1 + legacy/edje/src/lib/edje_util.c | 4 +++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 809bf4934d..d7bf4a4e68 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -384,6 +384,7 @@ struct _Edje_External_Type void (*signal_emit) (void *data, Evas_Object *obj, const char *emission, const char *source); /**< Feed a signal emitted with emission originally set as part_name:signal to this object (without the "part_name:" prefix) */ Eina_Bool (*param_set) (void *data, Evas_Object *obj, const Edje_External_Param *param); /**< dynamically change a parameter of this external, called by scripts and user code. Returns @c EINA_TRUE on success */ Eina_Bool (*param_get) (void *data, const Evas_Object *obj, Edje_External_Param *param); /**< dynamically fetch a parameter of this external, called by scripts and user code. Returns @c EINA_TRUE on success. (Must check parameter name and type!) */ + Evas_Object *(*content_get) (void *data, const Evas_Object *obj, const char *content); /**< dynamically fetch a sub object of this external, called by scripts and user code. Returns @c Evas_Object * on success. (Must check parameter name and type!) */ void *(*params_parse) (void *data, Evas_Object *obj, const Eina_List *params); /**< parses the list of parameters, converting into a friendly representation. Used with state_set() */ void (*params_free) (void *params); /**< free parameters parsed with params_parse() */ @@ -555,6 +556,7 @@ typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Mess EAPI Evas_Object *edje_object_part_external_object_get (const Evas_Object *obj, const char *part); EAPI Eina_Bool edje_object_part_external_param_set (Evas_Object *obj, const char *part, const Edje_External_Param *param); EAPI Eina_Bool edje_object_part_external_param_get (const Evas_Object *obj, const char *part, Edje_External_Param *param); + EAPI Evas_Object *edje_object_part_external_content_get (const Evas_Object *obj, const char *part, const char *content); EAPI Edje_External_Param_Type edje_object_part_external_param_type_get (const Evas_Object *obj, const char *part, const char *param); EAPI Eina_Bool edje_object_part_box_append (Evas_Object *obj, const char *part, Evas_Object *child); diff --git a/legacy/edje/src/lib/edje_external.c b/legacy/edje/src/lib/edje_external.c index f7dc77bcf9..15351cc59a 100644 --- a/legacy/edje/src/lib/edje_external.c +++ b/legacy/edje/src/lib/edje_external.c @@ -181,6 +181,29 @@ edje_object_part_external_param_get(const Evas_Object *obj, const char *part, Ed return _edje_external_param_get(rp->swallowed_object, param); } + + +EAPI Evas_Object* +edje_object_part_external_content_get(const Evas_Object *obj, const char *part, const char *content) +{ + Edje *ed; + Edje_Real_Part *rp; + + if (!content) return EINA_FALSE; + + ed = _edje_fetch(obj); + if ((!ed) || (!part)) return EINA_FALSE; + + rp = _edje_real_part_recursive_get(ed, (char *)part); + if (!rp) + { + ERR("no part '%s'", part); + return EINA_FALSE; + } + + return _edje_external_content_get(rp->swallowed_object, content); +} + /** * Facility to query the type of the given parameter of the given part. * @@ -594,13 +617,31 @@ _edje_external_param_get(const Evas_Object *obj, Edje_External_Param *param) } if (!type->param_get) { - ERR("external type '%s' from module '%s' does not provide param_set()", + ERR("external type '%s' from module '%s' does not provide param_get()", type->module_name, type->module); return EINA_FALSE; } return type->param_get(type->data, obj, param); } +Evas_Object* +_edje_external_content_get(const Evas_Object *obj, const char *content) +{ + Edje_External_Type *type = evas_object_data_get(obj, "Edje_External_Type"); + if (!type) + { + ERR("no external type for object %p", obj); + return EINA_FALSE; + } + if (!type->content_get) + { + ERR("external type '%s' from module '%s' does not provide content_get()", + type->module_name, type->module); + return EINA_FALSE; + } + return type->content_get(type->data, obj, content); +} + void _edje_external_params_free(Eina_List *external_params, Eina_Bool free_strings) { diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 2dfa38b5e5..5f4c607e57 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -1683,6 +1683,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); Eina_Bool _edje_external_param_set(Evas_Object *obj, const Edje_External_Param *param) EINA_ARG_NONNULL(1, 2); Eina_Bool _edje_external_param_get(const Evas_Object *obj, Edje_External_Param *param) EINA_ARG_NONNULL(1, 2); +Evas_Object *_edje_external_content_get(const Evas_Object *obj, const char *content) EINA_ARG_NONNULL(1, 2); void _edje_external_params_free(Eina_List *params, Eina_Bool free_strings); void _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index af0ef6e01c..3b5365b572 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -4252,6 +4252,9 @@ _edje_children_get(Edje_Real_Part *rp, const char *partid) else if (rp->part->type == EDJE_PART_TYPE_TABLE) l = evas_object_table_children_get(rp->object); + else + if (rp->part->type == EDJE_PART_TYPE_EXTERNAL) + return _edje_external_content_get(rp->swallowed_object, partid); else return NULL; @@ -4320,6 +4323,7 @@ _edje_real_part_recursive_get_helper(Edje *ed, char **path) return _edje_real_part_recursive_get_helper(ed, path); case EDJE_PART_TYPE_BOX: case EDJE_PART_TYPE_TABLE: + case EDJE_PART_TYPE_EXTERNAL: if (!idx) return rp; path++;