diff options
author | cabelitos <guilherme.iscaro@intel.com> | 2013-05-09 16:26:29 -0300 |
---|---|---|
committer | Gustavo Lima Chaves <glima@profusion.mobi> | 2013-05-10 11:07:10 -0300 |
commit | 1883575158829696421c9695f6360ad46bd8b74a (patch) | |
tree | 4b5c9560497bb0e191538230ec171b979f64741c | |
parent | e65b285223bfeafcfe75abb2bfafbe929b5dcbc9 (diff) | |
download | elementary-1883575158829696421c9695f6360ad46bd8b74a.tar.gz |
Adding a new scroller API, to block its movements (by user input).
With this new API the user can block movements on X axis, Y Axis or
both. I was left with no option but to come up with this, side by side
with elm_object_scroll_freeze_push(), elm_object_scroll_hold_push()
and elm_object_scroll_lock_x_set() (or
elm_object_scroll_lock_y_set()), once all of these will act on *parent
and/or child* widgets too, making those useless for any pratical use
of scroll blocking. Here's a sane, new option, enjoy it.
-rw-r--r-- | src/bin/test_scroller.c | 68 | ||||
-rw-r--r-- | src/lib/elm_interface_scrollable.c | 104 | ||||
-rw-r--r-- | src/lib/elm_interface_scrollable.h | 26 | ||||
-rw-r--r-- | src/lib/elm_scroller.c | 21 | ||||
-rw-r--r-- | src/lib/elm_scroller_common.h | 14 | ||||
-rw-r--r-- | src/lib/elm_scroller_legacy.h | 37 |
6 files changed, 257 insertions, 13 deletions
diff --git a/src/bin/test_scroller.c b/src/bin/test_scroller.c index 882a94f6c..36d6d60e6 100644 --- a/src/bin/test_scroller.c +++ b/src/bin/test_scroller.c @@ -46,6 +46,58 @@ my_bt_hold_toggle(void *data, Evas_Object *obj, void *event_info __UNUSED__) } void +my_bt_block_movements_x_axis(void *data, Evas_Object *obj, + void *event_info __UNUSED__) +{ + Elm_Scroller_Movement_Block block; + + block = elm_scroller_movement_block_get((Evas_Object *)data); + + if (elm_check_state_get(obj)) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL | + block); + } + else if (block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL); + } + else + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_NO_BLOCK); + } +} + +void +my_bt_block_movements_y_axis(void *data, Evas_Object *obj, + void *event_info __UNUSED__) +{ + Elm_Scroller_Movement_Block block; + + block = elm_scroller_movement_block_get((Evas_Object *)data); + + if (elm_check_state_get(obj)) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL | + block); + } + else if (block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); + } + else + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_NO_BLOCK); + } +} + +void _sc_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) { Evas_Coord x = 0, y = 0; @@ -64,7 +116,7 @@ _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; + Evas_Object *win, *bg2, *tb, *tb2, *sc, *bt, *ck1, *ck2, *bx, *bx2, *fr, *ck3, *ck4; int i, j, n; char buf[PATH_MAX]; Evas_Coord x = 0, y = 0, w = 0, h = 0; @@ -111,6 +163,16 @@ test_scroller(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in elm_box_pack_end(bx2, ck2); evas_object_show(ck2); + ck3 = elm_check_add(win); + elm_object_text_set(ck3, "Block movements in X axis"); + elm_box_pack_end(bx2, ck3); + evas_object_show(ck3); + + ck4 = elm_check_add(win); + elm_object_text_set(ck4, "Block movements in Y axis"); + elm_box_pack_end(bx2, ck4); + evas_object_show(ck4); + 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); @@ -145,6 +207,10 @@ test_scroller(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in evas_object_smart_callback_add(ck1, "changed", my_bt_freeze_toggle, tb); evas_object_smart_callback_add(ck2, "changed", my_bt_hold_toggle, tb); + evas_object_smart_callback_add(ck3, "changed", my_bt_block_movements_x_axis, + sc); + evas_object_smart_callback_add(ck4, "changed", my_bt_block_movements_y_axis, + sc); tb2 = elm_table_add(win); diff --git a/src/lib/elm_interface_scrollable.c b/src/lib/elm_interface_scrollable.c index 867ea70c0..e83682072 100644 --- a/src/lib/elm_interface_scrollable.c +++ b/src/lib/elm_interface_scrollable.c @@ -1874,6 +1874,10 @@ _elm_scroll_wheel_event_cb(void *data, sid = data; ev = event_info; direction = ev->direction; + + if (sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) + return; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; if ((evas_key_modifier_is_set(ev->modifiers, "Control")) || (evas_key_modifier_is_set(ev->modifiers, "Alt")) || @@ -2301,6 +2305,10 @@ _elm_scroll_mouse_up_event_cb(void *data, if (!sid->pan_obj) return; + if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) && + (sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) + return; + #ifdef SMOOTHDBG if (_elm_scroll_smooth_debug) _elm_scroll_smooth_debug_shutdown(); #endif @@ -2461,7 +2469,9 @@ _elm_scroll_mouse_up_event_cb(void *data, (sid->obj))) { pgx = _elm_scroll_page_x_get(sid, ox, EINA_TRUE); - if (pgx != x) + if (pgx != x && + !(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) { ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL; _elm_scroll_scroll_to_x @@ -2473,7 +2483,9 @@ _elm_scroll_mouse_up_event_cb(void *data, (sid->obj))) { pgy = _elm_scroll_page_y_get(sid, oy, EINA_TRUE); - if (pgy != y) + if (pgy != y && + !(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL)) { ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL; _elm_scroll_scroll_to_y @@ -2560,6 +2572,10 @@ _elm_scroll_mouse_down_event_cb(void *data, sid = data; ev = event_info; + if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) && + (sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) + return; + #ifdef SMOOTHDBG if (getenv("ELS_SCROLLER_SMOOTH_DEBUG")) _elm_scroll_smooth_debug = 1; if (_elm_scroll_smooth_debug) _elm_scroll_smooth_debug_init(); @@ -2977,6 +2993,10 @@ _elm_scroll_mouse_move_event_cb(void *data, if (!sid->pan_obj) return; + if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) && + (sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) + return; + ev = event_info; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sid->down.hold_parent = EINA_TRUE; @@ -2988,7 +3008,8 @@ _elm_scroll_mouse_move_event_cb(void *data, if (!sid->down.now) return; - if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze)) + if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze) && + !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) { Evas_Coord px; ecore_animator_del(sid->scrollto.x.animator); @@ -2998,7 +3019,8 @@ _elm_scroll_mouse_move_event_cb(void *data, sid->down.x = sid->down.history[0].x; } - if ((sid->scrollto.y.animator) && (!sid->hold) && (!sid->freeze)) + if ((sid->scrollto.y.animator) && (!sid->hold) && (!sid->freeze) && + !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL)) { Evas_Coord py; ecore_animator_del(sid->scrollto.y.animator); @@ -3053,20 +3075,36 @@ _elm_scroll_mouse_move_event_cb(void *data, int dodir = 0; if (x > (y * 2)) { - sid->down.dir_x = EINA_TRUE; + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) + { + sid->down.dir_x = EINA_TRUE; + } sid->down.dir_y = EINA_FALSE; dodir++; } if (y > (x * 2)) { sid->down.dir_x = EINA_FALSE; - sid->down.dir_y = EINA_TRUE; + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL)) + { + sid->down.dir_y = EINA_TRUE; + } dodir++; } if (!dodir) { - sid->down.dir_x = EINA_TRUE; - sid->down.dir_y = EINA_TRUE; + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) + { + sid->down.dir_x = EINA_TRUE; + } + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL)) + { + sid->down.dir_y = EINA_TRUE; + } } } else if (sid->one_direction_at_a_time == @@ -3074,21 +3112,37 @@ _elm_scroll_mouse_move_event_cb(void *data, { if (x > y) { - sid->down.dir_x = EINA_TRUE; + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) + { + sid->down.dir_x = EINA_TRUE; + } sid->down.dir_y = EINA_FALSE; } if (y > x) { sid->down.dir_x = EINA_FALSE; - sid->down.dir_y = EINA_TRUE; + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL)) + { + sid->down.dir_y = EINA_TRUE; + } } } } } else { - sid->down.dir_x = EINA_TRUE; - sid->down.dir_y = EINA_TRUE; + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)) + { + sid->down.dir_x = EINA_TRUE; + } + if (!(sid->block & + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL)) + { + sid->down.dir_y = EINA_TRUE; + } } } if ((!sid->hold) && (!sid->freeze)) @@ -4300,6 +4354,27 @@ _elm_scroll_gravity_get(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *lis } static void +_elm_scroll_movement_block_set(Eo *obj __UNUSED__, void *_pd, va_list *list) +{ + Elm_Scrollable_Smart_Interface_Data *sid = _pd; + + Elm_Scroller_Movement_Block block = va_arg(*list, + Elm_Scroller_Movement_Block); + + sid->block = block; +} + +static void +_elm_scroll_movement_block_get(Eo *obj __UNUSED__, void *_pd, va_list *list) +{ + Elm_Scrollable_Smart_Interface_Data *sid = _pd; + Elm_Scroller_Movement_Block *block = va_arg(*list, + Elm_Scroller_Movement_Block *); + + *block = sid->block; +} + +static void _elm_scroll_interface_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED) { Elm_Scrollable_Smart_Interface_Data *sid = _pd; @@ -4329,6 +4404,7 @@ _elm_scroll_interface_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED) sid->one_direction_at_a_time = ELM_SCROLLER_SINGLE_DIRECTION_SOFT; sid->momentum_animator_disabled = EINA_FALSE; sid->bounce_animator_disabled = EINA_FALSE; + sid->block = ELM_SCROLLER_MOVEMENT_NO_BLOCK; _elm_scroll_scroll_bar_reset(sid); @@ -4434,6 +4510,8 @@ _elm_scrollable_interface_constructor(Eo_Class *klass) EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ANIMATOR_DISABLED_GET), _elm_scroll_bounce_animator_disabled_get), EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_GET), _elm_scroll_wheel_disabled_get), 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_SENTINEL }; eo_class_funcs_set(klass, func_desc); @@ -4504,6 +4582,8 @@ static const Eo_Op_Description op_desc[] = { EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ANIMATOR_DISABLED_GET, "description here"), EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_GET, "description here"), 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_SENTINEL }; diff --git a/src/lib/elm_interface_scrollable.h b/src/lib/elm_interface_scrollable.h index bee2229d7..fcfd2d807 100644 --- a/src/lib/elm_interface_scrollable.h +++ b/src/lib/elm_interface_scrollable.h @@ -211,6 +211,8 @@ enum ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ANIMATOR_DISABLED_GET, ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_GET, 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_LAST }; @@ -940,6 +942,29 @@ enum #define elm_scrollable_interface_wheel_disabled_set(disabled) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_SET), EO_TYPECHECK(Eina_Bool, disabled) /** + * @def elm_scrollable_interface_movement_block_set + * @since 1.8 + * + * No description supplied by the EAPI. + * + * @param[in] block + * + */ +#define elm_scrollable_interface_movement_block_set(block) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_SET), EO_TYPECHECK(Elm_Scroller_Movement_Block, block) + +/** + * @def elm_scrollable_interface_movement_block_set + * @since 1.8 + * + * No description supplied by the EAPI. + * + * @param[in] block + * + */ +#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) + + +/** * Elementary scroller panning base smart data. */ typedef struct _Elm_Pan_Smart_Data Elm_Pan_Smart_Data; @@ -976,6 +1001,7 @@ struct _Elm_Scrollable_Smart_Interface_Data Elm_Scroller_Policy hbar_flags, vbar_flags; Elm_Scroller_Single_Direction one_direction_at_a_time; + Elm_Scroller_Movement_Block block; struct { diff --git a/src/lib/elm_scroller.c b/src/lib/elm_scroller.c index e1edb2802..9cd473625 100644 --- a/src/lib/elm_scroller.c +++ b/src/lib/elm_scroller.c @@ -1211,6 +1211,27 @@ elm_scroller_gravity_get(const Evas_Object *obj, } EAPI void +elm_scroller_movement_block_set(Evas_Object *obj, + Elm_Scroller_Movement_Block block) +{ + ELM_SCROLLABLE_CHECK(obj); + + eo_do(obj, elm_scrollable_interface_movement_block_set(block)); +} + +EAPI Elm_Scroller_Movement_Block +elm_scroller_movement_block_get(const Evas_Object *obj) +{ + Elm_Scroller_Movement_Block block; + + ELM_SCROLLABLE_CHECK(obj, ELM_SCROLLER_SINGLE_DIRECTION_NONE); + + eo_do((Eo *) obj, elm_scrollable_interface_movement_block_get(&block)); + + return block; +} + +EAPI void elm_scroller_propagate_events_set(Evas_Object *obj, Eina_Bool propagation) { diff --git a/src/lib/elm_scroller_common.h b/src/lib/elm_scroller_common.h index b5c998de6..f8085c102 100644 --- a/src/lib/elm_scroller_common.h +++ b/src/lib/elm_scroller_common.h @@ -24,4 +24,18 @@ typedef enum ELM_SCROLLER_SINGLE_DIRECTION_LAST } Elm_Scroller_Single_Direction; +/** + * @brief Type that blocks the scroll movement in one or more direction. + * + * @see elm_scroller_movement_block() + * + * @since 1.8 + */ +typedef enum +{ + ELM_SCROLLER_MOVEMENT_NO_BLOCK = 1 << 0, /**< Do not block movements */ + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL = 1 << 1, /**< Block vertical movements */ + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL = 1 << 2 /**< Block horizontal movements */ +} Elm_Scroller_Movement_Block; + diff --git a/src/lib/elm_scroller_legacy.h b/src/lib/elm_scroller_legacy.h index 7af9ee740..a254ee5c7 100644 --- a/src/lib/elm_scroller_legacy.h +++ b/src/lib/elm_scroller_legacy.h @@ -446,3 +446,40 @@ EAPI void elm_scroller_gravity_set(Evas_Object *obj, do */ EAPI void elm_scroller_gravity_get(const Evas_Object *obj, double *x, double *y); +/** + * @brief Set blocking of scrolling (per axis) on a given scroller + * + * @param obj The scroller object + * @param block The axis to block + * + * This function will block scrolling movement (by input of a user) in + * a given direction. One can disable movements in the X axis, the Y + * axis or both. The default value is @c ELM_SCROLLER_MOVEMENT_NO_BLOCK, + * where movements are allowed in both directions. + * + * What makes this function different from + * elm_object_scroll_freeze_push(), elm_object_scroll_hold_push() and + * elm_object_scroll_lock_x_set() (or elm_object_scroll_lock_y_set()) + * is that it @b doesn't propagate its effects to any parent or child + * widget of @a obj. Only the target scrollable widget will be locked + * with regard to scrolling. + * + * @since 1.8 + * + * @ingroup Scroller + */ +EAPI void elm_scroller_movement_block_set(Evas_Object *obj, Elm_Scroller_Movement_Block block); + +/** + * @brief Get a scroller's scroll blocking state + * + * @param parent The scroller object + * @return The blocking state + * + * @since 1.8 + * + * @see elm_scroller_movement_block_set() for more details + * + * @ingroup Scroller + */ +EAPI Elm_Scroller_Movement_Block elm_scroller_movement_block_get(const Evas_Object *obj); |