jaehwan pushed a commit to branch master.

commit 0c1a4597857a8ba64f8e2a0ec961c9bf226881db
Author: Jaehwan Kim <[email protected]>
Date:   Sat Apr 6 13:06:43 2013 +0900

    Add the API elm_scroller_page_scroll_limit_set/get.
    It sets the maxium of the movable page at flicking.
---
 ChangeLog                          |  4 +++
 NEWS                               |  1 +
 src/lib/elm_interface_scrollable.c | 52 +++++++++++++++++++++++++++++----
 src/lib/elm_interface_scrollable.h | 27 +++++++++++++++++
 src/lib/elm_scroller.c             | 49 +++++++++++++++++++++++++++++++
 src/lib/elm_scroller.h             | 60 ++++++++++++++++++++++++++++++++++++++
 6 files changed, 187 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 17933fe..0c4d50d 100644
--- a/ChangeLog
+++ b/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/NEWS b/NEWS
index 014df47..d5e6632 100644
--- a/NEWS
+++ b/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/src/lib/elm_interface_scrollable.c 
b/src/lib/elm_interface_scrollable.c
index 21398ec..051ff1d 100644
--- a/src/lib/elm_interface_scrollable.c
+++ b/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);
@@ -4027,6 +4039,28 @@ _elm_scroll_paging_get(Eo *obj EINA_UNUSED, void *_pd, 
va_list *list)
 }
 
 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)
 {
    Evas_Coord x, y;
@@ -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/src/lib/elm_interface_scrollable.h 
b/src/lib/elm_interface_scrollable.h
index 4978650..30a6621 100644
--- a/src/lib/elm_interface_scrollable.h
+++ b/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,
@@ -762,6 +764,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/src/lib/elm_scroller.c b/src/lib/elm_scroller.c
index 39a581a..3f196dd 100644
--- a/src/lib/elm_scroller.c
+++ b/src/lib/elm_scroller.c
@@ -1049,6 +1049,51 @@ elm_scroller_page_size_get(const Evas_Object *obj,
 }
 
 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,
                               int *v_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/src/lib/elm_scroller.h b/src/lib/elm_scroller.h
index 3e0f37d..4d3876d 100644
--- a/src/lib/elm_scroller.h
+++ b/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
@@ -136,6 +138,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
  *
@@ -382,6 +410,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.
  *
  * @param obj The scroller object

-- 

------------------------------------------------------------------------------
Minimize network downtime and maximize team effectiveness.
Reduce network management and security costs.Learn how to hire 
the most talented Cisco Certified professionals. Visit the 
Employer Resources Portal
http://www.cisco.com/web/learning/employer_resources/index.html

Reply via email to