diff --git a/legacy/elementary/src/lib/elm_gengrid.c b/legacy/elementary/src/lib/elm_gengrid.c index 94a82e88c5..ed6a99de69 100644 --- a/legacy/elementary/src/lib/elm_gengrid.c +++ b/legacy/elementary/src/lib/elm_gengrid.c @@ -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; diff --git a/legacy/elementary/src/lib/elm_gengrid.h b/legacy/elementary/src/lib/elm_gengrid.h index 41c00956aa..e630f12a36 100644 --- a/legacy/elementary/src/lib/elm_gengrid.h +++ b/legacy/elementary/src/lib/elm_gengrid.h @@ -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 diff --git a/legacy/elementary/src/lib/elm_interface_scrollable.c b/legacy/elementary/src/lib/elm_interface_scrollable.c index e836820728..dc987629ff 100644 --- a/legacy/elementary/src/lib/elm_interface_scrollable.c +++ b/legacy/elementary/src/lib/elm_interface_scrollable.c @@ -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 }; diff --git a/legacy/elementary/src/lib/elm_interface_scrollable.h b/legacy/elementary/src/lib/elm_interface_scrollable.h index fcfd2d8070..b4c5a62763 100644 --- a/legacy/elementary/src/lib/elm_interface_scrollable.h +++ b/legacy/elementary/src/lib/elm_interface_scrollable.h @@ -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; diff --git a/legacy/elementary/src/lib/elm_scroller.c b/legacy/elementary/src/lib/elm_scroller.c index 9cd473625b..bbb51f83f1 100644 --- a/legacy/elementary/src/lib/elm_scroller.c +++ b/legacy/elementary/src/lib/elm_scroller.c @@ -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 diff --git a/legacy/elementary/src/lib/elm_scroller.h b/legacy/elementary/src/lib/elm_scroller.h index 0ab73df801..fa052bce50 100644 --- a/legacy/elementary/src/lib/elm_scroller.h +++ b/legacy/elementary/src/lib/elm_scroller.h @@ -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(),