* edje: Add more focus event in edje. A start for a focus layout work.

SVN revision: 46389
This commit is contained in:
Cedric BAIL 2010-02-23 13:39:19 +00:00
parent 7fcbff0e0e
commit 51de26862a
8 changed files with 147 additions and 33 deletions

View File

@ -6520,6 +6520,7 @@ st_collections_group_programs_program_action(void)
"SCRIPT", EDJE_ACTION_TYPE_SCRIPT,
"LUA_SCRIPT", EDJE_ACTION_TYPE_LUA_SCRIPT,
"FOCUS_SET", EDJE_ACTION_TYPE_FOCUS_SET,
"FOCUS_OBJECT", EDJE_ACTION_TYPE_FOCUS_OBJECT,
NULL);
if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
{
@ -6546,7 +6547,7 @@ st_collections_group_programs_program_action(void)
ep->value = parse_float(1);
ep->value2 = parse_float(2);
}
switch (ep->action)
{
case EDJE_ACTION_TYPE_ACTION_STOP:
@ -6560,6 +6561,7 @@ st_collections_group_programs_program_action(void)
/* this is implicitly set by lua_script {} so this is here just for
* completeness */
break;
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
case EDJE_ACTION_TYPE_FOCUS_SET:
check_arg_count(1);
break;

View File

@ -125,7 +125,8 @@ typedef enum _Edje_Action_Type
EDJE_ACTION_TYPE_SCRIPT = 7,
EDJE_ACTION_TYPE_FOCUS_SET = 8,
EDJE_ACTION_TYPE_LUA_SCRIPT = 9,
EDJE_ACTION_TYPE_LAST = 10
EDJE_ACTION_TYPE_FOCUS_OBJECT = 10,
EDJE_ACTION_TYPE_LAST = 11
} Edje_Action_Type;
typedef enum _Edje_Tween_Mode

View File

@ -23,6 +23,38 @@ _edje_hold_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
e = NULL;
}
void
_edje_focus_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
{
Edje *ed;
Edje_Real_Part *rp;
ed = data;
rp = evas_object_data_get(obj, "real_part");
if ((!rp) || (!ed))
return;
_edje_emit(ed, "focus,part,in", rp->part->name);
return;
e = NULL;
}
void
_edje_focus_out_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
{
Edje *ed;
Edje_Real_Part *rp;
ed = data;
rp = evas_object_data_get(obj, "real_part");
if ((!rp) || (!ed))
return;
_edje_emit(ed, "focus,part,out", rp->part->name);
return;
e = NULL;
}
void
_edje_mouse_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
{
@ -466,28 +498,62 @@ _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
}
void
_edje_callbacks_del(Evas_Object *obj)
_edje_callbacks_del(Evas_Object *obj, Edje *ed)
{
evas_object_event_callback_del(obj,
EVAS_CALLBACK_HOLD,
_edje_hold_cb);
evas_object_event_callback_del(obj,
EVAS_CALLBACK_MOUSE_IN,
_edje_mouse_in_cb);
evas_object_event_callback_del(obj,
EVAS_CALLBACK_MOUSE_OUT,
_edje_mouse_out_cb);
evas_object_event_callback_del(obj,
EVAS_CALLBACK_MOUSE_DOWN,
_edje_mouse_down_cb);
evas_object_event_callback_del(obj,
EVAS_CALLBACK_MOUSE_UP,
_edje_mouse_up_cb);
evas_object_event_callback_del(obj,
EVAS_CALLBACK_MOUSE_MOVE,
_edje_mouse_move_cb);
evas_object_event_callback_del(obj,
EVAS_CALLBACK_MOUSE_WHEEL,
_edje_mouse_wheel_cb);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_HOLD,
_edje_hold_cb,
ed);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_IN,
_edje_mouse_in_cb,
ed);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_OUT,
_edje_mouse_out_cb,
ed);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_DOWN,
_edje_mouse_down_cb,
ed);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_UP,
_edje_mouse_up_cb,
ed);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_MOVE,
_edje_mouse_move_cb,
ed);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_WHEEL,
_edje_mouse_wheel_cb,
ed);
evas_object_data_del(obj, "real_part");
}
void
_edje_callbacks_focus_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
{
evas_object_event_callback_add(obj,
EVAS_CALLBACK_FOCUS_IN,
_edje_focus_in_cb,
ed);
evas_object_event_callback_add(obj,
EVAS_CALLBACK_FOCUS_OUT,
_edje_focus_out_cb,
ed);
evas_object_data_set(obj, "real_part", rp);
}
void
_edje_callbacks_focus_del(Evas_Object *obj, Edje *ed)
{
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_FOCUS_IN,
_edje_focus_in_cb,
ed);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_FOCUS_OUT,
_edje_focus_out_cb,
ed);
}

View File

@ -172,7 +172,7 @@ _edje_real_part_free(Edje_Real_Part *rp)
if (rp->object)
{
_edje_callbacks_del(rp->object);
_edje_callbacks_del(rp->object, rp->edje);
evas_object_del(rp->object);
}
@ -185,7 +185,7 @@ _edje_real_part_free(Edje_Real_Part *rp)
evas_object_clip_unset(rp->swallowed_object);
evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
if (rp->part->mouse_events)
_edje_callbacks_del(rp->swallowed_object);
_edje_callbacks_del(rp->swallowed_object, rp->edje);
if (rp->part->type == EDJE_PART_TYPE_GROUP ||
rp->part->type == EDJE_PART_TYPE_EXTERNAL)
@ -2148,7 +2148,7 @@ edje_edit_part_mouse_events_set(Evas_Object *obj, const char *part, Eina_Bool mo
else
{
evas_object_pass_events_set(rp->object, 1);
_edje_callbacks_del(rp->object);
_edje_callbacks_del(rp->object, ed);
}
}

View File

@ -414,6 +414,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
evas_object_color_set(rp->object, 0, 0, 0, 0);
evas_object_pass_events_set(rp->object, 1);
evas_object_pointer_mode_set(rp->object, EVAS_OBJECT_POINTER_MODE_NOGRAB);
_edje_callbacks_focus_add(rp->object, ed, rp);
break;
case EDJE_PART_TYPE_TEXTBLOCK:
rp->object = evas_object_textblock_add(ed->evas);
@ -680,7 +681,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
group_path = eina_list_remove(group_path, group_path_entry);
eina_stringshare_del(group_path_entry);
edje_object_signal_callback_add(child_obj, "*", "*", _cb_signal_repeat, obj);
if (rp->part->type == EDJE_PART_TYPE_GROUP)
{
@ -852,7 +853,8 @@ _edje_file_del(Edje *ed)
_edje_entry_real_part_shutdown(rp);
if (rp->object)
{
_edje_callbacks_del(rp->object);
_edje_callbacks_del(rp->object, ed);
_edje_callbacks_focus_del(rp->object, ed);
evas_object_del(rp->object);
}
if (rp->swallowed_object)

View File

@ -1229,7 +1229,9 @@ void _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void *event_
int _edje_timer_cb(void *data);
int _edje_pending_timer_cb(void *data);
void _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp);
void _edje_callbacks_del(Evas_Object *obj);
void _edje_callbacks_focus_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp);
void _edje_callbacks_del(Evas_Object *obj, Edje *ed);
void _edje_callbacks_focus_del(Evas_Object *obj, Edje *ed);
void _edje_edd_init(void);
void _edje_edd_shutdown(void);

View File

@ -882,7 +882,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
}
else
{
EINA_LIST_FOREACH(pr->targets, l, pt)
EINA_LIST_FOREACH(pr->targets, l, pt)
{
if (pt->id >= 0)
{
@ -903,6 +903,44 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
}
}
}
else if (pr->action == EDJE_ACTION_TYPE_FOCUS_OBJECT)
{
if (!pr->targets)
{
Evas_Object *focused;
focused = evas_focus_get(evas_object_evas_get(ed->obj));
if (focused)
{
int i;
/* Check if the current swallowed object is one of my child. */
for (i = 0; i < ed->table_parts_size; ++i)
{
rp = ed->table_parts[i];
if (rp && rp->swallowed_object == focused)
{
evas_object_focus_set(focused, EINA_FALSE);
break;
}
}
}
}
else
{
EINA_LIST_FOREACH(pr->targets, l, pt)
{
if (pt->id >= 0)
{
rp = ed->table_parts[pt->id % ed->table_parts_size];
if (rp && rp->swallowed_object)
{
evas_object_focus_set(rp->swallowed_object, EINA_TRUE);
}
}
}
}
}
else
{
// _edje_emit(ed, "program,start", pr->name);

View File

@ -2406,7 +2406,8 @@ edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow
evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
if (rp->part->mouse_events)
_edje_callbacks_del(rp->swallowed_object);
_edje_callbacks_del(rp->swallowed_object, rp->edje);
_edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
rp->swallowed_object = NULL;
rp->swallow_params.min.w = 0;
@ -4453,6 +4454,7 @@ _edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow)
}
else
evas_object_pass_events_set(obj_swallow, 1);
_edje_callbacks_focus_add(rp->swallowed_object, rp->edje, rp);
if (rp->part->precise_is_inside)
evas_object_precise_is_inside_set(obj_swallow, 1);
@ -4476,7 +4478,8 @@ _edje_real_part_swallow_clear(Edje_Real_Part *rp)
evas_object_clip_unset(rp->swallowed_object);
evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
if (rp->part->mouse_events)
_edje_callbacks_del(rp->swallowed_object);
_edje_callbacks_del(rp->swallowed_object, rp->edje);
_edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
}
static void