elm: Fixed on_focus_region() issue. Focused area should be scrolled only when it is needed. Now only entry needs this feature.

SVN revision: 78111
This commit is contained in:
Daniel Juyung Seo 2012-10-17 10:09:52 +00:00
parent 3721aab314
commit 5b7785ccea
3 changed files with 32 additions and 20 deletions

View File

@ -868,7 +868,7 @@ _elm_entry_smart_translate(Evas_Object *obj)
return EINA_TRUE;
}
static void
static Eina_Bool
_elm_entry_smart_on_focus_region(const Evas_Object *obj,
Evas_Coord *x,
Evas_Coord *y,
@ -879,6 +879,7 @@ _elm_entry_smart_on_focus_region(const Evas_Object *obj,
edje_object_part_text_cursor_geometry_get
(sd->entry_edje, "elm.text", x, y, w, h);
return EINA_TRUE;
}
static void

View File

@ -97,16 +97,16 @@ _elm_widget_theme_func(Evas_Object *obj)
return EINA_TRUE;
}
static void
_elm_widget_on_focus_region_func(const Evas_Object *obj,
Evas_Coord *x,
Evas_Coord *y,
Evas_Coord *w,
Evas_Coord *h)
static Eina_Bool
_elm_widget_on_focus_region_func_unimplemented(const Evas_Object *obj __UNUSED__,
Evas_Coord *x __UNUSED__,
Evas_Coord *y __UNUSED__,
Evas_Coord *w __UNUSED__,
Evas_Coord *h __UNUSED__)
{
evas_object_geometry_get(obj, NULL, NULL, w, h);
if (x) *x = 0;
if (y) *y = 0;
WRN("The %s widget does not implement the \"on_focus_region\" function.",
elm_widget_type_get(obj));
return EINA_FALSE;
}
static Eina_Bool
@ -720,7 +720,7 @@ _elm_widget_smart_set(Elm_Widget_Smart_Class *api)
API_DEFAULT_SET_UNIMPLEMENTED(disable);
API_DEFAULT_SET(theme);
API_DEFAULT_SET(on_focus_region);
API_DEFAULT_SET_UNIMPLEMENTED(on_focus_region);
API_DEFAULT_SET_UNIMPLEMENTED(translate);
API_DEFAULT_SET_UNIMPLEMENTED(event);
@ -883,6 +883,10 @@ _propagate_event(void *data,
elm_widget_event_propagate(obj, type, event_info, event_flags);
}
/**
* If elm_widget_focus_region_get() returns EINA_FALSE, this function will
* ignore region show action.
*/
static void
_elm_widget_focus_region_show(const Evas_Object *obj)
{
@ -894,7 +898,9 @@ _elm_widget_focus_region_show(const Evas_Object *obj)
o = elm_widget_parent_get(obj);
if (!o) return;
elm_widget_focus_region_get(obj, &x, &y, &w, &h);
if (!elm_widget_focus_region_get(obj, &x, &y, &w, &h))
return;
evas_object_geometry_get(obj, &ox, &oy, NULL, NULL);
while (o)
@ -907,7 +913,11 @@ _elm_widget_focus_region_show(const Evas_Object *obj)
s_iface->content_region_show(o, x, y, w, h);
elm_widget_focus_region_get(o, &x, &y, &w, &h);
if (!elm_widget_focus_region_get(o, &x, &y, &w, &h))
{
o = elm_widget_parent_get(o);
continue;
}
}
else
{
@ -2775,12 +2785,13 @@ elm_widget_show_region_get(const Evas_Object *obj,
*
* Get the focus region of the given widget.
*
* @return show region or not
* (@c EINA_TRUE = show region/@c EINA_FALSE = do not show region). Default is @c EINA_FALSE.
*
* The focus region is the area of a widget that should brought into the
* visible area when the widget is focused. Mostly used to show the part of
* an entry where the cursor is, for example. The area returned is relative
* to the object @p obj.
* If the @p obj doesn't have the proper on_focus_region_hook set, this
* function will return the full size of the object.
*
* @param obj The widget object
* @param x Where to store the x coordinate of the area
@ -2790,7 +2801,7 @@ elm_widget_show_region_get(const Evas_Object *obj,
*
* @ingroup Widget
*/
EAPI void
EAPI Eina_Bool
elm_widget_focus_region_get(const Evas_Object *obj,
Evas_Coord *x,
Evas_Coord *y,
@ -2802,12 +2813,12 @@ elm_widget_focus_region_get(const Evas_Object *obj,
evas_object_geometry_get(obj, NULL, NULL, w, h);
if (x) *x = 0;
if (y) *y = 0;
return;
return EINA_FALSE;
}
ELM_WIDGET_DATA_GET(obj, sd);
sd->api->on_focus_region(obj, x, y, w, h);
return sd->api->on_focus_region(obj, x, y, w, h);
}
EAPI Eina_List *

View File

@ -422,7 +422,7 @@ typedef struct _Elm_Widget_Smart_Class
Evas_Object *source,
Evas_Callback_Type type,
void *event_info); /**< 'Virtual' function handling input events on the widget */
void (*on_focus_region)(const Evas_Object *obj,
Eina_Bool (*on_focus_region)(const Evas_Object *obj,
Evas_Coord *x,
Evas_Coord *y,
Evas_Coord *w,
@ -715,7 +715,7 @@ EAPI void elm_widget_disabled_set(Evas_Object *obj, Eina_Bool disabl
EAPI Eina_Bool elm_widget_disabled_get(const Evas_Object *obj);
EAPI void elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Eina_Bool forceshow);
EAPI void elm_widget_show_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI void elm_widget_focus_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI Eina_Bool elm_widget_focus_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI void elm_widget_scroll_hold_push(Evas_Object *obj);
EAPI void elm_widget_scroll_hold_pop(Evas_Object *obj);
EAPI int elm_widget_scroll_hold_get(const Evas_Object *obj);