summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>2009-10-31 18:07:08 +0000
committersachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>2009-10-31 18:07:08 +0000
commita6b643672667e2fea9128fd7936fb6acdc38b7ad (patch)
treea9d2a3b435282493c95770b0a932265e426f268d
parentd247c29699a08f12901549b532035d097bd74494 (diff)
downloadedje-a6b643672667e2fea9128fd7936fb6acdc38b7ad.tar.gz
edje-a6b643672667e2fea9128fd7936fb6acdc38b7ad.tar.bz2
edje-a6b643672667e2fea9128fd7936fb6acdc38b7ad.zip
Some more stuff in externals, little api change there, may change some more later.
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@43379 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33
-rw-r--r--src/lib/Edje.h11
-rw-r--r--src/lib/edje_calc.c15
-rw-r--r--src/lib/edje_external.c43
-rw-r--r--src/lib/edje_load.c19
-rw-r--r--src/lib/edje_private.h7
5 files changed, 86 insertions, 9 deletions
diff --git a/src/lib/Edje.h b/src/lib/Edje.h
index b6f9fc1..fe68177 100644
--- a/src/lib/Edje.h
+++ b/src/lib/Edje.h
@@ -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
}
diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c
index c4b447f..d32e89a 100644
--- a/src/lib/edje_calc.c
+++ b/src/lib/edje_calc.c
@@ -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)
diff --git a/src/lib/edje_external.c b/src/lib/edje_external.c
index 04b7c31..1b09fa9 100644
--- a/src/lib/edje_external.c
+++ b/src/lib/edje_external.c
@@ -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);
}
diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c
index 4f0a08b..64d6013 100644
--- a/src/lib/edje_load.c
+++ b/src/lib/edje_load.c
@@ -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;
}
diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h
index 4643300..beffd18 100644
--- a/src/lib/edje_private.h
+++ b/src/lib/edje_private.h
@@ -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