Add the API elm_scroller_page_scroll_limit_set/get.
authorJaehwan Kim <jae.hwan.kim@samsung.com>
Sat, 6 Apr 2013 04:06:43 +0000 (13:06 +0900)
committerJaehwan Kim <jae.hwan.kim@samsung.com>
Sat, 6 Apr 2013 04:09:59 +0000 (13:09 +0900)
It sets the maxium of the movable page at flicking.

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

index 17933fe..0c4d50d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
         * 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 (file)
--- 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:
 
index 21398ec..051ff1d 100644 (file)
@@ -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"),
index 4978650..30a6621 100644 (file)
@@ -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;
index 39a581a..3f196dd 100644 (file)
@@ -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
index 3e0f37d..4d3876d 100644 (file)
@@ -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