* edje: finally fix everything !

SVN revision: 56286
This commit is contained in:
Cedric BAIL 2011-01-24 13:29:17 +00:00
parent 998ffa4094
commit 45652e5da5
3 changed files with 133 additions and 34 deletions

View File

@ -1493,8 +1493,9 @@ const char * _edje_text_class_font_get(Edje *ed,
int *size, char **free_later); int *size, char **free_later);
Edje_Real_Part *_edje_real_part_get(Edje *ed, const char *part); Edje_Real_Part *_edje_real_part_get(const Edje *ed, const char *part);
Edje_Real_Part *_edje_real_part_recursive_get(Edje *ed, const char *part); Edje_Real_Part *_edje_real_part_recursive_get(const Edje *ed, const char *part);
Edje *_edje_recursive_get(Edje *ed, const char *part, Edje_Real_Part **orp);
Edje_Color_Class *_edje_color_class_find(Edje *ed, const char *color_class); Edje_Color_Class *_edje_color_class_find(Edje *ed, const char *color_class);
void _edje_color_class_member_add(Edje *ed, const char *color_class); void _edje_color_class_member_add(Edje *ed, const char *color_class);
void _edje_color_class_member_del(Edje *ed, const char *color_class); void _edje_color_class_member_del(Edje *ed, const char *color_class);

View File

@ -1008,7 +1008,8 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
*/ */
if (sep) if (sep)
{ {
Edje_Real_Part *rp; Edje_Real_Part *rp = NULL;
Edje *ed2;
char *newsig; char *newsig;
size_t length; size_t length;
char *part; char *part;
@ -1025,24 +1026,20 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
*newsig = '\0'; *newsig = '\0';
newsig++; newsig++;
rp = _edje_real_part_recursive_get(ed, part); ed2 = _edje_recursive_get(ed, part, &rp);
if (rp && rp->part) if (ed2 && ed2 != ed)
{
_edje_emit(ed2, newsig, src);
return; /* stop processing.
* XXX maybe let signal be processed anyway?
* XXX in this case, just comment this line
*/
}
if (rp)
{ {
switch (rp->part->type) switch (rp->part->type)
{ {
case EDJE_PART_TYPE_GROUP:
{
Edje *ed2;
if (!rp->swallowed_object) break ;
ed2 = _edje_fetch(rp->swallowed_object);
if (ed2) _edje_emit(ed2, newsig, src);
return; /* stop processing.
* XXX maybe let signal be processed anyway?
* XXX in this case, just comment this line
*/
}
case EDJE_PART_TYPE_EXTERNAL: case EDJE_PART_TYPE_EXTERNAL:
{ {
if (!rp->swallowed_object) break ; if (!rp->swallowed_object) break ;
@ -1056,6 +1053,17 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
_edje_emit(rp->edje, newsig, src); _edje_emit(rp->edje, newsig, src);
return; return;
} }
case EDJE_PART_TYPE_GROUP:
if (!rp->swallowed_object) break;
ed2 = _edje_fetch(rp->swallowed_object);
if (!ed2) break;
_edje_emit(ed2, newsig, src);
return;
default:
fprintf(stderr, "SPANK SPANK SPANK !!!\nYou should never be here !\n");
break;
} }
} }
} }

View File

@ -37,7 +37,8 @@ static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void
static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source); static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path); Edje_Real_Part *_edje_real_part_recursive_get_helper(const Edje *ed, char **path);
static Edje *_edje_recursive_get_helper(Edje *ed, char **path, Edje_Real_Part **orp);
/************************** API Routines **************************/ /************************** API Routines **************************/
@ -4357,7 +4358,7 @@ _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
} }
Edje_Real_Part * Edje_Real_Part *
_edje_real_part_recursive_get(Edje *ed, const char *part) _edje_real_part_recursive_get(const Edje *ed, const char *part)
{ {
Edje_Real_Part *rp; Edje_Real_Part *rp;
char **path; char **path;
@ -4373,6 +4374,23 @@ _edje_real_part_recursive_get(Edje *ed, const char *part)
return rp; return rp;
} }
Edje *
_edje_recursive_get(Edje *ed, const char *part, Edje_Real_Part **orp)
{
Edje *oed;
char **path;
path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
if (!path) return NULL;
//printf("recursive get: %s\n", part);
oed = _edje_recursive_get_helper(ed, path, orp);
free(*path);
free(path);
return oed;
}
Evas_Object * Evas_Object *
_edje_children_get(Edje_Real_Part *rp, const char *partid) _edje_children_get(Edje_Real_Part *rp, const char *partid)
{ {
@ -4422,16 +4440,22 @@ _edje_children_get(Edje_Real_Part *rp, const char *partid)
} }
Edje_Real_Part * Edje_Real_Part *
_edje_real_part_recursive_get_helper(Edje *ed, char **path) _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
{ {
Edje_Real_Part *rp; Edje_Real_Part *rp;
Evas_Object *child; Evas_Object *child;
const char *alias = NULL; const char *alias = NULL;
char *idx = NULL; char *idx = NULL;
if (ed->collection && ed->collection->alias)
alias = eina_hash_find(ed->collection->alias, path[0]);
if (!alias)
alias = path[0];
//printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-"); //printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
if (path[0]) if (alias)
idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL); idx = strchr(alias, EDJE_PART_PATH_SEPARATOR_INDEXL);
if (idx) if (idx)
{ {
char *end; char *end;
@ -4445,18 +4469,16 @@ _edje_real_part_recursive_get_helper(Edje *ed, char **path)
} }
} }
if (ed->collection && ed->collection->alias) if (alias != path[0])
alias = eina_hash_find(ed->collection->alias, path[0]);
if (alias)
{ {
rp = _edje_real_part_recursive_get(ed, alias); rp = _edje_real_part_recursive_get(ed, alias);
if (!path[1]) return rp; if (!path[1] && !idx) return rp;
if (!rp) return NULL; if (!rp) return NULL;
} }
else else
{ {
rp = _edje_real_part_get(ed, path[0]); rp = _edje_real_part_get(ed, path[0]);
if (!path[1]) return rp; if (!path[1] && !idx) return rp;
if (!rp) return NULL; if (!rp) return NULL;
} }
@ -4478,20 +4500,88 @@ _edje_real_part_recursive_get_helper(Edje *ed, char **path)
ed = _edje_fetch(child); ed = _edje_fetch(child);
if (!ed) return NULL; if (!ed) return NULL;
if ((rp = _edje_real_part_recursive_get_helper(ed, path))) return _edje_real_part_recursive_get_helper(ed, path);
return rp;
return NULL;
default: default:
return NULL; return NULL;
} }
} }
/* Private Routines */ /* Private Routines */
static Edje *
_edje_recursive_get_helper(Edje *ed, char **path, Edje_Real_Part **orp)
{
Evas_Object *child;
Edje_Real_Part *rp;
const char *alias = NULL;
char *idx = NULL;
if (ed->collection && ed->collection->alias)
alias = eina_hash_find(ed->collection->alias, path[0]);
if (!alias)
alias = path[0];
//printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
if (alias)
idx = strchr(alias, EDJE_PART_PATH_SEPARATOR_INDEXL);
if (idx)
{
char *end;
end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
if (end)
{
*end = '\0';
*idx = '\0';
idx++;
}
}
if (alias != path[0])
rp = _edje_real_part_recursive_get(ed, alias);
else
rp = _edje_real_part_get(ed, path[0]);
if (!rp) return NULL;
if (!path[1] && !idx)
{
*orp = rp;
return rp->edje;
}
switch (rp->part->type)
{
case EDJE_PART_TYPE_GROUP:
if (!rp->swallowed_object) return NULL;
ed = _edje_fetch(rp->swallowed_object);
if (!ed) return NULL;
path++;
if (!path[0]) return ed;
return _edje_recursive_get_helper(ed, path, orp);
case EDJE_PART_TYPE_BOX:
case EDJE_PART_TYPE_TABLE:
case EDJE_PART_TYPE_EXTERNAL:
if (!idx)
{
*orp = rp;
return NULL;
}
path++;
child = _edje_children_get(rp, idx);
ed = _edje_fetch(child);
if (!ed) return NULL;
if (!path[0]) return ed;
return _edje_recursive_get_helper(ed, path, orp);
default:
return NULL;
}
}
Edje_Real_Part * Edje_Real_Part *
_edje_real_part_get(Edje *ed, const char *part) _edje_real_part_get(const Edje *ed, const char *part)
{ {
unsigned int i; unsigned int i;