Scroller can me made to snap to pages on scrolling now.
authorGustavo Lima Chaves <glima@profusion.mobi>
Fri, 17 May 2013 14:30:42 +0000 (11:30 -0300)
committerGustavo Lima Chaves <glima@profusion.mobi>
Fri, 17 May 2013 18:37:37 +0000 (15:37 -0300)
src/bin/test_scroller.c
src/lib/elm_interface_scrollable.c
src/lib/elm_interface_scrollable.h
src/lib/elm_scroller.c
src/lib/elm_scroller_legacy.h

index 36d6d60..5bec50b 100644 (file)
@@ -72,6 +72,21 @@ my_bt_block_movements_x_axis(void *data, Evas_Object *obj,
 }
 
 void
+my_bt_snap_to_pages(void *data,
+                    Evas_Object *obj,
+                    void *event_info __UNUSED__)
+{
+   if (elm_check_state_get(obj))
+     {
+        elm_scroller_page_snap_set(data, EINA_TRUE, EINA_TRUE);
+     }
+   else
+     {
+        elm_scroller_page_snap_set(data, EINA_FALSE, EINA_FALSE);
+     }
+}
+
+void
 my_bt_block_movements_y_axis(void *data, Evas_Object *obj,
                              void *event_info __UNUSED__)
 {
@@ -116,7 +131,8 @@ _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, *ck3, *ck4;
+   Evas_Object *win, *bg2, *tb, *tb2, *sc, *bt, *ck1, *ck2, *bx, *bx2, *fr,
+       *ck3, *ck4, *ck5;
    int i, j, n;
    char buf[PATH_MAX];
    Evas_Coord x = 0, y = 0, w = 0, h = 0;
@@ -173,6 +189,11 @@ test_scroller(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    elm_box_pack_end(bx2, ck4);
    evas_object_show(ck4);
 
+   ck5 = elm_check_add(win);
+   elm_object_text_set(ck5, "Snap to pages");
+   elm_box_pack_end(bx2, ck5);
+   evas_object_show(ck5);
+
    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);
@@ -211,6 +232,7 @@ test_scroller(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
                                   sc);
    evas_object_smart_callback_add(ck4, "changed", my_bt_block_movements_y_axis,
                                   sc);
+   evas_object_smart_callback_add(ck5, "changed", my_bt_snap_to_pages, sc);
 
    tb2 = elm_table_add(win);
 
index dc98762..021bc9a 100644 (file)
@@ -1541,8 +1541,29 @@ _elm_scroll_content_pos_set(Eo *obj, void *_pd, va_list *list)
    eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
    eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
    eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
+
+   if (_paging_is_enabled(sid) && sid->page_snap_horiz)
+     {
+        //we passed one page to the right
+        if (x > sid->current_page.x + sid->pagesize_h)
+          x = sid->current_page.x + sid->pagesize_h;
+        //we passed one page to the left
+        if (x < sid->current_page.x - sid->pagesize_h)
+          x = sid->current_page.x - sid->pagesize_h;
+     }
+   if (_paging_is_enabled(sid) && sid->page_snap_vert)
+     {
+        //we passed one page to the bottom
+        if (y > sid->current_page.y + sid->pagesize_v)
+          y = sid->current_page.y + sid->pagesize_v;
+        //we passed one page to the top
+        if (y < sid->current_page.y - sid->pagesize_v)
+          y = sid->current_page.y - sid->pagesize_v;
+     }
+
    if (!_elm_config->thumbscroll_bounce_enable)
      {
+
         if (x < minx) x = minx;
         if ((x - minx) > mx) x = mx + minx;
         if (y < miny) y = miny;
@@ -4175,6 +4196,32 @@ _elm_scroll_freeze_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
 }
 
 static void
+_elm_scroll_page_snap_allow_set(Eo *obj EINA_UNUSED,
+                                  void *_pd,
+                                  va_list *list)
+{
+   Elm_Scrollable_Smart_Interface_Data *sid = _pd;
+   Eina_Bool horiz = va_arg(*list, int);
+   Eina_Bool vert = va_arg(*list, int);
+
+   sid->page_snap_horiz = !!horiz;
+   sid->page_snap_vert = !!vert;
+}
+
+static void
+_elm_scroll_page_snap_allow_get(Eo *obj EINA_UNUSED,
+                                  void *_pd,
+                                  va_list *list)
+{
+   Elm_Scrollable_Smart_Interface_Data *sid = _pd;
+   Eina_Bool *horiz = va_arg(*list, Eina_Bool *);
+   Eina_Bool *vert = va_arg(*list, Eina_Bool *);
+
+   if (horiz) *horiz = sid->page_snap_horiz;
+   if (vert) *vert = sid->page_snap_vert;
+}
+
+static void
 _elm_scroll_bounce_allow_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = _pd;
@@ -4542,6 +4589,8 @@ _elm_scrollable_interface_constructor(Eo_Class *klass)
            EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MIRRORED_SET), _elm_scroll_mirrored_set),
            EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_HOLD_SET), _elm_scroll_hold_set),
            EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET), _elm_scroll_freeze_set),
+           EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET), _elm_scroll_page_snap_allow_set),
+           EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET), _elm_scroll_page_snap_allow_get),
            EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_SET), _elm_scroll_bounce_allow_set),
            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),
@@ -4616,6 +4665,12 @@ static const Eo_Op_Description op_desc[] = {
      EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_MIRRORED_SET, "description here"),
      EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_HOLD_SET, "description here"),
      EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET, "description here"),
+     EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET,
+                       "Enable/disable page bouncing, for paged scrollers, "
+                       "on each axis."),
+     EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET,
+                       "Get wether page bouncing is enabled,"
+                       " for paged scrollers, on each axis"),
      EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_SET, "description here"),
      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"),
index b4c5a62..f5a83e9 100644 (file)
@@ -192,6 +192,8 @@ enum
    ELM_SCROLLABLE_INTERFACE_SUB_ID_MIRRORED_SET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_HOLD_SET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET,
+   ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET,
+   ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_SET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_BOUNCE_ALLOW_GET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGING_SET,
@@ -715,6 +717,31 @@ enum
 #define elm_scrollable_interface_freeze_set(freeze) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_FREEZE_SET), EO_TYPECHECK(Eina_Bool, freeze)
 
 /**
+ * @def elm_scrollable_interface_page_snap_allow_set
+ * @since 1.8
+ *
+ * Enable/disable page bouncing, for paged scrollers, on each axis.
+ *
+ * @param[in] horiz
+ * @param[in] vert
+ *
+ */
+#define elm_scrollable_interface_page_snap_allow_set(horiz, vert) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_SET), EO_TYPECHECK(Eina_Bool, horiz), EO_TYPECHECK(Eina_Bool, vert)
+
+/**
+ * @def elm_scrollable_interface_page_snap_allow_get
+ * @since 1.8
+ *
+ * Get wether page bouncing is enabled, for paged scrollers, on each
+ * axis.
+ *
+ * @param[out] horiz
+ * @param[out] vert
+ *
+ */
+#define elm_scrollable_interface_page_snap_allow_get(horiz, vert) ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_BOUNCE_ALLOW_GET), EO_TYPECHECK(Eina_Bool *, horiz), EO_TYPECHECK(Eina_Bool *, vert)
+
+/**
  * @def elm_scrollable_interface_bounce_allow_set
  * @since 1.8
  *
@@ -1126,6 +1153,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
 
    Eina_Bool  momentum_animator_disabled : 1;
    Eina_Bool  bounce_animator_disabled : 1;
+   Eina_Bool  page_snap_horiz : 1;
+   Eina_Bool  page_snap_vert : 1;
    Eina_Bool  wheel_disabled : 1;
    Eina_Bool  hbar_visible : 1;
    Eina_Bool  vbar_visible : 1;
index bbb51f8..4b69e79 100644 (file)
@@ -1022,6 +1022,28 @@ _child_size_get(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
 }
 
 EAPI void
+elm_scroller_page_snap_set(Evas_Object *obj,
+                             Eina_Bool page_snap_h,
+                             Eina_Bool page_snap_v)
+{
+   ELM_SCROLLABLE_CHECK(obj);
+
+   eo_do(obj, elm_scrollable_interface_page_snap_allow_set
+         (page_snap_h, page_snap_v));
+}
+
+EAPI void
+elm_scroller_page_snap_get(const Evas_Object *obj,
+                             Eina_Bool *page_snap_h,
+                             Eina_Bool *page_snap_v)
+{
+   ELM_SCROLLABLE_CHECK(obj);
+
+   eo_do((Eo *) obj, elm_scrollable_interface_page_snap_allow_get
+         (page_snap_h, page_snap_v));
+}
+
+EAPI void
 elm_scroller_bounce_set(Evas_Object *obj,
                         Eina_Bool h_bounce,
                         Eina_Bool v_bounce)
index a254ee5..2caa21e 100644 (file)
@@ -134,6 +134,44 @@ EAPI void                          elm_scroller_region_get(const Evas_Object *ob
 EAPI void                          elm_scroller_child_size_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
 
 /**
+ * @brief Set page snapping behavior of a scroller
+ *
+ * @param obj The scroller object
+ * @param page_h_snap Allow snap horizontally
+ * @param page_v_snap Allow snap vertically
+ *
+ * When scrolling, if a scroller is paged (see
+ * elm_scroller_page_size_set() and elm_scroller_page_relative_set()),
+ * the scroller may snap to pages when being scrolled, i.e., even if
+ * it had momentum to scroll further, it will stop at the next page
+ * boundaries. This is @b disabled, by default, for both axis. This
+ * function will set if it that is enabled or not, for each axis.
+ *
+ * @note If @a obj is not set to have pages, nothing will happen after
+ * this call.
+ *
+ * @since 1.8
+ *
+ * @ingroup Scroller
+ */
+EAPI void                          elm_scroller_page_snap_set(Evas_Object *obj, Eina_Bool page_h_snap, Eina_Bool page_v_snap);
+
+/**
+ * @brief Get the page snap behaviour of a scroller
+ *
+ * @param obj The Scroller object
+ * @param page_h_snap Will the scroller snap horizontally or not
+ * @param page_v_snap Will the scroller snap vertically or not
+ *
+ * @see elm_scroller_page_snap_set() for more details
+ *
+ * @since 1.8
+ *
+ * @ingroup Scroller
+ */
+EAPI void                          elm_scroller_page_snap_get(const Evas_Object *obj, Eina_Bool *page_h_snap, Eina_Bool *page_v_snap);
+
+/**
  * @brief Set bouncing behavior
  *
  * @param obj The scroller object