glima pushed a commit to branch master.

commit 164cc07237395f8fe6efa465e4f0c0c4863f78ed
Author: Flavio Ceolin <[email protected]>
Date:   Wed May 15 18:56:04 2013 -0300

    Welcome a new smart callback for scrollables -- page,changed.
---
 src/lib/elm_gengrid.c              | 15 ++++++++--
 src/lib/elm_gengrid.h              |  2 ++
 src/lib/elm_interface_scrollable.c | 59 ++++++++++++++++++++++++++++++++++++--
 src/lib/elm_interface_scrollable.h | 16 ++++++++++-
 src/lib/elm_scroller.c             | 14 ++++++++-
 src/lib/elm_scroller.h             |  1 +
 6 files changed, 101 insertions(+), 6 deletions(-)

diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c
index 94a82e8..ed6a99d 100644
--- a/src/lib/elm_gengrid.c
+++ b/src/lib/elm_gengrid.c
@@ -55,6 +55,7 @@ static const char SIG_SCROLL_ANIM_START[] = 
"scroll,anim,start";
 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
+static const char SIG_SCROLL_PAGE_CHANGE[] = "scroll,page,changed";
 static const char SIG_EDGE_TOP[] = "edge,top";
 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
 static const char SIG_EDGE_LEFT[] = "edge,left";
@@ -97,6 +98,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {SIG_LANG_CHANGED, ""},
    {SIG_PRESSED, ""},
    {SIG_RELEASED, ""},
+   {SIG_SCROLL_PAGE_CHANGE, ""},
 
    {NULL, NULL}
 };
@@ -2158,6 +2160,13 @@ _edge_bottom_cb(Evas_Object *obj,
 }
 
 static void
+_scroll_page_change_cb(Evas_Object *obj,
+                     void *data __UNUSED__)
+{
+   evas_object_smart_callback_call(obj, SIG_SCROLL_PAGE_CHANGE, NULL);
+}
+
+static void
 _scroll_cb(Evas_Object *obj,
            void *data __UNUSED__)
 {
@@ -2432,7 +2441,8 @@ _elm_gengrid_smart_add(Eo *obj, void *_pd, va_list *list 
EINA_UNUSED)
    eo_do(obj, elm_scrollable_interface_bounce_allow_set(bounce, bounce));
 
    eo_do(obj,
-         
elm_scrollable_interface_animate_start_cb_set(_scroll_animate_start_cb),
+         elm_scrollable_interface_animate_start_cb_set
+         (_scroll_animate_start_cb),
          elm_scrollable_interface_animate_stop_cb_set(_scroll_animate_stop_cb),
          elm_scrollable_interface_drag_start_cb_set(_scroll_drag_start_cb),
          elm_scrollable_interface_drag_stop_cb_set(_scroll_drag_stop_cb),
@@ -2440,7 +2450,8 @@ _elm_gengrid_smart_add(Eo *obj, void *_pd, va_list *list 
EINA_UNUSED)
          elm_scrollable_interface_edge_right_cb_set(_edge_right_cb),
          elm_scrollable_interface_edge_top_cb_set(_edge_top_cb),
          elm_scrollable_interface_edge_bottom_cb_set(_edge_bottom_cb),
-         elm_scrollable_interface_scroll_cb_set(_scroll_cb));
+         elm_scrollable_interface_scroll_cb_set(_scroll_cb),
+         elm_scrollable_interface_page_change_cb_set(_scroll_page_change_cb));
 
    priv->align_x = 0.5;
    priv->align_y = 0.5;
diff --git a/src/lib/elm_gengrid.h b/src/lib/elm_gengrid.h
index 41c0095..e630f12 100644
--- a/src/lib/elm_gengrid.h
+++ b/src/lib/elm_gengrid.h
@@ -209,6 +209,8 @@
  *   started.
  * - @c "scroll,drag,stop" - called when dragging the content has
  *   stopped.
+ * - @c "scroll,page,changed" - called when the visible page has
+ *   changed.
  * - @c "edge,top" - This is called when the gengrid is scrolled until
  *   the top edge.
  * - @c "edge,bottom" - This is called when the gengrid is scrolled
diff --git a/src/lib/elm_interface_scrollable.c 
b/src/lib/elm_interface_scrollable.c
index e836820..dc98762 100644
--- a/src/lib/elm_interface_scrollable.c
+++ b/src/lib/elm_interface_scrollable.c
@@ -958,6 +958,9 @@ _elm_scroll_scroll_bar_read_and_update(
 static void
 _elm_scroll_drag_start(Elm_Scrollable_Smart_Interface_Data *sid)
 {
+   sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+   sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+
    if (sid->cb_func.drag_start)
      sid->cb_func.drag_start(sid->obj, NULL);
 }
@@ -965,6 +968,18 @@ _elm_scroll_drag_start(Elm_Scrollable_Smart_Interface_Data 
*sid)
 static void
 _elm_scroll_drag_stop(Elm_Scrollable_Smart_Interface_Data *sid)
 {
+   Evas_Coord x, y;
+
+   if (!(sid->down.bounce_x_animator) && !(sid->down.bounce_y_animator) &&
+       !(sid->scrollto.x.animator) && !(sid->scrollto.y.animator))
+     {
+        x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+        y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+        if (sid->cb_func.page_change &&
+            ((x != sid->current_page.x) || (y != sid->current_page.y)))
+          sid->cb_func.page_change(sid->obj, NULL);
+     }
+
    if (sid->cb_func.drag_stop)
      sid->cb_func.drag_stop(sid->obj, NULL);
 }
@@ -979,6 +994,16 @@ _elm_scroll_anim_start(Elm_Scrollable_Smart_Interface_Data 
*sid)
 static void
 _elm_scroll_anim_stop(Elm_Scrollable_Smart_Interface_Data *sid)
 {
+   Evas_Coord x, y;
+
+   if (sid->cb_func.page_change)
+     {
+        x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+        y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+        if ((x != sid->current_page.x) || (y != sid->current_page.y))
+           sid->cb_func.page_change(sid->obj, NULL);
+     }
+
    if (sid->cb_func.animate_stop)
      sid->cb_func.animate_stop(sid->obj, NULL);
 }
@@ -3773,6 +3798,16 @@ _elm_scroll_animate_stop_cb_set(Eo *obj EINA_UNUSED, 
void *_pd, va_list *list)
 }
 
 static void
+_elm_scroll_page_change_cb_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   Elm_Scrollable_Smart_Interface_Data *sid = _pd;
+   Elm_Interface_Scrollable_Cb page_change_cb =
+       va_arg(*list, Elm_Interface_Scrollable_Cb);
+
+   sid->cb_func.page_change = page_change_cb;
+}
+
+static void
 _elm_scroll_scroll_cb_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = _pd;
@@ -4282,13 +4317,20 @@ _elm_scroll_page_show(Eo *obj, void *_pd, va_list *list)
 
    Elm_Scrollable_Smart_Interface_Data *sid = _pd;
 
+   sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+   sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+
    eo_do(sid->obj, elm_scrollable_interface_content_viewport_size_get(&w, &h));
    if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
    if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
    if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
-
-
      eo_do(obj, elm_scrollable_interface_content_pos_set(x, y, EINA_TRUE));
+
+   if ((sid->current_page.x != x) || (sid->current_page.y != y))
+     {
+        if (sid->cb_func.page_change)
+          sid->cb_func.page_change(sid->obj, NULL);
+     }
 }
 
 static void
@@ -4303,6 +4345,9 @@ _elm_scroll_page_bring_in(Eo *obj, void *_pd, va_list 
*list)
 
    Elm_Scrollable_Smart_Interface_Data *sid = _pd;
 
+   sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+   sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+
    eo_do(sid->obj, elm_scrollable_interface_content_viewport_size_get(&w, &h));
    if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
    if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
@@ -4311,6 +4356,12 @@ _elm_scroll_page_bring_in(Eo *obj, void *_pd, va_list 
*list)
         _elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
         _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, y);
      }
+
+   if ((sid->current_page.x != x) || (sid->current_page.y != y))
+     {
+        if (sid->cb_func.page_change)
+          sid->cb_func.page_change(sid->obj, NULL);
+     }
 }
 
 static void
@@ -4512,6 +4563,8 @@ _elm_scrollable_interface_constructor(Eo_Class *klass)
            
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_SET),
 _elm_scroll_wheel_disabled_set),
            
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_SET),
 _elm_scroll_movement_block_set),
            
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET),
 _elm_scroll_movement_block_get),
+           
EO_OP_FUNC(ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET),
 _elm_scroll_page_change_cb_set),
+
            EO_OP_FUNC_SENTINEL
       };
       eo_class_funcs_set(klass, func_desc);
@@ -4584,6 +4637,8 @@ static const Eo_Op_Description op_desc[] = {
      EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_SET, 
"description here"),
      EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_SET, 
"Set movement block in a axis"),
      EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET, 
"Get the movement block"),
+     EO_OP_DESCRIPTION(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET,
+                       "Set a scroller page change callback function"),
      EO_OP_DESCRIPTION_SENTINEL
 };
 
diff --git a/src/lib/elm_interface_scrollable.h 
b/src/lib/elm_interface_scrollable.h
index fcfd2d8..b4c5a62 100644
--- a/src/lib/elm_interface_scrollable.h
+++ b/src/lib/elm_interface_scrollable.h
@@ -213,6 +213,7 @@ enum
    ELM_SCROLLABLE_INTERFACE_SUB_ID_WHEEL_DISABLED_SET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_SET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET,
+   ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET,
    ELM_SCROLLABLE_INTERFACE_SUB_ID_LAST
 };
 
@@ -963,6 +964,17 @@ enum
  */
 #define elm_scrollable_interface_movement_block_get(block) 
ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_MOVEMENT_BLOCK_GET),
 EO_TYPECHECK(Elm_Scroller_Movement_Block *, block)
 
+/**
+ * @def elm_scrollable_interface_page_change_cb_set
+ * @since 1.8
+ *
+ * No description supplied by the EAPI.
+ *
+ * @param[in] page_change_cb
+ *
+ */
+#define elm_scrollable_interface_page_change_cb_set(page_change_cb) 
ELM_SCROLLABLE_INTERFACE_ID(ELM_SCROLLABLE_INTERFACE_SUB_ID_PAGE_CHANGE_CB_SET),
 EO_TYPECHECK(Elm_Interface_Scrollable_Cb, page_change_cb)
+
 
 /**
  * Elementary scroller panning base smart data.
@@ -1070,7 +1082,7 @@ struct _Elm_Scrollable_Smart_Interface_Data
    struct
    {
       Evas_Coord x, y;
-   } step, page;
+   } step, page, current_page;
 
    struct
    {
@@ -1093,6 +1105,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
       Elm_Interface_Scrollable_Cb hbar_drag;
       Elm_Interface_Scrollable_Cb hbar_press;
       Elm_Interface_Scrollable_Cb hbar_unpress;
+      Elm_Interface_Scrollable_Cb page_change;
+
       Elm_Interface_Scrollable_Min_Limit_Cb content_min_limit;
    } cb_func;
 
diff --git a/src/lib/elm_scroller.c b/src/lib/elm_scroller.c
index 9cd4736..bbb51f8 100644
--- a/src/lib/elm_scroller.c
+++ b/src/lib/elm_scroller.c
@@ -34,6 +34,8 @@ static const char SIG_VBAR_UNPRESS[] = "vbar,unpress";
 static const char SIG_HBAR_DRAG[] = "hbar,drag";
 static const char SIG_HBAR_PRESS[] = "hbar,press";
 static const char SIG_HBAR_UNPRESS[] = "hbar,unpress";
+static const char SIG_SCROLL_PAGE_CHANGE[] = "scroll,page,changed";
+
 static const Evas_Smart_Cb_Description _smart_callbacks[] =
 {
    {SIG_SCROLL, ""},
@@ -55,6 +57,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] =
    {SIG_HBAR_DRAG, ""},
    {SIG_HBAR_PRESS, ""},
    {SIG_HBAR_UNPRESS, ""},
+   {SIG_SCROLL_PAGE_CHANGE, ""},
    {NULL, NULL}
 };
 
@@ -647,6 +650,13 @@ _hbar_unpress_cb(Evas_Object *obj,
 }
 
 static void
+_page_change_cb(Evas_Object *obj,
+                void *data __UNUSED__)
+{
+   evas_object_smart_callback_call(obj, SIG_SCROLL_PAGE_CHANGE, NULL);
+}
+
+static void
 _elm_scroller_smart_content_set(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
 {
    const char *part = va_arg(*list, const char *);
@@ -790,7 +800,9 @@ _elm_scroller_smart_add(Eo *obj, void *_pd, va_list *list 
EINA_UNUSED)
          elm_scrollable_interface_hbar_drag_cb_set(_hbar_drag_cb),
          elm_scrollable_interface_hbar_press_cb_set(_hbar_press_cb),
          elm_scrollable_interface_hbar_unpress_cb_set(_hbar_unpress_cb),
-         
elm_scrollable_interface_content_min_limit_cb_set(_elm_scroller_content_min_limit_cb));
+         elm_scrollable_interface_page_change_cb_set(_page_change_cb),
+         elm_scrollable_interface_content_min_limit_cb_set
+         (_elm_scroller_content_min_limit_cb));
 }
 
 static void
diff --git a/src/lib/elm_scroller.h b/src/lib/elm_scroller.h
index 0ab73df..fa052bc 100644
--- a/src/lib/elm_scroller.h
+++ b/src/lib/elm_scroller.h
@@ -35,6 +35,7 @@
  * @li @c "hbar,drag" - the horizontal scroll bar has been dragged
  * @li @c "hbar,press" - the horizontal scroll bar has been pressed
  * @li @c "hbar,unpress" - the horizontal scroll bar has been unpressed
+ * @li @c "scroll,page,changed" - the visible page has changed
  *
  * This widget implements the @ref elm-scrollable-interface interface.
  * Its (non-deprecated) API functions, except for elm_scroller_add(),

-- 

------------------------------------------------------------------------------
AlienVault Unified Security Management (USM) platform delivers complete
security visibility with the essential security capabilities. Easily and
efficiently configure, manage, and operate all of your security controls
from a single console and one unified framework. Download a free trial.
http://p.sf.net/sfu/alienvault_d2d

Reply via email to