Edje: adding support for ignore_flags.

Parts can choose to ignore Events with certain flags in event_flags. The default value is
to accept all events. The syntax for this is specifying in the part:

    ignore_flags: ON_HOLD;

I've tried to update Edje_Edit bits also.


SVN revision: 34170
This commit is contained in:
Caio Marcelo de Oliveira Filho 2008-04-01 21:33:17 +00:00
parent a43c7ca786
commit ea56c61eba
6 changed files with 123 additions and 22 deletions

View File

@ -83,6 +83,7 @@ static void st_collections_group_parts_part_type(void);
static void st_collections_group_parts_part_effect(void);
static void st_collections_group_parts_part_mouse_events(void);
static void st_collections_group_parts_part_repeat_events(void);
static void st_collections_group_parts_part_ignore_flags(void);
static void st_collections_group_parts_part_pointer_mode(void);
static void st_collections_group_parts_part_precise_is_inside(void);
static void st_collections_group_parts_part_use_alternate_font_metrics(void);
@ -222,6 +223,7 @@ New_Statement_Handler statement_handlers[] =
{"collections.group.parts.part.effect", st_collections_group_parts_part_effect},
{"collections.group.parts.part.mouse_events", st_collections_group_parts_part_mouse_events},
{"collections.group.parts.part.repeat_events", st_collections_group_parts_part_repeat_events},
{"collections.group.parts.part.ignore_flags", st_collections_group_parts_part_ignore_flags},
{"collections.group.parts.part.pointer_mode", st_collections_group_parts_part_pointer_mode},
{"collections.group.parts.part.precise_is_inside", st_collections_group_parts_part_precise_is_inside},
{"collections.group.parts.part.use_alternate_font_metrics", st_collections_group_parts_part_use_alternate_font_metrics},
@ -1382,6 +1384,7 @@ st_collections_group_data_item(void)
type: IMAGE;
mouse_events: 1;
repeat_events: 0;
ignore_flags: NONE;
clip_to: "anotherpart";
source: "groupname";
pointer_mode: AUTOGRAB;
@ -1412,6 +1415,7 @@ ob_collections_group_parts_part(void)
ep->type = EDJE_PART_TYPE_IMAGE;
ep->mouse_events = 1;
ep->repeat_events = 0;
ep->ignore_flags = EVAS_EVENT_FLAG_NONE;
ep->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
ep->precise_is_inside = 0;
ep->use_alternate_font_metrics = 0;
@ -1551,6 +1555,37 @@ st_collections_group_parts_part_repeat_events(void)
ep->repeat_events = parse_bool(0);
}
/**
@page edcref
@property
ignore_flags
@parameters
[FLAG] ...
@effect
Specifies whether events with the given flags should be ignored,
i.e., will not have the signals emitted to the parts. Multiple flags
must be separated by spaces, the effect will be ignoring all events
with one of the flags specified. Possible flags:
@li NONE (default value, no event will be ignored)
@li ON_HOLD
@endproperty
*/
static void
st_collections_group_parts_part_ignore_flags(void)
{
Edje_Part_Collection *pc;
Edje_Part *ep;
check_min_arg_count(1);
pc = evas_list_data(evas_list_last(edje_collections));
ep = evas_list_data(evas_list_last(pc->parts));
ep->ignore_flags = parse_flags(0,
"NONE", EVAS_EVENT_FLAG_NONE,
"ON_HOLD", EVAS_EVENT_FLAG_ON_HOLD,
NULL);
}
/**
@page edcref
@property

View File

@ -383,6 +383,22 @@ edje_edit_part_repeat_events_set(
* If set to 0 the events received will not propagate to other parts.*/
);
/**Get ignore_flags for part.*/
EAPI Evas_Event_Flags ///@return event flags ignored
edje_edit_part_ignore_flags_get(
Evas_Object *obj, ///< The edje object
const char *part ///< The name of the part
);
/**Set repeat_events for part. */
EAPI void
edje_edit_part_ignore_flags_set(
Evas_Object *obj, ///< The edje object
const char *part, ///< The name of the part
Evas_Event_Flags ignore_flags ///< event flags to be ignored
);
//@}
/******************************************************************************/
/************************** STATES API ************************************/

View File

@ -34,7 +34,7 @@ _edje_mouse_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
if (!rp) return;
if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return;
_edje_emit(ed, "mouse,in", rp->part->name);
return;
e = NULL;
@ -50,7 +50,7 @@ _edje_mouse_out_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
if (!rp) return;
if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return;
_edje_emit(ed, "mouse,out", rp->part->name);
return;
e = NULL;
@ -63,20 +63,28 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
Edje *ed;
Edje_Real_Part *rp;
char buf[256];
int ignored;
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
if (!rp) return;
if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK)
snprintf(buf, sizeof(buf), "mouse,down,%i,triple", ev->button);
else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
snprintf(buf, sizeof(buf), "mouse,down,%i,double", ev->button);
else
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
ignored = rp->part->ignore_flags & ev->event_flags;
_edje_ref(ed);
_edje_freeze(ed);
_edje_emit(ed, buf, rp->part->name);
if (!ignored)
{
if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK)
snprintf(buf, sizeof(buf), "mouse,down,%i,triple", ev->button);
else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
snprintf(buf, sizeof(buf), "mouse,down,%i,double", ev->button);
else
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
_edje_emit(ed, buf, rp->part->name);
}
if (rp->events_to)
{
@ -101,8 +109,11 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
events->y = ev->canvas.y - y - events->h / 2;
}
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
_edje_emit(ed, buf, events->part->name);
if (!ignored)
{
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
_edje_emit(ed, buf, events->part->name);
}
ed->dirty = 1;
}
_edje_recalc(ed);
@ -123,7 +134,8 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
{
rp->drag.val.x = dx;
rp->drag.val.y = dy;
_edje_emit(ed, "drag", rp->part->name);
if (!ignored)
_edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1;
rp->drag.need_reset = 1;
_edje_recalc(ed);
@ -139,7 +151,8 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->drag.down.x = ev->canvas.x;
if (rp->part->dragable.y)
rp->drag.down.y = ev->canvas.y;
_edje_emit(ed, "drag,start", rp->part->name);
if (!ignored)
_edje_emit(ed, "drag,start", rp->part->name);
}
rp->drag.down.count++;
}
@ -162,22 +175,32 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
Edje *ed;
Edje_Real_Part *rp;
char buf[256];
int ignored;
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
if (!rp) return;
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
ignored = rp->part->ignore_flags & ev->event_flags;
_edje_ref(ed);
_edje_freeze(ed);
_edje_emit(ed, buf, rp->part->name);
if (!ignored)
{
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
_edje_emit(ed, buf, rp->part->name);
}
if (rp->events_to)
{
rp = rp->events_to;
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
_edje_emit(ed, buf, rp->part->name);
if (!ignored)
{
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
_edje_emit(ed, buf, rp->part->name);
}
}
if ((rp->part->dragable.x) || (rp->part->dragable.y))
@ -189,11 +212,12 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
{
rp->drag.need_reset = 1;
ed->dirty = 1;
_edje_emit(ed, "drag,stop", rp->part->name);
if (!ignored)
_edje_emit(ed, "drag,stop", rp->part->name);
}
}
}
if ((rp->still_in) && (rp->clicked_button == ev->button))
if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ignored))
{
snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button);
_edje_emit(ed, buf, rp->part->name);
@ -214,6 +238,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
Evas_Event_Mouse_Move *ev;
Edje *ed;
Edje_Real_Part *rp;
int ignored;
ev = event_info;
ed = data;
@ -221,8 +246,11 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
if (!rp) return;
if (rp->events_to) rp = rp->events_to;
ignored = rp->part->ignore_flags & ev->event_flags;
_edje_ref(ed);
_edje_emit(ed, "mouse,move", rp->part->name);
if (!ignored)
_edje_emit(ed, "mouse,move", rp->part->name);
if (rp->still_in)
{
@ -267,7 +295,8 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
{
rp->drag.val.x = dx;
rp->drag.val.y = dy;
_edje_emit(ed, "drag", rp->part->name);
if (!ignored)
_edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1;
_edje_recalc(ed);
}
@ -290,7 +319,8 @@ _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
if (!rp) return;
if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return;
snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i", ev->direction, (ev->z < 0) ? (-1) : (1));
_edje_emit(ed, buf, rp->part->name);
return;

View File

@ -358,6 +358,7 @@ _edje_edd_setup(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "ignore_flags", ignore_flags, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "pointer_mode", pointer_mode, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "precise_is_inside", precise_is_inside, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "clip_to_id", clip_to_id, EET_T_INT);

View File

@ -921,6 +921,7 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
ep->name = evas_stringshare_add(name);
ep->mouse_events = 1;
ep->repeat_events = 0;
ep->ignore_flags = EVAS_EVENT_FLAG_NONE;
ep->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
ep->precise_is_inside = 0;
ep->use_alternate_font_metrics = 0;
@ -1299,6 +1300,23 @@ edje_edit_part_repeat_events_set(Evas_Object *obj, const char *part, unsigned ch
evas_object_repeat_events_set(rp->object, 0);
}
EAPI Evas_Event_Flags
edje_edit_part_ignore_flags_get(Evas_Object *obj, const char *part)
{
GET_RP_OR_RETURN(0);
return rp->part->ignore_flags;
}
EAPI void
edje_edit_part_ignore_flags_set(Evas_Object *obj, const char *part, Evas_Event_Flags ignore_flags)
{
GET_RP_OR_RETURN();
if (!rp->object) return;
printf("Set ignore_flags for part: %s [%#x]\n", part, ignore_flags);
rp->part->ignore_flags = ignore_flags;
}
EAPI const char *
edje_edit_part_source_get(Evas_Object *obj, const char *part)
{

View File

@ -486,6 +486,7 @@ struct _Edje_Part
unsigned char effect; /* 0 = plain... */
unsigned char mouse_events; /* it will affect/respond to mouse events */
unsigned char repeat_events; /* it will repeat events to objects below */
Evas_Event_Flags ignore_flags;
unsigned char precise_is_inside;
unsigned char use_alternate_font_metrics;
char pointer_mode;