We can change the focusable state of elm_layout by calling elm_object_focus_allow_set from application side.

This commit is contained in:
WooHyun Jung 2013-07-11 17:47:25 +09:00
parent dbbe13e7ca
commit 27d51db839
2 changed files with 62 additions and 70 deletions

View File

@ -395,7 +395,10 @@ static void
_elm_layout_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
*ret = EINA_TRUE;
if (!elm_widget_can_focus_get(obj))
*ret = EINA_TRUE;
else
*ret = EINA_FALSE;
}
/* WARNING: if you're making a widget *not* supposed to have focusable
* child objects, but still inheriting from elm_layout, just set its
@ -501,7 +504,10 @@ static void
_elm_layout_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
*ret = EINA_TRUE;
if (!elm_widget_can_focus_get(obj))
*ret = EINA_TRUE;
else
*ret = EINA_FALSE;
}
static void

View File

@ -172,6 +172,53 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] =
{NULL, NULL}
};
static void
_obj_mouse_down(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info)
{
ELM_WIDGET_DATA_GET(data, sd);
Evas_Event_Mouse_Down *ev = event_info;
if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
sd->still_in = EINA_TRUE;
}
static void
_obj_mouse_move(void *data,
Evas *e __UNUSED__,
Evas_Object *obj,
void *event_info)
{
ELM_WIDGET_DATA_GET(data, sd);
Evas_Event_Mouse_Move *ev = event_info;
if (sd->still_in)
{
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
sd->still_in = EINA_FALSE;
else
{
Evas_Coord x, y, w, h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
if ((ev->cur.canvas.x < x) || (ev->cur.canvas.y < y) ||
(ev->cur.canvas.x >= (x + w)) || (ev->cur.canvas.y >= (y + h)))
sd->still_in = EINA_FALSE;
}
}
}
static void
_obj_mouse_up(void *data,
Evas *e __UNUSED__,
Evas_Object *obj,
void *event_info __UNUSED__)
{
ELM_WIDGET_DATA_GET(data, sd);
if (sd->still_in)
elm_widget_focus_mouse_up_handle(obj);
sd->still_in = EINA_FALSE;
}
static void
_elm_widget_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
{
@ -184,6 +231,12 @@ _elm_widget_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
elm_widget_can_focus_set(obj, EINA_TRUE);
elm_widget_mirrored_set(obj, elm_config_mirrored_get());
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
_obj_mouse_down, obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
_obj_mouse_move, obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP,
_obj_mouse_up, obj);
/* just a helper for inheriting classes */
if (priv->resize_obj)
{
@ -459,53 +512,6 @@ _elm_widget_focus_direction_manager_is(const Evas_Object *obj)
return manager_is;
}
static void
_obj_mouse_down(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info)
{
ELM_WIDGET_DATA_GET(data, sd);
Evas_Event_Mouse_Down *ev = event_info;
if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
sd->still_in = EINA_TRUE;
}
static void
_obj_mouse_move(void *data,
Evas *e __UNUSED__,
Evas_Object *obj,
void *event_info)
{
ELM_WIDGET_DATA_GET(data, sd);
Evas_Event_Mouse_Move *ev = event_info;
if (sd->still_in)
{
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
sd->still_in = EINA_FALSE;
else
{
Evas_Coord x, y, w, h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
if ((ev->cur.canvas.x < x) || (ev->cur.canvas.y < y) ||
(ev->cur.canvas.x >= (x + w)) || (ev->cur.canvas.y >= (y + h)))
sd->still_in = EINA_FALSE;
}
}
}
static void
_obj_mouse_up(void *data,
Evas *e __UNUSED__,
Evas_Object *obj,
void *event_info __UNUSED__)
{
ELM_WIDGET_DATA_GET(data, sd);
if (sd->still_in)
elm_widget_focus_mouse_up_handle(obj);
sd->still_in = EINA_FALSE;
}
static void
_propagate_x_drag_lock(Evas_Object *obj,
int dir)
@ -1187,19 +1193,7 @@ _elm_widget_resize_object_set(Eo *obj, void *_pd, va_list *list)
}
sd->resize_obj = sobj;
if (!sobj)
{
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_DOWN,
_obj_mouse_down, obj);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_MOVE,
_obj_mouse_move, obj);
evas_object_event_callback_del_full(obj,
EVAS_CALLBACK_MOUSE_UP,
_obj_mouse_up, obj);
return;
}
if (!sobj) return;
// orphan new resize obj
parent = evas_object_data_get(sobj, "elm-parent");
@ -1216,17 +1210,9 @@ _elm_widget_resize_object_set(Eo *obj, void *_pd, va_list *list)
elm_widget_sub_object_del(parent, sobj);
}
}
elm_widget_sub_object_add(obj, sobj);
evas_object_smart_member_add(sobj, obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
_obj_mouse_down, obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
_obj_mouse_move, obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP,
_obj_mouse_up, obj);
_smart_reconfigure(sd);
}