cedric pushed a commit to branch master.
commit 8222bf4650e71a454e6c4e68c42853908e69bd85
Author: Cedric BAIL <[email protected]>
Date: Fri Mar 22 15:29:33 2013 +0900
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 | 183 +++++++++++++++++++++++++---------------
src/lib/edje/edje_private.h | 7 +-
6 files changed, 158 insertions(+), 73 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 0c3403b..9b3856c 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 706436f..8c8fb6c 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 90c8d5e..5381280 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;
}
@@ -4429,6 +4434,27 @@ static void
st_collections_group_parts_part_box_items_item_min(void)
}
/**
+ @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
prefer
diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c
index bdeff5b..aa289d7 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 406d65e..9851152 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;
- }
+ 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);
+ }
- group_path = eina_list_remove(group_path,
group_path_entry);
- eina_stringshare_del(group_path_entry);
+ 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;
+ }
- 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))
+ 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)
{
- 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);
- }
+ 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)
- {
- pack_it = *curr_item;
- source = pack_it->source;
- curr_item++;
- item_count--;
- }
- else
+ source = NULL;
+ }
+ else
+ {
+ if ((rp->type == EDJE_RP_TYPE_CONTAINER) &&
+ (rp->typedata.container))
{
- 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 376cb1b..e79fee9 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;
--
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar