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