forked from enlightenment/efl
efl_ui_widget: move show_region to legacy
summary_: show_region is simular to focus_region. However, it builds up on setting custom functions per setter to the widget, which are then executed. This can be solved better by overwriting the interest_region getter, and using a function like elm_widget_focus_region_show (This function still needs to find its place in the eo api). ref T7553 Depends on D8025 Reviewers: woohyun, cedric, Jaehyun_Cho, zmike, segfaultxavi Reviewed By: segfaultxavi Subscribers: #reviewers, #committers Tags: #efl Maniphest Tasks: T7553 Reviewed-by: Xavi Artigas <xavierartigas@yahoo.es> Differential Revision: https://phab.enlightenment.org/D8026
This commit is contained in:
parent
b704db8f07
commit
29e6d1d364
|
@ -1342,20 +1342,6 @@ _efl_ui_widget_efl_ui_i18n_mirrored_automatic_set(Eo *obj, Elm_Widget_Smart_Data
|
|||
}
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_widget_on_show_region_hook_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd, void *data, Efl_Ui_Scrollable_On_Show_Region func, Eina_Free_Cb func_free_cb)
|
||||
{
|
||||
if ((sd->on_show_region_data == data) && (sd->on_show_region == func))
|
||||
return;
|
||||
|
||||
if (sd->on_show_region_data && sd->on_show_region_data_free)
|
||||
sd->on_show_region_data_free(sd->on_show_region_data);
|
||||
|
||||
sd->on_show_region = func;
|
||||
sd->on_show_region_data = data;
|
||||
sd->on_show_region_data_free = func_free_cb;
|
||||
}
|
||||
|
||||
/*
|
||||
* @internal
|
||||
*
|
||||
|
@ -2422,66 +2408,6 @@ _efl_ui_widget_disabled_get(const Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd
|
|||
return pd->disabled > 0;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_widget_show_region_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Rect sr, Eina_Bool forceshow)
|
||||
{
|
||||
Evas_Object *parent_obj, *child_obj;
|
||||
Evas_Coord px, py, cx, cy, nx = 0, ny = 0;
|
||||
|
||||
evas_smart_objects_calculate(evas_object_evas_get(obj));
|
||||
|
||||
if (!forceshow && eina_rectangle_equal(&sr.rect, &sd->show_region.rect)) return;
|
||||
|
||||
sd->show_region = sr;
|
||||
if (sd->on_show_region)
|
||||
{
|
||||
sd->on_show_region(sd->on_show_region_data, obj, sr);
|
||||
|
||||
if (_elm_scrollable_is(obj))
|
||||
{
|
||||
if (elm_widget_is_legacy(obj))
|
||||
{
|
||||
elm_interface_scrollable_content_pos_get(obj, &nx, &ny);
|
||||
sr.x -= nx;
|
||||
sr.y -= ny;
|
||||
}
|
||||
else
|
||||
{
|
||||
Eina_Position2D pos;
|
||||
pos = efl_ui_scrollable_content_pos_get(obj);
|
||||
sr.x -= pos.x;
|
||||
sr.y -= pos.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
parent_obj = sd->parent_obj;
|
||||
child_obj = sd->obj;
|
||||
if ((!parent_obj) || (!_elm_widget_is(parent_obj))) break;
|
||||
sd = efl_data_scope_get(parent_obj, MY_CLASS);
|
||||
if (!sd) break;
|
||||
|
||||
evas_object_geometry_get(parent_obj, &px, &py, NULL, NULL);
|
||||
evas_object_geometry_get(child_obj, &cx, &cy, NULL, NULL);
|
||||
|
||||
sr.x += (cx - px);
|
||||
sr.y += (cy - py);
|
||||
sd->show_region = sr;
|
||||
|
||||
if (sd->on_show_region)
|
||||
sd->on_show_region(sd->on_show_region_data, parent_obj, sr);
|
||||
}
|
||||
while (parent_obj);
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Rect
|
||||
_efl_ui_widget_show_region_get(const Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
|
||||
{
|
||||
return (Eina_Rect) sd->show_region;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
|
@ -5481,6 +5407,84 @@ _efl_ui_widget_efl_ui_focus_object_focus_set(Eo *obj, Elm_Widget_Smart_Data *pd,
|
|||
|
||||
/* Legacy APIs */
|
||||
|
||||
EAPI void
|
||||
elm_widget_on_show_region_hook_set(Eo *obj, void *data, Efl_Ui_Scrollable_On_Show_Region func, Eina_Free_Cb func_free_cb)
|
||||
{
|
||||
ELM_WIDGET_DATA_GET(obj, sd);
|
||||
|
||||
if ((sd->on_show_region_data == data) && (sd->on_show_region == func))
|
||||
return;
|
||||
|
||||
if (sd->on_show_region_data && sd->on_show_region_data_free)
|
||||
sd->on_show_region_data_free(sd->on_show_region_data);
|
||||
|
||||
sd->on_show_region = func;
|
||||
sd->on_show_region_data = data;
|
||||
sd->on_show_region_data_free = func_free_cb;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
elm_widget_show_region_set(Eo *obj, Eina_Rect sr, Eina_Bool forceshow)
|
||||
{
|
||||
Evas_Object *parent_obj, *child_obj;
|
||||
Evas_Coord px, py, cx, cy, nx = 0, ny = 0;
|
||||
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, sd);
|
||||
|
||||
evas_smart_objects_calculate(evas_object_evas_get(obj));
|
||||
|
||||
if (!forceshow && eina_rectangle_equal(&sr.rect, &sd->show_region.rect)) return;
|
||||
|
||||
sd->show_region = sr;
|
||||
if (sd->on_show_region)
|
||||
{
|
||||
sd->on_show_region(sd->on_show_region_data, obj, sr);
|
||||
|
||||
if (_elm_scrollable_is(obj))
|
||||
{
|
||||
if (elm_widget_is_legacy(obj))
|
||||
{
|
||||
elm_interface_scrollable_content_pos_get(obj, &nx, &ny);
|
||||
sr.x -= nx;
|
||||
sr.y -= ny;
|
||||
}
|
||||
else
|
||||
{
|
||||
Eina_Position2D pos;
|
||||
pos = efl_ui_scrollable_content_pos_get(obj);
|
||||
sr.x -= pos.x;
|
||||
sr.y -= pos.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
parent_obj = sd->parent_obj;
|
||||
child_obj = sd->obj;
|
||||
if ((!parent_obj) || (!_elm_widget_is(parent_obj))) break;
|
||||
sd = efl_data_scope_get(parent_obj, MY_CLASS);
|
||||
if (!sd) break;
|
||||
|
||||
evas_object_geometry_get(parent_obj, &px, &py, NULL, NULL);
|
||||
evas_object_geometry_get(child_obj, &cx, &cy, NULL, NULL);
|
||||
|
||||
sr.x += (cx - px);
|
||||
sr.y += (cy - py);
|
||||
sd->show_region = sr;
|
||||
|
||||
if (sd->on_show_region)
|
||||
sd->on_show_region(sd->on_show_region_data, parent_obj, sr);
|
||||
}
|
||||
while (parent_obj);
|
||||
}
|
||||
|
||||
EAPI Eina_Rect
|
||||
elm_widget_show_region_get(const Eo *obj)
|
||||
{
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, sd, EINA_RECT_EMPTY());
|
||||
return (Eina_Rect) sd->show_region;
|
||||
}
|
||||
/* elm_object_content_xxx APIs are supposed to work on all objects for which
|
||||
* elm_object_widget_check() returns true. The below checks avoid printing out
|
||||
* undesired ERR messages. */
|
||||
|
|
|
@ -329,43 +329,6 @@ abstract @beta Efl.Ui.Widget extends Efl.Canvas.Group implements Efl.Access.Obje
|
|||
theme or default theme was used.]]
|
||||
}
|
||||
|
||||
/* Scroll API. */
|
||||
@property on_show_region_hook @protected {
|
||||
[[Hook function called when the @.show_region is changed.
|
||||
|
||||
See also @.show_region.
|
||||
]]
|
||||
set {}
|
||||
values {
|
||||
func: Efl.Ui.Scrollable_On_Show_Region @nullable; [[Region hook function]]
|
||||
}
|
||||
}
|
||||
@property show_region @protected {
|
||||
[[Region inside the widget to show.
|
||||
|
||||
See also @.on_show_region_hook.
|
||||
]]
|
||||
set {
|
||||
[[Request parent scrollers to pan around so that this region
|
||||
of the widget becomes visible.
|
||||
|
||||
If $force is $true this will trigger scroller changes and
|
||||
the @.on_show_region_hook to be called even if the region is
|
||||
unchanged.
|
||||
]]
|
||||
values {
|
||||
region: Eina.Rect; [[The region to show.]]
|
||||
force: bool; [[Set to $true to force show even if unchanged.]]
|
||||
}
|
||||
}
|
||||
get {
|
||||
[[Returns the current region to show.]]
|
||||
values {
|
||||
region: Eina.Rect; [[The region to show.]]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: Scroll API. Not sure how those APIs should be exposed with
|
||||
* the new scrollable API. */
|
||||
scroll_hold_push {
|
||||
|
@ -410,9 +373,9 @@ abstract @beta Efl.Ui.Widget extends Efl.Canvas.Group implements Efl.Access.Obje
|
|||
}
|
||||
}
|
||||
@property interest_region_mode {
|
||||
[[Defines how @.show_region should be calculated.
|
||||
[[Defines how @.interest_region should be calculated.
|
||||
|
||||
It is up to the implementation of @.show_region.get to take this
|
||||
It is up to the implementation of @.interest_region.get to take this
|
||||
value into account (or ignore it).
|
||||
]]
|
||||
get {
|
||||
|
|
Loading…
Reference in New Issue