diff options
author | sachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33> | 2009-10-26 21:33:56 +0000 |
---|---|---|
committer | sachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33> | 2009-10-26 21:33:56 +0000 |
commit | 1e22ab8aa7929fc86086b6a33c2ab74499e1182a (patch) | |
tree | 7ec3ad116ba7fd0ff3793bfe90272f432cc84983 /src/lib | |
parent | f49a92df1183c1a76e267841f62dd375f57d03fd (diff) | |
download | edje-1e22ab8aa7929fc86086b6a33c2ab74499e1182a.tar.gz edje-1e22ab8aa7929fc86086b6a33c2ab74499e1182a.tar.bz2 edje-1e22ab8aa7929fc86086b6a33c2ab74499e1182a.zip |
External objects support by Brian 'rephorm' Mattern
Since we are on a freeze, the patch goes on updated to current svn, but without changing its API. After the freeze some things will be added, and some will change :)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@43302 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/Edje.h | 39 | ||||
-rw-r--r-- | src/lib/Makefile.am | 3 | ||||
-rw-r--r-- | src/lib/edje_calc.c | 4 | ||||
-rw-r--r-- | src/lib/edje_data.c | 12 | ||||
-rw-r--r-- | src/lib/edje_load.c | 12 | ||||
-rw-r--r-- | src/lib/edje_main.c | 3 | ||||
-rw-r--r-- | src/lib/edje_private.h | 8 | ||||
-rw-r--r-- | src/lib/edje_program.c | 26 |
8 files changed, 95 insertions, 12 deletions
diff --git a/src/lib/Edje.h b/src/lib/Edje.h index 7eb0bf2..b6f9fc1 100644 --- a/src/lib/Edje.h +++ b/src/lib/Edje.h @@ -90,7 +90,8 @@ typedef enum _Edje_Part_Type EDJE_PART_TYPE_GROUP = 7, EDJE_PART_TYPE_BOX = 8, EDJE_PART_TYPE_TABLE = 9, - EDJE_PART_TYPE_LAST = 10 + EDJE_PART_TYPE_EXTERNAL = 10, + EDJE_PART_TYPE_LAST = 11 } Edje_Part_Type; typedef enum _Edje_Text_Effect @@ -226,6 +227,37 @@ enum EDJE_LOAD_ERROR_RECURSIVE_REFERENCE = 9 }; +enum _Edje_External_Param_Type +{ + EDJE_EXTERNAL_PARAM_TYPE_INT, + EDJE_EXTERNAL_PARAM_TYPE_DOUBLE, + EDJE_EXTERNAL_PARAM_TYPE_STRING, + EDJE_EXTERNAL_PARAM_TYPE_MAX +}; +typedef enum _Edje_External_Param_Type Edje_External_Param_Type; + +struct _Edje_External_Param +{ + const char *name; + Edje_External_Param_Type type; + // XXX these could be in a union, but eet doesn't support them (or does it?) + int i; + double d; + const char *s; +}; +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 (*signal_emit) (void *data, Evas_Object *obj, const char *emission, const char *source); + + void *data; +}; +typedef struct _Edje_External_Type Edje_External_Type; + + typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source); typedef void (*Edje_Text_Change_Cb) (void *data, Evas_Object *obj, const char *part); typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg); @@ -365,6 +397,11 @@ extern "C" { EAPI void edje_message_signal_process (void); + /* 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 Edje_External_Param *edje_external_param_find(const Eina_List *params, const char *key); + #ifdef __cplusplus } #endif diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 6a4c7d5..62a5bd7 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -42,7 +42,8 @@ edje_textblock_styles.c \ edje_edit.c \ edje_script_only.c \ edje_lua_script_only.c \ -edje_entry.c +edje_entry.c \ +edje_external.c libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ -lm libedje_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c index 2d2cc86..c4b447f 100644 --- a/src/lib/edje_calc.c +++ b/src/lib/edje_calc.c @@ -1874,6 +1874,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags) /* move and resize are needed for all previous object => no break here. */ case EDJE_PART_TYPE_SWALLOW: case EDJE_PART_TYPE_GROUP: + case EDJE_PART_TYPE_EXTERNAL: /* visibility and color have no meaning on SWALLOW and GROUP part. */ evas_object_move(ep->object, ed->x + pf->x, ed->y + pf->y); evas_object_resize(ep->object, pf->w, pf->h); @@ -1903,6 +1904,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags) case EDJE_PART_TYPE_TABLE: _edje_table_recalc_apply(ed, ep, pf, chosen_desc); break; + case EDJE_PART_TYPE_EXTERNAL: + _edje_external_recalc_apply(ed, ep, pf, chosen_desc); + break; case EDJE_PART_TYPE_RECTANGLE: case EDJE_PART_TYPE_SWALLOW: case EDJE_PART_TYPE_GROUP: diff --git a/src/lib/edje_data.c b/src/lib/edje_data.c index c913d60..c33c0b4 100644 --- a/src/lib/edje_data.c +++ b/src/lib/edje_data.c @@ -26,6 +26,7 @@ EAPI Eet_Data_Descriptor *_edje_edd_edje_part_collection = NULL; EAPI Eet_Data_Descriptor *_edje_edd_edje_part = NULL; EAPI Eet_Data_Descriptor *_edje_edd_edje_part_description = NULL; EAPI Eet_Data_Descriptor *_edje_edd_edje_part_image_id = NULL; +EAPI Eet_Data_Descriptor *_edje_edd_edje_external_param = NULL; #define FREED(eed) \ if (eed) \ @@ -59,6 +60,7 @@ _edje_edd_shutdown(void) FREED(_edje_edd_edje_part); FREED(_edje_edd_edje_part_description); FREED(_edje_edd_edje_part_image_id); + FREED(_edje_edd_edje_external_param); } void @@ -213,6 +215,15 @@ _edje_edd_init(void) eet_data_descriptor_file_new(&eddc); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_image_id, Edje_Part_Image_Id, "id", id, EET_T_INT); + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_External_Param); + _edje_edd_edje_external_param = + eet_data_descriptor_file_new(&eddc); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "name", name, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "type", type, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "i", i, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "d", d, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "s", s, EET_T_STRING); + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description); _edje_edd_edje_part_description = eet_data_descriptor_file_new(&eddc); @@ -318,6 +329,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.align.y", table.align.y, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.x", table.padding.x, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.y", table.padding.y, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description, Edje_Part_Description, "external_params", external_params, _edje_edd_edje_external_param); EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Pack_Element); _edje_edd_edje_pack_element = diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c index 53e7a23..4f0a08b 100644 --- a/src/lib/edje_load.c +++ b/src/lib/edje_load.c @@ -399,6 +399,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g break; case EDJE_PART_TYPE_SWALLOW: case EDJE_PART_TYPE_GROUP: + case EDJE_PART_TYPE_EXTERNAL: rp->object = evas_object_rectangle_add(ed->evas); evas_object_color_set(rp->object, 0, 0, 0, 0); evas_object_pass_events_set(rp->object, 1); @@ -595,6 +596,13 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g source = pack_it->source; } break; + case EDJE_PART_TYPE_EXTERNAL: + { + 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); + } + continue; default: continue; } @@ -839,7 +847,7 @@ _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) + if (rp->part->type == EDJE_PART_TYPE_GROUP || rp->part->type == EDJE_PART_TYPE_EXTERNAL) evas_object_del(rp->swallowed_object); rp->swallowed_object = NULL; @@ -1138,6 +1146,8 @@ _edje_collection_free_part_description_free(Edje_Part_Description *desc, unsigne EINA_LIST_FREE(desc->image.tween_list, pi) free(pi); + if (desc->external_params) + _edje_external_params_free(desc->external_params, free_strings); if (free_strings) { if (desc->color_class) eina_stringshare_del(desc->color_class); diff --git a/src/lib/edje_main.c b/src/lib/edje_main.c index aeeffef..33faf50 100644 --- a/src/lib/edje_main.c +++ b/src/lib/edje_main.c @@ -96,6 +96,7 @@ edje_init(void) _edje_edd_init(); _edje_text_init(); _edje_box_init(); + _edje_external_init(); _edje_lua_init(); _edje_message_init(); @@ -126,6 +127,7 @@ edje_init(void) _edje_real_part_mp = NULL; _edje_message_shutdown(); _edje_lua_shutdown(); + _edje_external_shutdown(); _edje_box_shutdown(); _edje_text_class_members_free(); _edje_text_class_hash_free(); @@ -183,6 +185,7 @@ edje_shutdown(void) _edje_message_shutdown(); _edje_lua_shutdown(); + _edje_external_shutdown(); _edje_box_shutdown(); _edje_text_class_members_free(); _edje_text_class_hash_free(); diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h index 9892068..4643300 100644 --- a/src/lib/edje_private.h +++ b/src/lib/edje_private.h @@ -567,6 +567,7 @@ struct _Edje_Part_Description } table; Edje_Color color, color2, color3; /* color for rect or text, shadow etc. */ + Eina_List *external_params; /* parameters for external objects */ unsigned char visible; /* is it shown */ }; @@ -1338,4 +1339,11 @@ void _edje_entry_cursor_geometry_get(Edje_Real_Part *rp, Evas_Coord *cx, Evas_Co void _edje_entry_select_allow_set(Edje_Real_Part *rp, Eina_Bool allow); void _edje_entry_select_abort(Edje_Real_Part *rp); +void _edje_external_init(); +void _edje_external_shutdown(); +Evas_Object *_edje_external_type_add(const char *type_name, Evas *evas, Evas_Object *parent, const Eina_List *params); +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); + #endif diff --git a/src/lib/edje_program.c b/src/lib/edje_program.c index b804992..066603e 100644 --- a/src/lib/edje_program.c +++ b/src/lib/edje_program.c @@ -944,8 +944,8 @@ _edje_emit(Edje *ed, const char *sig, const char *src) { size_t length; char *part; - /* the signal contains a colon, split the signal into "group:signal", - * and deliver it to "group" + /* the signal contains a colon, split the signal into "part:signal", + * and deliver it to "part" (if there is a GROUP or EXTERNAL part named "part") */ length = strlen(sig) + 1; part = alloca(length); @@ -962,17 +962,25 @@ _edje_emit(Edje *ed, const char *sig, const char *src) for (i = 0; i < ed->table_parts_size; i++) { Edje_Real_Part *rp = ed->table_parts[i]; - if ((rp->part->type == EDJE_PART_TYPE_GROUP) && + if ((rp->part->type == EDJE_PART_TYPE_GROUP || rp->part->type == EDJE_PART_TYPE_EXTERNAL) && (rp->swallowed_object) && (rp->part) && (rp->part->name) && (strcmp(rp->part->name, part) == 0)) { - Edje *ed2 = _edje_fetch(rp->swallowed_object); - if (ed2) _edje_emit(ed2, newsig, src); - return; /* stop processing. - * XXX maybe let signal be processed anyway? - * XXX in this case, just comment this line - */ + if (rp->part->type == EDJE_PART_TYPE_GROUP) + { + Edje *ed2 = _edje_fetch(rp->swallowed_object); + if (ed2) _edje_emit(ed2, newsig, src); + return; /* stop processing. + * XXX maybe let signal be processed anyway? + * XXX in this case, just comment this line + */ + } + else if (rp->part->type == EDJE_PART_TYPE_EXTERNAL) + { + _edje_external_signal_emit(rp->swallowed_object, newsig, src); + return; + } } } } |