Edje_Edit
authorsachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 18 Nov 2009 00:27:49 +0000 (00:27 +0000)
committersachiel <sachiel@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 18 Nov 2009 00:27:49 +0000 (00:27 +0000)
 - Watch for non-shared strings when copying states
 - Get/Set external parameters

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@43757 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Edje_Edit.h
src/lib/edje_edit.c

index cba8124..e7feb81 100644 (file)
@@ -1390,6 +1390,96 @@ edje_edit_state_color_class_set(
    const char *color_class ///< The new color_class to assign
 );
 
+/**Get the list of parameters for an external part. DO NOT FREE THE LIST*/
+EAPI const Eina_List *
+edje_edit_state_external_params_list_get( ///@return The list of Edje_External_Param
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state       ///< The name of the 'part state' (ex. "default 0.00")
+);
+
+/**Get the type and value of the paramater given*/
+EAPI Eina_Bool
+edje_edit_state_external_param_get( ///@return True if the parameter was found, False otherwise
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter to look for
+   Edje_External_Param_Type *type, ///< Type will be stored here
+   void **value            ///< Pointer to value will be stored here. DO NOT FREE IT
+);
+
+/**Get external parameter of type INT*/
+EAPI Eina_Bool
+edje_edit_state_external_param_int_get( ///@return True if succesful, False if not found or is of different type
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   int *value
+);
+
+/**Get external parameter of type DOUBLE*/
+EAPI Eina_Bool
+edje_edit_state_external_param_double_get( ///@return True if succesful, False if not found or is of different type
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   double *value
+);
+
+/**Get external parameter of type STRING*/
+EAPI Eina_Bool
+edje_edit_state_external_param_string_get( ///@return True if succesful, False if not found or is of different type
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   const char **value
+);
+
+/**Set the external parameter type and value, adding it if it didn't exist before*/
+EAPI Eina_Bool
+edje_edit_state_external_param_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter to set
+   Edje_External_Param_Type type, ///< The type of the parameter
+   ...                     ///< Value(s) according to type
+);
+
+/**Set external parameter of type INT*/
+EAPI Eina_Bool
+edje_edit_state_external_param_int_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   int value
+);
+
+/**Set external parameter of type DOUBLE*/
+EAPI Eina_Bool
+edje_edit_state_external_param_double_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   double value
+);
+
+/**Set external parameter of type STRING*/
+EAPI Eina_Bool
+edje_edit_state_external_param_string_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   const char *value
+);
+
 
 //@}
 /******************************************************************************/
index 711bd89..fe04b29 100644 (file)
@@ -2347,6 +2347,7 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, const
 {
    Edje_Part_Description *pdfrom, *pdto;
    Edje_Part_Image_Id *i;
+   Edje_External_Param *p;
    Eina_List *l;
    GET_RP_OR_RETURN(0);
 
@@ -2367,6 +2368,8 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, const
      }
 
 #define PD_COPY(_x) pdto->_x = pdfrom->_x
+#define PD_STRING_COPY(_x) _edje_if_string_free(ed, pdto->_x); \
+                          pdto->_x = eina_stringshare_add(pdfrom->_x)
    PD_COPY(align.x);
    PD_COPY(align.y);
    PD_COPY(fixed.w);
@@ -2400,8 +2403,8 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, const
        new_i->id = i->id;
        pdto->image.tween_list = eina_list_append(pdto->image.tween_list, new_i);
      }
-   eina_stringshare_replace(&pdto->gradient.type, pdfrom->gradient.type);
-   eina_stringshare_replace(&pdto->gradient.params, pdfrom->gradient.params);
+   PD_STRING_COPY(gradient.type);
+   PD_STRING_COPY(gradient.params);
    PD_COPY(gradient.id);
    PD_COPY(gradient.use_rel);
    PD_COPY(gradient.rel1.relative_x);
@@ -2429,12 +2432,12 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, const
    PD_COPY(fill.spread);
    PD_COPY(fill.smooth);
    PD_COPY(fill.type);
-   eina_stringshare_replace(&pdto->color_class, pdfrom->color_class);
-   eina_stringshare_replace(&pdto->text.text, pdfrom->text.text);
-   eina_stringshare_replace(&pdto->text.text_class, pdfrom->text.text_class);
-   eina_stringshare_replace(&pdto->text.style, pdfrom->text.style);
-   eina_stringshare_replace(&pdto->text.font, pdfrom->text.font);
-   eina_stringshare_replace(&pdto->text.repch, &pdfrom->text.repch);
+   PD_STRING_COPY(color_class);
+   PD_STRING_COPY(text.text);
+   PD_STRING_COPY(text.text_class);
+   PD_STRING_COPY(text.style);
+   PD_STRING_COPY(text.font);
+   PD_STRING_COPY(text.repch);
    PD_COPY(text.align.x);
    PD_COPY(text.align.y);
    PD_COPY(text.elipsis);
@@ -2447,8 +2450,8 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, const
    PD_COPY(text.min_y);
    PD_COPY(text.max_x);
    PD_COPY(text.max_y);
-   eina_stringshare_replace(&pdto->box.layout, pdfrom->box.layout);
-   eina_stringshare_replace(&pdto->box.alt_layout, pdfrom->box.alt_layout);
+   PD_STRING_COPY(box.layout);
+   PD_STRING_COPY(box.alt_layout);
    PD_COPY(box.align.x);
    PD_COPY(box.align.y);
    PD_COPY(box.padding.x);
@@ -2472,7 +2475,37 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, const
    PD_COPY(color3.g);
    PD_COPY(color3.b);
    PD_COPY(color3.a);
+   /* XXX: optimize this, most likely we don't need to remove and add */
+   EINA_LIST_FREE(pdto->external_params, p)
+     {
+       _edje_if_string_free(ed, p->name);
+       if (p->s)
+         _edje_if_string_free(ed, p->s);
+       free(p);
+     }
+   EINA_LIST_FOREACH(pdfrom->external_params, l, p)
+     {
+       Edje_External_Param *new_p;
+       new_p = _alloc(sizeof(Edje_External_Param));
+       new_p->name = eina_stringshare_add(p->name);
+       new_p->type = p->type;
+       switch (p->type)
+         {
+          case EDJE_EXTERNAL_PARAM_TYPE_INT:
+             new_p->i = p->i;
+             break;
+          case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+             new_p->d = p->d;
+             break;
+          case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+             new_p->s = eina_stringshare_add(p->s);
+             break;
+          default:
+             break;
+         }
+     }
    PD_COPY(visible);
+#undef PD_STRING_COPY
 #undef PD_COPY
 
    return 1;
@@ -3218,6 +3251,178 @@ edje_edit_state_color_class_set(Evas_Object *obj, const char *part, const char *
    pd->color_class = (char*)eina_stringshare_add(color_class);
 }
 
+EAPI const Eina_List *
+edje_edit_state_external_params_list_get(Evas_Object *obj, const char *part, const char *state)
+{
+   GET_PD_OR_RETURN(NULL);
+   return pd->external_params;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_get(Evas_Object *obj, const char *part, const char *state, const char *param, Edje_External_Param_Type *type, void **value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+       {
+          if (type) *type = p->type;
+          if (value)
+             switch (p->type)
+               {
+                case EDJE_EXTERNAL_PARAM_TYPE_INT:
+                   *value = &p->i;
+                   break;
+                case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+                   *value = &p->d;
+                   break;
+                case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+                   *value = p->s;
+                   break;
+               }
+          return EINA_TRUE;
+       }
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_int_get(Evas_Object *obj, const char *part, const char *state, const char *param, int *value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+       {
+          if (p->type != EDJE_EXTERNAL_PARAM_TYPE_INT)
+            return EINA_FALSE;
+          if (value)
+            *value = p->i;
+          return EINA_TRUE;
+       }
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_double_get(Evas_Object *obj, const char *part, const char *state, const char *param, double *value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+       {
+          if (p->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
+            return EINA_FALSE;
+          if (value)
+            *value = p->d;
+          return EINA_TRUE;
+       }
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_string_get(Evas_Object *obj, const char *part, const char *state, const char *param, const char **value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+       {
+          if (p->type != EDJE_EXTERNAL_PARAM_TYPE_STRING)
+            return EINA_FALSE;
+          if (value)
+            *value = p->s;
+          return EINA_TRUE;
+       }
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_set(Evas_Object *obj, const char *part, const char *state, const char *param, Edje_External_Param_Type type, ...)
+{
+   va_list ap;
+   Eina_List *l;
+   Edje_External_Param *p;
+   int found = 0;
+
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   va_start(ap, type);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+       {
+          found = 1;
+          break;
+       }
+
+   if (!found)
+     {
+       p = _alloc(sizeof(Edje_External_Param));
+       if (!p)
+         {
+            va_end(ap);
+            return EINA_FALSE;
+         }
+       p->name = eina_stringshare_add(param);
+     }
+
+   p->type = type;
+   p->i = 0;
+   p->d = 0;
+   _edje_if_string_free(ed, p->s);
+   p->s = NULL;
+
+   switch (type)
+     {
+      case EDJE_EXTERNAL_PARAM_TYPE_INT:
+        p->i = (int)va_arg(ap, int);
+        break;
+      case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+        p->d = (double)va_arg(ap, double);
+        break;
+      case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+        p->s = eina_stringshare_add((const char *)va_arg(ap, char *));
+        break;
+     }
+
+   va_end(ap);
+
+   if (!found)
+     pd->external_params = eina_list_append(pd->external_params, p);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_int_set(Evas_Object *obj, const char *part, const char *state, const char *param, int value)
+{
+   return edje_edit_state_external_param_set(obj, part, state, param, EDJE_EXTERNAL_PARAM_TYPE_INT, value);
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_double_set(Evas_Object *obj, const char *part, const char *state, const char *param, double value)
+{
+   return edje_edit_state_external_param_set(obj, part, state, param, EDJE_EXTERNAL_PARAM_TYPE_DOUBLE, value);
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_string_set(Evas_Object *obj, const char *part, const char *state, const char *param, const char *value)
+{
+   return edje_edit_state_external_param_set(obj, part, state, param, EDJE_EXTERNAL_PARAM_TYPE_STRING, value);
+}
+
 /**************/
 /*  TEXT API */
 /**************/