edje: edje_calc - update _edje_part_description_find
authorVyacheslav Reutskiy <v.reutskiy@samsung.com>
Mon, 23 Dec 2013 00:51:43 +0000 (09:51 +0900)
committerCedric BAIL <cedric.bail@samsung.com>
Mon, 23 Dec 2013 01:47:32 +0000 (10:47 +0900)
Add to fuction prototype new param: Eina_Bool approximation.
If need exact matching state name and value set EINA_FALSE to
'approximate'. In other cases used EINA_TRUE.

Reviewers: cedric, raster, seoz

CC: cedric
Differential Revision: https://phab.enlightenment.org/D400

Signed-off-by: Cedric BAIL <cedric.bail@samsung.com>
src/lib/edje/edje_calc.c
src/lib/edje/edje_edit.c
src/lib/edje/edje_embryo.c
src/lib/edje/edje_load.c
src/lib/edje/edje_lua.c
src/lib/edje/edje_private.h

index dbb1464..5406e58 100644 (file)
@@ -280,8 +280,8 @@ _edje_get_description_by_orientation(Edje *ed, Edje_Part_Description_Common *src
 }
 
 Edje_Part_Description_Common *
-_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name,
-                            double val)
+_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *state_name,
+                            double state_val, Eina_Bool approximate)
 {
    Edje_Part *ep = rp->part;
    Edje_Part_Description_Common *ret = NULL;
@@ -297,39 +297,47 @@ _edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name,
           calloc(ep->other.desc_count,
                 sizeof (Edje_Part_Description_Common *));
 
-   if (!strcmp(name, "default") && val == 0.0)
+   if (!strcmp(state_name, "default") && state_val == 0.0)
      return _edje_get_description_by_orientation(ed,
            ep->default_desc, &ep->default_desc_rtl, ep->type);
 
-   if (!strcmp(name, "custom"))
+   if (!strcmp(state_name, "custom"))
      return rp->custom ?
         _edje_get_description_by_orientation(ed, rp->custom->description,
               &rp->custom->description_rtl, ep->type) : NULL;
 
-   if (!strcmp(name, "default"))
+   if (!strcmp(state_name, "default") && approximate)
      {
         ret = _edje_get_description_by_orientation(ed, ep->default_desc,
                                                    &ep->default_desc_rtl,
                                                    ep->type);
 
-        min_dst = ABS(ep->default_desc->state.value - val);
+        min_dst = ABS(ep->default_desc->state.value - state_val);
      }
 
    for (i = 0; i < ep->other.desc_count; ++i)
      {
         d = ep->other.desc[i];
 
-        if (d->state.name && (d->state.name == name ||
-                              !strcmp(d->state.name, name)))
+        if (d->state.name && (d->state.name == state_name ||
+                              !strcmp(d->state.name, state_name)))
           {
-             double dst;
-
-             dst = ABS(d->state.value - val);
-             if (dst < min_dst)
+             if (!approximate && d->state.value == state_val)
+               {
+                  return _edje_get_description_by_orientation(ed, d,
+                                                              &ep->other.desc_rtl[i], ep->type);
+               }
+             else
                {
-                  ret = _edje_get_description_by_orientation(ed, d,
-                                                             &ep->other.desc_rtl[i], ep->type);
-                  min_dst = dst;
+                  double dst;
+
+                  dst = ABS(d->state.value - state_val);
+                  if (dst < min_dst)
+                    {
+                       ret = _edje_get_description_by_orientation(ed, d,
+                                                                  &ep->other.desc_rtl[i], ep->type);
+                       min_dst = dst;
+                    }
                }
           }
      }
@@ -540,12 +548,12 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
 
    if (!d1) d1 = "default";
 
-   epd1 = _edje_part_description_find(ed, ep, d1, v1);
+   epd1 = _edje_part_description_find(ed, ep, d1, v1, EINA_TRUE);
    if (!epd1)
      epd1 = ep->part->default_desc; /* never NULL */
 
    if (d2)
-     epd2 = _edje_part_description_find(ed, ep, d2, v2);
+     epd2 = _edje_part_description_find(ed, ep, d2, v2, EINA_TRUE);
 
    epdi = (Edje_Part_Description_Image*) epd2;
 
index 2bfd2e3..9a6b6b0 100644 (file)
@@ -266,7 +266,7 @@ _edje_part_description_find_byname(Edje_Edit *eed, const char *part, const char
    rp = _edje_real_part_get(eed->base, part);
    if (!rp) return NULL;
 
-   pd = _edje_part_description_find(eed->base, rp, state, value);
+   pd = _edje_part_description_find(eed->base, rp, state, value, EINA_FALSE);
 
    return pd;
 }
index 9283b44..5fa5ba3 100644 (file)
@@ -1718,7 +1718,7 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
 
    val = EMBRYO_CELL_TO_FLOAT(params[3]);
 
-   if (!(parent = _edje_part_description_find(ed, rp, name, val)))
+   if (!(parent = _edje_part_description_find(ed, rp, name, val, EINA_TRUE)))
      return 0;
 
    /* now create the custom state */
index f50351e..517fc2d 100644 (file)
@@ -579,8 +579,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
                     _edje_ref(ed);
                     rp->part = ep;
                     eina_array_push(&parts, rp);
-                    rp->param1.description = 
-                       _edje_part_description_find(ed, rp, "default", 0.0);
+                    rp->param1.description =
+                       _edje_part_description_find(ed, rp, "default", 0.0, EINA_TRUE);
                     rp->chosen_description = rp->param1.description;
                     if (!rp->param1.description)
                       ERR("no default part description for '%s'!",
index 1a0d1c1..339f0ad 100644 (file)
@@ -3916,7 +3916,7 @@ _edje_lua_part_fn_custom_state(lua_State *L)
 
    name = (char *)luaL_checkstring(L, 2);      // state name
    val = luaL_checknumber(L, 3);       // state val
-   if (!(parent = _edje_part_description_find(obj->ed, obj->rp, name, val)))
+   if (!(parent = _edje_part_description_find(obj->ed, obj->rp, name, val, EINA_TRUE)))
      {
        lua_pushnil(L);
        return 1;
index 3340f62..73731da 100644 (file)
@@ -1945,9 +1945,16 @@ EAPI extern Eina_Mempool *_emp_SPACER;
 EAPI extern Eina_Mempool *_emp_part;
 
 void  _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2, FLOAT_T v3, FLOAT_T v4);
+
+/** Find the description of the part by state name and state value.
+ * The param 'approximate' on the approximate calculation of the state value,
+ * it used for amination calculate, when used transition from 0.0 to 1.0.
+ * If need exact matching state name and value set EINA_FALSE to 'approximate'.
+ */
 Edje_Part_Description_Common *_edje_part_description_find(Edje *ed,
-                                                         Edje_Real_Part *rp,
-                                                         const char *name, double val);
+                                                          Edje_Real_Part *rp,
+                                                          const char *state_name, double val,
+                                                          Eina_Bool approximate);
 void  _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char  *d1, double v1, const char *d2, double v2);
 void  _edje_recalc(Edje *ed);
 void  _edje_recalc_do(Edje *ed);