edje: add spread.{w,h}.
authorCedric BAIL <cedric.bail@samsung.com>
Fri, 22 Mar 2013 06:29:33 +0000 (15:29 +0900)
committerCedric BAIL <cedric.bail@samsung.com>
Fri, 22 Mar 2013 09:17:12 +0000 (18:17 +0900)
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
NEWS
src/bin/edje/edje_cc_handlers.c
src/lib/edje/edje_data.c
src/lib/edje/edje_load.c
src/lib/edje/edje_private.h

index 0c3403b..9b3856c 100644 (file)
--- 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 (file)
--- 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).
index 90c8d5e..5381280 100644 (file)
@@ -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
index bdeff5b..aa289d7 100644 (file)
@@ -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);
index 406d65e..9851152 100644 (file)
@@ -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;
index 376cb1b..e79fee9 100644 (file)
@@ -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;