[Scroller] Add the API elm_scroller_single_direction_set/get.
authorJaehwan Kim <jae.hwan.kim@samsung.com>
Wed, 10 Apr 2013 12:14:28 +0000 (21:14 +0900)
committerSungho Kwak <sungho1.kwak@samsung.com>
Sun, 14 Apr 2013 09:38:47 +0000 (18:38 +0900)
Change-Id: I955c5a2134646ed9ef863ff6abaefa329b91c596

src/lib/elm_interface_scrollable.c
src/lib/elm_interface_scrollable.h
src/lib/elm_scroller.c
src/lib/elm_scroller.h

index df41b37..24501f3 100644 (file)
@@ -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;
 
index 389957a..e127ea6 100644 (file)
@@ -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);
index 249fe5e..721c5c9 100644 (file)
@@ -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,
index d550b3d..4e1ce3e 100644 (file)
@@ -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);
 
 /**
  * @}