Scroller can me made to snap to pages on scrolling now.

This commit is contained in:
Gustavo Lima Chaves 2013-05-17 11:30:42 -03:00
parent 86b4ab8276
commit d8be9d6cf1
5 changed files with 167 additions and 1 deletions

View File

@ -71,6 +71,21 @@ my_bt_block_movements_x_axis(void *data, Evas_Object *obj,
}
}
void
my_bt_snap_to_pages(void *data,
Evas_Object *obj,
void *event_info __UNUSED__)
{
if (elm_check_state_get(obj))
{
elm_scroller_page_snap_set(data, EINA_TRUE, EINA_TRUE);
}
else
{
elm_scroller_page_snap_set(data, EINA_FALSE, EINA_FALSE);
}
}
void
my_bt_block_movements_y_axis(void *data, Evas_Object *obj,
void *event_info __UNUSED__)
@ -116,7 +131,8 @@ _sc_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info
void
test_scroller(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *win, *bg2, *tb, *tb2, *sc, *bt, *ck1, *ck2, *bx, *bx2, *fr, *ck3, *ck4;
Evas_Object *win, *bg2, *tb, *tb2, *sc, *bt, *ck1, *ck2, *bx, *bx2, *fr,
*ck3, *ck4, *ck5;
int i, j, n;
char buf[PATH_MAX];
Evas_Coord x = 0, y = 0, w = 0, h = 0;
@ -173,6 +189,11 @@ test_scroller(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
elm_box_pack_end(bx2, ck4);
evas_object_show(ck4);
ck5 = elm_check_add(win);
elm_object_text_set(ck5, "Snap to pages");
elm_box_pack_end(bx2, ck5);
evas_object_show(ck5);
sc = elm_scroller_add(win);
evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
@ -211,6 +232,7 @@ test_scroller(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
sc);
evas_object_smart_callback_add(ck4, "changed", my_bt_block_movements_y_axis,
sc);
evas_object_smart_callback_add(ck5, "changed", my_bt_snap_to_pages, sc);
tb2 = elm_table_add(win);

View File

@ -1541,8 +1541,29 @@ _elm_scroll_content_pos_set(Eo *obj, void *_pd, va_list *list)
eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
if (_paging_is_enabled(sid) && sid->page_snap_horiz)
{
//we passed one page to the right
if (x > sid->current_page.x + sid->pagesize_h)
x = sid->current_page.x + sid->pagesize_h;
//we passed one page to the left
if (x < sid->current_page.x - sid->pagesize_h)
x = sid->current_page.x - sid->pagesize_h;
}
if (_paging_is_enabled(sid) && sid->page_snap_vert)
{
//we passed one page to the bottom
if (y > sid->current_page.y + sid->pagesize_v)
y = sid->current_page.y + sid->pagesize_v;
//we passed one page to the top
if (y < sid->current_page.y - sid->pagesize_v)
y = sid->current_page.y - sid->pagesize_v;
}
if (!_elm_config->thumbscroll_bounce_enable)
{
if (x < minx) x = minx;
if ((x - minx) > mx) x = mx + minx;
if (y < miny) y = miny;
@ -4174,6 +4195,32 @@ _elm_scroll_freeze_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
_elm_scroll_bounce_eval(sid);
}
static void
_elm_scroll_page_snap_allow_set(Eo *obj EINA_UNUSED,
void *_pd,
va_list *list)
{
Elm_Scrollable_Smart_Interface_Data *sid = _pd;
Eina_Bool horiz = va_arg(*list, int);
Eina_Bool vert = va_arg(*list, int);
sid->page_snap_horiz = !!horiz;
sid->page_snap_vert = !!vert;
}
static void
_elm_scroll_page_snap_allow_get(Eo *obj EINA_UNUSED,
void *_pd,
va_list *list)
{
Elm_Scrollable_Smart_Interface_Data *sid = _pd;
Eina_Bool *horiz = va_arg(*list, Eina_Bool *);
Eina_Bool *vert = va_arg(*list, Eina_Bool *);
if (horiz) *horiz = sid->page_snap_horiz;
if (vert) *vert = sid->page_snap_vert;
}
static void
_elm_scroll_bounce_allow_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
@ -4542,6 +4589,8 @@ _elm_scrollable_interface_constructor(Eo_Class *klass)
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MIRRORED_SET), _elm_scroll_mirrored_set),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_HOLD_SET), _elm_scroll_hold_set),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET), _elm_scroll_freeze_set),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET), _elm_scroll_page_snap_allow_set),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET), _elm_scroll_page_snap_allow_get),
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_SET), _elm_scroll_bounce_allow_set),
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),
@ -4616,6 +4665,12 @@ static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_MIRRORED_SET, "description here"),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_HOLD_SET, "description here"),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET, "description here"),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET,
"Enable/disable page bouncing, for paged scrollers, "
"on each axis."),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET,
"Get wether page bouncing is enabled,"
" for paged scrollers, on each axis"),
EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_SET, "description here"),
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"),

View File

@ -192,6 +192,8 @@ enum
ELM_SCROLLABLE_INTERFACE_SUB_ID_MIRRORED_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_HOLD_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_SET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_GET,
ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_SET,
@ -714,6 +716,31 @@ enum
*/
#define elm_scrollable_interface_freeze_set(freeze) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET), EO_TYPECHECK(Eina_Bool, freeze)
/**
* @def elm_scrollable_interface_page_snap_allow_set
* @since 1.8
*
* Enable/disable page bouncing, for paged scrollers, on each axis.
*
* @param[in] horiz
* @param[in] vert
*
*/
#define elm_scrollable_interface_page_snap_allow_set(horiz, vert) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET), EO_TYPECHECK(Eina_Bool, horiz), EO_TYPECHECK(Eina_Bool, vert)
/**
* @def elm_scrollable_interface_page_snap_allow_get
* @since 1.8
*
* Get wether page bouncing is enabled, for paged scrollers, on each
* axis.
*
* @param[out] horiz
* @param[out] vert
*
*/
#define elm_scrollable_interface_page_snap_allow_get(horiz, vert) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET), EO_TYPECHECK(Eina_Bool *, horiz), EO_TYPECHECK(Eina_Bool *, vert)
/**
* @def elm_scrollable_interface_bounce_allow_set
* @since 1.8
@ -1126,6 +1153,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
Eina_Bool momentum_animator_disabled : 1;
Eina_Bool bounce_animator_disabled : 1;
Eina_Bool page_snap_horiz : 1;
Eina_Bool page_snap_vert : 1;
Eina_Bool wheel_disabled : 1;
Eina_Bool hbar_visible : 1;
Eina_Bool vbar_visible : 1;

View File

@ -1021,6 +1021,28 @@ _child_size_get(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
eo_do((Eo *) obj, elm_scrollable_interface_content_size_get(w, h));
}
EAPI void
elm_scroller_page_snap_set(Evas_Object *obj,
Eina_Bool page_snap_h,
Eina_Bool page_snap_v)
{
ELM_SCROLLABLE_CHECK(obj);
eo_do(obj, elm_scrollable_interface_page_snap_allow_set
(page_snap_h, page_snap_v));
}
EAPI void
elm_scroller_page_snap_get(const Evas_Object *obj,
Eina_Bool *page_snap_h,
Eina_Bool *page_snap_v)
{
ELM_SCROLLABLE_CHECK(obj);
eo_do((Eo *) obj, elm_scrollable_interface_page_snap_allow_get
(page_snap_h, page_snap_v));
}
EAPI void
elm_scroller_bounce_set(Evas_Object *obj,
Eina_Bool h_bounce,

View File

@ -133,6 +133,44 @@ EAPI void elm_scroller_region_get(const Evas_Object *ob
*/
EAPI void elm_scroller_child_size_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
/**
* @brief Set page snapping behavior of a scroller
*
* @param obj The scroller object
* @param page_h_snap Allow snap horizontally
* @param page_v_snap Allow snap vertically
*
* When scrolling, if a scroller is paged (see
* elm_scroller_page_size_set() and elm_scroller_page_relative_set()),
* the scroller may snap to pages when being scrolled, i.e., even if
* it had momentum to scroll further, it will stop at the next page
* boundaries. This is @b disabled, by default, for both axis. This
* function will set if it that is enabled or not, for each axis.
*
* @note If @a obj is not set to have pages, nothing will happen after
* this call.
*
* @since 1.8
*
* @ingroup Scroller
*/
EAPI void elm_scroller_page_snap_set(Evas_Object *obj, Eina_Bool page_h_snap, Eina_Bool page_v_snap);
/**
* @brief Get the page snap behaviour of a scroller
*
* @param obj The Scroller object
* @param page_h_snap Will the scroller snap horizontally or not
* @param page_v_snap Will the scroller snap vertically or not
*
* @see elm_scroller_page_snap_set() for more details
*
* @since 1.8
*
* @ingroup Scroller
*/
EAPI void elm_scroller_page_snap_get(const Evas_Object *obj, Eina_Bool *page_h_snap, Eina_Bool *page_v_snap);
/**
* @brief Set bouncing behavior
*