Welcome a new smart callback for scrollables -- page,changed.

This commit is contained in:
Flavio Ceolin 2013-05-15 18:56:04 -03:00 committed by Gustavo Lima Chaves
parent f296eed13e
commit d53cc519ff
6 changed files with 101 additions and 6 deletions

View File

@ -55,6 +55,7 @@ static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
static const char SIG_SCROLL_PAGE_CHANGE[] = "scroll,page,changed";
static const char SIG_EDGE_TOP[] = "edge,top";
static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
static const char SIG_EDGE_LEFT[] = "edge,left";
@ -97,6 +98,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
{SIG_LANG_CHANGED, ""},
{SIG_PRESSED, ""},
{SIG_RELEASED, ""},
{SIG_SCROLL_PAGE_CHANGE, ""},
{NULL, NULL}
};
@ -2157,6 +2159,13 @@ _edge_bottom_cb(Evas_Object *obj,
evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
}
static void
_scroll_page_change_cb(Evas_Object *obj,
void *data __UNUSED__)
{
evas_object_smart_callback_call(obj, SIG_SCROLL_PAGE_CHANGE, NULL);
}
static void
_scroll_cb(Evas_Object *obj,
void *data __UNUSED__)
@ -2432,7 +2441,8 @@ _elm_gengrid_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
eo_do(obj, elm_scrollable_interface_bounce_allow_set(bounce, bounce));
eo_do(obj,
elm_scrollable_interface_animate_start_cb_set(_scroll_animate_start_cb),
elm_scrollable_interface_animate_start_cb_set
(_scroll_animate_start_cb),
elm_scrollable_interface_animate_stop_cb_set(_scroll_animate_stop_cb),
elm_scrollable_interface_drag_start_cb_set(_scroll_drag_start_cb),
elm_scrollable_interface_drag_stop_cb_set(_scroll_drag_stop_cb),
@ -2440,7 +2450,8 @@ _elm_gengrid_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
elm_scrollable_interface_edge_right_cb_set(_edge_right_cb),
elm_scrollable_interface_edge_top_cb_set(_edge_top_cb),
elm_scrollable_interface_edge_bottom_cb_set(_edge_bottom_cb),
elm_scrollable_interface_scroll_cb_set(_scroll_cb));
elm_scrollable_interface_scroll_cb_set(_scroll_cb),
elm_scrollable_interface_page_change_cb_set(_scroll_page_change_cb));
priv->align_x = 0.5;
priv->align_y = 0.5;

View File

@ -209,6 +209,8 @@
* started.
* - @c "scroll,drag,stop" - called when dragging the content has
* stopped.
* - @c "scroll,page,changed" - called when the visible page has
* changed.
* - @c "edge,top" - This is called when the gengrid is scrolled until
* the top edge.
* - @c "edge,bottom" - This is called when the gengrid is scrolled

View File

@ -958,6 +958,9 @@ _elm_scroll_scroll_bar_read_and_update(
static void
_elm_scroll_drag_start(Elm_Scrollable_Smart_Interface_Data *sid)
{
sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
if (sid->cb_func.drag_start)
sid->cb_func.drag_start(sid->obj, NULL);
}
@ -965,6 +968,18 @@ _elm_scroll_drag_start(Elm_Scrollable_Smart_Interface_Data *sid)
static void
_elm_scroll_drag_stop(Elm_Scrollable_Smart_Interface_Data *sid)
{
Evas_Coord x, y;
if (!(sid->down.bounce_x_animator) && !(sid->down.bounce_y_animator) &&
!(sid->scrollto.x.animator) && !(sid->scrollto.y.animator))
{
x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
if (sid->cb_func.page_change &&
((x != sid->current_page.x) || (y != sid->current_page.y)))
sid->cb_func.page_change(sid->obj, NULL);
}
if (sid->cb_func.drag_stop)
sid->cb_func.drag_stop(sid->obj, NULL);
}
@ -979,6 +994,16 @@ _elm_scroll_anim_start(Elm_Scrollable_Smart_Interface_Data *sid)
static void
_elm_scroll_anim_stop(Elm_Scrollable_Smart_Interface_Data *sid)
{
Evas_Coord x, y;
if (sid->cb_func.page_change)
{
x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
if ((x != sid->current_page.x) || (y != sid->current_page.y))
sid->cb_func.page_change(sid->obj, NULL);
}
if (sid->cb_func.animate_stop)
sid->cb_func.animate_stop(sid->obj, NULL);
}
@ -3772,6 +3797,16 @@ _elm_scroll_animate_stop_cb_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
sid->cb_func.animate_stop = animate_stop_cb;
}
static void
_elm_scroll_page_change_cb_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
Elm_Scrollable_Smart_Interface_Data *sid = _pd;
Elm_Interface_Scrollable_Cb page_change_cb =
va_arg(*list, Elm_Interface_Scrollable_Cb);
sid->cb_func.page_change = page_change_cb;
}
static void
_elm_scroll_scroll_cb_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
@ -4282,13 +4317,20 @@ _elm_scroll_page_show(Eo *obj, void *_pd, va_list *list)
Elm_Scrollable_Smart_Interface_Data *sid = _pd;
sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
eo_do(sid->obj, elm_scrollable_interface_content_viewport_size_get(&w, &h));
if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
eo_do(obj, elm_scrollable_interface_content_pos_set(x, y, EINA_TRUE));
if ((sid->current_page.x != x) || (sid->current_page.y != y))
{
if (sid->cb_func.page_change)
sid->cb_func.page_change(sid->obj, NULL);
}
}
static void
@ -4303,6 +4345,9 @@ _elm_scroll_page_bring_in(Eo *obj, void *_pd, va_list *list)
Elm_Scrollable_Smart_Interface_Data *sid = _pd;
sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
eo_do(sid->obj, elm_scrollable_interface_content_viewport_size_get(&w, &h));
if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
@ -4311,6 +4356,12 @@ _elm_scroll_page_bring_in(Eo *obj, void *_pd, va_list *list)
_elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
_elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, y);
}
if ((sid->current_page.x != x) || (sid->current_page.y != y))
{
if (sid->cb_func.page_change)
sid->cb_func.page_change(sid->obj, NULL);
}
}
static void
@ -4512,6 +4563,8 @@ _elm_scrollable_interface_constructor(Eo_Class *klass)
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_SET), _elm_scroll_wheel_disabled_set),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_SET), _elm_scroll_movement_block_set),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET), _elm_scroll_movement_block_get),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET), _elm_scroll_page_change_cb_set),
EO_OP_FUNC_SENTINEL
};
eo_class_funcs_set(klass, func_desc);
@ -4584,6 +4637,8 @@ static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_SET, "description here"),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_SET, "Set movement block in a axis"),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET, "Get the movement block"),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET,
"Set a scroller page change callback function"),
EO_OP_DESCRIPTION_SENTINEL
};

View File

@ -213,6 +213,7 @@ enum
ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_LAST
};
@ -963,6 +964,17 @@ enum
*/
#define elm_scrollable_interface_movement_block_get(block) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET), EO_TYPECHECK(Elm_Scroller_Movement_Block *, block)
/**
* @def elm_scrollable_interface_page_change_cb_set
* @since 1.8
*
* No description supplied by the EAPI.
*
* @param[in] page_change_cb
*
*/
#define elm_scrollable_interface_page_change_cb_set(page_change_cb) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET), EO_TYPECHECK(Elm_Interface_Scrollable_Cb, page_change_cb)
/**
* Elementary scroller panning base smart data.
@ -1070,7 +1082,7 @@ struct _Elm_Scrollable_Smart_Interface_Data
struct
{
Evas_Coord x, y;
} step, page;
} step, page, current_page;
struct
{
@ -1093,6 +1105,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
Elm_Interface_Scrollable_Cb hbar_drag;
Elm_Interface_Scrollable_Cb hbar_press;
Elm_Interface_Scrollable_Cb hbar_unpress;
Elm_Interface_Scrollable_Cb page_change;
Elm_Interface_Scrollable_Min_Limit_Cb content_min_limit;
} cb_func;

View File

@ -34,6 +34,8 @@ static const char SIG_VBAR_UNPRESS[] = "vbar,unpress";
static const char SIG_HBAR_DRAG[] = "hbar,drag";
static const char SIG_HBAR_PRESS[] = "hbar,press";
static const char SIG_HBAR_UNPRESS[] = "hbar,unpress";
static const char SIG_SCROLL_PAGE_CHANGE[] = "scroll,page,changed";
static const Evas_Smart_Cb_Description _smart_callbacks[] =
{
{SIG_SCROLL, ""},
@ -55,6 +57,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] =
{SIG_HBAR_DRAG, ""},
{SIG_HBAR_PRESS, ""},
{SIG_HBAR_UNPRESS, ""},
{SIG_SCROLL_PAGE_CHANGE, ""},
{NULL, NULL}
};
@ -646,6 +649,13 @@ _hbar_unpress_cb(Evas_Object *obj,
evas_object_smart_callback_call(obj, SIG_HBAR_UNPRESS, NULL);
}
static void
_page_change_cb(Evas_Object *obj,
void *data __UNUSED__)
{
evas_object_smart_callback_call(obj, SIG_SCROLL_PAGE_CHANGE, NULL);
}
static void
_elm_scroller_smart_content_set(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
{
@ -790,7 +800,9 @@ _elm_scroller_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
elm_scrollable_interface_hbar_drag_cb_set(_hbar_drag_cb),
elm_scrollable_interface_hbar_press_cb_set(_hbar_press_cb),
elm_scrollable_interface_hbar_unpress_cb_set(_hbar_unpress_cb),
elm_scrollable_interface_content_min_limit_cb_set(_elm_scroller_content_min_limit_cb));
elm_scrollable_interface_page_change_cb_set(_page_change_cb),
elm_scrollable_interface_content_min_limit_cb_set
(_elm_scroller_content_min_limit_cb));
}
static void

View File

@ -35,6 +35,7 @@
* @li @c "hbar,drag" - the horizontal scroll bar has been dragged
* @li @c "hbar,press" - the horizontal scroll bar has been pressed
* @li @c "hbar,unpress" - the horizontal scroll bar has been unpressed
* @li @c "scroll,page,changed" - the visible page has changed
*
* This widget implements the @ref elm-scrollable-interface interface.
* Its (non-deprecated) API functions, except for elm_scroller_add(),