From 85849217f91d8df92d16d5137fb956555024880d Mon Sep 17 00:00:00 2001 From: Jaehwan Kim Date: Sat, 6 Apr 2013 13:06:43 +0900 Subject: [PATCH] Add the API elm_scroller_page_scroll_limit_set/get. It sets the maxium of the movable page at flicking. --- legacy/elementary/ChangeLog | 4 ++ legacy/elementary/NEWS | 1 + .../src/lib/elm_interface_scrollable.c | 52 ++++++++++++++-- .../src/lib/elm_interface_scrollable.h | 27 +++++++++ legacy/elementary/src/lib/elm_scroller.c | 49 +++++++++++++++ legacy/elementary/src/lib/elm_scroller.h | 60 +++++++++++++++++++ 6 files changed, 187 insertions(+), 6 deletions(-) diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index 17933fe276..0c4d50df35 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/ChangeLog @@ -1204,3 +1204,7 @@ * Add convenient macros - elm_object_translatable_part_text_set(), elm_object_item_translatable_part_text_set(). +2013-04-06 Jaehwan Kim + + * Add the API elm_scroller_page_scroll_limit_set/get. + It sets the maxium of the movable page at flicking. diff --git a/legacy/elementary/NEWS b/legacy/elementary/NEWS index 014df47696..d5e663238b 100644 --- a/legacy/elementary/NEWS +++ b/legacy/elementary/NEWS @@ -57,6 +57,7 @@ Additions: * Add elm_map smart callback - "language,changed". * Add the repeat_events_set/get for blocking the events of content objects. * Add convenient macros - elm_object_translatable_part_text_set(), elm_object_item_translatable_part_text_set(). + * Add the API elm_scroller_page_scroll_limit_set/get. Improvements: diff --git a/legacy/elementary/src/lib/elm_interface_scrollable.c b/legacy/elementary/src/lib/elm_interface_scrollable.c index 21398ec600..051ff1d67a 100644 --- a/legacy/elementary/src/lib/elm_interface_scrollable.c +++ b/legacy/elementary/src/lib/elm_interface_scrollable.c @@ -1982,7 +1982,7 @@ static Evas_Coord _elm_scroll_page_x_get(Elm_Scrollable_Smart_Interface_Data *sid, int offset) { - Evas_Coord x, y, w, h, cw, ch, minx = 0; + Evas_Coord x, y, w, h, dx, cw, ch, minx = 0; if (!sid->pan_obj) return 0; @@ -1991,10 +1991,16 @@ _elm_scroll_page_x_get(Elm_Scrollable_Smart_Interface_Data *sid, eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch)); eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, NULL)); - x += offset; - if (sid->pagerel_h > 0.0) sid->pagesize_h = w * sid->pagerel_h; + + dx = (sid->pagesize_h * ((double)sid->page_limit_h - 0.5)); + + if (offset > 0) + x += (abs(offset) < dx ? offset : dx); + else + x += (abs(offset) < dx ? offset : -dx); + if (sid->pagesize_h > 0) { x = x + (sid->pagesize_h * 0.5); @@ -2011,7 +2017,7 @@ static Evas_Coord _elm_scroll_page_y_get(Elm_Scrollable_Smart_Interface_Data *sid, int offset) { - Evas_Coord x, y, w, h, cw, ch, miny = 0; + Evas_Coord x, y, w, h, dy, cw, ch, miny = 0; if (!sid->pan_obj) return 0; @@ -2020,10 +2026,16 @@ _elm_scroll_page_y_get(Elm_Scrollable_Smart_Interface_Data *sid, eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch)); eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(NULL, &miny)); - y += offset; - if (sid->pagerel_v > 0.0) sid->pagesize_v = h * sid->pagerel_v; + + dy = (sid->pagesize_v * ((double)sid->page_limit_v - 0.5)); + + if (offset > 0) + y += (abs(offset) < dy ? offset : dy); + else + y += (abs(offset) < dy ? offset : -dy); + if (sid->pagesize_v > 0) { y = y + (sid->pagesize_v * 0.5); @@ -4026,6 +4038,28 @@ _elm_scroll_paging_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list) if (pagesize_v) *pagesize_v = sid->pagesize_v; } +static void +_elm_scroll_page_scroll_limit_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list) +{ + Elm_Scrollable_Smart_Interface_Data *sid = _pd; + int page_limit_h = va_arg(*list, int); + int page_limit_v = va_arg(*list, int); + + sid->page_limit_h = page_limit_h; + sid->page_limit_v = page_limit_v; +} + +static void +_elm_scroll_page_scroll_limit_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list) +{ + Elm_Scrollable_Smart_Interface_Data *sid = _pd; + int *page_limit_h = va_arg(*list, int *); + int *page_limit_v = va_arg(*list, int *); + + if (page_limit_h) *page_limit_h = sid->page_limit_h; + if (page_limit_v) *page_limit_v = sid->page_limit_v; +} + static void _elm_scroll_current_page_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list) { @@ -4181,6 +4215,8 @@ _elm_scroll_interface_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED) sid->step.y = 32; sid->page.x = -50; sid->page.y = -50; + sid->page_limit_h = 9999; + sid->page_limit_v = 9999; sid->hbar_flags = ELM_SCROLLER_POLICY_AUTO; sid->vbar_flags = ELM_SCROLLER_POLICY_AUTO; sid->hbar_visible = EINA_TRUE; @@ -4282,6 +4318,8 @@ _elm_scrollable_interface_constructor(Eo_Class *klass) EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_GET), _elm_scroll_bounce_allow_get), EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_SET), _elm_scroll_paging_set), EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_GET), _elm_scroll_paging_get), + EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_SET), _elm_scroll_page_scroll_limit_set), + EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_GET), _elm_scroll_page_scroll_limit_get), EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_CURRENT_PAGE_GET), _elm_scroll_current_page_get), EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_LAST_PAGE_GET), _elm_scroll_last_page_get), EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SHOW), _elm_scroll_page_show), @@ -4350,6 +4388,8 @@ static const Eo_Op_Description op_desc[] = { EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_GET, "description here"), EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_SET, "description here"), EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_GET, "description here"), + EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_SET, "Set the maxium of the movable page at a flicking"), + EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_GET, "Get the maxium of the movable page at a flicking"), EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_CURRENT_PAGE_GET, "description here"), EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_LAST_PAGE_GET, "description here"), EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SHOW, "description here"), diff --git a/legacy/elementary/src/lib/elm_interface_scrollable.h b/legacy/elementary/src/lib/elm_interface_scrollable.h index 4978650e27..30a66210d1 100644 --- a/legacy/elementary/src/lib/elm_interface_scrollable.h +++ b/legacy/elementary/src/lib/elm_interface_scrollable.h @@ -196,6 +196,8 @@ enum ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_GET, ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_SET, ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_GET, + ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_SET, + ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_GET, ELM_SCROLLABLE_INTERFACE_SUB_ID_CURRENT_PAGE_GET, ELM_SCROLLABLE_INTERFACE_SUB_ID_LAST_PAGE_GET, ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SHOW, @@ -761,6 +763,30 @@ enum */ #define elm_scrollable_interface_paging_get(pagerel_h, pagerel_v, pagesize_h, pagesize_v) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_GET), EO_TYPECHECK(double *, pagerel_h), EO_TYPECHECK(double *, pagerel_v), EO_TYPECHECK(Evas_Coord *, pagesize_h), EO_TYPECHECK(Evas_Coord *, pagesize_v) +/** + * @def elm_scrollable_interface_page_scroll_limit_set + * @since 1.8 + * + * No description supplied by the EAPI. + * + * @param[in] page_limit_h + * @param[in] page_limit_v + * + */ +#define elm_scrollable_interface_page_scroll_limit_set(page_limit_h, page_limit_v) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_SET), EO_TYPECHECK(int, page_limit_h), EO_TYPECHECK(int, page_limit_v) + +/** + * @def elm_scrollable_interface_page_scroll_limit_get + * @since 1.8 + * + * No description supplied by the EAPI. + * + * @param[out] page_limit_h + * @param[out] page_limit_v + * + */ +#define elm_scrollable_interface_page_scroll_limit_get(page_limit_h, page_limit_v) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_SCROLL_LIMIT_GET), EO_TYPECHECK(int *, page_limit_h), EO_TYPECHECK(int *, page_limit_v) + /** * @def elm_scrollable_interface_current_page_get * @since 1.8 @@ -1054,6 +1080,7 @@ struct _Elm_Scrollable_Smart_Interface_Data double pagerel_h, pagerel_v; Evas_Coord pagesize_h, pagesize_v; + int page_limit_h, page_limit_v; Eina_Bool momentum_animator_disabled : 1; Eina_Bool bounce_animator_disabled : 1; diff --git a/legacy/elementary/src/lib/elm_scroller.c b/legacy/elementary/src/lib/elm_scroller.c index 39a581adca..3f196dd96a 100644 --- a/legacy/elementary/src/lib/elm_scroller.c +++ b/legacy/elementary/src/lib/elm_scroller.c @@ -1048,6 +1048,51 @@ elm_scroller_page_size_get(const Evas_Object *obj, eo_do((Eo *)obj, elm_scrollable_interface_paging_get(NULL, NULL, h_pagesize, v_pagesize)); } +EAPI void +elm_scroller_page_scroll_limit_set(const Evas_Object *obj, + int page_limit_h, + int page_limit_v) +{ + ELM_SCROLLABLE_CHECK(obj); + eo_do((Eo *)obj, elm_obj_scroller_page_scroll_limit_set + (page_limit_h, page_limit_v)); +} + +static void +_page_scroll_limit_set(Eo *obj, void *_pd EINA_UNUSED, va_list *list) +{ + int page_limit_h = va_arg(*list, int); + int page_limit_v = va_arg(*list, int); + + if (page_limit_h < 1) + page_limit_h = 9999; + if (page_limit_v < 1) + page_limit_v = 9999; + + eo_do(obj, elm_scrollable_interface_page_scroll_limit_set + (page_limit_h, page_limit_v)); +} + +EAPI void +elm_scroller_page_scroll_limit_get(const Evas_Object *obj, + int *page_limit_h, + int *page_limit_v) +{ + ELM_SCROLLABLE_CHECK(obj); + eo_do((Eo *)obj, elm_obj_scroller_page_scroll_limit_get + (page_limit_h, page_limit_v)); +} + +static void +_page_scroll_limit_get(Eo *obj, void *_pd EINA_UNUSED, va_list *list) +{ + int *page_limit_h = va_arg(*list, int *); + int *page_limit_v = va_arg(*list, int *); + + eo_do(obj, elm_scrollable_interface_page_scroll_limit_get + (page_limit_h, page_limit_v)); +} + EAPI void elm_scroller_current_page_get(const Evas_Object *obj, int *h_pagenumber, @@ -1187,6 +1232,8 @@ _class_constructor(Eo_Class *klass) EO_OP_FUNC(ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_REGION_GET), _region_get), EO_OP_FUNC(ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_CHILD_SIZE_GET), _child_size_get), EO_OP_FUNC(ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PAGE_RELATIVE_SET), _page_relative_set), + EO_OP_FUNC(ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_SET), _page_scroll_limit_set), + EO_OP_FUNC(ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_GET), _page_scroll_limit_get), EO_OP_FUNC(ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PROPAGATE_EVENTS_SET), _propagate_events_set), EO_OP_FUNC(ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PROPAGATE_EVENTS_GET), _propagate_events_get), EO_OP_FUNC_SENTINEL @@ -1201,6 +1248,8 @@ static const Eo_Op_Description op_desc[] = { EO_OP_DESCRIPTION(ELM_OBJ_SCROLLER_SUB_ID_REGION_GET, "Get the currently visible content region."), EO_OP_DESCRIPTION(ELM_OBJ_SCROLLER_SUB_ID_CHILD_SIZE_GET, "Get the size of the content object."), EO_OP_DESCRIPTION(ELM_OBJ_SCROLLER_SUB_ID_PAGE_RELATIVE_SET, "Set scroll page size relative to viewport size."), + EO_OP_DESCRIPTION(ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_SET, "Set the maxium of the movable page at a flicking."), + EO_OP_DESCRIPTION(ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_GET, "Get the maxium of the movable page at a flicking."), EO_OP_DESCRIPTION(ELM_OBJ_SCROLLER_SUB_ID_PROPAGATE_EVENTS_SET, "Set event propagation on a scroller."), EO_OP_DESCRIPTION(ELM_OBJ_SCROLLER_SUB_ID_PROPAGATE_EVENTS_GET, "Get event propagation for a scroller."), EO_OP_DESCRIPTION_SENTINEL diff --git a/legacy/elementary/src/lib/elm_scroller.h b/legacy/elementary/src/lib/elm_scroller.h index 3e0f37dbdc..4d3876d733 100644 --- a/legacy/elementary/src/lib/elm_scroller.h +++ b/legacy/elementary/src/lib/elm_scroller.h @@ -73,6 +73,8 @@ enum ELM_OBJ_SCROLLER_SUB_ID_REGION_GET, ELM_OBJ_SCROLLER_SUB_ID_CHILD_SIZE_GET, ELM_OBJ_SCROLLER_SUB_ID_PAGE_RELATIVE_SET, + ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_SET, + ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_GET, ELM_OBJ_SCROLLER_SUB_ID_PROPAGATE_EVENTS_SET, ELM_OBJ_SCROLLER_SUB_ID_PROPAGATE_EVENTS_GET, ELM_OBJ_SCROLLER_SUB_ID_LAST @@ -135,6 +137,32 @@ enum */ #define elm_obj_scroller_page_relative_set(h_pagerel, v_pagerel) ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PAGE_RELATIVE_SET), EO_TYPECHECK(double, h_pagerel), EO_TYPECHECK(double, v_pagerel) +/** + * @def elm_obj_scroller_page_scroll_limit_set + * @since 1.8 + * + * @brief Set the maxium of the movable page at a flicking. + * + * @param[in] page_limit_h + * @param[in] page_limit_v + * + * @see elm_scroller_page_scroll_limit_set + */ +#define elm_obj_scroller_page_scroll_limit_set(page_limit_h, page_limit_v) ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_SET), EO_TYPECHECK(int, page_limit_h), EO_TYPECHECK(int, page_limit_v) + +/** + * @def elm_obj_scroller_page_scroll_limit_get + * @since 1.8 + * + * @brief Get the maxium of the movable page at a flicking. + * + * @param[in] page_limit_h + * @param[in] page_limit_v + * + * @see elm_scroller_page_scroll_limit_get + */ +#define elm_obj_scroller_page_scroll_limit_get(page_limit_h, page_limit_v) ELM_OBJ_SCROLLER_ID(ELM_OBJ_SCROLLER_SUB_ID_PAGE_SCROLL_LIMIT_GET), EO_TYPECHECK(int *, page_limit_h), EO_TYPECHECK(int *, page_limit_v) + /** * @def elm_obj_scroller_propagate_events_set * @since 1.8 @@ -381,6 +409,38 @@ EAPI void elm_scroller_page_size_set(Evas_Object *obj, E */ EAPI void elm_scroller_page_size_get(const Evas_Object *obj, Evas_Coord *h_pagesize, Evas_Coord *v_pagesize); +/** + * @brief Set the maxium of the movable page at a flicking. + * + * @param obj The scroller object + * @param page_limit_h The maxium of the movable horizontal page + * @param page_limit_v The maxium of the movable vertical page + * + * The value of maxium movable page should be more than 1. + * + * @see elm_scroller_page_scroll_limit_get() + * + * @since 1.8 + * + * @ingroup Scroller + */ +EAPI void elm_scroller_page_scroll_limit_set(const Evas_Object *obj, Evas_Coord page_limit_h, Evas_Coord page_limit_v); + +/** + * @brief Get the maxium of the movable page at a flicking. + * + * @param obj The scroller object + * @param page_limit_h The maxium of the movable horizontal page + * @param page_limit_v The maxium of the movable vertical page + * + * @see elm_scroller_page_scroll_limit_set() + * + * @since 1.8 + * + * @ingroup Scroller + */ +EAPI void elm_scroller_page_scroll_limit_get(const Evas_Object *obj, Evas_Coord *page_limit_h, Evas_Coord *page_limit_v); + /** * @brief Get scroll current page number. *