From 8222bf4650e71a454e6c4e68c42853908e69bd85 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 22 Mar 2013 15:29:33 +0900 Subject: [PATCH] edje: add spread.{w,h}. This is particularly useful when using table and replicating the same group all over the place. At least for many games I have in mind this will save a lot of lines ! --- ChangeLog | 7 +- NEWS | 6 +- src/bin/edje/edje_cc_handlers.c | 26 +++++ src/lib/edje/edje_data.c | 2 + src/lib/edje/edje_load.c | 187 ++++++++++++++++++++------------ src/lib/edje/edje_private.h | 7 +- 6 files changed, 160 insertions(+), 75 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0c3403bae1..9b3856c1ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-03-22 Cedric Bail + + * Edje: Add spread width and height in TABLE part. + 2013-03-20 Jérémy Zurcher (jeyzu) * Eina: Add eina_list_shuffle @@ -67,7 +71,6 @@ * Evas Evas_GL: removed resource surface/context pool in favor of creating on-demand. resource surface/contexts are used for creating GL resources for Evas_GL. - 2013-02-28 Tom Hacohen (TAsn) @@ -76,7 +79,7 @@ 2013-02-28 Mike Blumenkrantz - * fix custom states for edje SPACER parts + * fix custom states for edje SPACER parts * fix edje program filters 2013-02-28 Cedric Bail diff --git a/NEWS b/NEWS index 706436f1e6..8c8fb6cb54 100644 --- a/NEWS +++ b/NEWS @@ -72,8 +72,10 @@ Additions: * Add eio_eet_sync symbols. * Add infrastructure to handle buggy touchscreen in Ecore_Input_Evas. * Add infrastructure to handle message between ecore and parent ecore in Ecore_Evas. - * Edje textblock: Added support for size_range. - * Ecore_x: Add atom related with indicator type. + * Edje: + - textblock: Added support for size_range. + - table: Added spread.{w,h} to repeat and automatically name an item in a TABLE part. + * Ecore_x: Add atom related with indicator type. * Ecore_x: Add manual render code before deiconify * Eeze: Add a dummy libmount replacement for when libmount is not there. * Ecore_Con: Add systemd socket activation support (ECORE_CON_SOCKET_ACTIVATE). diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index 90c8d5ee13..5381280155 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -239,6 +239,7 @@ static void st_collections_group_parts_part_box_items_item_type(void); static void st_collections_group_parts_part_box_items_item_name(void); static void st_collections_group_parts_part_box_items_item_source(void); static void st_collections_group_parts_part_box_items_item_min(void); +static void st_collections_group_parts_part_box_items_item_spread(void); static void st_collections_group_parts_part_box_items_item_prefer(void); static void st_collections_group_parts_part_box_items_item_max(void); static void st_collections_group_parts_part_box_items_item_padding(void); @@ -528,6 +529,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.parts.part.box.items.item.name", st_collections_group_parts_part_box_items_item_name}, {"collections.group.parts.part.box.items.item.source", st_collections_group_parts_part_box_items_item_source}, {"collections.group.parts.part.box.items.item.min", st_collections_group_parts_part_box_items_item_min}, + {"collections.group.parts.part.box.items.item.spread", st_collections_group_parts_part_box_items_item_spread}, {"collections.group.parts.part.box.items.item.prefer", st_collections_group_parts_part_box_items_item_prefer}, {"collections.group.parts.part.box.items.item.max", st_collections_group_parts_part_box_items_item_max}, {"collections.group.parts.part.box.items.item.padding", st_collections_group_parts_part_box_items_item_padding}, @@ -540,6 +542,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.parts.part.table.items.item.name", st_collections_group_parts_part_box_items_item_name}, /* dup */ {"collections.group.parts.part.table.items.item.source", st_collections_group_parts_part_box_items_item_source}, /* dup */ {"collections.group.parts.part.table.items.item.min", st_collections_group_parts_part_box_items_item_min}, /* dup */ + {"collections.group.parts.part.table.items.item.spread", st_collections_group_parts_part_box_items_item_spread}, /* dup */ {"collections.group.parts.part.table.items.item.prefer", st_collections_group_parts_part_box_items_item_prefer}, /* dup */ {"collections.group.parts.part.table.items.item.max", st_collections_group_parts_part_box_items_item_max}, /* dup */ {"collections.group.parts.part.table.items.item.padding", st_collections_group_parts_part_box_items_item_padding}, /* dup */ @@ -4309,6 +4312,8 @@ static void ob_collections_group_parts_part_box_items_item(void) item->row = -1; item->colspan = 1; item->rowspan = 1; + item->spread.w = 1; + item->spread.h = 1; pitem = (Edje_Pack_Element_Parser *)item; pitem->can_override = EINA_FALSE; } @@ -4428,6 +4433,27 @@ static void st_collections_group_parts_part_box_items_item_min(void) current_item->min.h = parse_int_range(1, 0, 0x7ffffff); } +/** + @page edcref + @property + spread + @parameters + [width] [height] + @effect + Will replicate the item in a rectangle of size width x height + box starting from the defined position of this item. + + default value will be 1 1; + @endproperty +*/ +static void st_collections_group_parts_part_box_items_item_spread(void) +{ + check_arg_count(2); + + current_item->spread.w = parse_int_range(0, 0, 0x7ffffff); + current_item->spread.h = parse_int_range(1, 0, 0x7ffffff); +} + /** @page edcref @property diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c index bdeff5b6f8..aa289d705a 100644 --- a/src/lib/edje/edje_data.c +++ b/src/lib/edje/edje_data.c @@ -883,6 +883,8 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "source", source, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "min.w", min.w, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "min.h", min.h, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "spread.w", spread.w, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "spread.h", spread.h, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "prefer.w", prefer.w, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "prefer.h", prefer.h, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "max.w", max.w, EET_T_INT); diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index 406d65e203..98511523f9 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -827,6 +827,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g { Eina_List *l; Evas_Object *child_obj; + Edje_Pack_Element pack_it_copy; const char *group_path_entry = eina_stringshare_add(source); const char *data; @@ -848,80 +849,124 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g } } - child_obj = edje_object_add(ed->base->evas); - group_path = eina_list_append(group_path, group_path_entry); - if (rp->part->type == EDJE_PART_TYPE_GROUP) - { - _edje_real_part_swallow(rp, child_obj, EINA_FALSE); - } + if (pack_it) + { + pack_it_copy = *pack_it; + } + else + { + pack_it_copy.spread.w = 0; + pack_it_copy.spread.h = 0; + } - if (!_edje_object_file_set_internal(child_obj, file, source, rp->part->name, group_path, nested)) + do { - ERR("impossible to set part '%s' of group '%s' from file '%s' to '%s'", - rp->part->name, group_path_entry, file, source); - ed->load_error = edje_object_load_error_get(child_obj); - evas_object_del(child_obj); - eina_stringshare_del(group_path_entry); - goto on_error; - } - - group_path = eina_list_remove(group_path, group_path_entry); - eina_stringshare_del(group_path_entry); - - edje_object_propagate_callback_add(child_obj, - _cb_signal_repeat, - obj); - if (rp->part->type == EDJE_PART_TYPE_GROUP) - { - ed->groups = eina_list_append(ed->groups, _edje_fetch(child_obj)); - _edje_real_part_swallow(rp, child_obj, EINA_TRUE); - _edje_subobj_register(ed, child_obj); - source = NULL; - } - else - { - if ((rp->type == EDJE_RP_TYPE_CONTAINER) && - (rp->typedata.container)) + child_obj = edje_object_add(ed->base->evas); + group_path = eina_list_append(group_path, group_path_entry); + if (rp->part->type == EDJE_PART_TYPE_GROUP) { - pack_it->parent = rp; - - _edje_object_pack_item_hints_set(child_obj, pack_it); - if (pack_it->name) - evas_object_name_set(child_obj, pack_it->name); - - if (rp->part->type == EDJE_PART_TYPE_BOX) - { - _edje_real_part_box_append(rp, child_obj); - evas_object_data_set(child_obj, "\377 edje.box_item", pack_it); - } - else if (rp->part->type == EDJE_PART_TYPE_TABLE) - { - _edje_real_part_table_pack(rp, child_obj, pack_it->col, pack_it->row, pack_it->colspan, pack_it->rowspan); - evas_object_data_set(child_obj, "\377 edje.table_item", pack_it); - } + _edje_real_part_swallow(rp, child_obj, EINA_FALSE); + } + + if (!_edje_object_file_set_internal(child_obj, file, source, rp->part->name, group_path, nested)) + { + ERR("impossible to set part '%s' of group '%s' from file '%s' to '%s'", + rp->part->name, group_path_entry, file, source); + ed->load_error = edje_object_load_error_get(child_obj); + evas_object_del(child_obj); + eina_stringshare_del(group_path_entry); + goto on_error; + } + + group_path = eina_list_remove(group_path, group_path_entry); + + edje_object_propagate_callback_add(child_obj, + _cb_signal_repeat, + obj); + if (rp->part->type == EDJE_PART_TYPE_GROUP) + { + ed->groups = eina_list_append(ed->groups, _edje_fetch(child_obj)); + _edje_real_part_swallow(rp, child_obj, EINA_TRUE); _edje_subobj_register(ed, child_obj); - evas_object_show(child_obj); - rp->typedata.container->items = eina_list_append(rp->typedata.container->items, child_obj); - - if (item_count > 0) + source = NULL; + } + else + { + if ((rp->type == EDJE_RP_TYPE_CONTAINER) && + (rp->typedata.container)) { - pack_it = *curr_item; - source = pack_it->source; - curr_item++; - item_count--; - } - else - { - source = NULL; - curr_item = NULL; - pack_it = NULL; + Eina_Strbuf *buf = NULL; + const char *name = pack_it_copy.name; + + pack_it->parent = rp; + + _edje_object_pack_item_hints_set(child_obj, &pack_it_copy); + + if (pack_it_copy.spread.h >= 1 && pack_it_copy.spread.w > 1) + { + buf = eina_strbuf_new(); + if (name) + eina_strbuf_append_printf(buf, "%s{%i,%i}", name, pack_it_copy.col, pack_it_copy.row); + else + eina_strbuf_append_printf(buf, "%i,%i", pack_it_copy.col, pack_it_copy.row); + name = eina_strbuf_string_get(buf); + } + if (name) evas_object_name_set(child_obj, name); + if (buf) eina_strbuf_free(buf); + + if (rp->part->type == EDJE_PART_TYPE_BOX) + { + _edje_real_part_box_append(rp, child_obj); + evas_object_data_set(child_obj, "\377 edje.box_item", pack_it); + } + else if (rp->part->type == EDJE_PART_TYPE_TABLE) + { + _edje_real_part_table_pack(rp, child_obj, + pack_it_copy.col, pack_it_copy.row, + pack_it_copy.colspan, pack_it_copy.rowspan); + evas_object_data_set(child_obj, "\377 edje.table_item", pack_it); + } + _edje_subobj_register(ed, child_obj); + evas_object_show(child_obj); + rp->typedata.container->items = eina_list_append(rp->typedata.container->items, child_obj); } } - } - } - } - if (group_path_started) + pack_it_copy.spread.w--; + pack_it_copy.col++; + if (pack_it_copy.spread.w < 1 && pack_it) + { + pack_it_copy.col = pack_it->col; + pack_it_copy.row++; + pack_it_copy.spread.h--; + pack_it_copy.spread.w = pack_it->spread.w; + } + } + while (pack_it_copy.spread.h > 0); + + eina_stringshare_del(group_path_entry); + + if ((rp->type == EDJE_RP_TYPE_CONTAINER) && + (rp->typedata.container)) + { + if (item_count > 0) + { + pack_it = *curr_item; + source = pack_it->source; + curr_item++; + item_count--; + } + else + { + source = NULL; + curr_item = NULL; + pack_it = NULL; + } + } + } + } + + if (group_path_started) { const char *str; @@ -1746,6 +1791,7 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *sig, const char *sou size_t length_source; int i = 0; const char *alias = NULL; + const char *name = NULL; Edje_Message_Signal emsg; parent = data; @@ -1754,9 +1800,12 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *sig, const char *sou pack_it = evas_object_data_get(obj, "\377 edje.box_item"); if (!pack_it) pack_it = evas_object_data_get(obj, "\377 edje.table_item"); + name = evas_object_name_get(obj); + if (pack_it) { - if (!pack_it->name) + if (!name) name = pack_it->name; + if (!name) { Eina_List *child = NULL; Evas_Object *o; @@ -1782,7 +1831,7 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *sig, const char *sou } else { - length_index = strlen(pack_it->name) + 2; + length_index = strlen(name) + 2; } } @@ -1802,7 +1851,7 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *sig, const char *sou length_parent += eina_convert_itoa(i, new_src + length_parent); else { - memcpy(new_src + length_parent, pack_it->name, length_index); + memcpy(new_src + length_parent, name, length_index); length_parent += length_index - 2; } new_src[length_parent++] = EDJE_PART_PATH_SEPARATOR_INDEXR; diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index 376cb1b709..e79fee9e61 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -164,7 +164,7 @@ EAPI extern int _edje_default_log_dom ; /* increment this when you add new feature to edje file format without * breaking backward compatibility. */ -#define EDJE_FILE_MINOR 4 +#define EDJE_FILE_MINOR 5 /* FIXME: * @@ -723,8 +723,11 @@ struct _Edje_Pack_Element const char *source; /* group name to use as source for this element */ Edje_Size min, prefer, max; struct { - int l, r, t, b; + int l, r, t, b; } padding; + struct { + int w, h; + } spread; Edje_Alignment align; Edje_Alignment weight; Edje_Aspect aspect;