Edje: now we can refer to the content of a external type
authorwatchwolf <watchwolf@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 1 Aug 2010 17:27:31 +0000 (17:27 +0000)
committerwatchwolf <watchwolf@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 1 Aug 2010 17:27:31 +0000 (17:27 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@50730 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Edje.h
src/lib/edje_external.c
src/lib/edje_private.h
src/lib/edje_util.c

index 809bf49..d7bf4a4 100644 (file)
@@ -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);
index f7dc77b..15351cc 100644 (file)
@@ -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)
 {
index 2dfa38b..5f4c607 100644 (file)
@@ -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,
index af0ef6e..3b5365b 100644 (file)
@@ -4253,6 +4253,9 @@ _edje_children_get(Edje_Real_Part *rp, const char *partid)
      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;
 
    if (number)
@@ -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++;