edje: implement per part limit.

SVN revision: 72767
This commit is contained in:
Cedric BAIL 2012-06-24 13:23:37 +00:00
parent 2804dcfe88
commit b5c65a71d2
6 changed files with 142 additions and 4 deletions

View File

@ -490,14 +490,18 @@
* Add edje_object_access_part_list_get and acess flags in edc file.
2012-05-21 Carsten Haitzler (The Rasterman)
2012-06-21 Carsten Haitzler (The Rasterman)
* Improve edje_cc slightly to use prefix for full path to
embryo_cc. this still like before requires embryo and edje to share
the same install prefix for edje_cc to work.
2012-06-12 Michael Bouchaud (yoz)
2012-06-12 Michael Bouchaud (yoz)
* The aliases are now inherited from the targeted group
* Aliases can be usable with edje programs, if the part is in the
group
2012-06-24 Cedric Bail
* Emit signal for flagged part when their size get to zero.

View File

@ -10,6 +10,7 @@ Additions:
* Add SPACER part. This part are not putting anything into the canvas. So lighter and faster to
process (Use it to replace RECT part that are never visible and never catch any event).
* Add accessibility flags and API to retrieve the relevant part.
* Emit signal when flagged part size get to zero.
Improvements:
* Allocate once and reuse Evas_Map.

View File

@ -171,6 +171,7 @@ static void st_collections_group_parts_part_description_inherit(void);
static void st_collections_group_parts_part_description_source(void);
static void st_collections_group_parts_part_description_state(void);
static void st_collections_group_parts_part_description_visible(void);
static void st_collections_group_parts_part_description_limit(void);
static void st_collections_group_parts_part_description_align(void);
static void st_collections_group_parts_part_description_fixed(void);
static void st_collections_group_parts_part_description_min(void);
@ -436,6 +437,7 @@ New_Statement_Handler statement_handlers[] =
{"collections.group.parts.part.description.source", st_collections_group_parts_part_description_source},
{"collections.group.parts.part.description.state", st_collections_group_parts_part_description_state},
{"collections.group.parts.part.description.visible", st_collections_group_parts_part_description_visible},
{"collections.group.parts.part.description.limit", st_collections_group_parts_part_description_limit},
{"collections.group.parts.part.description.align", st_collections_group_parts_part_description_align},
{"collections.group.parts.part.description.fixed", st_collections_group_parts_part_description_fixed},
{"collections.group.parts.part.description.min", st_collections_group_parts_part_description_min},
@ -2258,7 +2260,6 @@ st_collections_group_inherit(void)
Edje_Pack_Element_Parser *pitem;
Edje_Part_Description_Common *ed, *ed2;
Edje_List_Foreach_Data fdata;
Edje_String *es;
Eina_List *l;
char *parent_name;
unsigned int i, j;
@ -4260,6 +4261,7 @@ ob_collections_group_parts_part_description(void)
}
ed->visible = 1;
ed->limit = 0;
ed->align.x = FROM_DOUBLE(0.5);
ed->align.y = FROM_DOUBLE(0.5);
ed->min.w = 0;
@ -4673,6 +4675,42 @@ st_collections_group_parts_part_description_visible(void)
current_desc->visible = parse_bool(0);
}
/**
@page edcref
@property
limit
@parameters
[NONE, WIDTH, HEIGHT or BOTH]
@effect
Emit a signal when the part size change from zero or to a zero size
('limit,width,over', 'limit,width,zero'). By default no signal are
emitted.
@endproperty
*/
static void
st_collections_group_parts_part_description_limit(void)
{
check_arg_count(1);
current_desc->limit = parse_enum(0,
"NONE", 0,
"WIDTH", 1,
"HEIGHT", 2,
"BOTH", 3);
if (current_desc->limit)
{
Edje_Part_Collection *pc;
int count;
pc = eina_list_data_get(eina_list_last(edje_collections));
count = pc->limits.parts_count++;
pc->limits.parts = realloc(pc->limits.parts,
pc->limits.parts_count * sizeof (Edje_Part_Limit));
data_queue_part_lookup(pc, current_part->name,
&(pc->limits.parts[count].part));
}
}
/**
@page edcref

View File

@ -667,6 +667,79 @@ _edje_recalc_do(Edje *ed)
edje_object_size_min_calc(ed->obj, &w, &h);
evas_object_size_hint_min_set(ed->obj, w, h);
}
if (!ed->collection) return ;
for (i = 0; i < ed->collection->limits.parts_count; i++)
{
const char *name;
unsigned char limit;
int part;
name = ed->collection->parts[i]->name;
part = ed->collection->limits.parts[i].part;
limit = ed->table_parts[part]->chosen_description->limit;
switch (limit)
{
case 0:
ed->collection->limits.parts[i].width = 2;
ed->collection->limits.parts[i].height = 2;
break;
case 1:
ed->collection->limits.parts[i].height = 2;
break;
case 2:
ed->collection->limits.parts[i].width = 2;
break;
case 3:
break;
}
if (limit | 1)
{
if (ed->table_parts[part]->w > 0 &&
(ed->collection->limits.parts[i].width <= 0 ||
ed->collection->limits.parts[i].width == 2))
{
ed->collection->limits.parts[i].width = 1;
_edje_emit(ed, "limit,width,over", name);
}
else if (ed->table_parts[part]->w < 0 &&
ed->collection->limits.parts[i].width >= 0)
{
ed->collection->limits.parts[i].width = -1;
_edje_emit(ed, "limit,width,below", name);
}
else if (ed->table_parts[part]->w == 0 &&
ed->collection->limits.parts[i].width != 0)
{
ed->collection->limits.parts[i].width = 0;
_edje_emit(ed, "limit,width,zero", name);
}
}
if (limit | 2)
{
if (ed->table_parts[part]->h > 0 &&
(ed->collection->limits.parts[i].height <= 0 ||
ed->collection->limits.parts[i].height == 2))
{
ed->collection->limits.parts[i].height = 1;
_edje_emit(ed, "limit,height,over", name);
}
else if (ed->table_parts[part]->h < 0 &&
ed->collection->limits.parts[i].height >= 0)
{
ed->collection->limits.parts[i].height = -1;
_edje_emit(ed, "limit,height,beloh", name);
}
else if (ed->table_parts[part]->h == 0 &&
ed->collection->limits.parts[i].height != 0)
{
ed->collection->limits.parts[i].height = 0;
_edje_emit(ed, "limit,height,zero", name);
}
}
}
}
void

View File

@ -55,6 +55,7 @@ Eet_Data_Descriptor *_edje_edd_edje_part_description_external_pointer = NULL;
Eet_Data_Descriptor *_edje_edd_edje_part_image_id = NULL;
Eet_Data_Descriptor *_edje_edd_edje_part_image_id_pointer = NULL;
Eet_Data_Descriptor *_edje_edd_edje_external_param = NULL;
Eet_Data_Descriptor *_edje_edd_edje_part_limit = NULL;
#define EMP(Type, Minus) \
Eina_Mempool *_emp_##Type = NULL; \
@ -218,6 +219,7 @@ _edje_edd_shutdown(void)
FREED(_edje_edd_edje_external_param);
FREED(_edje_edd_edje_image_directory_set);
FREED(_edje_edd_edje_image_directory_set_entry);
FREED(_edje_edd_edje_part_limit);
}
#define EDJE_DEFINE_POINTER_TYPE(Type, Name) \
@ -454,6 +456,7 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.name", state.name, EET_T_STRING); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.value", state.value, EET_T_DOUBLE); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "visible", visible, EET_T_CHAR); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "limit", limit, EET_T_CHAR); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "align.x", align.x, EDJE_T_FLOAT); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "align.y", align.y, EDJE_T_FLOAT); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "fixed.w", fixed.w, EET_T_UCHAR); \
@ -867,6 +870,11 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "api.name", api.name, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "api.description", api.description, EET_T_STRING);
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Limit);
_edje_edd_edje_part_limit = eet_data_descriptor_file_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_limit, Edje_Part_Limit, "part", part, EET_T_INT);
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Collection);
_edje_edd_edje_part_collection =
eet_data_descriptor_file_new(&eddc);
@ -884,6 +892,7 @@ _edje_edd_init(void)
EDJE_DEFINE_POINTER_TYPE(Limit, limit);
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_part_collection, Edje_Part_Collection, "limits.vertical", limits.vertical, _edje_edd_edje_limit_pointer);
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_part_collection, Edje_Part_Collection, "limits.horizontal", limits.horizontal, _edje_edd_edje_limit_pointer);
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_part_collection, Edje_Part_Collection, "limits.parts", limits.parts, _edje_edd_edje_part_limit);
EET_DATA_DESCRIPTOR_ADD_HASH(_edje_edd_edje_part_collection, Edje_Part_Collection, "data", data, _edje_edd_edje_string);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "id", id, EET_T_INT);

View File

@ -195,7 +195,7 @@ struct _Edje_Smart_Api
/* increment this when you add new feature to edje file format without
* breaking backward compatibility.
*/
#define EDJE_FILE_MINOR 3
#define EDJE_FILE_MINOR 4
/* FIXME:
*
@ -321,6 +321,7 @@ typedef struct _Edje_Part_Description_Spec_Box Edje_Part_Description_Spec_
typedef struct _Edje_Part_Description_Spec_Table Edje_Part_Description_Spec_Table;
typedef struct _Edje_Patterns Edje_Patterns;
typedef struct _Edje_Part_Box_Animation Edje_Part_Box_Animation;
typedef struct _Edje_Part_Limit Edje_Part_Limit;
typedef struct _Edje Edje;
typedef struct _Edje_Real_Part_State Edje_Real_Part_State;
@ -726,6 +727,14 @@ struct _Edje_Pack_Element
unsigned short colspan, rowspan;
};
struct _Edje_Part_Limit
{
int part;
signed char width; /* -1, 0 or 1 */
signed char height; /* -1, 0, or 1 */
};
/*----------*/
struct _Edje_Part_Collection
@ -753,6 +762,9 @@ struct _Edje_Part_Collection
Edje_Limit **horizontal;
unsigned int horizontal_count;
Edje_Part_Limit *parts;
unsigned int parts_count;
} limits;
Edje_Part **parts; /* an array of Edje_Part */
@ -914,6 +926,7 @@ struct _Edje_Part_Description_Common
} persp;
unsigned char visible; /* is it shown */
unsigned char limit; /* 0 == no, 1 = width, 2 = height, 3 = both */
};
struct _Edje_Part_Description_Spec_Fill