+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
#include <Elementary.h>
+
#include "elm_priv.h"
#include "elm_interface_scrollable.h"
-static const char PAN_SMART_NAME[] = "elm_pan";
+#define MY_PAN_CLASS ELM_PAN_CLASS
+
+#define MY_PAN_CLASS_NAME "Elm_Pan"
+#define MY_PAN_CLASS_NAME_LEGACY "elm_pan"
#define ELM_PAN_DATA_GET_OR_RETURN(o, ptr) \
- Elm_Pan_Smart_Data *ptr = evas_object_smart_data_get(o); \
+ Elm_Pan_Smart_Data *ptr = eo_data_scope_get(o, MY_PAN_CLASS); \
if (!ptr) \
{ \
- CRITICAL("No smart data for object %p (%s)", \
+ CRI("No smart data for object %p (%s)", \
o, evas_object_type_get(o)); \
return; \
}
-#define ELM_PAN_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
- Elm_Pan_Smart_Data *ptr = evas_object_smart_data_get(o); \
- if (!ptr) \
- { \
- CRITICAL("No smart data for object %p (%s)", \
- o, evas_object_type_get(o)); \
- return val; \
+#define ELM_PAN_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
+ Elm_Pan_Smart_Data *ptr = eo_data_scope_get(o, MY_PAN_CLASS); \
+ if (!ptr) \
+ { \
+ CRI("No smart data for object %p (%s)", \
+ o, evas_object_type_get(o)); \
+ return val; \
}
static const char SIG_CHANGED[] = "changed";
{NULL, NULL}
};
-ELM_INTERNAL_SMART_SUBCLASS_NEW
- (PAN_SMART_NAME, _elm_pan, Elm_Pan_Smart_Class, Evas_Smart_Class,
- evas_object_smart_clipped_class_get, _smart_callbacks);
-
static void _elm_pan_content_set(Evas_Object *, Evas_Object *);
static void
_elm_scroll_scroll_to_x(Elm_Scrollable_Smart_Interface_Data *sid,
double t_in,
Evas_Coord pos_y);
static void
-_elm_scroll_current_page_get(const Evas_Object *obj,
- int *pagenumber_h,
- int *pagenumber_v);
-static void
_elm_scroll_wanted_coordinates_update(Elm_Scrollable_Smart_Interface_Data *sid,
Evas_Coord x,
Evas_Coord y);
-EAPI const Elm_Pan_Smart_Class *
-elm_pan_smart_class_get(void)
-{
- static Elm_Pan_Smart_Class _sc =
- ELM_PAN_SMART_CLASS_INIT_NAME_VERSION(PAN_SMART_NAME);
- static const Elm_Pan_Smart_Class *class = NULL;
- Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
-
- if (class)
- return class;
-
- _elm_pan_smart_set(&_sc);
- esc->callbacks = _smart_callbacks;
- class = &_sc;
-
- return class;
-}
-
static double
_round(double value, int pos)
{
psd->py = psd->delta_posy * psd->gravity_y;
}
-static void
-_elm_pan_smart_add(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_add(Eo *obj, Elm_Pan_Smart_Data *priv)
{
- const Evas_Smart_Class *sc;
- const Evas_Smart *smart;
-
- EVAS_SMART_DATA_ALLOC(obj, Elm_Pan_Smart_Data);
-
- _elm_pan_parent_sc->add(obj);
+ eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_add());
priv->self = obj;
-
- priv->x = 0;
- priv->y = 0;
- priv->w = 0;
- priv->h = 0;
- priv->gravity_x = 0.0;
- priv->gravity_y = 0.0;
-
- smart = evas_object_smart_smart_get(obj);
- sc = evas_smart_class_get(smart);
- priv->api = (const Elm_Pan_Smart_Class *)sc;
}
-static void
-_elm_pan_smart_del(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_del(Eo *obj, Elm_Pan_Smart_Data *_pd EINA_UNUSED)
{
_elm_pan_content_set(obj, NULL);
- _elm_pan_parent_sc->del(obj);
+ eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_del());
}
-static void
-_elm_pan_smart_move(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y)
+EOLIAN static void
+_elm_pan_evas_object_smart_move(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord x, Evas_Coord y)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
- /* we don't want the clipped smart object version here */
-
psd->x = x;
psd->y = y;
_elm_pan_update(psd);
}
-static void
-_elm_pan_smart_resize(Evas_Object *obj,
- Evas_Coord w,
- Evas_Coord h)
+EOLIAN static void
+_elm_pan_evas_object_smart_resize(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord w, Evas_Coord h)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
psd->w = w;
psd->h = h;
evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
}
-static void
-_elm_pan_smart_show(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_show(Eo *obj, Elm_Pan_Smart_Data *psd)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
- _elm_pan_parent_sc->show(obj);
+ eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_show());
if (psd->content)
evas_object_show(psd->content);
}
-static void
-_elm_pan_smart_hide(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_hide(Eo *obj, Elm_Pan_Smart_Data *psd)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
- _elm_pan_parent_sc->hide(obj);
+ eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_hide());
if (psd->content)
evas_object_hide(psd->content);
}
-static void
-_elm_pan_pos_set(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y)
+EOLIAN static void
+_elm_pan_pos_set(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord x, Evas_Coord y)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
if ((x == psd->px) && (y == psd->py)) return;
psd->px = x;
psd->py = y;
evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
}
-static void
-_elm_pan_pos_get(const Evas_Object *obj,
- Evas_Coord *x,
- Evas_Coord *y)
+EOLIAN static void
+_elm_pan_pos_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord *x, Evas_Coord *y)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
if (x) *x = psd->px;
if (y) *y = psd->py;
}
-static void
-_elm_pan_pos_max_get(const Evas_Object *obj,
- Evas_Coord *x,
- Evas_Coord *y)
+EOLIAN static void
+_elm_pan_pos_max_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord *x, Evas_Coord *y)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
if (x)
{
if (psd->w < psd->content_w) *x = psd->content_w - psd->w;
}
}
-static void
-_elm_pan_pos_min_get(const Evas_Object *obj __UNUSED__,
- Evas_Coord *x,
- Evas_Coord *y)
+EOLIAN static void
+_elm_pan_pos_min_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *_pd EINA_UNUSED, Evas_Coord *x, Evas_Coord *y)
{
if (x)
*x = 0;
*y = 0;
}
-static void
-_elm_pan_content_size_get(const Evas_Object *obj,
- Evas_Coord *w,
- Evas_Coord *h)
+// TIZEN_ONLY(20150705): Genlist item align feature
+EOLIAN static void
+_elm_pan_pos_adjust(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd EINA_UNUSED, Evas_Coord *x EINA_UNUSED, Evas_Coord *y EINA_UNUSED)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
+}
+//
+
+EOLIAN static void
+_elm_pan_content_size_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord *w, Evas_Coord *h)
+{
if (w) *w = psd->content_w;
if (h) *h = psd->content_h;
}
-static void
-_elm_pan_gravity_set(Evas_Object *obj,
- double x,
- double y)
+EOLIAN static void
+_elm_pan_gravity_set(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, double x, double y)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
psd->gravity_x = x;
psd->gravity_y = y;
psd->prev_cw = psd->content_w;
psd->delta_posy = 0;
}
-static void
-_elm_pan_gravity_get(const Evas_Object *obj,
- double *x,
- double *y)
+EOLIAN static void
+_elm_pan_gravity_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, double *x, double *y)
{
- ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
if (x) *x = psd->gravity_x;
if (y) *y = psd->gravity_y;
}
-static void
-_elm_pan_smart_set_user(Elm_Pan_Smart_Class *sc)
-{
- sc->base.add = _elm_pan_smart_add;
- sc->base.del = _elm_pan_smart_del;
- sc->base.move = _elm_pan_smart_move;
- sc->base.resize = _elm_pan_smart_resize;
- sc->base.show = _elm_pan_smart_show;
- sc->base.hide = _elm_pan_smart_hide;
- sc->pos_set = _elm_pan_pos_set;
- sc->pos_get = _elm_pan_pos_get;
- sc->pos_max_get = _elm_pan_pos_max_get;
- sc->pos_min_get = _elm_pan_pos_min_get;
- sc->content_size_get = _elm_pan_content_size_get;
- sc->gravity_set = _elm_pan_gravity_set;
- sc->gravity_get = _elm_pan_gravity_get;
- sc->pos_adjust = NULL;
-}
-
static Evas_Object *
_elm_pan_add(Evas *evas)
{
- return evas_object_smart_add(evas, _elm_pan_smart_class_new());
+ Evas_Object *obj = eo_add(MY_PAN_CLASS, evas);
+ return obj;
+}
+
+EOLIAN static void
+_elm_pan_eo_base_constructor(Eo *obj, Elm_Pan_Smart_Data *_pd EINA_UNUSED)
+{
+ eo_do_super(obj, MY_PAN_CLASS, eo_constructor());
+ eo_do(obj,
+ evas_obj_type_set(MY_PAN_CLASS_NAME_LEGACY),
+ evas_obj_smart_callbacks_descriptions_set(_smart_callbacks));
}
static void
_elm_pan_content_del_cb(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj __UNUSED__,
- void *event_info __UNUSED__)
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
Elm_Pan_Smart_Data *psd;
static void
_elm_pan_content_resize_cb(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj __UNUSED__,
- void *event_info __UNUSED__)
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
Elm_Pan_Smart_Data *psd;
Evas_Coord w, h;
evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
}
+EOLIAN static void
+_elm_pan_class_constructor(Eo_Class *klass)
+{
+ evas_smart_legacy_type_register(MY_PAN_CLASS_NAME_LEGACY, klass);
+}
+
/* pan smart object on top, scroller interface on bottom */
/* ============================================================ */
-static const char SCROLL_SMART_NAME[] = "elm_scroll";
+#define MY_SCROLLABLE_INTERFACE ELM_INTERFACE_SCROLLABLE_MIXIN
+
+#define MY_SCROLLABLE_INTERFACE_NAME "Elm_Interface_Scrollable"
+#define MY_SCROLLABLE_INTERFACE_NAME_LEGACY "elm_interface_scrollable"
-#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(o, ptr) \
- Elm_Scrollable_Smart_Interface_Data *ptr = \
- evas_object_smart_interface_data_get(o, &(ELM_SCROLLABLE_IFACE.base)); \
- if (!ptr) \
- { \
- CRITICAL("No interface data for object %p (%s)", \
- o, evas_object_type_get(o)); \
- return; \
+#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(o, ptr) \
+ Elm_Scrollable_Smart_Interface_Data *ptr = \
+ (!eo_isa(o, MY_SCROLLABLE_INTERFACE) ? NULL : \
+ eo_data_scope_get(o, MY_SCROLLABLE_INTERFACE)); \
+ if (!ptr) \
+ { \
+ CRI("No interface data for object %p (%s)", \
+ o, evas_object_type_get(o)); \
+ return; \
}
-#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
- Elm_Scrollable_Smart_Interface_Data *ptr = \
- evas_object_smart_interface_data_get(o, &(ELM_SCROLLABLE_IFACE.base)); \
- if (!ptr) \
- { \
- CRITICAL("No interface data for object %p (%s)", \
- o, evas_object_type_get(o)); \
- return val; \
+#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
+ Elm_Scrollable_Smart_Interface_Data *ptr = \
+ (!eo_isa(o, MY_SCROLLABLE_INTERFACE) ? NULL : \
+ eo_data_scope_get(o, MY_SCROLLABLE_INTERFACE)); \
+ if (!ptr) \
+ { \
+ CRI("No interface data for object %p (%s)", \
+ o, evas_object_type_get(o)); \
+ return val; \
}
static void _elm_scroll_scroll_bar_size_adjust(
- Elm_Scrollable_Smart_Interface_Data *);
-static void _elm_scroll_wanted_region_set(Evas_Object *);
+ Elm_Scrollable_Smart_Interface_Data *);
static Eina_Bool _paging_is_enabled(Elm_Scrollable_Smart_Interface_Data *sid);
static Evas_Coord _elm_scroll_page_x_get(
Elm_Scrollable_Smart_Interface_Data *sid, int offset, Eina_Bool limit);
static Evas_Coord _elm_scroll_page_y_get(
Elm_Scrollable_Smart_Interface_Data *sid, int offset, Eina_Bool limit);
-static void _elm_scroll_content_pos_get(const Evas_Object *,
- Evas_Coord *,
- Evas_Coord *);
-static void _elm_scroll_content_pos_set(Evas_Object *,
- Evas_Coord,
- Evas_Coord,
- Eina_Bool);
#define LEFT 0
#define RIGHT 1
static int smooth_info_y_count = 0;
static double start_time = 0;
static int _elm_scroll_smooth_debug = 0;
-static const int _elm_scroll_gradient_check_pixel = 30;
-
void
_elm_scroll_smooth_debug_init(void)
Eina_Bool go_left = EINA_TRUE, go_right = EINA_TRUE;
Eina_Bool go_up = EINA_TRUE, go_down = EINA_TRUE;
Evas_Coord x = 0, y = 0, mx = 0, my = 0, minx = 0, miny = 0;
-
+
if (!sid->edje_obj || !sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->pos_get(sid->pan_obj, &x, &y);
+
+ 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(&x, &y));
if (x == minx) go_left = EINA_FALSE;
if (x == (mx + minx)) go_right = EINA_FALSE;
#endif
+static void
+_elm_scroll_scroll_bar_h_visibility_apply(Elm_Scrollable_Smart_Interface_Data *sid)
+{
+ if (sid->hbar_flags != ELM_SCROLLER_POLICY_OFF)
+ {
+ if (sid->hbar_visible)
+ edje_object_signal_emit
+ (sid->edje_obj, "elm,action,show,hbar", "elm");
+ else
+ edje_object_signal_emit
+ (sid->edje_obj, "elm,action,hide,hbar", "elm");
+ }
+ else
+ edje_object_signal_emit(sid->edje_obj, "elm,action,hide,hbar", "elm");
+ edje_object_message_signal_process(sid->edje_obj);
+ _elm_scroll_scroll_bar_size_adjust(sid);
+ if (sid->cb_func.content_min_limit)
+ sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
+}
+
+static void
+_elm_scroll_scroll_bar_v_visibility_apply(Elm_Scrollable_Smart_Interface_Data *sid)
+{
+ if (sid->vbar_flags != ELM_SCROLLER_POLICY_OFF)
+ {
+ if (sid->vbar_visible)
+ edje_object_signal_emit
+ (sid->edje_obj, "elm,action,show,vbar", "elm");
+ else
+ edje_object_signal_emit
+ (sid->edje_obj, "elm,action,hide,vbar", "elm");
+ }
+ else
+ edje_object_signal_emit
+ (sid->edje_obj, "elm,action,hide,vbar", "elm");
+ edje_object_message_signal_process(sid->edje_obj);
+ _elm_scroll_scroll_bar_size_adjust(sid);
+ if (sid->cb_func.content_min_limit)
+ sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
+}
+
static int
_elm_scroll_scroll_bar_h_visibility_adjust(
Elm_Scrollable_Smart_Interface_Data *sid)
}
}
}
- if (scroll_h_vis_change)
- {
- if (sid->hbar_flags != ELM_SCROLLER_POLICY_OFF)
- {
- if (sid->hbar_visible)
- edje_object_signal_emit
- (sid->edje_obj, "elm,action,show,hbar", "elm");
- else
- edje_object_signal_emit
- (sid->edje_obj, "elm,action,hide,hbar", "elm");
- }
- else
- edje_object_signal_emit
- (sid->edje_obj, "elm,action,hide,hbar", "elm");
- edje_object_message_signal_process(sid->edje_obj);
- _elm_scroll_scroll_bar_size_adjust(sid);
- if (sid->cb_func.content_min_limit)
- sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
- }
-
+
+ if (scroll_h_vis_change) _elm_scroll_scroll_bar_h_visibility_apply(sid);
+
_elm_direction_arrows_eval(sid);
return scroll_h_vis_change;
}
}
}
}
- if (scroll_v_vis_change)
- {
- if (sid->vbar_flags != ELM_SCROLLER_POLICY_OFF)
- {
- if (sid->vbar_visible)
- edje_object_signal_emit
- (sid->edje_obj, "elm,action,show,vbar", "elm");
- else
- edje_object_signal_emit
- (sid->edje_obj, "elm,action,hide,vbar", "elm");
- }
- else
- edje_object_signal_emit
- (sid->edje_obj, "elm,action,hide,vbar", "elm");
- edje_object_message_signal_process(sid->edje_obj);
- _elm_scroll_scroll_bar_size_adjust(sid);
- if (sid->cb_func.content_min_limit)
- sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
- }
+ if (scroll_v_vis_change) _elm_scroll_scroll_bar_v_visibility_apply(sid);
_elm_direction_arrows_eval(sid);
return scroll_v_vis_change;
{
if (!sid->pan_obj || !sid->edje_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
+ if (sid->size_adjust_recurse_abort) return;
+ if (sid->size_adjust_recurse > 20)
+ {
+ sid->size_adjust_recurse_abort = EINA_TRUE;
+ return;
+ }
+ sid->size_adjust_recurse++;
if ((sid->content) || (sid->extern_pan))
{
- Evas_Coord x, y, w, h, mx = 0, my = 0, vw = 0, vh = 0, px, py,
+ Evas_Coord x, y, w, h, mx = 0, my = 0, vw = 0, vh = 0,
minx = 0, miny = 0;
double vx, vy, size;
- edje_object_calc_force(sid->edje_obj);
edje_object_part_geometry_get
(sid->edje_obj, "elm.swallow.content", NULL, NULL, &vw, &vh);
w = sid->content_info.w;
edje_object_part_drag_size_set
(sid->edje_obj, "elm.dragable.vbar", 1.0, size);
- edje_object_part_drag_value_get
- (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
- edje_object_part_drag_value_get
- (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
+ //TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+ //edje_object_part_drag_value_get
+ // (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
+ //edje_object_part_drag_value_get
+ // (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
+ //
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- x = vx * mx + minx;
- y = vy * my + miny;
+ 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));
+ //TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+ //x = vx * mx + minx;
+ //y = vy * my + miny;
+ //
edje_object_part_drag_step_set
(sid->edje_obj, "elm.dragable.hbar", (double)sid->step.x /
(sid->edje_obj, "elm.dragable.vbar", 0.0,
-((double)sid->page.y * ((double)vh / (double)h)) / 100.0);
- psd->api->pos_get(sid->pan_obj, &px, &py);
- if (vx != mx) x = px;
- if (vy != my) y = py;
- psd->api->pos_set(sid->pan_obj, x, y);
+ //TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+ //eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
+ //
+ //if (vx != mx) x = px;
+ //if (vy != my) y = py;
+ //
+ eo_do(sid->obj, elm_interface_scrollable_bar_changed_bar_pos_adjust(&x, &y));
+ //
+
+ eo_do(sid->pan_obj, elm_obj_pan_pos_set(x, y));
+
+ if (mx > 0) vx = (double)(x - minx) / (double)mx;
+ else vx = 0.0;
+
+ if (vx < 0.0) vx = 0.0;
+ else if (vx > 1.0)
+ vx = 1.0;
+
+ if (my > 0) vy = (double)(y - miny) / (double)my;
+ else vy = 0.0;
+
+ if (vy < 0.0) vy = 0.0;
+ else if (vy > 1.0)
+ vy = 1.0;
+
+ edje_object_part_drag_value_set
+ (sid->edje_obj, "elm.dragable.vbar", 0.0, vy);
+ edje_object_part_drag_value_set
+ (sid->edje_obj, "elm.dragable.hbar", vx, 0.0);
}
else
{
(sid->edje_obj, "elm.dragable.vbar", 1.0, 1.0);
edje_object_part_drag_size_set
(sid->edje_obj, "elm.dragable.hbar", 1.0, 1.0);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->pos_get(sid->pan_obj, &px, &py);
- psd->api->pos_set(sid->pan_obj, minx, miny);
+ 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));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_set(minx, miny));
if ((px != minx) || (py != miny))
edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
}
_elm_scroll_scroll_bar_visibility_adjust(sid);
+ sid->size_adjust_recurse--;
+ if (sid->size_adjust_recurse <= 0)
+ {
+ sid->size_adjust_recurse = 0;
+ sid->size_adjust_recurse_abort = EINA_FALSE;
+ }
+}
+
+//TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+EOLIAN static void
+_elm_interface_scrollable_bar_changed_bar_pos_adjust(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
+{
+ Evas_Coord mx, my, minx, miny, px, py;
+ double vx, vy;
+
+ edje_object_part_drag_value_get
+ (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
+ edje_object_part_drag_value_get
+ (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
+
+ 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));
+
+ *x = _round(vx * (double)mx + minx, 1);
+ *y = _round(vy * (double)my + miny, 1);
+
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
+
+ if (vx != mx) *x = px;
+ if (vy != my) *y = py;
}
+//
static void
_elm_scroll_scroll_bar_read_and_update(
Elm_Scrollable_Smart_Interface_Data *sid)
{
- Evas_Coord x, y, mx = 0, my = 0, px, py, minx = 0, miny = 0;
+ Evas_Coord x, y, mx = 0, my = 0, minx = 0, miny = 0;
double vx, vy;
if (!sid->edje_obj || !sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
if ((sid->down.dragged) || (sid->down.bounce_x_animator)
|| (sid->down.bounce_y_animator) || (sid->down.momentum_animator)
|| (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
(sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
edje_object_part_drag_value_get
(sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
+ 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));
x = _round(vx * (double)mx + minx, 1);
y = _round(vy * (double)my + miny, 1);
- psd->api->pos_get(sid->pan_obj, &px, &py);
-
- if (!sid->freeze && _paging_is_enabled(sid))
- {
- x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
- y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
- }
- psd->api->pos_set(sid->pan_obj, x, y);
- if ((px != x) || (py != y))
- {
- edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
- }
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
+ _elm_scroll_wanted_coordinates_update(sid, x, y);
}
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);
}
static void
_elm_scroll_drag_stop(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);
+ 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);
static void
_elm_scroll_anim_stop(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);
+ 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);
static void
_elm_scroll_reload_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
-
- // FIXME: refactoring for determining bar's size and visiblity
- sid->hbar_visible = EINA_TRUE;
- sid->vbar_visible = EINA_TRUE;
-
_elm_scroll_policy_signal_emit(sid);
+ _elm_scroll_scroll_bar_h_visibility_apply(sid);
+ _elm_scroll_scroll_bar_v_visibility_apply(sid);
}
static void
_elm_scroll_vbar_drag_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_vbar_press_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_vbar_unpress_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_edje_drag_v_start_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_edje_drag_v_stop_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_edje_drag_v_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_hbar_drag_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_hbar_press_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_hbar_unpress_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_edje_drag_h_start_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_edje_drag_h_stop_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
static void
_elm_scroll_edje_drag_h_cb(void *data,
- Evas_Object *obj __UNUSED__,
- const char *emission __UNUSED__,
- const char *source __UNUSED__)
+ Evas_Object *obj EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
_elm_scroll_scroll_bar_read_and_update(sid);
}
-static void
-_elm_scroll_content_size_get(const Evas_Object *obj,
- Evas_Coord *w,
- Evas_Coord *h)
-{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- if (sid->content)
- evas_object_geometry_get(sid->content, NULL, NULL, w, h);
- else if (sid->pan_obj)
- {
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
- psd->api->content_size_get(sid->pan_obj, w, h);
- }
-}
-
-static void
-_elm_scroll_content_viewport_size_get(const Evas_Object *obj,
- Evas_Coord *w,
- Evas_Coord *h)
+EOLIAN static void
+_elm_interface_scrollable_content_size_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *w, Evas_Coord *h)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- if (!sid->pan_obj || !sid->edje_obj) return;
-
- edje_object_calc_force(sid->edje_obj);
- evas_object_geometry_get(sid->pan_obj, NULL, NULL, w, h);
+ eo_do(sid->pan_obj, elm_obj_pan_content_size_get(w, h));
}
-static void
-_elm_scroll_content_viewport_pos_get(const Evas_Object *obj,
- Evas_Coord *x,
- Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_content_viewport_geometry_get(Eo *obj EINA_UNUSED,
+ Elm_Scrollable_Smart_Interface_Data *sid,
+ Evas_Coord *x,
+ Evas_Coord *y,
+ Evas_Coord *w,
+ Evas_Coord *h)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->pan_obj || !sid->edje_obj) return;
edje_object_calc_force(sid->edje_obj);
- evas_object_geometry_get(sid->pan_obj, x, y, NULL, NULL);
+ evas_object_geometry_get(sid->pan_obj, x, y, w, h);
}
-static void
-_elm_scroll_content_min_limit(Evas_Object *obj,
- Eina_Bool w,
- Eina_Bool h)
+EOLIAN static void
+_elm_interface_scrollable_content_min_limit(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool w, Eina_Bool h)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->edje_obj) return;
if (!sid->cb_func.content_min_limit)
sid->cb_func.content_min_limit(sid->obj, w, h);
}
-static void
-_elm_scroll_origin_reverse_set(Evas_Object *obj,
- Eina_Bool origin_x, Eina_Bool origin_y)
-{
- Evas_Coord x, y;
-
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->origin_x = origin_x;
- sid->origin_y = origin_y;
-
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
- _elm_scroll_wanted_coordinates_update(sid, x, y);
-}
-
-static void
-_elm_scroll_origin_reverse_get(const Evas_Object *obj,
- Eina_Bool *origin_x, Eina_Bool *origin_y)
-{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- if (origin_x) *origin_x = sid->origin_x;
- if (origin_y) *origin_y = sid->origin_y;
-}
-
static Evas_Coord
_elm_scroll_x_mirrored_get(const Evas_Object *obj,
Evas_Coord x)
{
- Evas_Coord cw, ch, w, ret;
+ Evas_Coord cw = 0, w = 0, min = 0, ret;
ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, x);
if (!sid->pan_obj) return 0;
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&min, NULL));
+ eo_do((Eo *)obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, NULL));
+ eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, NULL));
+ ret = cw - w - x + min + min;
- _elm_scroll_content_viewport_size_get(obj, &w, NULL);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
- ret = (cw - (x + w));
-
- return (ret >= 0) ? ret : 0;
+ return (ret >= min) ? ret : min;
}
/* Update the wanted coordinates according to the x, y passed
Evas_Coord x,
Evas_Coord y)
{
- Evas_Coord cw, ch;
+ Evas_Coord mx = 0, my = 0, minx = 0, miny = 0;
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
+ 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));
/* Update wx/y/w/h - and if the requested positions aren't legal
* adjust a bit. */
- _elm_scroll_content_viewport_size_get(sid->obj, &sid->ww, &sid->wh);
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &sid->ww, &sid->wh));
- if (x < 0)
+ if (x < minx && !sid->is_mirrored)
{
- if (!sid->loop_h) sid->wx = 0;
- else sid->wx = cw - sid->ww;
+ if (!sid->loop_h) sid->wx = minx;
+ else sid->wx = mx;
}
- else if (!sid->loop_h && (x + sid->ww) > cw)
- sid->wx = cw - sid->ww;
- else if (sid->loop_h && x >= cw)
- sid->wx = 0;
else if (sid->is_mirrored)
sid->wx = _elm_scroll_x_mirrored_get(sid->obj, x);
- else
- sid->wx = x;
-
- if (sid->origin_x)
- {
- sid->wx = cw - sid->wx;
- if (sid->wx < 0) sid->wx = 0;
- }
+ else if (!sid->loop_h && (x > mx)) sid->wx = mx;
+ else if (sid->loop_h && x >= (sid->ww + mx)) sid->wx = 0;
+ else sid->wx = x;
- if (y < 0)
+ if (y < miny)
{
- if (!sid->loop_v) sid->wy = 0;
- else sid->wy = ch - sid->wh;
+ if (!sid->loop_v) sid->wy = miny;
+ else sid->wy = my;
}
- else if (!sid->loop_v && (y + sid->wh) > ch)
- sid->wy = ch - sid->wh;
- else if (sid->loop_v && y >= ch)
- sid->wy = 0;
+ else if (!sid->loop_v && (y > my)) sid->wy = my;
+ else if (sid->loop_v && y >= (sid->wh + my)) sid->wy = 0;
else sid->wy = y;
-
- if (sid->origin_y)
- {
- sid->wy = ch - sid->wy;
- if (sid->wy < 0) sid->wy = 0;
- }
}
static void
if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator)) return;
if (sid->down.momentum_animator)
{
- Evas_Coord px, py;
- _elm_scroll_content_pos_get(sid->obj, &px, &py);
+ Evas_Coord px = 0, py = 0;
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&px, &py));
_elm_scroll_wanted_coordinates_update(sid, px, py);
- ecore_animator_del(sid->down.momentum_animator);
- sid->down.momentum_animator = NULL;
+ ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
sid->down.bounce_x_hold = EINA_FALSE;
sid->down.bounce_y_hold = EINA_FALSE;
sid->down.ax = 0;
sid->down.pdx = 0;
sid->down.pdy = 0;
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
}
static Eina_Bool
_elm_scroll_bounce_x_animator(void *data)
{
- Elm_Scrollable_Smart_Interface_Data *sid;
+ ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(data, sid, EINA_FALSE);
Evas_Coord x, y, dx, w, odx, ed, md;
double t, p, dt, pd, r;
- sid = data;
t = ecore_loop_time_get();
dt = t - sid->down.anim_start2;
if (dt >= 0.0)
{
dt = dt / _elm_config->thumbscroll_bounce_friction;
odx = sid->down.b2x - sid->down.bx;
- _elm_scroll_content_viewport_size_get(sid->obj, &w, NULL);
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, NULL));
if (!sid->down.momentum_animator && (w > abs(odx)))
{
pd = (double)odx / (double)w;
}
if (dt > 1.0) dt = 1.0;
p = 1.0 - ((1.0 - dt) * (1.0 - dt));
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
dx = (odx * p);
r = 1.0;
if (sid->down.momentum_animator)
}
x = sid->down.b2x + (int)((double)(dx - odx) * r);
if (!sid->down.cancelled)
- _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
if (dt >= 1.0)
{
if (sid->down.momentum_animator)
sid->bouncemex = EINA_FALSE;
_elm_scroll_momentum_end(sid);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
return ECORE_CALLBACK_CANCEL;
}
}
static Eina_Bool
_elm_scroll_bounce_y_animator(void *data)
{
- Elm_Scrollable_Smart_Interface_Data *sid;
+ ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(data, sid, EINA_FALSE);
Evas_Coord x, y, dy, h, ody, ed, md;
double t, p, dt, pd, r;
- sid = data;
t = ecore_loop_time_get();
dt = t - sid->down.anim_start3;
if (dt >= 0.0)
{
dt = dt / _elm_config->thumbscroll_bounce_friction;
ody = sid->down.b2y - sid->down.by;
- _elm_scroll_content_viewport_size_get(sid->obj, NULL, &h);
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, NULL, &h));
if (!sid->down.momentum_animator && (h > abs(ody)))
{
pd = (double)ody / (double)h;
}
if (dt > 1.0) dt = 1.0;
p = 1.0 - ((1.0 - dt) * (1.0 - dt));
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
dy = (ody * p);
r = 1.0;
if (sid->down.momentum_animator)
}
y = sid->down.b2y + (int)((double)(dy - ody) * r);
if (!sid->down.cancelled)
- _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
if (dt >= 1.0)
{
if (sid->down.momentum_animator)
sid->bouncemey = EINA_FALSE;
_elm_scroll_momentum_end(sid);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
return ECORE_CALLBACK_CANCEL;
}
}
static void
_elm_scroll_bounce_eval(Elm_Scrollable_Smart_Interface_Data *sid)
{
- Evas_Coord mx, my, px, py, bx, by, b2x, b2y, minx = 0, miny = 0;
+ Evas_Coord mx = 0, my = 0, px = 0, py = 0, bx, by, b2x, b2y, minx = 0, miny = 0;
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
if (sid->freeze) return;
if ((!sid->bouncemex) && (!sid->bouncemey)) return;
if (sid->down.now) return; // down bounce while still held down
if (sid->down.onhold_animator)
{
- ecore_animator_del(sid->down.onhold_animator);
- sid->down.onhold_animator = NULL;
+ ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
if (sid->down.hold_animator)
{
- ecore_animator_del(sid->down.hold_animator);
- sid->down.hold_animator = NULL;
+ ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
+
+ 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));
bx = px;
by = py;
if (px < minx) px = minx;
{
if (sid->bouncemex)
{
- if (sid->scrollto.x.animator)
- {
- ecore_animator_del(sid->scrollto.x.animator);
- sid->scrollto.x.animator = NULL;
- }
+ ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
sid->down.bounce_x_animator =
- ecore_animator_add(_elm_scroll_bounce_x_animator, sid);
+ ecore_animator_add(_elm_scroll_bounce_x_animator, sid->obj);
sid->down.anim_start2 = ecore_loop_time_get();
sid->down.bx = bx;
sid->down.bx0 = bx;
{
if (sid->bouncemey)
{
- if (sid->scrollto.y.animator)
- {
- ecore_animator_del(sid->scrollto.y.animator);
- sid->scrollto.y.animator = NULL;
- }
+ ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
sid->down.bounce_y_animator =
- ecore_animator_add(_elm_scroll_bounce_y_animator, sid);
+ ecore_animator_add(_elm_scroll_bounce_y_animator, sid->obj);
sid->down.anim_start3 = ecore_loop_time_get();
sid->down.by = by;
sid->down.by0 = by;
}
}
-static void
-_elm_scroll_content_pos_get(const Evas_Object *obj,
- Evas_Coord *x,
- Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_content_pos_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->pos_get(sid->pan_obj, x, y);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(x, y));
}
-static void
-_elm_scroll_content_pos_set(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y,
- Eina_Bool sig)
+EOLIAN static void
+_elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Eina_Bool sig)
{
- Evas_Coord mx = 0, my = 0, px = 0, py = 0, spx = 0, spy = 0, minx = 0, miny = 0, pw = 0, ph = 0;
- Evas_Coord cw =0, ch = 0, ww = 0, wh = 0; //// TIZEN ONLY
+ Evas_Coord mx = 0, my = 0, px = 0, py = 0, spx = 0, spy = 0, minx = 0, miny = 0;
+ Evas_Coord cw = 0, ch = 0, pw = 0, ph = 0;
+// TIZEN_ONLY(20150820): Overscroll effect
+ Evas_Coord ww = 0, wh = 0;
+//
double vx, vy;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
if (!sid->edje_obj || !sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->pos_get(sid->pan_obj, &px, &py);
-
- if ((px == x) && (py == y)) return;
-
// FIXME: allow for bounce outside of range
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch); //// TIZEN ONLY
- _elm_scroll_content_viewport_size_get(obj, &ww, &wh); //// TIZEN ONLY
+ 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_content_size_get(&cw, &ch));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
evas_object_geometry_get(sid->pan_obj, NULL, NULL, &pw, &ph);
-
- if (_elm_config->access_mode)
- {
- if (((y > 0) && (y % _elm_config->finger_size) < 2 &&
- !((py % _elm_config->finger_size) < 2 && abs(py - y) < 2)) ||
- ((x > 0) && (x % _elm_config->finger_size) < 2 &&
- !((px % _elm_config->finger_size) < 2 && abs(px - x) < 2)))
- _elm_access_sound_play(ELM_ACCESS_SOUND_SCROLL);
- }
+// TIZEN_ONLY(20150820): Overscroll effect
+ eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &ww, &wh));
+//
if (_paging_is_enabled(sid))
{
- //Work when Page Snap is enabled.
- /*
- //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;
-
- //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 (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 (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 (sid->loop_h && cw > 0)
{
- if (_paging_is_enabled(sid))
- {
- if (x < 0) x = cw + (x % cw);
- else if (x >= (pw * sid->pagecount_h)) x = (x % cw);
- }
- else
- {
- if (x < 0) x = cw + (x % cw);
- else if (x >= cw) x = (x % cw);
- }
+ if (x < 0) x = cw + (x % cw);
+ else if (x >= cw) x = (x % cw);
}
if (sid->loop_v && ch > 0)
{
- if (_paging_is_enabled(sid))
- {
- if (y < 0) y = ch + (y % ch);
- else if (y >= (ph * sid->pagecount_v)) y = (y % ch);
- }
- else
- {
- if (y < 0) y = ch + (y % ch);
- else if (y >= ch) y = (y % ch);
- }
+ if (y < 0) y = ch + (y % ch);
+ else if (y >= ch) y = (y % ch);
}
-//// TIZEN ONLY
+// TIZEN_ONLY(20150820): Overscroll effect
if (cw > ww)
{
if (x < minx)
edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom", "elm");
}
//
+
if (!_elm_config->thumbscroll_bounce_enable)
{
+
if (x < minx) x = minx;
if (!sid->loop_h && (x - minx) > mx) x = mx + minx;
if (y < miny) y = miny;
if (!sid->bounce_horiz)
{
if (x < minx) x = minx;
- if (!sid->loop_h && ((x - minx) > mx)) x = mx + minx;
+ if (!sid->loop_h && (x - minx) > mx) x = mx + minx;
}
if (!sid->bounce_vert)
{
if (y < miny) y = miny;
- if (!sid->loop_v && ((y - miny) > my)) y = my + miny;
+ if (!sid->loop_v && (y - miny) > my) y = my + miny;
}
- psd->api->pos_set(sid->pan_obj, x, y);
- psd->api->pos_get(sid->pan_obj, &spx, &spy);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_set(x, y));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&spx, &spy));
if (mx > 0) vx = (double)(spx - minx) / (double)mx;
else vx = 0.0;
sid->cb_func.scroll_down(obj, NULL);
edje_object_signal_emit(sid->edje_obj, "elm,action,scroll,down", "elm");
}
- edje_message_signal_process();
}
if (x != px)
{
{
if (sid->cb_func.edge_left)
sid->cb_func.edge_left(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+// edje_object_signal_emit(sid->edje_obj, "elm,edge,left", "elm");
+//
}
if (x == (mx + minx))
{
if (sid->cb_func.edge_right)
sid->cb_func.edge_right(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+// edje_object_signal_emit(sid->edje_obj, "elm,edge,right", "elm");
+//
}
}
if (y != py)
{
if (sid->cb_func.edge_top)
sid->cb_func.edge_top(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+// edje_object_signal_emit(sid->edje_obj, "elm,edge,top", "elm");
+//
}
if (y == my + miny)
{
if (sid->cb_func.edge_bottom)
sid->cb_func.edge_bottom(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+// edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom", "elm");
+//
}
}
}
_elm_direction_arrows_eval(sid);
}
-static void
-_elm_scroll_mirrored_set(Evas_Object *obj,
- Eina_Bool mirrored)
+EOLIAN static void
+_elm_interface_scrollable_mirrored_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool mirrored)
{
Evas_Coord wx;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->edje_obj) return;
mirrored = !!mirrored;
else
wx = sid->wx;
- _elm_scroll_content_pos_set(sid->obj, wx, sid->wy, EINA_FALSE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(wx, sid->wy, EINA_FALSE));
}
/* returns TRUE when we need to move the scroller, FALSE otherwise.
Evas_Coord w,
Evas_Coord h)
{
- Evas_Coord mx = 0, my = 0, cw = 0, ch = 0, px = 0, py = 0, nx = 0, ny = 0,
+ Evas_Coord mx = 0, my = 0, cw = 0, ch = 0, px = 0, py = 0, nx, ny,
minx = 0, miny = 0, pw = 0, ph = 0, x = *_x, y = *_y;
ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
if (!sid->pan_obj) return EINA_FALSE;
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
-
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ 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_content_size_get(&cw, &ch));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
evas_object_geometry_get(sid->pan_obj, NULL, NULL, &pw, &ph);
nx = px;
if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
(sid->scrollto.x.animator) || (sid->scrollto.y.animator))
{
- if (sid->scrollto.x.animator)
- {
- ecore_animator_del(sid->scrollto.x.animator);
- sid->scrollto.x.animator = NULL;
- }
- if (sid->scrollto.y.animator)
- {
- ecore_animator_del(sid->scrollto.y.animator);
- sid->scrollto.y.animator = NULL;
- }
+ ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+ ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
if (sid->down.bounce_x_animator)
{
- ecore_animator_del(sid->down.bounce_x_animator);
- sid->down.bounce_x_animator = NULL;
+ ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
sid->bouncemex = EINA_FALSE;
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
if (sid->down.bounce_y_animator)
{
- ecore_animator_del(sid->down.bounce_y_animator);
- sid->down.bounce_y_animator = NULL;
+ ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
sid->bouncemey = EINA_FALSE;
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
+
_elm_scroll_anim_stop(sid);
}
if (sid->down.hold_animator)
{
- ecore_animator_del(sid->down.hold_animator);
- sid->down.hold_animator = NULL;
+ ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
_elm_scroll_drag_stop(sid);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
+ ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
if (sid->down.momentum_animator)
{
- ecore_animator_del(sid->down.momentum_animator);
- sid->down.momentum_animator = NULL;
+ ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
sid->down.bounce_x_hold = EINA_FALSE;
sid->down.bounce_y_hold = EINA_FALSE;
sid->down.ax = 0;
sid->down.pdx = 0;
sid->down.pdy = 0;
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
if (_paging_is_enabled(sid))
{
x = _elm_scroll_page_x_get(sid, nx - px, EINA_FALSE);
y = _elm_scroll_page_y_get(sid, ny - py, EINA_FALSE);
- if ((pw != sid->pagesize_h) && (sid->pagesize_h != 0))
- pw = sid->pagesize_h;
- if ((ph != sid->pagesize_v) && (sid->pagesize_v != 0))
- ph = sid->pagesize_v;
}
else
{
}
if (!sid->loop_v)
{
- if ((y + ph) > ch) y = ch - ph;
- if (y < miny) y = miny;
+ if ((y + ph) > ch) y = ch - ph;
+ if (y < miny) y = miny;
}
if ((x == px) && (y == py)) return EINA_FALSE;
*_x = x;
*_y = y;
-
return EINA_TRUE;
}
+EOLIAN static void
+_elm_interface_scrollable_content_region_get(Eo *obj, Elm_Scrollable_Smart_Interface_Data *_pd EINA_UNUSED, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+ eo_do(obj, elm_interface_scrollable_content_pos_get(x, y));
+ eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, w, h));
+}
+
/* Set should be used for calculated positions, for example, when we move
* because of an animation or because this is the correct position after
* constraints. */
-static void
-_elm_scroll_content_region_set(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y,
- Evas_Coord w,
- Evas_Coord h)
+EOLIAN static void
+_elm_interface_scrollable_content_region_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
{
- _elm_scroll_content_pos_set(obj, x, y, EINA_FALSE);
+ eo_do(obj, elm_interface_scrollable_content_pos_set(x, y, EINA_FALSE));
sid->down.sx = x;
sid->down.sy = y;
sid->down.x = sid->down.history[0].x;
/* Set should be used for setting the wanted position, for example a
* user scroll or moving the cursor in an entry. */
-static void
-_elm_scroll_content_region_show(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y,
- Evas_Coord w,
- Evas_Coord h)
+EOLIAN static void
+_elm_interface_scrollable_content_region_show(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
- Evas_Coord cw = 0, ch = 0;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- if (sid->pan_obj)
- {
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
- }
-
- if (sid->origin_x && cw > 0)
- {
- sid->wx = cw - y;
- if (sid->wx < 0) sid->wx = 0;
- }
- else
- sid->wx = x;
-
- if (sid->origin_y && ch > 0)
- {
- sid->wy = ch - y;
- if (sid->wy < 0) sid->wy = 0;
- }
- else
- sid->wy = y;
-
+ sid->wx = (sid->is_mirrored ? _elm_scroll_x_mirrored_get(sid->obj, x) : x);
+ sid->wy = y;
sid->ww = w;
sid->wh = h;
- if (_paging_is_enabled(sid))
- {
- if (sid->pagesize_h != 0)
- {
- x = (int)(x / sid->pagesize_h) * sid->pagesize_h;
- if (sid->origin_x && cw > 0)
- {
- sid->wx = cw - x;
- if (sid->wx < 0) sid->wx = 0;
- }
- else
- sid->wx = x;
- sid->ww = w = sid->pagesize_h;
- }
- if (sid->pagesize_v != 0)
- {
- y = (int)(y / sid->pagesize_v) * sid->pagesize_v;
- if (sid->origin_y && ch > 0)
- {
- sid->wy = ch - y;
- if (sid->wy < 0) sid->wy = 0;
- }
- else
- sid->wy = y;
- sid->wh = h = sid->pagesize_v;
- }
- }
-
if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
{
- _elm_scroll_content_pos_set(obj, x, y, EINA_TRUE);
+ eo_do(obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
sid->down.sx = x;
sid->down.sy = y;
sid->down.x = sid->down.history[0].x;
}
}
-static void
-_elm_scroll_wanted_region_set(Evas_Object *obj)
+//TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+//static void
+//_elm_scroll_wanted_region_set(Evas_Object *obj)
+//{
+// Evas_Coord ww, wh, wx;
+//
+// ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+//
+// wx = sid->wx;
+// if (sid->down.now || sid->down.momentum_animator ||
+// sid->down.bounce_x_animator || sid->down.bounce_y_animator ||
+// sid->down.hold_animator || sid->down.onhold_animator ||
+// sid->scrollto.x.animator || sid->scrollto.y.animator)
+// return;
+//
+// sid->content_info.resized = EINA_FALSE;
+//
+// /* Flip to RTL cords only if init in RTL mode */
+// if (sid->is_mirrored)
+// wx = _elm_scroll_x_mirrored_get(obj, sid->wx);
+//
+// if (sid->ww == -1)
+// {
+// eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+// (NULL, NULL, &ww, &wh));
+// }
+// else
+// {
+// ww = sid->ww;
+// wh = sid->wh;
+// }
+//
+// eo_do(obj, elm_interface_scrollable_content_region_set(wx, sid->wy, ww, wh));
+//}
+//
+EOLIAN static void
+_elm_interface_scrollable_wanted_region_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x EINA_UNUSED, Evas_Coord y EINA_UNUSED)
{
- Evas_Coord ww, wh, wx, wy, cw= 0, ch = 0;
-
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+ Evas_Coord ww, wh, wx;
wx = sid->wx;
- wy = sid->wy;
if (sid->down.now || sid->down.momentum_animator ||
sid->down.bounce_x_animator || sid->down.bounce_y_animator ||
sid->scrollto.x.animator || sid->scrollto.y.animator)
return;
- if (sid->pan_obj)
- {
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
- }
-
sid->content_info.resized = EINA_FALSE;
/* Flip to RTL cords only if init in RTL mode */
if (sid->is_mirrored)
wx = _elm_scroll_x_mirrored_get(obj, sid->wx);
- if (sid->origin_x && cw > 0)
- {
- wx = cw - sid->wx;
- if (wx < 0) wx = 0;
- }
-
- if (sid->origin_y && ch > 0)
- {
- wy = ch - sid->wy;
- if (wy < 0) wy = 0;
- }
-
if (sid->ww == -1)
{
- _elm_scroll_content_viewport_size_get(obj, &ww, &wh);
+ eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &ww, &wh));
}
else
{
wh = sid->wh;
}
- _elm_scroll_content_region_set(obj, wx, wy, ww, wh);
+ eo_do(obj, elm_interface_scrollable_content_region_set(wx, sid->wy, ww, wh));
}
+//
static void
_elm_scroll_wheel_event_cb(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj __UNUSED__,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
void *event_info)
{
Elm_Scrollable_Smart_Interface_Data *sid;
Evas_Event_Mouse_Wheel *ev;
Evas_Coord x = 0, y = 0, vw = 0, vh = 0, cw = 0, ch = 0;
int direction = 0;
- int pagenumber_h, pagenumber_v;
+ int pagenumber_h = 0, pagenumber_v = 0;
sid = data;
- if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
ev = event_info;
direction = ev->direction;
return;
else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
direction = !direction;
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
(sid->scrollto.x.animator) || (sid->scrollto.y.animator))
{
_elm_scroll_anim_stop(sid);
}
- if (sid->scrollto.x.animator)
- {
- ecore_animator_del(sid->scrollto.x.animator);
- sid->scrollto.x.animator = NULL;
- }
- if (sid->scrollto.y.animator)
- {
- ecore_animator_del(sid->scrollto.y.animator);
- sid->scrollto.y.animator = NULL;
- }
+ ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+ ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
if (sid->down.bounce_x_animator)
{
- ecore_animator_del(sid->down.bounce_x_animator);
- sid->down.bounce_x_animator = NULL;
+ ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
sid->bouncemex = EINA_FALSE;
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
if (sid->down.bounce_y_animator)
{
- ecore_animator_del(sid->down.bounce_y_animator);
- sid->down.bounce_y_animator = NULL;
+ ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
sid->bouncemey = EINA_FALSE;
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
- _elm_scroll_content_viewport_size_get(sid->obj, &vw, &vh);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &vw, &vh));
+ if (sid->pan_obj)
+ eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
if (!_paging_is_enabled(sid))
{
if (!direction)
if ((!sid->hold) && (!sid->freeze))
{
_elm_scroll_wanted_coordinates_update(sid, x, y);
- _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
}
}
else
{
- _elm_scroll_current_page_get(sid->obj, &pagenumber_h, &pagenumber_v);
+ eo_do(sid->obj, elm_interface_scrollable_current_page_get(&pagenumber_h, &pagenumber_v));
if (!direction)
{
if (ch > vh || cw <= vw)
if ((!sid->hold) && (!sid->freeze))
{
- //_elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
+ _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);
}
}
static Eina_Bool
_elm_scroll_post_event_up(void *data,
- Evas *e __UNUSED__)
+ Evas *e EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
Evas_Coord x, y, dx, dy, px, py, maxx, maxy, minx, miny;
Eina_Bool no_bounce_x_end = EINA_FALSE, no_bounce_y_end = EINA_FALSE;
- if (!sid->pan_obj) return ECORE_CALLBACK_CANCEL;
-
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, ECORE_CALLBACK_CANCEL);
+ if (!sid->pan_obj)
+ {
+ sid->down.momentum_animator = NULL;
+ return ECORE_CALLBACK_CANCEL;
+ }
t = ecore_loop_time_get();
dt = t - sid->down.anim_start;
(_elm_config->thumbscroll_friction + sid->down.extra_time);
dt = dt / at;
if (dt > 1.0) dt = 1.0;
+// TIZEN_ONLY(20150705): Genlist item align feature
p = 1 - powf((1.0) - dt, 3);
- if (psd->api->pos_adjust)
- {
- dx = sid->down.dx * p;
- dy = sid->down.dy * p;
- }
- else
- {
- dx = (sid->down.dx * (_elm_config->thumbscroll_friction +
- sid->down.extra_time) * p);
- dy = (sid->down.dy * (_elm_config->thumbscroll_friction +
- sid->down.extra_time) * p);
- }
-
+ dx = sid->down.dx * p;
+ dy = sid->down.dy * p;
+//
sid->down.ax = dx;
sid->down.ay = dy;
x = sid->down.sx - dx;
y = sid->down.sy - dy;
- _elm_scroll_content_pos_get(sid->obj, &px, &py);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&px, &py));
if ((sid->down.bounce_x_animator) ||
(sid->down.bounce_x_hold))
{
sid->down.by = sid->down.by0 - dy + sid->down.b0y;
y = py;
}
- _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
_elm_scroll_wanted_coordinates_update(sid, x, y);
- psd->api->pos_max_get(sid->pan_obj, &maxx, &maxy);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&maxx, &maxy));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+
if (!_elm_config->thumbscroll_bounce_enable || !sid->bounce_horiz)
{
if (x <= minx) no_bounce_x_end = EINA_TRUE;
sid->down.pdx = 0;
sid->down.pdy = 0;
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
return ECORE_CALLBACK_CANCEL;
}
if (!sid->pan_obj) return 0;
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
-
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
- _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
- psd->api->pos_min_get(sid->pan_obj, &minx, NULL);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
+ 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));
if (sid->pagerel_h > 0.0)
- {
- if (sid->pagecount_h != 0)
- w = cw / (sid->pagecount_h * sid->pagerel_h);
- x *= (w * sid->pagerel_h) / sid->pagesize_h;
- sid->pagesize_h = w * sid->pagerel_h;
- }
+ sid->pagesize_h = w * sid->pagerel_h;
if (!limit)
x += offset;
if (sid->pagesize_h > 0)
{
- if (x >= minx) x = x + (sid->pagesize_h * 0.5);
- else x = x - (sid->pagesize_h * 0.5);
+ if (x >= 0)
+ x = x + (sid->pagesize_h * 0.5);
+ else if (x < 0 && sid->loop_h)
+ x = x - (sid->pagesize_h * 0.5);
x = x / (sid->pagesize_h);
x = x * (sid->pagesize_h);
}
_elm_scroll_page_y_get(Elm_Scrollable_Smart_Interface_Data *sid,
int offset, Eina_Bool limit)
{
- Evas_Coord x, y, w, h, dy, cw, ch, miny = 0;
+ Evas_Coord x, y, w = 0, h = 0, dy, cw = 0, ch = 0, miny = 0;
if (!sid->pan_obj) return 0;
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
-
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
- _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
- psd->api->pos_min_get(sid->pan_obj, NULL, &miny);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
+ 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));
if (sid->pagerel_v > 0.0)
- {
- if (sid->pagecount_v != 0)
- h = ch / (sid->pagecount_v * sid->pagerel_v);
- y *= (h * sid->pagerel_v) / sid->pagesize_v;
- sid->pagesize_v = h * sid->pagerel_v;
- }
+ sid->pagesize_v = h * sid->pagerel_v;
+
if (!limit)
y += offset;
else
if (sid->pagesize_v > 0)
{
- if (y >= miny) y = y + (sid->pagesize_v * 0.5);
- else y = y - (sid->pagesize_v * 0.5);
+ if (y >= 0)
+ y = y + (sid->pagesize_v * 0.5);
+ else if (y < 0 && sid->loop_v)
+ y = y - (sid->pagesize_v * 0.5);
y = y / (sid->pagesize_v);
y = y * (sid->pagesize_v);
}
Evas_Coord px, py;
double t, tt;
- if (!sid->pan_obj) return ECORE_CALLBACK_CANCEL;
-
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, ECORE_CALLBACK_CANCEL);
+ if (!sid->pan_obj)
+ {
+ sid->scrollto.x.animator = NULL;
+ return ECORE_CALLBACK_CANCEL;
+ }
t = ecore_loop_time_get();
tt = (t - sid->scrollto.x.t_start) /
(sid->scrollto.x.t_end - sid->scrollto.x.t_start);
tt = 1.0 - tt;
tt = 1.0 - (tt * tt);
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
px = (sid->scrollto.x.start * (1.0 - tt)) +
(sid->scrollto.x.end * tt);
if (t >= sid->scrollto.x.t_end)
{
px = sid->scrollto.x.end;
- _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
sid->down.sx = px;
sid->down.x = sid->down.history[0].x;
+ sid->down.pdx = 0;
_elm_scroll_wanted_coordinates_update(sid, px, py);
sid->scrollto.x.animator = NULL;
if ((!sid->scrollto.y.animator) && (!sid->down.bounce_y_animator))
_elm_scroll_anim_stop(sid);
return ECORE_CALLBACK_CANCEL;
}
- _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
_elm_scroll_wanted_coordinates_update(sid, px, py);
return ECORE_CALLBACK_RENEW;
}
if (!sid->pan_obj) return EINA_FALSE;
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
-
t = ecore_loop_time_get();
tt = (t - sid->scrollto.y.t_start) /
(sid->scrollto.y.t_end - sid->scrollto.y.t_start);
tt = 1.0 - tt;
tt = 1.0 - (tt * tt);
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
py = (sid->scrollto.y.start * (1.0 - tt)) +
(sid->scrollto.y.end * tt);
if (t >= sid->scrollto.y.t_end)
{
py = sid->scrollto.y.end;
- _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
sid->down.sy = py;
sid->down.y = sid->down.history[0].y;
+ sid->down.pdy = 0;
_elm_scroll_wanted_coordinates_update(sid, px, py);
sid->scrollto.y.animator = NULL;
if ((!sid->scrollto.x.animator) && (!sid->down.bounce_x_animator))
_elm_scroll_anim_stop(sid);
return ECORE_CALLBACK_CANCEL;
}
- _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
_elm_scroll_wanted_coordinates_update(sid, px, py);
return ECORE_CALLBACK_RENEW;
double t_in,
Evas_Coord pos_y)
{
- Evas_Coord px, py, x, y, w, h;
+ Evas_Coord px = 0, py = 0, x, y, w, h;
double t;
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
if (sid->freeze) return;
if (t_in <= 0.0)
{
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
- _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
y = pos_y;
- _elm_scroll_content_region_set(sid->obj, x, y, w, h);
+ eo_do(sid->obj, elm_interface_scrollable_content_region_set(x, y, w, h));
return;
}
t = ecore_loop_time_get();
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
sid->scrollto.y.start = py;
sid->scrollto.y.end = pos_y;
sid->scrollto.y.t_start = t;
}
if (sid->down.bounce_y_animator)
{
- ecore_animator_del(sid->down.bounce_y_animator);
- sid->down.bounce_y_animator = NULL;
+ ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
_elm_scroll_momentum_end(sid);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
sid->bouncemey = EINA_FALSE;
}
double t_in,
Evas_Coord pos_x)
{
- Evas_Coord px, py, x, y, w, h;
+ Evas_Coord px = 0, py = 0, x, y, w, h;
double t;
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
if (sid->freeze) return;
if (t_in <= 0.0)
{
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
- _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
x = pos_x;
- _elm_scroll_content_region_set(sid->obj, x, y, w, h);
+ eo_do(sid->obj, elm_interface_scrollable_content_region_set
+ (x, y, w, h));
return;
}
t = ecore_loop_time_get();
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
sid->scrollto.x.start = px;
sid->scrollto.x.end = pos_x;
sid->scrollto.x.t_start = t;
}
if (sid->down.bounce_x_animator)
{
- ecore_animator_del(sid->down.bounce_x_animator);
- sid->down.bounce_x_animator = NULL;
+ ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
_elm_scroll_momentum_end(sid);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
sid->bouncemex = EINA_FALSE;
}
static void
_elm_scroll_mouse_up_event_cb(void *data,
Evas *e,
- Evas_Object *obj __UNUSED__,
+ Evas_Object *obj EINA_UNUSED,
void *event_info)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
Evas_Coord x = 0, y = 0, ox = 0, oy = 0;
- Evas_Event_Mouse_Down *ev;
+ Evas_Event_Mouse_Up *ev;
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
return;
sid->down.dy = 0;
evas_post_event_callback_push(e, _elm_scroll_post_event_up, sid);
- //REDWOOD ONLY
+// TIZEN_ONLY(20150820): Overscroll effect
edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,up", "elm");
+//
// FIXME: respect elm_widget_scroll_hold_get of parent container
if (!_elm_config->thumbscroll_enable) return;
{
if (sid->down.onhold_animator)
{
- ecore_animator_del(sid->down.onhold_animator);
- sid->down.onhold_animator = NULL;
+ ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
x = ev->canvas.x - sid->down.x;
y = ev->canvas.y - sid->down.y;
#endif
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
-
ax = ev->canvas.x;
ay = ev->canvas.y;
at = 0.0;
for (i = 0; i < 60; i++)
{
dt = t - sid->down.history[i].timestamp;
- if (dt > 0.4) break;
+ if (dt > 0.2) break;
#ifdef SCROLLDBG
DBG("H: %i %i @ %1.3f\n",
sid->down.history[i].x,
if ((_elm_config->thumbscroll_friction > 0.0) &&
(vel > _elm_config->thumbscroll_momentum_threshold))
{
- Evas_Coord vw, vh, aw, ah, max_d;
+ Evas_Coord max_d;
int minx, miny, mx, my, px, py;
double tt = 0.0, dtt = 0.0;
- psd->api->pos_min_get
- (sid->pan_obj, &minx, &miny);
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_min_get
+ (&minx, &miny));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_max_get
+ (&mx, &my));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
max_d = _elm_config->thumbscroll_flick_distance_tolerance;
- /* TIZEN ONLY */
- /* Original scroller used sin graph for calculating flick distance.
- But calculated flick distance is so long.
- So I divided into two sections. First section use sin grapth divided into 2.
- And second section use original logic.
- As a result, if flicking velocity is slow, flicking distance will be short.
- */
if (dx > 0)
{
if (dx > max_d) dx = max_d;
- if (0.4 >= ((sin((M_PI * (double)dx / max_d) - (M_PI / 2)) + 1) / 2))
- sid->down.dx = ((sin((M_PI * (double)dx / max_d)
- - (M_PI / 2)) + 1) / 2) * max_d / at;
- else
- sid->down.dx = ((sin((M_PI * (double)dx / max_d)
- - (M_PI / 2)) + 1)) * max_d / at;
+ sid->down.dx = (sin((M_PI * (double)dx / max_d)
+ - (M_PI / 2)) + 1) * max_d / at;
}
else
{
if (dx < -max_d) dx = -max_d;
- if (-0.4 <= ((sin((M_PI * (double)dx / max_d) + (M_PI / 2)) - 1) / 2))
- sid->down.dx = ((sin((M_PI * (double)dx / max_d)
- + (M_PI / 2)) - 1) / 2) * max_d / at;
- else
- sid->down.dx = (sin((M_PI * (double)dx / max_d)
- + (M_PI / 2)) - 1) * max_d / at;
+ sid->down.dx = (sin((M_PI * (double)dx / max_d)
+ + (M_PI / 2)) - 1) * max_d / at;
}
if (dy > 0)
{
if (dy > max_d) dy = max_d;
- if (0.4 >= ((sin((M_PI * (double)dy / max_d) - (M_PI / 2)) + 1) / 2))
- sid->down.dy = ((sin((M_PI * (double)dy / max_d)
- - (M_PI / 2)) + 1) / 2) * max_d / at;
- else
- sid->down.dy = (sin((M_PI * (double)dy / max_d)
- - (M_PI / 2)) + 1) * max_d / at;
+ sid->down.dy = (sin((M_PI * (double)dy / max_d)
+ - (M_PI / 2)) + 1) * max_d / at;
}
else
{
if (dy < -max_d) dy = -max_d;
- if (-0.4 <= ((sin((M_PI * (double)dy / max_d) + (M_PI / 2)) - 1) / 2))
- sid->down.dy = ((sin((M_PI * (double)dy / max_d)
- + (M_PI / 2)) - 1) / 2) * max_d / at;
- else
- sid->down.dy = (sin((M_PI * (double)dy / max_d)
- + (M_PI / 2)) - 1) * max_d / at;
+ sid->down.dy = (sin((M_PI * (double)dy / max_d)
+ + (M_PI / 2)) - 1) * max_d / at;
}
if (((sid->down.dx > 0) && (sid->down.pdx > 0)) ||
((sid->down.dx < 0) && (sid->down.pdx < 0)) ||
else
sid->down.extra_time = 0.0;
- aw = abs(sid->down.dx);
- _elm_scroll_content_viewport_size_get(sid->obj, &vw, &vh);
- if (aw > vw * 3)
- {
- if (sid->down.dx > 0) sid->down.dx = vw * 3;
- else sid->down.dx = -(vw * 3);
- }
- ah = abs(sid->down.dy);
- if (ah > vh * 3)
+ if (abs(sid->down.dx) > _elm_config->thumbscroll_acceleration_threshold &&
+ (dtt < _elm_config->thumbscroll_acceleration_time_limit) &&
+ (((sid->down.dx > 0) && (sid->down.pdx > 0)) ||
+ ((sid->down.dx < 0) && (sid->down.pdx < 0))))
+ if (px > minx && px < mx)
+ sid->down.dx += (double)sid->down.pdx * _elm_config->thumbscroll_acceleration_weight;
+ if (abs(sid->down.dy) > _elm_config->thumbscroll_acceleration_threshold &&
+ (dtt < _elm_config->thumbscroll_acceleration_time_limit) &&
+ (((sid->down.dy > 0) && (sid->down.pdy > 0)) ||
+ ((sid->down.dy < 0) && (sid->down.pdy < 0))))
+ if (py > miny && py < my)
{
- if (sid->down.dy > 0) sid->down.dy = vh * 3;
- else sid->down.dy = -(vh * 3);
+ sid->down.dy += (double)sid->down.pdy * _elm_config->thumbscroll_acceleration_weight;
}
- if (psd->api->pos_adjust)
- {
- Evas_Coord pos_x, pos_y;
+// TIZEN_ONLY(20150705): Genlist item align feature
+ Evas_Coord pos_x, pos_y;
- pos_x = sid->down.dx;
- pos_y = sid->down.dy;
+ pos_x = sid->down.dx;
+ pos_y = sid->down.dy;
- pos_x = _round(pos_x * (_elm_config->thumbscroll_friction +
- sid->down.extra_time), 0);
- pos_y = _round(pos_y * (_elm_config->thumbscroll_friction +
- sid->down.extra_time), 0);
- psd->api->pos_adjust(sid, &pos_x, &pos_y);
+ pos_x = _round(pos_x * (_elm_config->thumbscroll_friction +
+ sid->down.extra_time), 0);
+ pos_y = _round(pos_y * (_elm_config->thumbscroll_friction +
+ sid->down.extra_time), 0);
- sid->down.dx = pos_x;
- sid->down.dy = pos_y;
- }
+ eo_do(sid->pan_obj, elm_obj_pan_pos_adjust(&pos_x, &pos_y));
+ // adjusted position using to _elm_scroll_momentum_animator()
+ sid->down.dx = pos_x;
+ sid->down.dy = pos_y;
+//
sid->down.pdx = sid->down.dx;
sid->down.pdy = sid->down.dy;
ox = -sid->down.dx;
_elm_scroll_anim_start(sid);
}
sid->down.anim_start = ecore_loop_time_get();
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
+ eo_do(sid->obj,
+ elm_interface_scrollable_content_pos_get(&x, &y));
sid->down.sx = x;
sid->down.sy = y;
sid->down.b0x = 0;
sid->down.b0y = 0;
}
}
+// TIZEN_ONLY(20150705): Genlist item align feature
else
{
- if (psd->api->pos_adjust)
- {
- Evas_Coord pos_x = 0, pos_y = 0;
- Evas_Coord adjust_x, adjust_y;
+ Evas_Coord pos_x = 0, pos_y = 0;
+ Evas_Coord adjust_x, adjust_y;
- psd->api->pos_adjust(sid, &pos_x, &pos_y);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_adjust(&pos_x, &pos_y));
- _elm_scroll_content_pos_get(sid->obj, &adjust_x, &adjust_y);
- pos_y = -pos_y;
- adjust_y += pos_y;
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&adjust_x, &adjust_y));
+ pos_y = -pos_y;
+ adjust_y += pos_y;
- _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
- }
+ _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
}
- }
- else
- {
- if (psd->api->pos_adjust)
- {
- Evas_Coord pos_x = 0, pos_y = 0;
- Evas_Coord adjust_x, adjust_y;
-
- psd->api->pos_adjust(sid, &pos_x, &pos_y);
-
- _elm_scroll_content_pos_get(sid->obj, &adjust_x, &adjust_y);
- pos_y = -pos_y;
- adjust_y += pos_y;
-
- _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
- }
- }
+ }
+ else
+ {
+ Evas_Coord pos_x = 0, pos_y = 0;
+ Evas_Coord adjust_x, adjust_y;
+
+ eo_do(sid->pan_obj, elm_obj_pan_pos_adjust(&pos_x, &pos_y));
+
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&adjust_x, &adjust_y));
+ pos_y = -pos_y;
+ adjust_y += pos_y;
+
+ _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
+ }
+//
}
else
{
{
Evas_Coord pgx, pgy;
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get
+ (&x, &y));
if ((!sid->obj) ||
(!elm_widget_drag_child_locked_x_get
(sid->obj)))
{
- //TIZEN ONLY
- if (sid->down.dir_x && sid->pagesize_h > 0)
- {
- if (ox > 0)
- {
- if (sid->down.pageflick_h < 0)
- ox = sid->pagesize_h + sid->down.pageflick_h;
- else
- ox = sid->pagesize_h * 0.5;
- }
- else if (ox < 0)
- {
- if (sid->down.pageflick_h > 0)
- ox = -(sid->pagesize_h - sid->down.pageflick_h + 1);
- else
- ox = -(sid->pagesize_h * 0.5 + 1);
- }
- }
pgx = _elm_scroll_page_x_get(sid, ox, EINA_TRUE);
if (pgx != x &&
!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
+ ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
{
ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
_elm_scroll_scroll_to_x
- (sid, _elm_config->page_scroll_friction, pgx);
+ (sid, _elm_config->page_scroll_friction, pgx);
}
}
if ((!sid->obj) ||
(!elm_widget_drag_child_locked_y_get
(sid->obj)))
{
- //TIZEN ONLY
- if (sid->down.dir_y && sid->pagesize_v > 0)
- {
- if (oy > 0)
- {
- if (sid->down.pageflick_v < 0)
- oy = sid->pagesize_v + sid->down.pageflick_v;
- else
- oy = sid->pagesize_v * 0.5;
- }
- else if (oy < 0)
- {
- if (sid->down.pageflick_v > 0)
- oy = -(sid->pagesize_v - sid->down.pageflick_v + 1);
- else
- oy = -(sid->pagesize_v * 0.5 + 1);
- }
- }
pgy = _elm_scroll_page_y_get(sid, oy, EINA_TRUE);
if (pgy != y &&
!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+ ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
{
ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
_elm_scroll_scroll_to_y
- (sid, _elm_config->page_scroll_friction, pgy);
+ (sid, _elm_config->page_scroll_friction, pgy);
}
}
}
{
Evas_Coord pgx, pgy;
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get
+ (&x, &y));
if ((!sid->obj) ||
(!elm_widget_drag_child_locked_x_get
(sid->obj)))
}
if (sid->down.hold_animator)
{
- ecore_animator_del(sid->down.hold_animator);
- sid->down.hold_animator = NULL;
+ ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
+ ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
if (sid->down.scroll)
{
ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
sid->down.want_dragged = EINA_FALSE;
sid->down.dragged = EINA_FALSE;
sid->down.now = EINA_FALSE;
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
- _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
_elm_scroll_wanted_coordinates_update(sid, x, y);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
if (!_paging_is_enabled(sid))
_elm_scroll_bounce_eval(sid);
static void
_elm_scroll_mouse_down_event_cb(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj __UNUSED__,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
void *event_info)
{
Elm_Scrollable_Smart_Interface_Data *sid;
sid = data;
ev = event_info;
-#ifdef SMOOTHDBG
- if (getenv("ELS_SCROLLER_SMOOTH_DEBUG")) _elm_scroll_smooth_debug = 1;
- if (_elm_scroll_smooth_debug) _elm_scroll_smooth_debug_init();
-#endif
-
if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
return;
- //REDWOOD ONLY
+// TIZEN_ONLY(20150820): Overscroll effect
edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,down", "elm");
+//
- if (_elm_config->thumbscroll_enable)
+#ifdef SMOOTHDBG
+ if (getenv("ELS_SCROLLER_SMOOTH_DEBUG")) _elm_scroll_smooth_debug = 1;
+ if (_elm_scroll_smooth_debug) _elm_scroll_smooth_debug_init();
+#endif
+
+ if (!_elm_config->thumbscroll_enable) return;
+
+ sid->down.hold = EINA_FALSE;
+ if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
+ (sid->down.momentum_animator) || (sid->scrollto.x.animator) ||
+ (sid->scrollto.y.animator))
+ {
+ //TIZEN_ONLY: (20150819) Do not hold the flag causes click skip
+ //and not required as we are deleting all animators here.
+ //ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL |
+ // EVAS_EVENT_FLAG_ON_HOLD;
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
+ //
+ sid->down.scroll = EINA_TRUE;
+ //TIZEN_ONLY: (20150819) Do not hold the flag causes click skip
+ //sid->down.hold = EINA_TRUE;
+ //
+ _elm_scroll_anim_stop(sid);
+ }
+ ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+ ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
+ if (sid->down.bounce_x_animator)
{
- sid->down.hold = EINA_FALSE;
- if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
- (sid->down.momentum_animator) || (sid->scrollto.x.animator) ||
- (sid->scrollto.y.animator))
- {
- ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL |
- EVAS_EVENT_FLAG_ON_HOLD;
- sid->down.scroll = EINA_TRUE;
- sid->down.hold = EINA_TRUE;
- _elm_scroll_anim_stop(sid);
- }
- if (sid->scrollto.x.animator)
- {
- ecore_animator_del(sid->scrollto.x.animator);
- sid->scrollto.x.animator = NULL;
- }
- if (sid->scrollto.y.animator)
- {
- ecore_animator_del(sid->scrollto.y.animator);
- sid->scrollto.y.animator = NULL;
- }
- if (sid->down.bounce_x_animator)
- {
- ecore_animator_del(sid->down.bounce_x_animator);
- sid->down.bounce_x_animator = NULL;
- sid->bouncemex = EINA_FALSE;
- if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
- }
- if (sid->down.bounce_y_animator)
- {
- ecore_animator_del(sid->down.bounce_y_animator);
- sid->down.bounce_y_animator = NULL;
- sid->bouncemey = EINA_FALSE;
- if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
- }
- if (sid->down.hold_animator)
- {
- ecore_animator_del(sid->down.hold_animator);
- sid->down.hold_animator = NULL;
- _elm_scroll_drag_stop(sid);
- if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
- }
- if (sid->down.momentum_animator)
- {
- ecore_animator_del(sid->down.momentum_animator);
- sid->down.momentum_animator = NULL;
- sid->down.bounce_x_hold = EINA_FALSE;
- sid->down.bounce_y_hold = EINA_FALSE;
- sid->down.ax = 0;
- sid->down.ay = 0;
- if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
- }
- if (ev->button == 1)
- {
- if (_paging_is_enabled(sid))
- {
- sid->down.pageflick_h = 0;
- sid->down.pageflick_v = 0;
- }
- sid->down.hist.est_timestamp_diff =
- ecore_loop_time_get() - ((double)ev->timestamp / 1000.0);
- sid->down.hist.tadd = 0.0;
- sid->down.hist.dxsum = 0.0;
- sid->down.hist.dysum = 0.0;
- sid->down.now = EINA_TRUE;
- sid->down.dragged = EINA_FALSE;
- sid->down.dir_x = EINA_FALSE;
- sid->down.dir_y = EINA_FALSE;
- sid->down.x = ev->canvas.x;
- sid->down.y = ev->canvas.y;
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
- sid->down.sx = x;
- sid->down.sy = y;
- sid->down.locked = EINA_FALSE;
- memset(&(sid->down.history[0]), 0,
- sizeof(sid->down.history[0]) * ELM_SCROLL_HISTORY_SIZE);
+ ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
+ sid->bouncemex = EINA_FALSE;
+ if (sid->content_info.resized)
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
+ }
+ if (sid->down.bounce_y_animator)
+ {
+ ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
+ sid->bouncemey = EINA_FALSE;
+ if (sid->content_info.resized)
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
+ }
+ if (sid->down.hold_animator)
+ {
+ ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
+ _elm_scroll_drag_stop(sid);
+ if (sid->content_info.resized)
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
+ }
+ ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
+ if (sid->down.momentum_animator)
+ {
+ ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
+ sid->down.bounce_x_hold = EINA_FALSE;
+ sid->down.bounce_y_hold = EINA_FALSE;
+ sid->down.ax = 0;
+ sid->down.ay = 0;
+ if (sid->content_info.resized)
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
+ }
+ if (ev->button == 1)
+ {
+ sid->down.hist.est_timestamp_diff =
+ ecore_loop_time_get() - ((double)ev->timestamp / 1000.0);
+ sid->down.hist.tadd = 0.0;
+ sid->down.hist.dxsum = 0.0;
+ sid->down.hist.dysum = 0.0;
+ sid->down.now = EINA_TRUE;
+ sid->down.dragged = EINA_FALSE;
+ sid->down.dir_x = EINA_FALSE;
+ sid->down.dir_y = EINA_FALSE;
+ sid->down.x = ev->canvas.x;
+ sid->down.y = ev->canvas.y;
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+ sid->down.sx = x;
+ sid->down.sy = y;
+ sid->down.locked = EINA_FALSE;
+ memset(&(sid->down.history[0]), 0,
+ sizeof(sid->down.history[0]) * 60);
#ifdef EVTIME
- sid->down.history[0].timestamp = ev->timestamp / 1000.0;
- sid->down.history[0].localtimestamp = ecore_loop_time_get();
+ sid->down.history[0].timestamp = ev->timestamp / 1000.0;
+ sid->down.history[0].localtimestamp = ecore_loop_time_get();
#else
- sid->down.history[0].timestamp = ecore_loop_time_get();
+ sid->down.history[0].timestamp = ecore_loop_time_get();
#endif
- sid->down.dragged_began_timestamp = sid->down.history[0].timestamp;
- sid->down.history[0].x = ev->canvas.x;
- sid->down.history[0].y = ev->canvas.y;
- }
- sid->down.dragged_began = EINA_FALSE;
- sid->down.hold_parent = EINA_FALSE;
- sid->down.cancelled = EINA_FALSE;
- if (sid->hold || sid->freeze)
- sid->down.want_reset = EINA_TRUE;
- else
- sid->down.want_reset = EINA_FALSE;
+ sid->down.dragged_began_timestamp = sid->down.history[0].timestamp;
+ sid->down.history[0].x = ev->canvas.x;
+ sid->down.history[0].y = ev->canvas.y;
}
+ sid->down.dragged_began = EINA_FALSE;
+ sid->down.hold_parent = EINA_FALSE;
+ sid->down.cancelled = EINA_FALSE;
+ if (sid->hold || sid->freeze)
+ sid->down.want_reset = EINA_TRUE;
+ else
+ sid->down.want_reset = EINA_FALSE;
}
static Eina_Bool
if (!sid->pan_obj) return EINA_FALSE;
- ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
-
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->pos_get(sid->pan_obj, &px, &py);
+ 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));
switch (dir)
{
case LEFT:
static Eina_Bool
_elm_scroll_post_event_move(void *data,
- Evas *e __UNUSED__)
+ Evas *e EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
Eina_Bool horiz, vert;
+ int start = 0;
- if (sid->down.want_dragged)
- {
- int start = 0;
+ if (!sid->down.want_dragged) return EINA_TRUE;
- elm_widget_parents_bounce_get(sid->obj, &horiz, &vert);
- if (sid->down.hold_parent)
+ elm_widget_parents_bounce_get(sid->obj, &horiz, &vert);
+ if (sid->down.hold_parent)
+ {
+ if ((sid->down.dir_x) && (horiz || !sid->bounce_horiz) &&
+ !_elm_scroll_can_scroll(sid, sid->down.hdir))
{
- if ((sid->down.dir_x) && (horiz || !sid->bounce_horiz) &&
- !_elm_scroll_can_scroll(sid, sid->down.hdir))
- {
- sid->down.dir_x = EINA_FALSE;
- }
- if ((sid->down.dir_y) && (vert || !sid->bounce_vert) &&
- !_elm_scroll_can_scroll(sid, sid->down.vdir))
- {
- sid->down.dir_y = EINA_FALSE;
- }
- sid->down.dragged_began = EINA_TRUE;
+ sid->down.dir_x = EINA_FALSE;
}
- if (sid->down.dir_x)
+ if ((sid->down.dir_y) && (vert || !sid->bounce_vert) &&
+ !_elm_scroll_can_scroll(sid, sid->down.vdir))
{
- if ((!sid->obj) ||
- (!elm_widget_drag_child_locked_x_get(sid->obj)))
- {
- if (sid->down.dragged_began)
+ sid->down.dir_y = EINA_FALSE;
+ }
+ sid->down.dragged_began = EINA_TRUE;
+ }
+ if (sid->down.dir_x)
+ {
+ if ((!sid->obj) ||
+ (!elm_widget_drag_child_locked_x_get(sid->obj)))
+ {
+ if (sid->down.dragged_began)
+ {
+ sid->down.want_dragged = EINA_FALSE;
+ sid->down.dragged = EINA_TRUE;
+ if (sid->obj)
{
- sid->down.want_dragged = EINA_FALSE;
- sid->down.dragged = EINA_TRUE;
- if (sid->obj)
- {
- elm_widget_drag_lock_x_set(sid->obj, 1);
- }
- start = 1;
+ elm_widget_drag_lock_x_set(sid->obj, 1);
}
- }
- else
- {
- sid->down.dragged_began = EINA_TRUE;
- sid->down.dir_x = EINA_FALSE;
+ start = 1;
}
}
- if (sid->down.dir_y)
+ else
{
- if ((!sid->obj) ||
- (!elm_widget_drag_child_locked_y_get(sid->obj)))
+ sid->down.dragged_began = EINA_TRUE;
+ sid->down.dir_x = EINA_FALSE;
+ }
+ }
+ if (sid->down.dir_y)
+ {
+ if ((!sid->obj) ||
+ (!elm_widget_drag_child_locked_y_get(sid->obj)))
+ {
+ if (sid->down.dragged_began)
{
- if (sid->down.dragged_began)
+ sid->down.want_dragged = EINA_FALSE;
+ sid->down.dragged = EINA_TRUE;
+ if (sid->obj)
{
- sid->down.want_dragged = EINA_FALSE;
- sid->down.dragged = EINA_TRUE;
- if (sid->obj)
- {
- elm_widget_drag_lock_y_set
- (sid->obj, EINA_TRUE);
- }
- start = 1;
+ elm_widget_drag_lock_y_set
+ (sid->obj, EINA_TRUE);
}
- }
- else
- {
- sid->down.dragged_began = EINA_TRUE;
- sid->down.dir_y = EINA_FALSE;
+ start = 1;
}
}
- if ((!sid->down.dir_x) && (!sid->down.dir_y))
+ else
{
- sid->down.cancelled = EINA_TRUE;
+ sid->down.dragged_began = EINA_TRUE;
+ sid->down.dir_y = EINA_FALSE;
}
- if (start) _elm_scroll_drag_start(sid);
}
+ if ((!sid->down.dir_x) && (!sid->down.dir_y))
+ {
+ sid->down.cancelled = EINA_TRUE;
+ }
+ if (start) _elm_scroll_drag_start(sid);
return EINA_TRUE;
}
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- if (_paging_is_enabled(sid))
- {
- sid->down.pageflick_h = *x - sid->down.x;
- sid->down.pageflick_v = *y - sid->down.y;
- }
-
if (sid->down.dir_x) *x = sid->down.sx - (*x - sid->down.x);
else *x = sid->down.sx;
if (sid->down.dir_y) *y = sid->down.sy - (*y - sid->down.y);
}
}
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
if (!sid->loop_h && *x < minx)
*x += (minx - *x) * _elm_config->thumbscroll_border_friction;
_elm_config->thumbscroll_border_friction;
}
-//TIZEN ONLY : for scroll smooth algorithm
-
-#define iround(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
-
-//> Frequency of move events
-#define ELM_MOVE_PER_SECOND (90.75)
-//>Time between two subsequent events
-#define ELM_MOVE_TIMEOUT (1./ELM_MOVE_PER_SECOND)
-
-//>Quantity of move events in time interval
-#define ELM_MOVE_COUNT(t) iround((t)*ELM_MOVE_PER_SECOND)
-
-//>Getting coordinate (x is 0, y is 1) from struct Elm_Scroll_Pos or Elm_Scroll_History_Item.
-#define ELM_GET_COORD(p, coord) (*((int *)p + coord))
-
-//>Difference of coordinates of points with indexes ind and ind+inc.
-#define ELM_DIFF(p, coord, ind, inc) (ELM_GET_COORD((p + ind), coord) - ELM_GET_COORD((p + ind + inc), coord))
-
-//>Index in array for calculation of smoothed velocity.
-#define ELM_SMOOTH_SPEED_INDEX 9
-
-//>in seconds, includes driver to X time gap
-#define EXTRA_PREDIOCTION_TIME (-0.005)
-
-//>Calculating current velocity. In normal situation it is (pos[0].x - pos[ELM_SMOOTH_SPEED_INDEX].x) / (pos[0].t - pos[ELM_SMOOTH_SPEED_INDEX].t).
-//>But in situations when: 1. Sign of velocity was changes or 2. The acceleration is of constant sign or 3. There was stop of movement
-//>The index ELM_SMOOTH_SPEED_INDEX is replaced by 1.
-double _elm_scroll_get_v(Elm_Scroll_Pos *pos, int num, int coord,
- double *dt, int *pdiff, double *padt, Elm_Scroll_Predict *predict)
-{
- double v = 0;
- int nmeasure_idx = (num > ELM_SMOOTH_SPEED_INDEX) ? ELM_SMOOTH_SPEED_INDEX : (num -1);
- // a recent input takes higher priority
-#if USE_HISTORY_WEIGHT
- if (nmeasure_idx >= 2)
- *pdiff = (ELM_DIFF(pos, coord, 0, 1) * 2 + ELM_DIFF(pos, coord, 1, 1))/3;
- else
-#else
- *pdiff = ELM_DIFF(pos, coord, 0, 1);
-#endif
-
-#if ADJUST_EVENT_TIME
- *dt = -ELM_MOVE_TIMEOUT;
-#else
- if (nmeasure_idx >= 2)
- *dt = -(pos[2].t - pos[0].t)/2.;
- else
- *dt = -(pos[1].t - pos[0].t);
-#endif
- if (*dt == 0)
- *dt = -ELM_MOVE_TIMEOUT;
- v = *pdiff / *dt;
- predict->k[coord] = 0;
- *padt = EXTRA_PREDIOCTION_TIME;
-
- return v;
-}
-
-static Eina_Bool _elm_scroll_get_pos(Elm_Scrollable_Smart_Interface_Data *sid,
- Elm_Scroll_Pos *pos, int num, int *fx, int *fy)
-{
- double vx = 0, vy = 0, dt = 0, dtx = 0, dty = 0;
-
- if (num < 1)
- {
- return EINA_FALSE;
- }
- else if (num == 1)
- {
- *fx = iround((double)pos[0].x);
- *fy = iround((double)pos[0].y);
- }
- else if (num >= 2)
- {
- int diffx, diffy;
- if (sid->down.dir_y)
- vy = _elm_scroll_get_v(pos, num, 1, &dt, &diffy, &dty, &sid->down.predict);
- if (sid->down.dir_x)
- vx = _elm_scroll_get_v(pos, num, 0, &dt, &diffx, &dtx, &sid->down.predict);
- }
-
- if (sid->down.dir_x)
- {
- *fx = iround((double)pos[0].x - (pos[0].t + dtx) * vx);
- // don't go back even though over-run is detected.
- if (sid->down.anim_vx_prev && sid->down.anim_vx_prev * vx >= 0)
- if (vx == 0 || (vx > 0 && *fx > sid->down.anim_x_prev) ||
- (vx < 0 && *fx < sid->down.anim_x_prev))
- *fx = sid->down.anim_x_prev;
- }
-
- if (sid->down.dir_y)
- {
- *fy = iround((double)pos[0].y - (pos[0].t + dty) * vy);
- // don't go back even though over-run is detected.
- if (sid->down.anim_vy_prev && sid->down.anim_vy_prev * vy >= 0)
- if (vy == 0 || (vy > 0 && *fy > sid->down.anim_y_prev) ||
- (vy < 0 && *fy < sid->down.anim_y_prev))
- *fy = sid->down.anim_y_prev;
- }
-
- sid->down.anim_x_prev = *fx;
- sid->down.anim_y_prev = *fy;
- sid->down.anim_vx_prev = vx;
- sid->down.anim_vy_prev = vy;
-
- return EINA_TRUE;
-}
-
-#define COMPENSATE_FOR_INITIAL_RENDER_DELAY 0
-#define ADJUST_ANIMATOR_TIMING 1
-#define SMART_SMOOTH_START 1
-#define HOLD_ANIMATOR_DEBUG_LEVEL1 0
-#define HOLD_ANIMATOR_DEBUG_LEVEL2 0
-#define HOLD_ANIMATOR_DEBUG_X_AXIS 1
-#define USE_LOOP_TIME 0
-#define ADJUST_EVENT_TIME 0
-#define USE_HISTORY_WEIGHT 0
-#define PREDICT_WHEN_PAUSED 0
-
static Eina_Bool
-_elm_scroll_hold_animator(void *data)
+_elm_scroll_hold_enterer(void *data)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
- Evas_Coord ox = 0, oy = 0, fx = 0, fy = 0, x = 0, y = 0, num = 0;
- Evas_Coord fx_coord = 0, fy_coord = 0;
- fx = sid->down.hold_x;
- fy = sid->down.hold_y;
- fx_coord = sid->down.anim_x_coord_prev;
- fy_coord = sid->down.anim_y_coord_prev;
-#define QUEUE_SIZE 3 /* for event queue size */
- Elm_Scroll_Pos pos[QUEUE_SIZE];
-
- double now, now_diff, prev;
- double animators_frametime=0, d = 0;
- double pos_diff = 0;
-
- Ecore_Animator_Source source;
+ Evas_Coord ox = 0, oy = 0, fx = 0, fy = 0;
- sid->down.anim_count++;
+ sid->down.hold_enterer = NULL;
- source = ecore_animator_source_get();
-
- // FIXME: assume server and client have the same "timezone"
- // (0 timepoint) for now. this needs to be figured out in advance
- // though.
-#if USE_LOOP_TIME
- now = ecore_loop_time_get();
-#else
- now = ecore_time_get();
-#endif
-
- // init variables for the first animator run
- if (sid->down.anim_count == 1)
- {
- sid->down.anim_t_prev = now;
- sid->down.anim_x_coord_prev = fx;
- sid->down.anim_y_coord_prev = fy;
- fx_coord = fx;
- fy_coord = fy;
- }
- prev = sid->down.anim_t_prev;
- now_diff = now - prev;
- animators_frametime = ecore_animator_frametime_get();
-#if COMPENSATE_FOR_INITIAL_RENDER_DELAY
- if (sid->down.anim_count == 1)
- {
- if (source != ECORE_ANIMATOR_SOURCE_CUSTOM)
- sid->down.anim_t_delay = fmod(now, animators_frametime);
- }
- else
-#endif
- {
- sid->down.anim_t_delay += now_diff - animators_frametime;
- }
-
- // skip this turn if specified.
- if (sid->down.anim_skip > 0)
- {
- sid->down.anim_skip--;
-#if HOLD_ANIMATOR_DEBUG_LEVEL1
- DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev: %.4f skip(%d)\n",
- sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
- now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
- now_diff*1000,
- (now_diff - d)*1000,
- d*1000,
- sid->down.history[0].timestamp,
- sid->down.anim_skip);
-#endif
- if ((now_diff * 1000) > 18)
- {
-#if ADJUST_ANIMATOR_TIMING
- sid->down.anim_t_dont_adjust = 1;
-#endif
- goto update_time_and_quit;
- }
- }
-
- // We don't need to process old events again.
- if (sid->down.anim_count != 1 &&
- sid->down.anim_pos_t_prev == sid->down.history[0].timestamp)
- {
-#if HOLD_ANIMATOR_DEBUG_LEVEL1
- DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev:%.4f skip(%d) no events.\n",
- sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
- now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
- now_diff*1000,
- (now_diff - d)*1000,
- d*1000,
- sid->down.history[0].timestamp,
- sid->down.anim_skip);
-#endif
-
- goto update_time_and_quit;
- }
+ fx = sid->down.hold_x;
+ fy = sid->down.hold_y;
-#if ADJUST_ANIMATOR_TIMING
- if (sid->down.anim_count != 1 && !sid->down.anim_t_dont_adjust)
+ if (_elm_config->scroll_smooth_amount > 0.0)
{
- if (now_diff < animators_frametime*3/4)
- {
- d += animators_frametime/4;
- }
- else if (now_diff < animators_frametime)
- {
- d = animators_frametime - now_diff;
- }
- else if (now_diff < animators_frametime*5/4)
+ int i, count = 0;
+ Evas_Coord basex = 0, basey = 0, x, y;
+ double dt, t, tdiff, tnow, twin;
+ struct
{
- d = -(now_diff - animators_frametime);
- }
- else
+ Evas_Coord x, y, dx, dy;
+ double t, dt;
+ } pos[60];
+
+ tdiff = sid->down.hist.est_timestamp_diff;
+ tnow = ecore_time_get() - tdiff;
+ t = tnow;
+ twin = _elm_config->scroll_smooth_time_window;
+ for (i = 0; i < 60; i++)
{
- d = -animators_frametime/4;
- }
-
- now += d;
- now_diff +=d;
- sid->down.anim_t_adjusted += d;
- }
-
- sid->down.anim_t_dont_adjust = 0;
-
-#endif
-
-#if COMPENSATE_FOR_INITIAL_RENDER_DELAY
- // in case the first animator is called manually to make up for gpu's wake-up time,
- // then the second animator should be skipped.
- if ((sid->down.anim_count == 1) && (sid->down.anim_skip <= 0))
- sid->down.anim_skip++;
-#endif
-
- if ((!sid->hold) && (!sid->freeze) &&
- _elm_config->scroll_smooth_time_interval > 0.0)
- {
- int i = 0;
- int ncur_diff_x=0, ncur_diff_y=0;
- int nprev_diff_x=0, nprev_diff_y=0;
-
- for (i = 0; i < QUEUE_SIZE; i++)
- {
- if (sid->down.history[i].timestamp >=
+ if (sid->down.history[i].timestamp >
sid->down.dragged_began_timestamp)
{
- x = sid->down.history[i].x;
- y = sid->down.history[i].y;
-
- //if there is no history value, we don't deal with it if
- //there is better wat to know existance of history value
- //, I will modify this code to it
- if ((x == 0) && (y == 0))
- {
- break;
- }
-
- pos[i].x = x;
- pos[i].y = y;
- pos[i].t = now - sid->down.history[i].timestamp;
- num++;
-
- if (num <= 1)
- continue;
-
- // get rid of histories with different move direction.
- if (sid->down.dir_x)
- ncur_diff_x = pos[i].x - pos[i-1].x;
- if (sid->down.dir_y)
- ncur_diff_y = pos[i].y - pos[i-1].y;
-
- if (ncur_diff_x * nprev_diff_x < 0 || ncur_diff_y * nprev_diff_y < 0)
+ // oldest point is sd->down.history[i]
+ // newset is sd->down.history[0]
+ dt = t - sid->down.history[i].timestamp;
+ if (dt > twin)
{
- num--;
-#if HOLD_ANIMATOR_DEBUG_LEVEL2
- DBG("[%03d] i=%d a dir change detected. stopped.\n",
- sid->down.anim_count, i);
-#endif
+ i--;
+ count--;
break;
}
-
- nprev_diff_x = ncur_diff_x;
- nprev_diff_y = ncur_diff_y;
-
-#if ADJUST_EVENT_TIME
- //> a event is delayed??
- if (ELM_MOVE_COUNT(pos[i].t - pos[i-1].t) <= 0)
+ x = sid->down.history[i].x;
+ y = sid->down.history[i].y;
+ _elm_scroll_down_coord_eval(sid, &x, &y);
+ if (i == 0)
{
- DBG("[%03d] i=%d a event is delayed (%f) ??????????????????\n",
- sid->down.anim_count,
- i, pos[i].t - pos[i-1].t);
+ basex = x;
+ basey = y;
}
-
- //> a pause in movement detected
- if (ELM_MOVE_COUNT(pos[i].t - pos[i-1].t) >= 2)
- {
-#if HOLD_ANIMATOR_DEBUG_LEVEL2
- DBG("[%03d] i=%d a pause(%f) in movement detected. stopped.\n",
- sid->down.anim_count, i, pos[i].t - pos[i-1].t);
-#endif
-#if PREDICT_WHEN_PAUSED
- pos[i].t = pos[i-1].t + ELM_MOVE_TIMEOUT;
-#else
- num--;
-#endif
- break;
- }
-#endif
+ pos[i].x = x - basex;
+ pos[i].y = y - basey;
+ pos[i].t = sid->down.history[i].timestamp - sid->down.history[0].timestamp;
+ count++;
}
}
-
-#if ADJUST_EVENT_TIME
- // X server fills in time in milisecond order and it rounds off.
- // let's makt it more precise and this is proven by machine moving at constant speed.
- if (num >= 2)
+ if (count >= 2)
{
- double tmp = sid->down.history[0].timestamp;
- for (i = num - 1; i >= 1; i--)
+ double dtsum = 0.0, tadd, maxdt;
+ double dxsum = 0.0, dysum = 0.0, xsum = 0.0, ysum = 0.0;
+ for (i = 0; i < (count - 1); i++)
+ {
+ pos[i].dx = pos[i].x - pos[i + 1].x;
+ pos[i].dy = pos[i].y - pos[i + 1].y;
+ pos[i].dt = pos[i].t - pos[i + 1].t;
+ dxsum += pos[i].dx;
+ dysum += pos[i].dy;
+ dtsum += pos[i].dt;
+ xsum += pos[i].x;
+ ysum += pos[i].y;
+ }
+ maxdt = pos[i].t;
+ dxsum /= (double)i;
+ dysum /= (double)i;
+ dtsum /= (double)i;
+ if (dtsum > 0)
{
- pos[i-1].t = pos[i].t - ELM_MOVE_TIMEOUT;
- sid->down.history[i-1].timestamp = now - pos[i-1].t;
+ xsum /= (double)i;
+ ysum /= (double)i;
+ tadd = tnow - sid->down.history[0].timestamp + _elm_config->scroll_smooth_future_time;
+ tadd = tadd - (maxdt / 2);
+#define WEIGHT(n, o, v) n = (((double)o * (1.0 - v)) + ((double)n * v))
+ WEIGHT(tadd, sid->down.hist.tadd, _elm_config->scroll_smooth_history_weight);
+ WEIGHT(dxsum, sid->down.hist.dxsum, _elm_config->scroll_smooth_history_weight);
+ WEIGHT(dysum, sid->down.hist.dysum, _elm_config->scroll_smooth_history_weight);
+ fx = basex + xsum + ((dxsum * tadd) / dtsum);
+ fy = basey + ysum + ((dysum * tadd) / dtsum);
+ sid->down.hist.tadd = tadd;
+ sid->down.hist.dxsum = dxsum;
+ sid->down.hist.dysum = dysum;
+ WEIGHT(fx, sid->down.hold_x, _elm_config->scroll_smooth_amount);
+ WEIGHT(fy, sid->down.hold_y, _elm_config->scroll_smooth_amount);
}
- pos_diff = sid->down.history[0].timestamp - tmp;
}
-
-#endif
- sid->down.anim_pos_t_prev = sid->down.history[0].timestamp;
-
- //TIZEN ONLY : for scroll smooth algorithm
- _elm_scroll_get_pos(sid, pos, num, &fx, &fy);
-
- fx_coord = fx;
- fy_coord = fy;
- _elm_scroll_down_coord_eval(sid, &fx_coord, &fy_coord);
-
}
- _elm_scroll_content_pos_get(sid->obj, &ox, &oy);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&ox, &oy));
if (sid->down.dir_x)
{
if ((!sid->obj) ||
(!elm_widget_drag_child_locked_x_get(sid->obj)))
- ox = fx_coord;
+ ox = fx;
}
if (sid->down.dir_y)
{
if ((!sid->obj) ||
(!elm_widget_drag_child_locked_y_get(sid->obj)))
- oy = fy_coord;
+ oy = fy;
}
#ifdef SMOOTHDBG
_elm_scroll_smooth_debug_movetime_add(ox, oy);
#endif
- _elm_scroll_content_pos_set(sid->obj, ox, oy, EINA_TRUE);
-
-#if HOLD_ANIMATOR_DEBUG_LEVEL1
-#if HOLD_ANIMATOR_DEBUG_X_AXIS
- DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev:%02d %3.4f/%+.3f p:%d(%d) = %d%+d %d %d\n",
- sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
- now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
- now_diff*1000,
- (now_diff - d)*1000,
- d*1000,
- num, sid->down.history[0].timestamp, pos_diff*1000,
- ox, fx,
- sid->down.hold_x, ox - sid->down.hold_x,
- ox - sid->down.anim_x_coord_prev,
- (int)sid->down.anim_vx_prev);
-#else
- DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev:%02d %3.4f/%+.3f p:%d(%d) = %d%+d %d %d\n",
- sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
- now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
- now_diff*1000,
- (now_diff - d)*1000,
- d*1000,
- num, sid->down.history[0].timestamp, pos_diff*1000,
- oy, fy,
- sid->down.hold_y, oy - sid->down.hold_y,
- oy - sid->down.anim_y_coord_prev,
- (int)sid->down.anim_vy_prev);
-#endif
-#endif
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(ox, oy, EINA_TRUE));
- sid->down.anim_x_coord_prev = ox;
- sid->down.anim_y_coord_prev = oy;
+ return EINA_FALSE;
+}
-update_time_and_quit:
- sid->down.anim_t_prev = now;
+static Eina_Bool
+_elm_scroll_hold_animator(void *data)
+{
+ Elm_Scrollable_Smart_Interface_Data *sid = data;
+ ecore_idle_enterer_del(sid->down.hold_enterer);
+ sid->down.hold_enterer =
+ ecore_idle_enterer_before_add(_elm_scroll_hold_enterer, sid);
return ECORE_CALLBACK_RENEW;
}
{
double t, td;
double vx, vy;
- Evas_Coord x, y, ox, oy;
+ Evas_Coord x, y, ox = 0, oy = 0;
Elm_Scrollable_Smart_Interface_Data *sid;
sid = data;
(double)_elm_config->thumbscroll_hold_threshold * 2.0;
vy = sid->down.onhold_vy * td *
(double)_elm_config->thumbscroll_hold_threshold * 2.0;
- _elm_scroll_content_pos_get(sid->obj, &ox, &oy);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&ox, &oy));
x = ox;
y = oy;
}
}
- _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
}
sid->down.onhold_tlast = t;
static void
_elm_scroll_mouse_move_event_cb(void *data,
Evas *e,
- Evas_Object *obj __UNUSED__,
+ Evas_Object *obj EINA_UNUSED,
void *event_info)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
return;
evas_post_event_callback_push(e, _elm_scroll_post_event_move, sid);
// FIXME: respect elm_widget_scroll_hold_get of parent container
- if (_elm_config->thumbscroll_enable)
- {
- if (sid->down.now)
- {
- //REDWOOD ONLY
- edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,move", "elm");
+ if (!_elm_config->thumbscroll_enable)
+ return;
- if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze) &&
- !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
- {
- Evas_Coord px;
- ecore_animator_del(sid->scrollto.x.animator);
- sid->scrollto.x.animator = NULL;
- psd->api->pos_get(sid->pan_obj, &px, NULL);
- sid->down.sx = px;
- sid->down.x = sid->down.history[0].x;
- }
+ if (!sid->down.now) return;
- if ((sid->scrollto.y.animator) && (!sid->hold) && (!sid->freeze) &&
- !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
- {
- Evas_Coord py;
- ecore_animator_del(sid->scrollto.y.animator);
- sid->scrollto.y.animator = NULL;
- psd->api->pos_get(sid->pan_obj, NULL, &py);
- sid->down.sy = py;
- sid->down.y = sid->down.history[0].y;
- }
+// TIZEN_ONLY(20150820): Overscroll effect
+ edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,move", "elm");
+//
+
+ if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze) &&
+ !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
+ {
+ Evas_Coord px = 0;
+ ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, NULL));
+ sid->down.sx = px;
+ sid->down.x = sid->down.history[0].x;
+ }
+
+ if ((sid->scrollto.y.animator) && (!sid->hold) && (!sid->freeze) &&
+ !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+ {
+ Evas_Coord py = 0;
+ ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
+ eo_do(sid->pan_obj, elm_obj_pan_pos_get(NULL, &py));
+ sid->down.sy = py;
+ sid->down.y = sid->down.history[0].y;
+ }
#ifdef SCROLLDBG
- DBG("::: %i %i\n", ev->cur.canvas.x, ev->cur.canvas.y);
+ DBG("::: %i %i\n", ev->cur.canvas.x, ev->cur.canvas.y);
#endif
- memmove(&(sid->down.history[1]), &(sid->down.history[0]),
- sizeof(sid->down.history[0]) * (ELM_SCROLL_HISTORY_SIZE - 1));
+ memmove(&(sid->down.history[1]), &(sid->down.history[0]),
+ sizeof(sid->down.history[0]) * (60 - 1));
#ifdef EVTIME
- sid->down.history[0].timestamp = ev->timestamp / 1000.0;
- sid->down.history[0].localtimestamp = ecore_loop_time_get();
+ sid->down.history[0].timestamp = ev->timestamp / 1000.0;
+ sid->down.history[0].localtimestamp = ecore_loop_time_get();
#else
- sid->down.history[0].timestamp = ecore_loop_time_get();
+ sid->down.history[0].timestamp = ecore_loop_time_get();
#endif
- sid->down.history[0].x = ev->cur.canvas.x;
- sid->down.history[0].y = ev->cur.canvas.y;
-
- if (!sid->down.dragged_began)
- {
- x = ev->cur.canvas.x - sid->down.x;
- y = ev->cur.canvas.y - sid->down.y;
+ sid->down.history[0].x = ev->cur.canvas.x;
+ sid->down.history[0].y = ev->cur.canvas.y;
- if (sid->one_direction_at_a_time == ELM_SCROLLER_SINGLE_DIRECTION_HARD)
- {
- if (abs(x) <_elm_scroll_gradient_check_pixel && abs(y) <_elm_scroll_gradient_check_pixel)
- {
- return;
- }
- }
+ if (!sid->down.dragged_began)
+ {
+ x = ev->cur.canvas.x - sid->down.x;
+ y = ev->cur.canvas.y - sid->down.y;
- sid->down.hdir = -1;
- sid->down.vdir = -1;
+ sid->down.hdir = -1;
+ sid->down.vdir = -1;
- if (x > 0) sid->down.hdir = LEFT;
- else if (x < 0)
- sid->down.hdir = RIGHT;
- if (y > 0) sid->down.vdir = UP;
- else if (y < 0)
- sid->down.vdir = DOWN;
+ if (x > 0) sid->down.hdir = LEFT;
+ else if (x < 0)
+ sid->down.hdir = RIGHT;
+ if (y > 0) sid->down.vdir = UP;
+ else if (y < 0)
+ sid->down.vdir = DOWN;
- if (x < 0) x = -x;
- if (y < 0) y = -y;
+ if (x < 0) x = -x;
+ if (y < 0) y = -y;
- if (sid->one_direction_at_a_time)
+ if (sid->one_direction_at_a_time)
+ {
+ if (((x * x) + (y * y)) >
+ (_elm_config->thumbscroll_threshold *
+ _elm_config->thumbscroll_threshold))
+ {
+ if (sid->one_direction_at_a_time ==
+ ELM_SCROLLER_SINGLE_DIRECTION_SOFT)
{
- if (((x * x) + (y * y)) >
- (_elm_config->thumbscroll_threshold *
- _elm_config->thumbscroll_threshold))
+ int dodir = 0;
+ if (x > (y * 2))
{
- if (sid->one_direction_at_a_time ==
- ELM_SCROLLER_SINGLE_DIRECTION_SOFT)
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
{
- int dodir = 0;
- if (x > (y * 2))
- {
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
- {
- sid->down.dir_x = EINA_TRUE;
- }
- sid->down.dir_y = EINA_FALSE;
- dodir++;
- }
- if (y > (x * 2))
- {
- sid->down.dir_x = EINA_FALSE;
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
- {
- sid->down.dir_y = EINA_TRUE;
- }
- dodir++;
- }
- if (!dodir)
- {
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
- {
- sid->down.dir_x = EINA_TRUE;
- }
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
- {
- sid->down.dir_y = EINA_TRUE;
- }
- }
- }
- else if (sid->one_direction_at_a_time ==
- ELM_SCROLLER_SINGLE_DIRECTION_HARD)
- {
- if (x > y*2)
- {
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
- {
- sid->down.dir_x = EINA_TRUE;
- }
- sid->down.dir_y = EINA_FALSE;
- }
- else
- //if (y > x)
- {
- sid->down.dir_x = EINA_FALSE;
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
- {
- sid->down.dir_y = EINA_TRUE;
- }
- }
+ sid->down.dir_x = EINA_TRUE;
}
+ sid->down.dir_y = EINA_FALSE;
+ dodir++;
}
- }
- else
- {
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
- {
- sid->down.dir_x = EINA_TRUE;
- }
- if (!(sid->block &
- ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+ if (y > (x * 2))
{
- sid->down.dir_y = EINA_TRUE;
- }
- }
- }
- if ((!sid->hold) && (!sid->freeze))
- {
- if ((sid->down.dragged) ||
- (((x * x) + (y * y)) >
- (_elm_config->thumbscroll_threshold *
- _elm_config->thumbscroll_threshold)))
- {
- if (!sid->down.dragged_began &&
- _elm_config->scroll_smooth_start_enable)
- {
-#if SMART_SMOOTH_START
- int i = 0;
- for (i = 0 ; i < 5 ; i++)
- if (!sid->down.history[i].timestamp)
- break;
- if (i > 0)
+ sid->down.dir_x = EINA_FALSE;
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
{
- i--;
- DBG("smooth-start(-%d): %d->%d->%d->%d->%d->%d\n",
- i,
- sid->down.history[0].x,
- sid->down.history[1].x,
- sid->down.history[2].x,
- sid->down.history[3].x,
- sid->down.history[4].x,
- sid->down.x);
- sid->down.x = sid->down.history[i].x;
- sid->down.y = sid->down.history[i].y;
- sid->down.dragged_began_timestamp = sid->down.history[i].timestamp;
-
+ sid->down.dir_y = EINA_TRUE;
}
-#else
- sid->down.x = ev->cur.canvas.x;
- sid->down.y = ev->cur.canvas.y;
-#ifdef EVTIME
- sid->down.dragged_began_timestamp =
- ev->timestamp / 1000.0;
-#else
- sid->down.dragged_began_timestamp =
- ecore_loop_time_get();
-#endif
-#endif
- }
-
- if (!sid->down.dragged)
- {
- sid->down.want_dragged = EINA_TRUE;
- }
- //***************** TIZEN Only
- if ((((_elm_scroll_can_scroll(sid, LEFT) || _elm_scroll_can_scroll(sid, RIGHT)) && sid->down.dir_x) ||
- ((_elm_scroll_can_scroll(sid, UP) || _elm_scroll_can_scroll(sid, DOWN)) && sid->down.dir_y)) &&
- !sid->down.dragged_began)
- {
- ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
- sid->down.dragged_began = EINA_TRUE;
- }
- else if (sid->down.dragged_began)
- {
- ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
- }
- //****************************
- if (sid->down.dir_x)
- x = sid->down.sx - (ev->cur.canvas.x - sid->down.x);
- else
- x = sid->down.sx;
- if (sid->down.dir_y)
- y = sid->down.sy - (ev->cur.canvas.y - sid->down.y);
- else
- y = sid->down.sy;
- if (sid->down.want_reset)
- {
- sid->down.x = ev->cur.canvas.x;
- sid->down.y = ev->cur.canvas.y;
- sid->down.want_reset = EINA_FALSE;
+ dodir++;
}
- if ((sid->down.dir_x) || (sid->down.dir_y))
+ if (!dodir)
{
- if (!sid->down.locked)
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
{
- sid->down.locked_x = x;
- sid->down.locked_y = y;
- sid->down.locked = EINA_TRUE;
+ sid->down.dir_x = EINA_TRUE;
}
- if (!((sid->down.dir_x) && (sid->down.dir_y)))
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
{
- if (sid->down.dir_x) y = sid->down.locked_y;
- else x = sid->down.locked_x;
+ sid->down.dir_y = EINA_TRUE;
}
}
- {
- Evas_Coord minx, miny, mx, my;
-
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->pos_max_get(sid->pan_obj, &mx, &my);
- if (!sid->loop_v && y < miny)
- y += (miny - y) *
- _elm_config->thumbscroll_border_friction;
- else if (!sid->loop_v && my <= 0)
- y += (sid->down.sy - y) *
- _elm_config->thumbscroll_border_friction;
- else if (!sid->loop_v && (my + miny) < y)
- y += (my + miny - y) *
- _elm_config->thumbscroll_border_friction;
- if (!sid->loop_h && x < minx)
- x += (minx - x) *
- _elm_config->thumbscroll_border_friction;
- else if (!sid->loop_h && mx <= 0)
- x += (sid->down.sx - x) *
- _elm_config->thumbscroll_border_friction;
- else if (!sid->loop_h && (mx + minx) < x)
- x += (mx + minx - x) *
- _elm_config->thumbscroll_border_friction;
- }
-
- sid->down.hold_x = x;
- sid->down.hold_y = y;
- if (!sid->down.hold_animator)
- {
- sid->down.hold_animator =
- ecore_animator_add(_elm_scroll_hold_animator, sid);
- sid->down.anim_x_prev = 0;
- sid->down.anim_y_prev = 0;
- sid->down.anim_vx_prev = 0;
- sid->down.anim_vy_prev = 0;
- sid->down.anim_t_prev = 0;
- sid->down.anim_x_coord_prev = 0;
- sid->down.anim_y_coord_prev = 0;
- sid->down.anim_count = 0;
- sid->down.anim_skip = 0;
- sid->down.anim_t_dont_adjust = 0;
- sid->down.anim_t_delay = 0;
- sid->down.anim_t_adjusted = 0;
- sid->down.anim_pos_t_prev = 0;
- memset(&sid->down.predict, 0 , sizeof(sid->down.predict));
- }
}
- else
+ else if (sid->one_direction_at_a_time ==
+ ELM_SCROLLER_SINGLE_DIRECTION_HARD)
{
- if (sid->down.dragged_began)
+ if (x > y)
{
- //***************** TIZEN Only
- if ((_elm_scroll_can_scroll(sid, sid->down.hdir) && sid->down.dir_x) ||
- (_elm_scroll_can_scroll(sid, sid->down.vdir) && sid->down.dir_y))
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
{
- ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+ sid->down.dir_x = EINA_TRUE;
}
- //****************************
- if (!sid->down.hold)
+ sid->down.dir_y = EINA_FALSE;
+ }
+ if (y > x)
+ {
+ sid->down.dir_x = EINA_FALSE;
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
{
- sid->down.hold = EINA_TRUE;
- evas_event_feed_hold
- (e, 1, ev->timestamp, ev->data);
+ sid->down.dir_y = EINA_TRUE;
}
}
}
}
- else if (!sid->freeze)
+ }
+ else
+ {
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
+ {
+ sid->down.dir_x = EINA_TRUE;
+ }
+ if (!(sid->block &
+ ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+ {
+ sid->down.dir_y = EINA_TRUE;
+ }
+ }
+ }
+ if ((!sid->hold) && (!sid->freeze))
+ {
+ if ((sid->down.dragged) ||
+ (((x * x) + (y * y)) >
+ (_elm_config->thumbscroll_threshold *
+ _elm_config->thumbscroll_threshold)))
+ {
+ if (!sid->down.dragged_began &&
+ _elm_config->scroll_smooth_start_enable)
{
- double vx = 0.0, vy = 0.0;
+ sid->down.x = ev->cur.canvas.x;
+ sid->down.y = ev->cur.canvas.y;
+#ifdef EVTIME
+ sid->down.dragged_began_timestamp = ev->timestamp / 1000.0;
+#else
+ sid->down.dragged_began_timestamp = ecore_loop_time_get();
+#endif
+ }
- x = ev->cur.canvas.x - sid->x;
- y = ev->cur.canvas.y - sid->y;
- if (x < _elm_config->thumbscroll_hold_threshold)
- {
- if (_elm_config->thumbscroll_hold_threshold > 0.0)
- vx = -(double)(_elm_config->thumbscroll_hold_threshold - x)
- / _elm_config->thumbscroll_hold_threshold;
- else
- vx = -1.0;
- }
- else if (x > (sid->w - _elm_config->thumbscroll_hold_threshold))
- {
- if (_elm_config->thumbscroll_hold_threshold > 0.0)
- vx = (double)(_elm_config->thumbscroll_hold_threshold -
- (sid->w - x)) /
- _elm_config->thumbscroll_hold_threshold;
- else
- vx = 1.0;
- }
- if (y < _elm_config->thumbscroll_hold_threshold)
+ if (!sid->down.dragged)
+ {
+ sid->down.want_dragged = EINA_TRUE;
+ }
+ if ((((_elm_scroll_can_scroll(sid, LEFT) || _elm_scroll_can_scroll(sid, RIGHT)) && sid->down.dir_x) ||
+ ((_elm_scroll_can_scroll(sid, UP) || _elm_scroll_can_scroll(sid, DOWN)) && sid->down.dir_y)) &&
+ !sid->down.dragged_began)
+ {
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+ sid->down.dragged_began = EINA_TRUE;
+ }
+ else if (sid->down.dragged_began)
+ {
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+ }
+ if (sid->down.dir_x)
+ x = sid->down.sx - (ev->cur.canvas.x - sid->down.x);
+ else
+ x = sid->down.sx;
+ if (sid->down.dir_y)
+ y = sid->down.sy - (ev->cur.canvas.y - sid->down.y);
+ else
+ y = sid->down.sy;
+ if (sid->down.want_reset)
+ {
+ sid->down.x = ev->cur.canvas.x;
+ sid->down.y = ev->cur.canvas.y;
+ sid->down.want_reset = EINA_FALSE;
+ }
+ if ((sid->down.dir_x) || (sid->down.dir_y))
+ {
+ if (!sid->down.locked)
{
- if (_elm_config->thumbscroll_hold_threshold > 0.0)
- vy = -(double)(_elm_config->thumbscroll_hold_threshold - y)
- / _elm_config->thumbscroll_hold_threshold;
- else
- vy = -1.0;
+ sid->down.locked_x = x;
+ sid->down.locked_y = y;
+ sid->down.locked = EINA_TRUE;
}
- else if (y > (sid->h - _elm_config->thumbscroll_hold_threshold))
+ if (!((sid->down.dir_x) && (sid->down.dir_y)))
{
- if (_elm_config->thumbscroll_hold_threshold > 0.0)
- vy = (double)(_elm_config->thumbscroll_hold_threshold -
- (sid->h - y)) /
- _elm_config->thumbscroll_hold_threshold;
- else
- vy = 1.0;
+ if (sid->down.dir_x) y = sid->down.locked_y;
+ else x = sid->down.locked_x;
}
- if ((vx != 0.0) || (vy != 0.0))
+ }
+ {
+ Evas_Coord minx = 0, miny = 0, mx, my;
+
+ eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+ if (!sid->loop_v && y < miny)
+ y += (miny - y) *
+ _elm_config->thumbscroll_border_friction;
+ else if (!sid->loop_v && my <= 0)
+ y += (sid->down.sy - y) *
+ _elm_config->thumbscroll_border_friction;
+ else if (!sid->loop_v && (my + miny) < y)
+ y += (my + miny - y) *
+ _elm_config->thumbscroll_border_friction;
+ if (!sid->loop_h && x < minx)
+ x += (minx - x) *
+ _elm_config->thumbscroll_border_friction;
+ else if (!sid->loop_h && mx <= 0)
+ x += (sid->down.sx - x) *
+ _elm_config->thumbscroll_border_friction;
+ else if (!sid->loop_h && (mx + minx) < x)
+ x += (mx + minx - x) *
+ _elm_config->thumbscroll_border_friction;
+ }
+
+ sid->down.hold_x = x;
+ sid->down.hold_y = y;
+ if (!sid->down.hold_animator)
+ sid->down.hold_animator =
+ ecore_animator_add(_elm_scroll_hold_animator, sid);
+ }
+ else
+ {
+ if (sid->down.dragged_began)
+ {
+ if ((_elm_scroll_can_scroll(sid, sid->down.hdir) && sid->down.dir_x) ||
+ (_elm_scroll_can_scroll(sid, sid->down.vdir) && sid->down.dir_y))
{
- sid->down.onhold_vx = vx;
- sid->down.onhold_vy = vy;
- if (!sid->down.onhold_animator)
- {
- sid->down.onhold_vxe = 0.0;
- sid->down.onhold_vye = 0.0;
- sid->down.onhold_tlast = 0.0;
- sid->down.onhold_animator = ecore_animator_add
- (_elm_scroll_on_hold_animator, sid);
- }
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
}
- else
+ if (!sid->down.hold)
{
- if (sid->down.onhold_animator)
- {
- ecore_animator_del(sid->down.onhold_animator);
- sid->down.onhold_animator = NULL;
- if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
- }
+ sid->down.hold = EINA_TRUE;
+ evas_event_feed_hold
+ (e, 1, ev->timestamp, ev->data);
}
}
}
}
+ else if (!sid->freeze)
+ {
+ double vx = 0.0, vy = 0.0;
+
+ x = ev->cur.canvas.x - sid->x;
+ y = ev->cur.canvas.y - sid->y;
+ if (x < _elm_config->thumbscroll_hold_threshold)
+ {
+ if (_elm_config->thumbscroll_hold_threshold > 0.0)
+ vx = -(double)(_elm_config->thumbscroll_hold_threshold - x)
+ / _elm_config->thumbscroll_hold_threshold;
+ else
+ vx = -1.0;
+ }
+ else if (x > (sid->w - _elm_config->thumbscroll_hold_threshold))
+ {
+ if (_elm_config->thumbscroll_hold_threshold > 0.0)
+ vx = (double)(_elm_config->thumbscroll_hold_threshold -
+ (sid->w - x)) /
+ _elm_config->thumbscroll_hold_threshold;
+ else
+ vx = 1.0;
+ }
+ if (y < _elm_config->thumbscroll_hold_threshold)
+ {
+ if (_elm_config->thumbscroll_hold_threshold > 0.0)
+ vy = -(double)(_elm_config->thumbscroll_hold_threshold - y)
+ / _elm_config->thumbscroll_hold_threshold;
+ else
+ vy = -1.0;
+ }
+ else if (y > (sid->h - _elm_config->thumbscroll_hold_threshold))
+ {
+ if (_elm_config->thumbscroll_hold_threshold > 0.0)
+ vy = (double)(_elm_config->thumbscroll_hold_threshold -
+ (sid->h - y)) /
+ _elm_config->thumbscroll_hold_threshold;
+ else
+ vy = 1.0;
+ }
+ if ((vx != 0.0) || (vy != 0.0))
+ {
+ sid->down.onhold_vx = vx;
+ sid->down.onhold_vy = vy;
+ if (!sid->down.onhold_animator)
+ {
+ sid->down.onhold_vxe = 0.0;
+ sid->down.onhold_vye = 0.0;
+ sid->down.onhold_tlast = 0.0;
+ sid->down.onhold_animator = ecore_animator_add
+ (_elm_scroll_on_hold_animator, sid);
+ }
+ }
+ else
+ {
+ if (sid->down.onhold_animator)
+ {
+ ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
+ if (sid->content_info.resized)
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
+ }
+ }
+ }
+}
+
+static void
+_elm_scroll_page_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
+{
+ Evas_Coord x, y, w, h;
+
+ if (!_paging_is_enabled(sid)) return;
+
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
+
+ x = _elm_scroll_page_x_get(sid, 0, EINA_TRUE);
+ y = _elm_scroll_page_y_get(sid, 0, EINA_TRUE);
+
+ eo_do(sid->obj, elm_interface_scrollable_content_region_set(x, y, w, h));
}
static void
_elm_scroll_reconfigure(Elm_Scrollable_Smart_Interface_Data *sid)
{
_elm_scroll_scroll_bar_size_adjust(sid);
+ // TIZEN_ONLY(20150716): Remove dulplicated function calls for applying scroll bars visibility.
+ //_elm_scroll_scroll_bar_h_visibility_apply(sid);
+ //_elm_scroll_scroll_bar_v_visibility_apply(sid);
+ //
+ _elm_scroll_page_adjust(sid);
}
static void
_on_edje_move(void *data,
- Evas *e __UNUSED__,
+ Evas *e EINA_UNUSED,
Evas_Object *edje_obj,
- void *event_info __UNUSED__)
+ void *event_info EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
int x, y;
static void
_on_edje_resize(void *data,
- Evas *e __UNUSED__,
+ Evas *e,
Evas_Object *edje_obj,
- void *event_info __UNUSED__)
+ void *event_info EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
- int w, h;
+ Evas_Coord w, h;
+ int current_calc;
+ Eina_Bool reconf_ok = EINA_TRUE;
evas_object_geometry_get(edje_obj, NULL, NULL, &w, &h);
sid->w = w;
sid->h = h;
- _elm_scroll_reconfigure(sid);
- _elm_scroll_wanted_region_set(sid->obj);
+ current_calc = evas_smart_objects_calculate_count_get(e);
+ if (current_calc == sid->current_calc)
+ {
+ sid->size_count++;
+ if (sid->size_count > 3) reconf_ok = EINA_FALSE;
+ }
+ else
+ {
+ sid->current_calc = current_calc;
+ sid->size_count = 0;
+ }
+ if (reconf_ok) _elm_scroll_reconfigure(sid);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
static void
_elm_scroll_mouse_move_event_cb, sid);
}
-static void
-_elm_scroll_objects_set(Evas_Object *obj,
- Evas_Object *edje_object,
- Evas_Object *hit_rectangle)
+EOLIAN static void
+_elm_interface_scrollable_objects_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Object *edje_object, Evas_Object *hit_rectangle)
{
Evas_Coord mw, mh;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!edje_object || !hit_rectangle) return;
if (sid->edje_obj)
- _scroll_edje_object_detach(obj);
+ _scroll_edje_object_detach(obj);
sid->edje_obj = edje_object;
if (sid->event_rect)
- _scroll_event_object_detach(obj);
+ _scroll_event_object_detach(obj);
sid->event_rect = hit_rectangle;
evas_object_repeat_events_set(hit_rectangle, EINA_TRUE);
Evas_Object *base;
base = edje_object_part_swallow_get
- (sid->edje_obj, "elm.scrollbar.base");
+ (sid->edje_obj, "elm.scrollbar.base");
if (!base)
{
base = evas_object_rectangle_add
}
if (sid->pan_obj)
{
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
- psd->api->pos_get(sid->pan_obj, &px, &py);
- psd->api->pos_set(sid->pan_obj, minx, miny);
+ 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));
+ eo_do(sid->pan_obj, elm_obj_pan_pos_set(minx, miny));
}
if ((px != minx) || (py != miny))
edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
_elm_direction_arrows_eval(sid);
}
-/* even external pan objects get this */
static void
-_elm_scroll_pan_changed_cb(void *data,
- Evas_Object *obj __UNUSED__,
- void *event_info __UNUSED__)
+_elm_scroll_pan_resized_cb(void *data,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
- Evas_Coord w, h, vw, vh;
+ Evas_Coord w = 0, h = 0;
Elm_Scrollable_Smart_Interface_Data *sid = data;
- if (!sid->pan_obj) return;
-
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->content_size_get(sid->pan_obj, &w, &h);
- _elm_scroll_content_viewport_size_get(sid->obj, &vw, &vh);
- if ((w != sid->content_info.w) || (h != sid->content_info.h))
+ if (sid->cb_func.content_viewport_resize)
{
- if (_paging_is_enabled(sid))
- {
- if (w != sid->content_info.w)
- {
- if (sid->pagerel_h > 0)
- sid->pagecount_h = w / (vw * sid->pagerel_h);
- }
- if (h != sid->content_info.h)
- {
- if (sid->pagerel_v > 0)
- sid->pagecount_v = h / (vh * sid->pagerel_v);
- }
- }
- sid->content_info.w = w;
- sid->content_info.h = h;
- _elm_scroll_scroll_bar_size_adjust(sid);
-
- evas_object_size_hint_min_set
- (sid->edje_obj, sid->content_info.w, sid->content_info.h);
- sid->content_info.resized = EINA_TRUE;
- _elm_scroll_reconfigure(sid);
- _elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
+ sid->cb_func.content_viewport_resize(sid->obj, w, h);
}
}
+/* even external pan objects get this */
static void
-_elm_scroll_pan_resized_cb(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj __UNUSED__,
- void *event_info __UNUSED__)
+_elm_scroll_pan_changed_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
- Evas_Coord w, h;
+ Evas_Coord w = 0, h = 0;
Elm_Scrollable_Smart_Interface_Data *sid = data;
- if (sid->cb_func.content_viewport_resize)
+ if (!sid->pan_obj) return;
+
+ eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&w, &h));
+ if ((w != sid->content_info.w) || (h != sid->content_info.h))
{
- _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
- sid->cb_func.content_viewport_resize(sid->obj, w, h);
+ sid->content_info.w = w;
+ sid->content_info.h = h;
+ _elm_scroll_scroll_bar_size_adjust(sid);
+
+ evas_object_size_hint_min_set
+ (sid->edje_obj, sid->content_info.w, sid->content_info.h);
+ sid->content_info.resized = EINA_TRUE;
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
}
static void
_elm_scroll_content_del_cb(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj __UNUSED__,
- void *event_info __UNUSED__)
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
_elm_scroll_scroll_bar_reset(sid);
}
-static void
-_elm_scroll_content_set(Evas_Object *obj,
- Evas_Object *content)
+EOLIAN static void
+_elm_interface_scrollable_content_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Object *content)
{
- Evas_Coord w, h;
+ Evas_Coord w = 0, h = 0;
Evas_Object *o;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->edje_obj) return;
if (sid->content)
edje_object_part_swallow(sid->edje_obj, "elm.swallow.content", o);
}
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
evas_object_event_callback_add
(content, EVAS_CALLBACK_DEL, _elm_scroll_content_del_cb, sid);
_elm_pan_content_set(sid->pan_obj, content);
- psd->api->content_size_get(sid->pan_obj, &w, &h);
+ eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&w, &h));
sid->content_info.w = w;
sid->content_info.h = h;
_elm_scroll_scroll_bar_reset(sid);
}
-static void
-_elm_scroll_extern_pan_set(Evas_Object *obj,
- Evas_Object *pan)
+EOLIAN static void
+_elm_interface_scrollable_extern_pan_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Object *pan)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->edje_obj) return;
- _elm_scroll_content_set(obj, NULL);
+ eo_do(obj, elm_interface_scrollable_content_set(NULL));
if (sid->pan_obj)
{
}
else
{
- if (sid->pan_obj)
- {
- evas_object_del(sid->pan_obj);
- sid->pan_obj = NULL;
- }
+ ELM_SAFE_FREE(sid->pan_obj, evas_object_del);
}
if (!pan)
{
(sid->edje_obj, "elm.swallow.content", sid->pan_obj);
}
-static void
-_elm_scroll_drag_start_cb_set(Evas_Object *obj,
- void (*drag_start_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_drag_start_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb drag_start_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.drag_start = drag_start_cb;
}
-static void
-_elm_scroll_drag_stop_cb_set(Evas_Object *obj,
- void (*drag_stop_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_drag_stop_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb drag_stop_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.drag_stop = drag_stop_cb;
}
-static void
-_elm_scroll_animate_start_cb_set(Evas_Object *obj,
- void (*animate_start_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_animate_start_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb animate_start_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.animate_start = animate_start_cb;
}
-static void
-_elm_scroll_animate_stop_cb_set(Evas_Object *obj,
- void (*animate_stop_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_animate_stop_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb animate_stop_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.animate_stop = animate_stop_cb;
}
-static void
-_elm_scroll_scroll_cb_set(Evas_Object *obj,
- void (*scroll_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_page_change_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb page_change_cb EINA_UNUSED)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+ sid->cb_func.page_change = page_change_cb;
+}
+EOLIAN static void
+_elm_interface_scrollable_scroll_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_cb)
+{
sid->cb_func.scroll = scroll_cb;
}
-static void
-_elm_scroll_scroll_left_cb_set(Evas_Object *obj,
- void (*scroll_left_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_left_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_left_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.scroll_left = scroll_left_cb;
}
-static void
-_elm_scroll_scroll_right_cb_set(Evas_Object *obj,
- void (*scroll_right_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_right_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_right_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.scroll_right = scroll_right_cb;
}
-static void
-_elm_scroll_scroll_up_cb_set(Evas_Object *obj,
- void (*scroll_up_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_up_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_up_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.scroll_up = scroll_up_cb;
}
-static void
-_elm_scroll_scroll_down_cb_set(Evas_Object *obj,
- void (*scroll_down_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_down_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_down_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.scroll_down = scroll_down_cb;
}
-static void
-_elm_scroll_edge_left_cb_set(Evas_Object *obj,
- void (*edge_left_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_left_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_left_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->cb_func.edge_left = edge_left_cb;
+ sid->cb_func.edge_left = edje_left_cb;
}
-static void
-_elm_scroll_edge_right_cb_set(Evas_Object *obj,
- void (*edge_right_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_right_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_right_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->cb_func.edge_right = edge_right_cb;
+ sid->cb_func.edge_right = edje_right_cb;
}
-static void
-_elm_scroll_edge_top_cb_set(Evas_Object *obj,
- void (*edge_top_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_top_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_top_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->cb_func.edge_top = edge_top_cb;
+ sid->cb_func.edge_top = edje_top_cb;
}
-static void
-_elm_scroll_edge_bottom_cb_set(Evas_Object *obj,
- void (*edge_bottom_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_bottom_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_bottom_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->cb_func.edge_bottom = edge_bottom_cb;
+ sid->cb_func.edge_bottom = edje_bottom_cb;
}
-static void
-_elm_scroll_vbar_drag_cb_set(Evas_Object *obj,
- void (*vbar_drag_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_vbar_drag_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb vbar_drag_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.vbar_drag = vbar_drag_cb;
}
-static void
-_elm_scroll_vbar_press_cb_set(Evas_Object *obj,
- void (*vbar_press_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_vbar_press_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb vbar_press_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.vbar_press = vbar_press_cb;
}
-static void
-_elm_scroll_vbar_unpress_cb_set(Evas_Object *obj,
- void (*vbar_unpress_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_vbar_unpress_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb vbar_unpress_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.vbar_unpress = vbar_unpress_cb;
}
-static void
-_elm_scroll_hbar_drag_cb_set(Evas_Object *obj,
- void (*hbar_drag_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_hbar_drag_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb hbar_drag_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.hbar_drag = hbar_drag_cb;
}
-static void
-_elm_scroll_hbar_press_cb_set(Evas_Object *obj,
- void (*hbar_press_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_hbar_press_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb hbar_press_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.hbar_press = hbar_press_cb;
}
-static void
-_elm_scroll_hbar_unpress_cb_set(Evas_Object *obj,
- void (*hbar_unpress_cb)(Evas_Object *obj,
- void *data))
+EOLIAN static void
+_elm_interface_scrollable_hbar_unpress_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb hbar_unpress_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->cb_func.hbar_unpress = hbar_unpress_cb;
}
-static void
-_elm_scroll_content_min_limit_cb_set(Evas_Object *obj,
- void (*c_min_limit_cb)(Evas_Object *obj,
- Eina_Bool w,
- Eina_Bool h))
+EOLIAN static void
+_elm_interface_scrollable_content_min_limit_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Min_Limit_Cb min_limit_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->cb_func.content_min_limit = c_min_limit_cb;
+ sid->cb_func.content_min_limit = min_limit_cb;
}
-static void
-_elm_scroll_content_viewport_resize_cb_set(Evas_Object *obj,
- void (*c_viewport_resize_cb)(Evas_Object *obj,
- Evas_Coord w,
- Evas_Coord h))
+EOLIAN static void
+_elm_interface_scrollable_content_viewport_resize_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Resize_Cb viewport_resize_cb)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->cb_func.content_viewport_resize = c_viewport_resize_cb;
+ sid->cb_func.content_viewport_resize = viewport_resize_cb;
}
-static Eina_Bool
-_elm_scroll_momentum_animator_disabled_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_momentum_animator_disabled_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
return sid->momentum_animator_disabled;
}
-static void
-_elm_scroll_momentum_animator_disabled_set(Evas_Object *obj,
- Eina_Bool disabled)
+EOLIAN static void
+_elm_interface_scrollable_momentum_animator_disabled_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool disabled)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->momentum_animator_disabled = disabled;
if (sid->momentum_animator_disabled)
{
if (sid->down.momentum_animator)
{
- ecore_animator_del(sid->down.momentum_animator);
- sid->down.momentum_animator = NULL;
+ ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
}
}
-static Eina_Bool
-_elm_scroll_bounce_animator_disabled_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_bounce_animator_disabled_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
return sid->bounce_animator_disabled;
}
-static void
-_elm_scroll_bounce_animator_disabled_set(Evas_Object *obj,
- Eina_Bool disabled)
+EOLIAN static void
+_elm_interface_scrollable_bounce_animator_disabled_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool disabled)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->bounce_animator_disabled = disabled;
if (sid->bounce_animator_disabled)
{
- if (sid->scrollto.x.animator)
- {
- ecore_animator_del(sid->scrollto.x.animator);
- sid->scrollto.x.animator = NULL;
- }
-
- if (sid->scrollto.y.animator)
- {
- ecore_animator_del(sid->scrollto.y.animator);
- sid->scrollto.y.animator = NULL;
- }
+ ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+ ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
}
}
-static Eina_Bool
-_elm_scroll_wheel_disabled_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_wheel_disabled_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
return sid->wheel_disabled;
}
-static void
-_elm_scroll_wheel_disabled_set(Evas_Object *obj,
- Eina_Bool disabled)
+EOLIAN static void
+_elm_interface_scrollable_wheel_disabled_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool disabled)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->event_rect) return;
if ((!sid->wheel_disabled) && (disabled))
sid->wheel_disabled = disabled;
}
-static void
-_elm_scroll_movement_block_set(Evas_Object *obj,
- Elm_Scroller_Movement_Block block)
-{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- sid->block = block;
-}
-
-static Elm_Scroller_Movement_Block
-_elm_scroll_movement_block_get(const Evas_Object *obj)
-{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
-
- return sid->block;
-}
-
-static void
-_elm_scroll_step_size_set(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y)
+EOLIAN static void
+_elm_interface_scrollable_step_size_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (x < 1) x = 1;
if (y < 1) y = 1;
sid->step.x = x;
_elm_scroll_scroll_bar_size_adjust(sid);
}
-static void
-_elm_scroll_step_size_get(const Evas_Object *obj,
- Evas_Coord *x,
- Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_step_size_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (x) *x = sid->step.x;
if (y) *y = sid->step.y;
}
-static void
-_elm_scroll_page_size_set(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y)
+EOLIAN static void
+_elm_interface_scrollable_page_size_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->page.x = x;
sid->page.y = y;
_elm_scroll_scroll_bar_size_adjust(sid);
}
-static void
-_elm_scroll_page_size_get(const Evas_Object *obj,
- Evas_Coord *x,
- Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_page_size_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (x) *x = sid->page.x;
if (y) *y = sid->page.y;
}
-static void
-_elm_scroll_policy_set(Evas_Object *obj,
- Elm_Scroller_Policy hbar,
- Elm_Scroller_Policy vbar)
+EOLIAN static void
+_elm_interface_scrollable_policy_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Policy hbar, Elm_Scroller_Policy vbar)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->edje_obj) return;
if ((sid->hbar_flags == hbar) && (sid->vbar_flags == vbar)) return;
_elm_direction_arrows_eval(sid);
}
-static void
-_elm_scroll_policy_get(const Evas_Object *obj,
- Elm_Scroller_Policy *hbar,
- Elm_Scroller_Policy *vbar)
+EOLIAN static void
+_elm_interface_scrollable_policy_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Policy *hbar, Elm_Scroller_Policy *vbar)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (hbar) *hbar = sid->hbar_flags;
if (vbar) *vbar = sid->vbar_flags;
}
-static void
-_elm_scroll_single_direction_set(Evas_Object *obj,
- Elm_Scroller_Single_Direction single_dir)
+EOLIAN static void
+_elm_interface_scrollable_single_direction_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Single_Direction single_dir)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->one_direction_at_a_time = single_dir;
}
-static Elm_Scroller_Single_Direction
-_elm_scroll_single_direction_get(const Evas_Object *obj)
+EOLIAN static Elm_Scroller_Single_Direction
+_elm_interface_scrollable_single_direction_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, ELM_SCROLLER_SINGLE_DIRECTION_SOFT);
-
return sid->one_direction_at_a_time;
}
-static void
-_elm_scroll_repeat_events_set(Evas_Object *obj,
- Eina_Bool repeat_events)
+EOLIAN static void
+_elm_interface_scrollable_repeat_events_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool repeat_events)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- evas_object_repeat_events_set(sid->event_rect, repeat_events);
+ if (sid->event_rect)
+ evas_object_repeat_events_set(sid->event_rect, repeat_events);
}
-static Eina_Bool
-_elm_scroll_repeat_events_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_repeat_events_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
- return evas_object_repeat_events_get(sid->event_rect);
+ if (sid->event_rect)
+ return evas_object_repeat_events_get(sid->event_rect);
+ else
+ return EINA_TRUE;
}
-static void
-_elm_scroll_hold_set(Evas_Object *obj,
- Eina_Bool hold)
+EOLIAN static void
+_elm_interface_scrollable_hold_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool hold)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->hold = hold;
}
-static void
-_elm_scroll_freeze_set(Evas_Object *obj,
- Eina_Bool freeze)
+EOLIAN static void
+_elm_interface_scrollable_freeze_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool freeze)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->freeze = freeze;
if (sid->freeze)
{
if (sid->down.onhold_animator)
{
- ecore_animator_del(sid->down.onhold_animator);
- sid->down.onhold_animator = NULL;
+ ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
if (sid->content_info.resized)
- _elm_scroll_wanted_region_set(sid->obj);
+ //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+ //_elm_scroll_wanted_region_set(sid->obj);
+ eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+ //
}
}
else
_elm_scroll_bounce_eval(sid);
}
-static void
-_elm_scroll_bounce_allow_set(Evas_Object *obj,
- Eina_Bool horiz,
- Eina_Bool vert)
+EOLIAN static void
+_elm_interface_scrollable_page_snap_allow_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool horiz, Eina_Bool vert)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+ sid->page_snap_horiz = !!horiz;
+ sid->page_snap_vert = !!vert;
+}
+EOLIAN static void
+_elm_interface_scrollable_page_snap_allow_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool *horiz, Eina_Bool *vert)
+{
+ if (horiz) *horiz = sid->page_snap_horiz;
+ if (vert) *vert = sid->page_snap_vert;
+}
+
+EOLIAN static void
+_elm_interface_scrollable_bounce_allow_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool horiz, Eina_Bool vert)
+{
sid->bounce_horiz = !!horiz;
sid->bounce_vert = !!vert;
}
-static void
-_elm_scroll_bounce_allow_get(const Evas_Object *obj,
- Eina_Bool *horiz,
- Eina_Bool *vert)
+EOLIAN static void
+_elm_interface_scrollable_bounce_allow_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool *horiz, Eina_Bool *vert)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (horiz) *horiz = sid->bounce_horiz;
if (vert) *vert = sid->bounce_vert;
}
-static void
-_elm_scroll_paging_set(Evas_Object *obj,
- double pagerel_h,
- double pagerel_v,
- Evas_Coord pagesize_h,
- Evas_Coord pagesize_v)
+EOLIAN static void
+_elm_interface_scrollable_paging_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double pagerel_h, double pagerel_v, Evas_Coord pagesize_h, Evas_Coord pagesize_v)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
sid->pagerel_h = pagerel_h;
sid->pagerel_v = pagerel_v;
sid->pagesize_h = pagesize_h;
sid->pagesize_v = pagesize_v;
+
+ _elm_scroll_page_adjust(sid);
}
-static void
-_elm_scroll_paging_get(const Evas_Object *obj,
- double *pagerel_h,
- double *pagerel_v,
- Evas_Coord *pagesize_h,
- Evas_Coord *pagesize_v)
+EOLIAN static void
+_elm_interface_scrollable_paging_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double *pagerel_h, double *pagerel_v, Evas_Coord *pagesize_h, Evas_Coord *pagesize_v)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (pagerel_h) *pagerel_h = sid->pagerel_h;
if (pagerel_v) *pagerel_v = sid->pagerel_v;
if (pagesize_h) *pagesize_h = sid->pagesize_h;
if (pagesize_v) *pagesize_v = sid->pagesize_v;
}
-static void
-_elm_scroll_page_scroll_limit_set(const Evas_Object *obj,
- int page_limit_h,
- int page_limit_v)
+EOLIAN static void
+_elm_interface_scrollable_page_relative_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *_pd EINA_UNUSED, double h_pagerel, double v_pagerel)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+ Evas_Coord pagesize_h, pagesize_v;
+ eo_do(obj, elm_interface_scrollable_paging_get(NULL, NULL, &pagesize_h, &pagesize_v));
+
+ eo_do(obj, elm_interface_scrollable_paging_set(h_pagerel, v_pagerel, pagesize_h, pagesize_v));
+}
+
+EOLIAN static void
+_elm_interface_scrollable_page_scroll_limit_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int page_limit_h, int page_limit_v)
+{
sid->page_limit_h = page_limit_h;
sid->page_limit_v = page_limit_v;
}
-static void
-_elm_scroll_page_scroll_limit_get(const Evas_Object *obj,
- int *page_limit_h,
- int *page_limit_v)
+EOLIAN static void
+_elm_interface_scrollable_page_scroll_limit_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int *page_limit_h, int *page_limit_v)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
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(const Evas_Object *obj,
- int *pagenumber_h,
- int *pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_current_page_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int *pagenumber_h, int *pagenumber_v)
{
Evas_Coord x, y;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
- _elm_scroll_content_pos_get(sid->obj, &x, &y);
+ eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
if (pagenumber_h)
{
if (sid->pagesize_h > 0)
}
}
-static void
-_elm_scroll_last_page_get(const Evas_Object *obj,
- int *pagenumber_h,
- int *pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_last_page_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int *pagenumber_h, int *pagenumber_v)
{
Evas_Coord cw, ch;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
+ eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
if (pagenumber_h)
{
- if (sid->pagesize_h > 0)
+ if ((sid->pagesize_h > 0) && (cw > sid->pagesize_h))
*pagenumber_h = cw / sid->pagesize_h - 1;
else
*pagenumber_h = 0;
}
if (pagenumber_v)
{
- if (sid->pagesize_v > 0)
+ if ((sid->pagesize_v > 0) && (ch > sid->pagesize_v))
*pagenumber_v = ch / sid->pagesize_v - 1;
else
*pagenumber_v = 0;
}
}
-static void
-_elm_scroll_page_show(Evas_Object *obj,
- int pagenumber_h,
- int pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_page_show(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, int pagenumber_h, int pagenumber_v)
{
- Evas_Coord w, h, cw = 0, ch = 0;
+ Evas_Coord w = 0, h = 0;
Evas_Coord x = 0;
Evas_Coord y = 0;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
- if (sid->pan_obj)
- {
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
- psd->api->content_size_get(sid->pan_obj, &cw, &ch);
- }
-
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);
- _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
- if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
- if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
-
- if (sid->origin_x && cw > 0)
- {
- sid->wx = cw - x;
- if (sid->wx < 0) sid->wx = 0;
- }
- else
- sid->wx = x;
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
+ x = sid->pagesize_h * pagenumber_h;
+ y = sid->pagesize_v * pagenumber_v;
- if (sid->origin_y && ch > 0)
- {
- sid->wy = ch - y;
- if (sid->wy < 0) sid->wy = 0;
- }
- else
- sid->wy = y;
+ sid->wx = (sid->is_mirrored ? _elm_scroll_x_mirrored_get(sid->obj, x) : x);
+ sid->wy = y;
sid->ww = w;
sid->wh = h;
if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
- _elm_scroll_content_pos_set(obj, x, y, EINA_TRUE);
+ eo_do(obj, elm_interface_scrollable_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
-_elm_scroll_page_bring_in(Evas_Object *obj,
- int pagenumber_h,
- int pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_page_bring_in(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, int pagenumber_h, int pagenumber_v)
{
- Evas_Coord w, h;
+ Evas_Coord w = 0, h = 0;
Evas_Coord x = 0;
Evas_Coord y = 0;
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, 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);
- _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
- if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
- if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
+ eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+ (NULL, NULL, &w, &h));
+ x = sid->pagesize_h * pagenumber_h;
+ y = sid->pagesize_v * pagenumber_v;
if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
{
_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
-_elm_scroll_region_bring_in(Evas_Object *obj,
- Evas_Coord x,
- Evas_Coord y,
- Evas_Coord w,
- Evas_Coord h)
+EOLIAN static void
+_elm_interface_scrollable_region_bring_in(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
{
_elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
}
}
-static void
-_elm_scroll_gravity_set(Evas_Object *obj,
- double x,
- double y)
+EOLIAN static void
+_elm_interface_scrollable_gravity_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double x, double y)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->gravity_set(sid->pan_obj, x, y);
+ eo_do(sid->pan_obj, elm_obj_pan_gravity_set(x, y));
}
-static void
-_elm_scroll_gravity_get(const Evas_Object *obj,
- double *x,
- double *y)
+EOLIAN static void
+_elm_interface_scrollable_gravity_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double *x, double *y)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
if (!sid->pan_obj) return;
- ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
- psd->api->gravity_get(sid->pan_obj, x, y);
+ eo_do(sid->pan_obj, elm_obj_pan_gravity_get(x, y));
}
+EOLIAN static void
+_elm_interface_scrollable_movement_block_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Movement_Block block)
+{
+ sid->block = block;
+}
-static void
-_elm_scroll_loop_set(Evas_Object *obj,
- Eina_Bool loop_h,
- Eina_Bool loop_v)
+EOLIAN static Elm_Scroller_Movement_Block
+_elm_interface_scrollable_movement_block_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+ return sid->block;
+}
- if (sid->loop_h == loop_h &&
- sid->loop_v == loop_v)
- return;
+EOLIAN static void
+_elm_interface_scrollable_loop_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool loop_h, Eina_Bool loop_v)
+{
+ if (sid->loop_h == loop_h && sid->loop_v == loop_v) return;
sid->loop_h = loop_h;
sid->loop_v = loop_v;
}
-static void
-_elm_scroll_loop_get(const Evas_Object *obj,
- Eina_Bool *loop_h,
- Eina_Bool *loop_v)
+EOLIAN static void
+_elm_interface_scrollable_loop_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool *loop_h, Eina_Bool *loop_v)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
*loop_h = sid->loop_h;
*loop_v = sid->loop_v;
}
-
-static Eina_Bool
-_elm_scroll_interface_add(Evas_Object *obj)
+EOLIAN static void
+_elm_interface_scrollable_evas_object_smart_add(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
memset(sid, 0, sizeof(*sid));
sid->obj = obj;
sid->vbar_visible = EINA_TRUE;
sid->loop_h = EINA_FALSE;
sid->loop_v = EINA_FALSE;
- sid->origin_x = EINA_FALSE;
- sid->origin_y = EINA_FALSE;
sid->bounce_horiz = EINA_TRUE;
sid->bounce_vert = EINA_TRUE;
_elm_scroll_scroll_bar_reset(sid);
- return EINA_TRUE;
+ eo_do_super(obj, MY_SCROLLABLE_INTERFACE, evas_obj_smart_add());
}
-static void
-_elm_scroll_interface_del(Evas_Object *obj)
+EOLIAN static void
+_elm_interface_scrollable_evas_object_smart_del(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid)
{
- ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
- _elm_scroll_content_set(obj, NULL);
+ eo_do_super(obj, MY_SCROLLABLE_INTERFACE, evas_obj_smart_del());
+
+ eo_do(obj, elm_interface_scrollable_content_set(NULL));
if (!sid->extern_pan) evas_object_del(sid->pan_obj);
- if (sid->down.hold_animator)
- ecore_animator_del(sid->down.hold_animator);
- if (sid->down.onhold_animator)
- ecore_animator_del(sid->down.onhold_animator);
- if (sid->down.momentum_animator)
- ecore_animator_del(sid->down.momentum_animator);
- if (sid->down.bounce_x_animator)
- ecore_animator_del(sid->down.bounce_x_animator);
- if (sid->down.bounce_y_animator)
- ecore_animator_del(sid->down.bounce_y_animator);
- if (sid->scrollto.x.animator) ecore_animator_del(sid->scrollto.x.animator);
- if (sid->scrollto.y.animator) ecore_animator_del(sid->scrollto.y.animator);
-}
-
-EAPI const char ELM_SCROLLABLE_IFACE_NAME[] = "elm_interface_scrollable";
-
-EAPI const Elm_Scrollable_Smart_Interface ELM_SCROLLABLE_IFACE =
-{
- {
- ELM_SCROLLABLE_IFACE_NAME,
- sizeof(Elm_Scrollable_Smart_Interface_Data),
- _elm_scroll_interface_add,
- _elm_scroll_interface_del
- },
-
- _elm_scroll_objects_set,
- _elm_scroll_content_set,
- _elm_scroll_extern_pan_set,
- _elm_scroll_drag_start_cb_set,
- _elm_scroll_drag_stop_cb_set,
- _elm_scroll_animate_start_cb_set,
- _elm_scroll_animate_stop_cb_set,
- _elm_scroll_scroll_cb_set,
- _elm_scroll_scroll_left_cb_set,
- _elm_scroll_scroll_right_cb_set,
- _elm_scroll_scroll_up_cb_set,
- _elm_scroll_scroll_down_cb_set,
- _elm_scroll_edge_left_cb_set,
- _elm_scroll_edge_right_cb_set,
- _elm_scroll_edge_top_cb_set,
- _elm_scroll_edge_bottom_cb_set,
- _elm_scroll_vbar_drag_cb_set,
- _elm_scroll_vbar_press_cb_set,
- _elm_scroll_vbar_unpress_cb_set,
- _elm_scroll_hbar_drag_cb_set,
- _elm_scroll_hbar_press_cb_set,
- _elm_scroll_hbar_unpress_cb_set,
- _elm_scroll_content_min_limit_cb_set,
- _elm_scroll_content_viewport_resize_cb_set,
- _elm_scroll_content_pos_set,
- _elm_scroll_content_pos_get,
- _elm_scroll_content_region_show,
- _elm_scroll_content_region_set,
- _elm_scroll_content_size_get,
- _elm_scroll_content_viewport_size_get,
- _elm_scroll_content_viewport_pos_get,
- _elm_scroll_content_min_limit,
- _elm_scroll_step_size_set,
- _elm_scroll_step_size_get,
- _elm_scroll_page_size_set,
- _elm_scroll_page_size_get,
- _elm_scroll_policy_set,
- _elm_scroll_policy_get,
- _elm_scroll_single_direction_set,
- _elm_scroll_single_direction_get,
- _elm_scroll_repeat_events_set,
- _elm_scroll_repeat_events_get,
- _elm_scroll_mirrored_set,
- _elm_scroll_hold_set,
- _elm_scroll_freeze_set,
- _elm_scroll_bounce_allow_set,
- _elm_scroll_bounce_allow_get,
- _elm_scroll_origin_reverse_set,
- _elm_scroll_origin_reverse_get,
- _elm_scroll_paging_set,
- _elm_scroll_paging_get,
- _elm_scroll_page_scroll_limit_set,
- _elm_scroll_page_scroll_limit_get,
- _elm_scroll_current_page_get,
- _elm_scroll_last_page_get,
- _elm_scroll_page_show,
- _elm_scroll_page_bring_in,
- _elm_scroll_region_bring_in,
- _elm_scroll_gravity_set,
- _elm_scroll_gravity_get,
- _elm_scroll_loop_set,
- _elm_scroll_loop_get,
- _elm_scroll_momentum_animator_disabled_get,
- _elm_scroll_momentum_animator_disabled_set,
- _elm_scroll_bounce_animator_disabled_set,
- _elm_scroll_bounce_animator_disabled_get,
- _elm_scroll_wheel_disabled_get,
- _elm_scroll_wheel_disabled_set,
- _elm_scroll_movement_block_set,
- _elm_scroll_movement_block_get
-};
+ ecore_idle_enterer_del(sid->down.hold_enterer);
+ ecore_animator_del(sid->down.hold_animator);
+ ecore_animator_del(sid->down.onhold_animator);
+ ecore_animator_del(sid->down.momentum_animator);
+ ecore_animator_del(sid->down.bounce_x_animator);
+ ecore_animator_del(sid->down.bounce_y_animator);
+ ecore_animator_del(sid->scrollto.x.animator);
+ ecore_animator_del(sid->scrollto.y.animator);
+}
+
+EOLIAN static void
+_elm_interface_scrollable_eo_base_constructor(Eo *obj, Elm_Scrollable_Smart_Interface_Data *class_data EINA_UNUSED)
+{
+ eo_do_super(obj, MY_SCROLLABLE_INTERFACE, eo_constructor());
+}
+
+EOLIAN static void
+_elm_interface_scrollable_class_constructor(Eo_Class *klass)
+{
+ evas_smart_legacy_type_register(MY_SCROLLABLE_INTERFACE_NAME_LEGACY, klass);
+}
+
+#include "elm_interface_scrollable.eo.c"
+#include "elm_pan.eo.c"