From 4506835a3829dadf7ab70834815b2458ba00d734 Mon Sep 17 00:00:00 2001 From: Jaehwan Kim Date: Wed, 10 Apr 2013 21:14:28 +0900 Subject: [PATCH] [Scroller] Add the API elm_scroller_single_direction_set/get. Change-Id: I955c5a2134646ed9ef863ff6abaefa329b91c596 --- src/lib/elm_interface_scrollable.c | 66 ++++++++++++++++----------- src/lib/elm_interface_scrollable.h | 24 +++++----- src/lib/elm_scroller.c | 20 +++++++++ src/lib/elm_scroller.h | 91 +++++++++++++++++++++++++++----------- 4 files changed, 139 insertions(+), 62 deletions(-) diff --git a/src/lib/elm_interface_scrollable.c b/src/lib/elm_interface_scrollable.c index df41b37..24501f3 100644 --- a/src/lib/elm_interface_scrollable.c +++ b/src/lib/elm_interface_scrollable.c @@ -2709,8 +2709,6 @@ _elm_scroll_mouse_move_event_cb(void *data, { if (sid->down.now) { - int dodir = 0; - if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze)) { Evas_Coord px; @@ -2763,32 +2761,50 @@ _elm_scroll_mouse_move_event_cb(void *data, if (x < 0) x = -x; if (y < 0) y = -y; - if ((sid->one_direction_at_a_time) && - (!((sid->down.dir_x) || (sid->down.dir_y)))) + if (sid->one_direction_at_a_time) { - if (x > _elm_config->thumbscroll_threshold) + if (!((sid->down.dir_x) || (sid->down.dir_y)) && + (((x * x) + (y * y)) > + (_elm_config->thumbscroll_threshold * + _elm_config->thumbscroll_threshold))) { - if (x > (y * 2)) + if (sid->one_direction_at_a_time == + ELM_SCROLLER_SINGLE_DIRECTION_SOFT) { - sid->down.dir_x = EINA_TRUE; - sid->down.dir_y = EINA_FALSE; - dodir++; + int dodir = 0; + if (x > (y * 2)) + { + 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; + dodir++; + } + if (!dodir) + { + sid->down.dir_x = EINA_TRUE; + sid->down.dir_y = EINA_TRUE; + } } - } - if (y > _elm_config->thumbscroll_threshold) - { - if (y > (x * 2)) + else if (sid->one_direction_at_a_time == + ELM_SCROLLER_SINGLE_DIRECTION_HARD) { - sid->down.dir_x = EINA_FALSE; - sid->down.dir_y = EINA_TRUE; - dodir++; + if (x > y) + { + 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 (!dodir) - { - sid->down.dir_x = EINA_TRUE; - sid->down.dir_y = EINA_TRUE; - } } else { @@ -3771,17 +3787,17 @@ _elm_scroll_policy_get(const Evas_Object *obj, static void _elm_scroll_single_direction_set(Evas_Object *obj, - Eina_Bool single_dir) + Elm_Scroller_Single_Direction single_dir) { ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid); sid->one_direction_at_a_time = single_dir; } -static Eina_Bool +static Elm_Scroller_Single_Direction _elm_scroll_single_direction_get(const Evas_Object *obj) { - ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE); + ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, ELM_SCROLLER_SINGLE_DIRECTION_SOFT); return sid->one_direction_at_a_time; } @@ -4075,7 +4091,7 @@ _elm_scroll_interface_add(Evas_Object *obj) sid->bounce_horiz = EINA_TRUE; sid->bounce_vert = EINA_TRUE; - sid->one_direction_at_a_time = EINA_TRUE; + sid->one_direction_at_a_time = ELM_SCROLLER_SINGLE_DIRECTION_SOFT; sid->momentum_animator_disabled = EINA_FALSE; sid->bounce_animator_disabled = EINA_FALSE; diff --git a/src/lib/elm_interface_scrollable.h b/src/lib/elm_interface_scrollable.h index 389957a..e127ea6 100644 --- a/src/lib/elm_interface_scrollable.h +++ b/src/lib/elm_interface_scrollable.h @@ -168,18 +168,19 @@ typedef struct _Elm_Scrollable_Smart_Interface_Data Elm_Scrollable_Smart_Interface_Data; struct _Elm_Scrollable_Smart_Interface_Data { - Evas_Coord x, y, w, h; - Evas_Coord wx, wy, ww, wh; /**< Last "wanted" geometry */ + Evas_Coord x, y, w, h; + Evas_Coord wx, wy, ww, wh; /**< Last "wanted" geometry */ - Evas_Object *obj; - Evas_Object *content; - Evas_Object *pan_obj; - Evas_Object *edje_obj; - Evas_Object *event_rect; + Evas_Object *obj; + Evas_Object *content; + Evas_Object *pan_obj; + Evas_Object *edje_obj; + Evas_Object *event_rect; - Evas_Object *parent_widget; + Evas_Object *parent_widget; - Elm_Scroller_Policy hbar_flags, vbar_flags; + Elm_Scroller_Policy hbar_flags, vbar_flags; + Elm_Scroller_Single_Direction one_direction_at_a_time; struct { @@ -310,7 +311,6 @@ struct _Elm_Scrollable_Smart_Interface_Data Eina_Bool momentum_animator_disabled : 1; Eina_Bool bounce_animator_disabled : 1; - Eina_Bool one_direction_at_a_time : 1; Eina_Bool wheel_disabled : 1; Eina_Bool hbar_visible : 1; Eina_Bool vbar_visible : 1; @@ -463,8 +463,8 @@ struct _Elm_Scrollable_Smart_Interface Elm_Scroller_Policy *vbar); void (*single_direction_set)(Evas_Object *obj, - Eina_Bool single_dir); - Eina_Bool (*single_direction_get)(const Evas_Object *obj); + Elm_Scroller_Single_Direction single_dir); + Elm_Scroller_Single_Direction (*single_direction_get)(const Evas_Object *obj); void (*repeat_events_set)(Evas_Object *obj, Eina_Bool repeat_events); diff --git a/src/lib/elm_scroller.c b/src/lib/elm_scroller.c index 249fe5e..721c5c9 100644 --- a/src/lib/elm_scroller.c +++ b/src/lib/elm_scroller.c @@ -899,6 +899,26 @@ elm_scroller_policy_get(const Evas_Object *obj, } EAPI void +elm_scroller_single_direction_set(Evas_Object *obj, + Elm_Scroller_Single_Direction single_dir) +{ + ELM_SCROLLABLE_CHECK(obj); + + if (single_dir >= ELM_SCROLLER_SINGLE_DIRECTION_LAST) + return; + + s_iface->single_direction_set(obj, single_dir); +} + +EAPI Elm_Scroller_Single_Direction +elm_scroller_single_direction_get(const Evas_Object *obj) +{ + ELM_SCROLLABLE_CHECK(obj, ELM_SCROLLER_SINGLE_DIRECTION_SOFT); + + return s_iface->single_direction_get(obj); +} + +EAPI void elm_scroller_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, diff --git a/src/lib/elm_scroller.h b/src/lib/elm_scroller.h index d550b3d..4e1ce3e 100644 --- a/src/lib/elm_scroller.h +++ b/src/lib/elm_scroller.h @@ -65,6 +65,19 @@ typedef enum } Elm_Scroller_Policy; /** + * @brief Type that controls how the content is scrolled. + * + * @see elm_scroller_single_direction_set() + */ +typedef enum +{ + ELM_SCROLLER_SINGLE_DIRECTION_NONE = 0, /**< Scroll every direction */ + ELM_SCROLLER_SINGLE_DIRECTION_SOFT, /**< Scroll single direction if the direction is certain*/ + ELM_SCROLLER_SINGLE_DIRECTION_HARD, /**< Scroll only single direction */ + ELM_SCROLLER_SINGLE_DIRECTION_LAST +} Elm_Scroller_Single_Direction; + +/** * @brief Add a new scroller to the parent * * @param parent The parent object @@ -72,7 +85,7 @@ typedef enum * * @ingroup Scroller */ -EAPI Evas_Object *elm_scroller_add(Evas_Object *parent); +EAPI Evas_Object *elm_scroller_add(Evas_Object *parent); /** * @brief Set custom theme elements for the scroller @@ -85,7 +98,7 @@ EAPI Evas_Object *elm_scroller_add(Evas_Object *parent); * * @ingroup Scroller */ -EINA_DEPRECATED EAPI void elm_scroller_custom_widget_base_theme_set(Evas_Object *obj, const char *widget, const char *base); +EINA_DEPRECATED EAPI void elm_scroller_custom_widget_base_theme_set(Evas_Object *obj, const char *widget, const char *base); /** * @brief Make the scroller minimum size limited to the minimum size of the content @@ -101,7 +114,7 @@ EINA_DEPRECATED EAPI void elm_scroller_custom_widget_base_theme_set(Evas * * @ingroup Scroller */ -EAPI void elm_scroller_content_min_limit(Evas_Object *obj, Eina_Bool w, Eina_Bool h); +EAPI void elm_scroller_content_min_limit(Evas_Object *obj, Eina_Bool w, Eina_Bool h); /** * @brief Show a specific virtual region within the scroller content object @@ -118,7 +131,7 @@ EAPI void elm_scroller_content_min_limit(Evas_Object *ob * * @ingroup Scroller */ -EAPI void elm_scroller_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); +EAPI void elm_scroller_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); /** * @brief Set the scrollbar visibility policy @@ -135,7 +148,7 @@ EAPI void elm_scroller_region_show(Evas_Object *obj, Eva * * @ingroup Scroller */ -EAPI void elm_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v); +EAPI void elm_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v); /** * @brief Gets scrollbar visibility policy @@ -148,7 +161,35 @@ EAPI void elm_scroller_policy_set(Evas_Object *obj, Elm_ * * @ingroup Scroller */ -EAPI void elm_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v); +EAPI void elm_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v); + +/** + * @brief Set the type of single direction scroll + * + * @param obj The scroller object + * @param single_dir The type of single direction + * + * @see elm_scroller_single_direction_get() + * + * @since 1.8 + * + * @ingroup Scroller + */ +EAPI void elm_scroller_single_direction_set(Evas_Object *obj, Elm_Scroller_Single_Direction single_dir); + +/** + * @brief Get the type of single direction scroll + * + * @param obj The scroller object + * @return the type of single direction + * + * @see elm_scroller_single_direction_get() + * + * @since 1.8 + * + * @ingroup Scroller + */ +EAPI Elm_Scroller_Single_Direction elm_scroller_single_direction_get(const Evas_Object *obj); /** * @brief Get the currently visible content region @@ -169,7 +210,7 @@ EAPI void elm_scroller_policy_get(const Evas_Object *obj * * @ingroup Scroller */ -EAPI void elm_scroller_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); +EAPI void elm_scroller_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); /** * @brief Get the size of the content object @@ -182,7 +223,7 @@ EAPI void elm_scroller_region_get(const Evas_Object *obj * * @ingroup Scroller */ -EAPI void elm_scroller_child_size_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); +EAPI void elm_scroller_child_size_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); /** * @brief Set bouncing behavior @@ -198,7 +239,7 @@ EAPI void elm_scroller_child_size_get(const Evas_Object * * @ingroup Scroller */ -EAPI void elm_scroller_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce); +EAPI void elm_scroller_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce); /** * @brief Get the bounce behaviour @@ -211,7 +252,7 @@ EAPI void elm_scroller_bounce_set(Evas_Object *obj, Eina * * @ingroup Scroller */ -EAPI void elm_scroller_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce); +EAPI void elm_scroller_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce); /** * @brief Set scroll page size relative to viewport size. @@ -233,7 +274,7 @@ EAPI void elm_scroller_bounce_get(const Evas_Object *obj * * @ingroup Scroller */ -EAPI void elm_scroller_page_relative_set(Evas_Object *obj, double h_pagerel, double v_pagerel); +EAPI void elm_scroller_page_relative_set(Evas_Object *obj, double h_pagerel, double v_pagerel); /** * Get a given scroller widget's scrolling page size, relative to @@ -251,7 +292,7 @@ EAPI void elm_scroller_page_relative_set(Evas_Object *ob * * @ingroup Scroller */ -EAPI void elm_scroller_page_relative_get(const Evas_Object *obj, double *h_pagerel, double *v_pagerel); +EAPI void elm_scroller_page_relative_get(const Evas_Object *obj, double *h_pagerel, double *v_pagerel); /** * @brief Set scroll page size. @@ -268,7 +309,7 @@ EAPI void elm_scroller_page_relative_get(const Evas_Obje * * @ingroup Scroller */ -EAPI void elm_scroller_page_size_set(Evas_Object *obj, Evas_Coord h_pagesize, Evas_Coord v_pagesize); +EAPI void elm_scroller_page_size_set(Evas_Object *obj, Evas_Coord h_pagesize, Evas_Coord v_pagesize); /** * @brief Retrieve a scroller widget's current page size. @@ -284,7 +325,7 @@ EAPI void elm_scroller_page_size_set(Evas_Object *obj, E * * @ingroup Scroller */ -EAPI void elm_scroller_page_size_get(const Evas_Object *obj, Evas_Coord *h_pagesize, Evas_Coord *v_pagesize); +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. @@ -301,7 +342,7 @@ EAPI void elm_scroller_page_size_get(const Evas_Object * * * @ingroup Scroller */ -EAPI void elm_scroller_page_scroll_limit_set(Evas_Object *obj, int page_limit_h, int page_limit_v); +EAPI void elm_scroller_page_scroll_limit_set(Evas_Object *obj, int page_limit_h, int page_limit_v); /** * @brief Get the maxium of the movable page at a flicking. @@ -317,7 +358,7 @@ EAPI void elm_scroller_page_scroll_limit_set(Evas_Object * * @ingroup Scroller */ -EAPI void elm_scroller_page_scroll_limit_get(Evas_Object *obj, int *page_limit_h, int *page_limit_v); +EAPI void elm_scroller_page_scroll_limit_get(Evas_Object *obj, int *page_limit_h, int *page_limit_v); /** * @brief Get scroll current page number. @@ -337,7 +378,7 @@ EAPI void elm_scroller_page_scroll_limit_get(Evas_Object * * @ingroup Scroller */ -EAPI void elm_scroller_current_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber); +EAPI void elm_scroller_current_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber); /** * @brief Get scroll last page number. @@ -355,7 +396,7 @@ EAPI void elm_scroller_current_page_get(const Evas_Objec * * @ingroup Scroller */ -EAPI void elm_scroller_last_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber); +EAPI void elm_scroller_last_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber); /** * Show a specific virtual region within the scroller content object by page number. @@ -381,7 +422,7 @@ EAPI void elm_scroller_last_page_get(const Evas_Object * * * @ingroup Scroller */ -EAPI void elm_scroller_page_show(Evas_Object *obj, int h_pagenumber, int v_pagenumber); +EAPI void elm_scroller_page_show(Evas_Object *obj, int h_pagenumber, int v_pagenumber); /** * Show a specific virtual region within the scroller content object by page number. @@ -407,7 +448,7 @@ EAPI void elm_scroller_page_show(Evas_Object *obj, int h * * @ingroup Scroller */ -EAPI void elm_scroller_page_bring_in(Evas_Object *obj, int h_pagenumber, int v_pagenumber); +EAPI void elm_scroller_page_bring_in(Evas_Object *obj, int h_pagenumber, int v_pagenumber); /** * @brief Show a specific virtual region within the scroller content object. @@ -430,7 +471,7 @@ EAPI void elm_scroller_page_bring_in(Evas_Object *obj, i * * @ingroup Scroller */ -EAPI void elm_scroller_region_bring_in(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); +EAPI void elm_scroller_region_bring_in(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); /** * @brief Set event propagation on a scroller @@ -444,7 +485,7 @@ EAPI void elm_scroller_region_bring_in(Evas_Object *obj, * * @ingroup Scroller */ -EAPI void elm_scroller_propagate_events_set(Evas_Object *obj, Eina_Bool propagation); +EAPI void elm_scroller_propagate_events_set(Evas_Object *obj, Eina_Bool propagation); /** * @brief Get event propagation for a scroller @@ -458,7 +499,7 @@ EAPI void elm_scroller_propagate_events_set(Evas_Object * * @ingroup Scroller */ -EAPI Eina_Bool elm_scroller_propagate_events_get(const Evas_Object *obj); +EAPI Eina_Bool elm_scroller_propagate_events_get(const Evas_Object *obj); /** * @brief Set scrolling gravity on a scroller @@ -481,7 +522,7 @@ EAPI Eina_Bool elm_scroller_propagate_events_get(const Evas_O * * @ingroup Scroller */ -EAPI void elm_scroller_gravity_set(Evas_Object *obj, double x, double y); +EAPI void elm_scroller_gravity_set(Evas_Object *obj, double x, double y); /** * @brief Get scrolling gravity values for a scroller @@ -496,7 +537,7 @@ EAPI void elm_scroller_gravity_set(Evas_Object *obj, dou * * @ingroup Scroller */ -EAPI void elm_scroller_gravity_get(const Evas_Object *obj, double *x, double *y); +EAPI void elm_scroller_gravity_get(const Evas_Object *obj, double *x, double *y); /** * @} -- 2.7.4