From 44a8c218f0fa84d5e63cbb1985d841aa040af3db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Briano?= Date: Wed, 18 Nov 2009 00:27:49 +0000 Subject: [PATCH] Edje_Edit - Watch for non-shared strings when copying states - Get/Set external parameters SVN revision: 43757 --- legacy/edje/src/lib/Edje_Edit.h | 90 +++++++++++++ legacy/edje/src/lib/edje_edit.c | 225 ++++++++++++++++++++++++++++++-- 2 files changed, 305 insertions(+), 10 deletions(-) diff --git a/legacy/edje/src/lib/Edje_Edit.h b/legacy/edje/src/lib/Edje_Edit.h index cba8124325..e7feb81c12 100644 --- a/legacy/edje/src/lib/Edje_Edit.h +++ b/legacy/edje/src/lib/Edje_Edit.h @@ -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 +); + //@} /******************************************************************************/ diff --git a/legacy/edje/src/lib/edje_edit.c b/legacy/edje/src/lib/edje_edit.c index 711bd892c5..fe04b2905c 100644 --- a/legacy/edje/src/lib/edje_edit.c +++ b/legacy/edje/src/lib/edje_edit.c @@ -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 */ /**************/