1 #include <Elementary.h>
3 #include "elm_interface_scrollable.h"
5 static const char PAN_SMART_NAME[] = "elm_pan";
7 #define ELM_PAN_DATA_GET_OR_RETURN(o, ptr) \
8 Elm_Pan_Smart_Data *ptr = evas_object_smart_data_get(o); \
11 CRITICAL("No smart data for object %p (%s)", \
12 o, evas_object_type_get(o)); \
16 #define ELM_PAN_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
17 Elm_Pan_Smart_Data *ptr = evas_object_smart_data_get(o); \
20 CRITICAL("No smart data for object %p (%s)", \
21 o, evas_object_type_get(o)); \
25 static const char SIG_CHANGED[] = "changed";
26 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
31 ELM_INTERNAL_SMART_SUBCLASS_NEW
32 (PAN_SMART_NAME, _elm_pan, Elm_Pan_Smart_Class, Evas_Smart_Class,
33 evas_object_smart_clipped_class_get, _smart_callbacks);
35 static void _elm_pan_content_set(Evas_Object *, Evas_Object *);
37 EAPI const Elm_Pan_Smart_Class *
38 elm_pan_smart_class_get(void)
40 static Elm_Pan_Smart_Class _sc =
41 ELM_PAN_SMART_CLASS_INIT_NAME_VERSION(PAN_SMART_NAME);
42 static const Elm_Pan_Smart_Class *class = NULL;
43 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
48 _elm_pan_smart_set(&_sc);
49 esc->callbacks = _smart_callbacks;
56 _elm_pan_update(Elm_Pan_Smart_Data *psd)
58 if (!psd->gravity_x && !psd->gravity_y)
60 evas_object_move(psd->content, psd->x - psd->px, psd->y - psd->py);
64 if ((!psd->px) && (!psd->py))
66 psd->px = psd->delta_posx * psd->gravity_x;
67 psd->py = psd->delta_posy * psd->gravity_y;
69 psd->delta_posx += psd->content_w - psd->prev_cw;
70 psd->prev_cw = psd->content_w;
71 psd->delta_posy += psd->content_h - psd->prev_ch;
72 psd->prev_ch = psd->content_h;
74 evas_object_move(psd->content, psd->x - psd->px, psd->y - psd->py);
75 psd->px = psd->delta_posx * psd->gravity_x;
76 psd->py = psd->delta_posy * psd->gravity_y;
80 _elm_pan_smart_add(Evas_Object *obj)
82 const Evas_Smart_Class *sc;
83 const Evas_Smart *smart;
85 EVAS_SMART_DATA_ALLOC(obj, Elm_Pan_Smart_Data);
87 _elm_pan_parent_sc->add(obj);
95 priv->gravity_x = 0.0;
96 priv->gravity_y = 0.0;
98 smart = evas_object_smart_smart_get(obj);
99 sc = evas_smart_class_get(smart);
100 priv->api = (const Elm_Pan_Smart_Class *)sc;
104 _elm_pan_smart_del(Evas_Object *obj)
106 _elm_pan_content_set(obj, NULL);
108 _elm_pan_parent_sc->del(obj);
112 _elm_pan_smart_move(Evas_Object *obj,
116 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
118 /* we don't want the clipped smart object version here */
123 _elm_pan_update(psd);
127 _elm_pan_smart_resize(Evas_Object *obj,
131 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
136 _elm_pan_update(psd);
137 evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
141 _elm_pan_smart_show(Evas_Object *obj)
143 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
145 _elm_pan_parent_sc->show(obj);
148 evas_object_show(psd->content);
152 _elm_pan_smart_hide(Evas_Object *obj)
154 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
156 _elm_pan_parent_sc->hide(obj);
159 evas_object_hide(psd->content);
163 _elm_pan_pos_set(Evas_Object *obj,
167 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
169 if ((x == psd->px) && (y == psd->py)) return;
173 _elm_pan_update(psd);
174 evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
178 _elm_pan_pos_get(const Evas_Object *obj,
182 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
189 _elm_pan_pos_max_get(const Evas_Object *obj,
193 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
197 if (psd->w < psd->content_w) *x = psd->content_w - psd->w;
202 if (psd->h < psd->content_h) *y = psd->content_h - psd->h;
208 _elm_pan_pos_min_get(const Evas_Object *obj __UNUSED__,
219 _elm_pan_content_size_get(const Evas_Object *obj,
223 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
225 if (w) *w = psd->content_w;
226 if (h) *h = psd->content_h;
230 _elm_pan_gravity_set(Evas_Object *obj,
234 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
238 psd->prev_cw = psd->content_w;
239 psd->prev_ch = psd->content_h;
245 _elm_pan_gravity_get(const Evas_Object *obj,
249 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
251 if (x) *x = psd->gravity_x;
252 if (y) *y = psd->gravity_y;
256 _elm_pan_smart_set_user(Elm_Pan_Smart_Class *sc)
258 sc->base.add = _elm_pan_smart_add;
259 sc->base.del = _elm_pan_smart_del;
260 sc->base.move = _elm_pan_smart_move;
261 sc->base.resize = _elm_pan_smart_resize;
262 sc->base.show = _elm_pan_smart_show;
263 sc->base.hide = _elm_pan_smart_hide;
265 sc->pos_set = _elm_pan_pos_set;
266 sc->pos_get = _elm_pan_pos_get;
267 sc->pos_max_get = _elm_pan_pos_max_get;
268 sc->pos_min_get = _elm_pan_pos_min_get;
269 sc->content_size_get = _elm_pan_content_size_get;
270 sc->gravity_set = _elm_pan_gravity_set;
271 sc->gravity_get = _elm_pan_gravity_get;
275 _elm_pan_add(Evas *evas)
277 return evas_object_smart_add(evas, _elm_pan_smart_class_new());
281 _elm_pan_content_del_cb(void *data,
283 Evas_Object *obj __UNUSED__,
284 void *event_info __UNUSED__)
286 Elm_Pan_Smart_Data *psd;
290 psd->content_w = psd->content_h = psd->px = psd->py =
291 psd->prev_cw = psd->prev_ch = psd->delta_posx = psd->delta_posy = 0;
292 evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
296 _elm_pan_content_resize_cb(void *data,
298 Evas_Object *obj __UNUSED__,
299 void *event_info __UNUSED__)
301 Elm_Pan_Smart_Data *psd;
305 evas_object_geometry_get(psd->content, NULL, NULL, &w, &h);
306 if ((w != psd->content_w) || (h != psd->content_h))
310 _elm_pan_update(psd);
312 evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
316 _elm_pan_content_set(Evas_Object *obj,
317 Evas_Object *content)
321 ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
323 if (content == psd->content) return;
326 evas_object_smart_member_del(psd->content);
327 evas_object_event_callback_del_full
328 (psd->content, EVAS_CALLBACK_DEL, _elm_pan_content_del_cb, psd);
329 evas_object_event_callback_del_full
330 (psd->content, EVAS_CALLBACK_RESIZE, _elm_pan_content_resize_cb,
334 if (!content) goto end;
336 psd->content = content;
337 evas_object_smart_member_add(psd->content, psd->self);
338 evas_object_geometry_get(psd->content, NULL, NULL, &w, &h);
341 evas_object_event_callback_add
342 (content, EVAS_CALLBACK_DEL, _elm_pan_content_del_cb, psd);
343 evas_object_event_callback_add
344 (content, EVAS_CALLBACK_RESIZE, _elm_pan_content_resize_cb, psd);
346 if (evas_object_visible_get(psd->self))
347 evas_object_show(psd->content);
349 evas_object_hide(psd->content);
351 _elm_pan_update(psd);
354 evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
357 /* pan smart object on top, scroller interface on bottom */
358 /* ============================================================ */
360 static const char SCROLL_SMART_NAME[] = "elm_scroll";
362 #define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(o, ptr) \
363 Elm_Scrollable_Smart_Interface_Data *ptr = \
364 evas_object_smart_interface_data_get(o, &(ELM_SCROLLABLE_IFACE.base)); \
367 CRITICAL("No interface data for object %p (%s)", \
368 o, evas_object_type_get(o)); \
372 #define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
373 Elm_Scrollable_Smart_Interface_Data *ptr = \
374 evas_object_smart_interface_data_get(o, &(ELM_SCROLLABLE_IFACE.base)); \
377 CRITICAL("No interface data for object %p (%s)", \
378 o, evas_object_type_get(o)); \
382 static void _elm_scroll_scroll_bar_size_adjust(
383 Elm_Scrollable_Smart_Interface_Data *);
384 static void _elm_scroll_wanted_region_set(Evas_Object *);
385 static void _elm_scroll_content_pos_get(const Evas_Object *,
388 static void _elm_scroll_content_pos_set(Evas_Object *,
400 _elm_direction_arrows_eval(Elm_Scrollable_Smart_Interface_Data *sid)
402 Eina_Bool go_left = EINA_TRUE, go_right = EINA_TRUE;
403 Eina_Bool go_up = EINA_TRUE, go_down = EINA_TRUE;
404 Evas_Coord x = 0, y = 0, mx = 0, my = 0, minx = 0, miny = 0;
406 if (!sid->edje_obj || !sid->pan_obj) return;
407 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
409 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
410 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
411 psd->api->pos_get(sid->pan_obj, &x, &y);
413 if (x == minx) go_left = EINA_FALSE;
414 if (x == (mx + minx)) go_right = EINA_FALSE;
415 if (y == miny) go_up = EINA_FALSE;
416 if (y == (my + miny)) go_down = EINA_FALSE;
417 if (go_left != sid->go_left)
420 edje_object_signal_emit(sid->edje_obj, "elm,action,show,left", "elm");
422 edje_object_signal_emit(sid->edje_obj, "elm,action,hide,left", "elm");
423 sid->go_left = go_left;
425 if (go_right != sid->go_right)
428 edje_object_signal_emit(sid->edje_obj, "elm,action,show,right", "elm");
430 edje_object_signal_emit(sid->edje_obj, "elm,action,hide,right", "elm");
431 sid->go_right= go_right;
433 if (go_up != sid->go_up)
436 edje_object_signal_emit(sid->edje_obj, "elm,action,show,up", "elm");
438 edje_object_signal_emit(sid->edje_obj, "elm,action,hide,up", "elm");
441 if (go_down != sid->go_down)
444 edje_object_signal_emit(sid->edje_obj, "elm,action,show,down", "elm");
446 edje_object_signal_emit(sid->edje_obj, "elm,action,hide,down", "elm");
447 sid->go_down= go_down;
452 _elm_scroll_scroll_bar_h_visibility_adjust(
453 Elm_Scrollable_Smart_Interface_Data *sid)
455 int scroll_h_vis_change = 0;
456 Evas_Coord w, vw = 0, vh = 0;
458 if (!sid->edje_obj) return 0;
460 w = sid->content_info.w;
462 evas_object_geometry_get(sid->pan_obj, NULL, NULL, &vw, &vh);
463 if (sid->hbar_visible)
467 scroll_h_vis_change = 1;
468 sid->hbar_visible = EINA_FALSE;
472 if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
474 if ((sid->content) || (sid->extern_pan))
478 scroll_h_vis_change = 1;
479 sid->hbar_visible = EINA_FALSE;
484 scroll_h_vis_change = 1;
485 sid->hbar_visible = EINA_FALSE;
488 else if (sid->hbar_flags == ELM_SCROLLER_POLICY_OFF)
490 scroll_h_vis_change = 1;
491 sid->hbar_visible = EINA_FALSE;
499 if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
501 if ((sid->content) || (sid->extern_pan))
505 scroll_h_vis_change = 1;
506 sid->hbar_visible = EINA_TRUE;
510 else if (sid->hbar_flags == ELM_SCROLLER_POLICY_ON)
512 scroll_h_vis_change = 1;
513 sid->hbar_visible = EINA_TRUE;
517 if (scroll_h_vis_change)
519 if (sid->hbar_flags != ELM_SCROLLER_POLICY_OFF)
521 if (sid->hbar_visible)
522 edje_object_signal_emit
523 (sid->edje_obj, "elm,action,show,hbar", "elm");
525 edje_object_signal_emit
526 (sid->edje_obj, "elm,action,hide,hbar", "elm");
529 edje_object_signal_emit
530 (sid->edje_obj, "elm,action,hide,hbar", "elm");
531 edje_object_message_signal_process(sid->edje_obj);
532 _elm_scroll_scroll_bar_size_adjust(sid);
533 if (sid->cb_func.content_min_limit)
534 sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
537 _elm_direction_arrows_eval(sid);
538 return scroll_h_vis_change;
542 _elm_scroll_scroll_bar_v_visibility_adjust(
543 Elm_Scrollable_Smart_Interface_Data *sid)
545 int scroll_v_vis_change = 0;
546 Evas_Coord h, vw = 0, vh = 0;
548 if (!sid->edje_obj) return 0;
550 h = sid->content_info.h;
552 evas_object_geometry_get(sid->pan_obj, NULL, NULL, &vw, &vh);
553 if (sid->vbar_visible)
557 scroll_v_vis_change = 1;
558 sid->vbar_visible = EINA_FALSE;
562 if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
564 if ((sid->content) || (sid->extern_pan))
568 scroll_v_vis_change = 1;
569 sid->vbar_visible = EINA_FALSE;
574 scroll_v_vis_change = 1;
575 sid->vbar_visible = EINA_FALSE;
578 else if (sid->vbar_flags == ELM_SCROLLER_POLICY_OFF)
580 scroll_v_vis_change = 1;
581 sid->vbar_visible = EINA_FALSE;
589 if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
591 if ((sid->content) || (sid->extern_pan))
595 scroll_v_vis_change = 1;
596 sid->vbar_visible = EINA_TRUE;
600 else if (sid->vbar_flags == ELM_SCROLLER_POLICY_ON)
602 scroll_v_vis_change = 1;
603 sid->vbar_visible = EINA_TRUE;
607 if (scroll_v_vis_change)
609 if (sid->vbar_flags != ELM_SCROLLER_POLICY_OFF)
611 if (sid->vbar_visible)
612 edje_object_signal_emit
613 (sid->edje_obj, "elm,action,show,vbar", "elm");
615 edje_object_signal_emit
616 (sid->edje_obj, "elm,action,hide,vbar", "elm");
619 edje_object_signal_emit
620 (sid->edje_obj, "elm,action,hide,vbar", "elm");
621 edje_object_message_signal_process(sid->edje_obj);
622 _elm_scroll_scroll_bar_size_adjust(sid);
623 if (sid->cb_func.content_min_limit)
624 sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
627 _elm_direction_arrows_eval(sid);
628 return scroll_v_vis_change;
632 _elm_scroll_scroll_bar_visibility_adjust(
633 Elm_Scrollable_Smart_Interface_Data *sid)
637 changed |= _elm_scroll_scroll_bar_h_visibility_adjust(sid);
638 changed |= _elm_scroll_scroll_bar_v_visibility_adjust(sid);
642 _elm_scroll_scroll_bar_h_visibility_adjust(sid);
643 _elm_scroll_scroll_bar_v_visibility_adjust(sid);
648 _elm_scroll_scroll_bar_size_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
650 if (!sid->pan_obj || !sid->edje_obj) return;
652 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
654 if ((sid->content) || (sid->extern_pan))
656 Evas_Coord x, y, w, h, mx = 0, my = 0, vw = 0, vh = 0, px, py,
660 edje_object_part_geometry_get
661 (sid->edje_obj, "elm.swallow.content", NULL, NULL, &vw, &vh);
662 w = sid->content_info.w;
664 size = (double)vw / (double)w;
669 edje_object_part_drag_value_set
670 (sid->edje_obj, "elm.dragable.hbar", 0.0, 0.0);
672 edje_object_part_drag_size_set
673 (sid->edje_obj, "elm.dragable.hbar", size, 1.0);
675 h = sid->content_info.h;
677 size = (double)vh / (double)h;
681 edje_object_part_drag_value_set
682 (sid->edje_obj, "elm.dragable.vbar", 0.0, 0.0);
684 edje_object_part_drag_size_set
685 (sid->edje_obj, "elm.dragable.vbar", 1.0, size);
687 edje_object_part_drag_value_get
688 (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
689 edje_object_part_drag_value_get
690 (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
692 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
693 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
697 edje_object_part_drag_step_set
698 (sid->edje_obj, "elm.dragable.hbar", (double)sid->step.x /
700 edje_object_part_drag_step_set
701 (sid->edje_obj, "elm.dragable.vbar", 0.0, (double)sid->step.y /
704 edje_object_part_drag_page_set
705 (sid->edje_obj, "elm.dragable.hbar", (double)sid->page.x /
708 edje_object_part_drag_page_set
709 (sid->edje_obj, "elm.dragable.hbar",
710 -((double)sid->page.x * ((double)vw / (double)w)) / 100.0, 0.0);
712 edje_object_part_drag_page_set
713 (sid->edje_obj, "elm.dragable.vbar", 0.0,
714 (double)sid->page.y / (double)h);
716 edje_object_part_drag_page_set
717 (sid->edje_obj, "elm.dragable.vbar", 0.0,
718 -((double)sid->page.y * ((double)vh / (double)h)) / 100.0);
720 psd->api->pos_get(sid->pan_obj, &px, &py);
721 if (vx != mx) x = px;
722 if (vy != my) y = py;
723 psd->api->pos_set(sid->pan_obj, x, y);
727 Evas_Coord px = 0, py = 0, minx = 0, miny = 0;
729 edje_object_part_drag_size_set
730 (sid->edje_obj, "elm.dragable.vbar", 1.0, 1.0);
731 edje_object_part_drag_size_set
732 (sid->edje_obj, "elm.dragable.hbar", 1.0, 1.0);
733 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
734 psd->api->pos_get(sid->pan_obj, &px, &py);
735 psd->api->pos_set(sid->pan_obj, minx, miny);
736 if ((px != minx) || (py != miny))
737 edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
739 _elm_scroll_scroll_bar_visibility_adjust(sid);
743 _elm_scroll_scroll_bar_read_and_update(
744 Elm_Scrollable_Smart_Interface_Data *sid)
746 Evas_Coord x, y, mx = 0, my = 0, px, py, minx = 0, miny = 0;
749 if (!sid->edje_obj || !sid->pan_obj) return;
751 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
753 if ((sid->down.dragged) || (sid->down.bounce_x_animator)
754 || (sid->down.bounce_y_animator) || (sid->down.momentum_animator)
755 || (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
757 edje_object_part_drag_value_get
758 (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
759 edje_object_part_drag_value_get
760 (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
761 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
762 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
763 x = vx * (double)mx + minx;
764 y = vy * (double)my + miny;
765 psd->api->pos_get(sid->pan_obj, &px, &py);
766 psd->api->pos_set(sid->pan_obj, x, y);
767 if ((px != x) || (py != y))
769 edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
774 _elm_scroll_drag_start(Elm_Scrollable_Smart_Interface_Data *sid)
776 if (sid->cb_func.drag_start)
777 sid->cb_func.drag_start(sid->obj, NULL);
781 _elm_scroll_drag_stop(Elm_Scrollable_Smart_Interface_Data *sid)
783 if (sid->cb_func.drag_stop)
784 sid->cb_func.drag_stop(sid->obj, NULL);
788 _elm_scroll_anim_start(Elm_Scrollable_Smart_Interface_Data *sid)
790 if (sid->cb_func.animate_start)
791 sid->cb_func.animate_start(sid->obj, NULL);
795 _elm_scroll_anim_stop(Elm_Scrollable_Smart_Interface_Data *sid)
797 if (sid->cb_func.animate_stop)
798 sid->cb_func.animate_stop(sid->obj, NULL);
802 _elm_scroll_vbar_drag_cb(void *data,
803 Evas_Object *obj __UNUSED__,
804 const char *emission __UNUSED__,
805 const char *source __UNUSED__)
807 Elm_Scrollable_Smart_Interface_Data *sid = data;
809 if (sid->cb_func.vbar_drag)
810 sid->cb_func.vbar_drag(sid->obj, NULL);
812 _elm_scroll_scroll_bar_read_and_update(sid);
816 _elm_scroll_vbar_press_cb(void *data,
817 Evas_Object *obj __UNUSED__,
818 const char *emission __UNUSED__,
819 const char *source __UNUSED__)
821 Elm_Scrollable_Smart_Interface_Data *sid = data;
823 if (sid->cb_func.vbar_press)
824 sid->cb_func.vbar_press(sid->obj, NULL);
828 _elm_scroll_vbar_unpress_cb(void *data,
829 Evas_Object *obj __UNUSED__,
830 const char *emission __UNUSED__,
831 const char *source __UNUSED__)
833 Elm_Scrollable_Smart_Interface_Data *sid = data;
835 if (sid->cb_func.vbar_unpress)
836 sid->cb_func.vbar_unpress(sid->obj, NULL);
840 _elm_scroll_edje_drag_v_start_cb(void *data,
841 Evas_Object *obj __UNUSED__,
842 const char *emission __UNUSED__,
843 const char *source __UNUSED__)
845 Elm_Scrollable_Smart_Interface_Data *sid = data;
847 _elm_scroll_scroll_bar_read_and_update(sid);
848 _elm_scroll_drag_start(sid);
849 sid->freeze = EINA_TRUE;
853 _elm_scroll_edje_drag_v_stop_cb(void *data,
854 Evas_Object *obj __UNUSED__,
855 const char *emission __UNUSED__,
856 const char *source __UNUSED__)
858 Elm_Scrollable_Smart_Interface_Data *sid = data;
860 _elm_scroll_scroll_bar_read_and_update(sid);
861 _elm_scroll_drag_stop(sid);
862 sid->freeze = EINA_FALSE;
866 _elm_scroll_edje_drag_v_cb(void *data,
867 Evas_Object *obj __UNUSED__,
868 const char *emission __UNUSED__,
869 const char *source __UNUSED__)
871 Elm_Scrollable_Smart_Interface_Data *sid = data;
873 _elm_scroll_scroll_bar_read_and_update(sid);
877 _elm_scroll_hbar_drag_cb(void *data,
878 Evas_Object *obj __UNUSED__,
879 const char *emission __UNUSED__,
880 const char *source __UNUSED__)
882 Elm_Scrollable_Smart_Interface_Data *sid = data;
884 if (sid->cb_func.hbar_drag)
885 sid->cb_func.hbar_drag(sid->obj, NULL);
887 _elm_scroll_scroll_bar_read_and_update(sid);
891 _elm_scroll_hbar_press_cb(void *data,
892 Evas_Object *obj __UNUSED__,
893 const char *emission __UNUSED__,
894 const char *source __UNUSED__)
896 Elm_Scrollable_Smart_Interface_Data *sid = data;
898 if (sid->cb_func.hbar_press)
899 sid->cb_func.hbar_press(sid->obj, NULL);
903 _elm_scroll_hbar_unpress_cb(void *data,
904 Evas_Object *obj __UNUSED__,
905 const char *emission __UNUSED__,
906 const char *source __UNUSED__)
908 Elm_Scrollable_Smart_Interface_Data *sid = data;
910 if (sid->cb_func.hbar_unpress)
911 sid->cb_func.hbar_unpress(sid->obj, NULL);
915 _elm_scroll_edje_drag_h_start_cb(void *data,
916 Evas_Object *obj __UNUSED__,
917 const char *emission __UNUSED__,
918 const char *source __UNUSED__)
920 Elm_Scrollable_Smart_Interface_Data *sid = data;
922 _elm_scroll_scroll_bar_read_and_update(sid);
923 _elm_scroll_drag_start(sid);
924 sid->freeze = EINA_TRUE;
928 _elm_scroll_edje_drag_h_stop_cb(void *data,
929 Evas_Object *obj __UNUSED__,
930 const char *emission __UNUSED__,
931 const char *source __UNUSED__)
933 Elm_Scrollable_Smart_Interface_Data *sid = data;
935 _elm_scroll_scroll_bar_read_and_update(sid);
936 _elm_scroll_drag_stop(sid);
937 sid->freeze = EINA_FALSE;
941 _elm_scroll_edje_drag_h_cb(void *data,
942 Evas_Object *obj __UNUSED__,
943 const char *emission __UNUSED__,
944 const char *source __UNUSED__)
946 Elm_Scrollable_Smart_Interface_Data *sid = data;
948 _elm_scroll_scroll_bar_read_and_update(sid);
952 _elm_scroll_content_size_get(const Evas_Object *obj,
956 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
958 if (!sid->content) return;
960 evas_object_geometry_get(sid->content, NULL, NULL, w, h);
964 _elm_scroll_content_viewport_size_get(const Evas_Object *obj,
968 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
970 if (!sid->pan_obj || !sid->edje_obj) return;
972 edje_object_calc_force(sid->edje_obj);
973 evas_object_geometry_get(sid->pan_obj, NULL, NULL, w, h);
977 _elm_scroll_content_min_limit(Evas_Object *obj,
981 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
983 if (!sid->edje_obj) return;
985 if (!sid->cb_func.content_min_limit)
987 ERR("Content minimim size limiting is unimplemented -- you "
988 "must provide it yourself\n");
994 sid->cb_func.content_min_limit(sid->obj, w, h);
998 _elm_scroll_x_mirrored_get(const Evas_Object *obj,
1001 Evas_Coord cw, ch, w, ret;
1003 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, x);
1005 if (!sid->pan_obj) return 0;
1007 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
1009 _elm_scroll_content_viewport_size_get(obj, &w, NULL);
1010 psd->api->content_size_get(sid->pan_obj, &cw, &ch);
1011 ret = (cw - (x + w));
1013 return (ret >= 0) ? ret : 0;
1016 /* Update the wanted coordinates according to the x, y passed
1017 * widget directionality, content size and etc. */
1019 _elm_scroll_wanted_coordinates_update(Elm_Scrollable_Smart_Interface_Data *sid,
1025 if (!sid->pan_obj) return;
1027 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
1029 psd->api->content_size_get(sid->pan_obj, &cw, &ch);
1031 /* Update wx/y/w/h - and if the requested positions aren't legal
1033 _elm_scroll_content_viewport_size_get(sid->obj, &sid->ww, &sid->wh);
1036 else if ((x + sid->ww) > cw)
1037 sid->wx = cw - sid->ww;
1038 else if (sid->is_mirrored)
1039 sid->wx = _elm_scroll_x_mirrored_get(sid->obj, x);
1042 if (y < 0) sid->wy = 0;
1043 else if ((y + sid->wh) > ch)
1044 sid->wy = ch - sid->wh;
1049 _elm_scroll_momentum_end(Elm_Scrollable_Smart_Interface_Data *sid)
1051 if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator)) return;
1052 if (sid->down.momentum_animator)
1055 _elm_scroll_content_pos_get(sid->obj, &px, &py);
1056 _elm_scroll_wanted_coordinates_update(sid, px, py);
1058 ecore_animator_del(sid->down.momentum_animator);
1059 sid->down.momentum_animator = NULL;
1060 sid->down.bounce_x_hold = EINA_FALSE;
1061 sid->down.bounce_y_hold = EINA_FALSE;
1068 if (sid->content_info.resized)
1069 _elm_scroll_wanted_region_set(sid->obj);
1074 _elm_scroll_bounce_x_animator(void *data)
1076 Elm_Scrollable_Smart_Interface_Data *sid;
1077 Evas_Coord x, y, dx, w, odx, ed, md;
1078 double t, p, dt, pd, r;
1081 t = ecore_loop_time_get();
1082 dt = t - sid->down.anim_start2;
1085 dt = dt / _elm_config->thumbscroll_bounce_friction;
1086 odx = sid->down.b2x - sid->down.bx;
1087 _elm_scroll_content_viewport_size_get(sid->obj, &w, NULL);
1088 if (!sid->down.momentum_animator && (w > abs(odx)))
1090 pd = (double)odx / (double)w;
1091 pd = (pd > 0) ? pd : -pd;
1092 pd = 1.0 - ((1.0 - pd) * (1.0 - pd));
1095 if (dt > 1.0) dt = 1.0;
1096 p = 1.0 - ((1.0 - dt) * (1.0 - dt));
1097 _elm_scroll_content_pos_get(sid->obj, &x, &y);
1100 if (sid->down.momentum_animator)
1102 ed = abs(sid->down.dx * (_elm_config->thumbscroll_friction +
1103 sid->down.extra_time) - sid->down.b0x);
1104 md = abs(_elm_config->thumbscroll_friction * 5 * w);
1105 if (ed > md) r = (double)(md) / (double)ed;
1107 x = sid->down.b2x + (int)((double)(dx - odx) * r);
1108 if (!sid->down.cancelled)
1109 _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
1112 if (sid->down.momentum_animator)
1113 sid->down.bounce_x_hold = EINA_TRUE;
1114 if ((!sid->down.bounce_y_animator) &&
1115 (!sid->scrollto.y.animator))
1116 _elm_scroll_anim_stop(sid);
1117 sid->down.bounce_x_animator = NULL;
1119 sid->bouncemex = EINA_FALSE;
1120 _elm_scroll_momentum_end(sid);
1121 if (sid->content_info.resized)
1122 _elm_scroll_wanted_region_set(sid->obj);
1123 return ECORE_CALLBACK_CANCEL;
1126 return ECORE_CALLBACK_RENEW;
1130 _elm_scroll_bounce_y_animator(void *data)
1132 Elm_Scrollable_Smart_Interface_Data *sid;
1133 Evas_Coord x, y, dy, h, ody, ed, md;
1134 double t, p, dt, pd, r;
1137 t = ecore_loop_time_get();
1138 dt = t - sid->down.anim_start3;
1141 dt = dt / _elm_config->thumbscroll_bounce_friction;
1142 ody = sid->down.b2y - sid->down.by;
1143 _elm_scroll_content_viewport_size_get(sid->obj, NULL, &h);
1144 if (!sid->down.momentum_animator && (h > abs(ody)))
1146 pd = (double)ody / (double)h;
1147 pd = (pd > 0) ? pd : -pd;
1148 pd = 1.0 - ((1.0 - pd) * (1.0 - pd));
1151 if (dt > 1.0) dt = 1.0;
1152 p = 1.0 - ((1.0 - dt) * (1.0 - dt));
1153 _elm_scroll_content_pos_get(sid->obj, &x, &y);
1156 if (sid->down.momentum_animator)
1158 ed = abs(sid->down.dy * (_elm_config->thumbscroll_friction +
1159 sid->down.extra_time) - sid->down.b0y);
1160 md = abs(_elm_config->thumbscroll_friction * 5 * h);
1161 if (ed > md) r = (double)(md) / (double)ed;
1163 y = sid->down.b2y + (int)((double)(dy - ody) * r);
1164 if (!sid->down.cancelled)
1165 _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
1168 if (sid->down.momentum_animator)
1169 sid->down.bounce_y_hold = EINA_TRUE;
1170 if ((!sid->down.bounce_x_animator) &&
1171 (!sid->scrollto.y.animator))
1172 _elm_scroll_anim_stop(sid);
1173 sid->down.bounce_y_animator = NULL;
1175 sid->bouncemey = EINA_FALSE;
1176 _elm_scroll_momentum_end(sid);
1177 if (sid->content_info.resized)
1178 _elm_scroll_wanted_region_set(sid->obj);
1179 return ECORE_CALLBACK_CANCEL;
1183 return ECORE_CALLBACK_RENEW;
1187 _elm_scroll_bounce_eval(Elm_Scrollable_Smart_Interface_Data *sid)
1189 Evas_Coord mx, my, px, py, bx, by, b2x, b2y, minx = 0, miny = 0;
1191 if (!sid->pan_obj) return;
1193 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
1195 if (sid->freeze) return;
1196 if ((!sid->bouncemex) && (!sid->bouncemey)) return;
1197 if (sid->down.now) return; // down bounce while still held down
1198 if (sid->down.onhold_animator)
1200 ecore_animator_del(sid->down.onhold_animator);
1201 sid->down.onhold_animator = NULL;
1202 if (sid->content_info.resized)
1203 _elm_scroll_wanted_region_set(sid->obj);
1205 if (sid->down.hold_animator)
1207 ecore_animator_del(sid->down.hold_animator);
1208 sid->down.hold_animator = NULL;
1209 if (sid->content_info.resized)
1210 _elm_scroll_wanted_region_set(sid->obj);
1212 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
1213 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
1214 psd->api->pos_get(sid->pan_obj, &px, &py);
1217 if (px < minx) px = minx;
1218 if ((px - minx) > mx) px = mx + minx;
1219 if (py < miny) py = miny;
1220 if ((py - miny) > my) py = my + miny;
1224 (!elm_widget_drag_child_locked_x_get(sid->obj)))
1226 if ((!sid->down.bounce_x_animator) && (!sid->bounce_animator_disabled))
1230 if (sid->scrollto.x.animator)
1232 ecore_animator_del(sid->scrollto.x.animator);
1233 sid->scrollto.x.animator = NULL;
1235 sid->down.bounce_x_animator =
1236 ecore_animator_add(_elm_scroll_bounce_x_animator, sid);
1237 sid->down.anim_start2 = ecore_loop_time_get();
1240 sid->down.b2x = b2x;
1241 if (sid->down.momentum_animator)
1242 sid->down.b0x = sid->down.ax;
1243 else sid->down.b0x = 0;
1248 (!elm_widget_drag_child_locked_y_get(sid->obj)))
1250 if ((!sid->down.bounce_y_animator) && (!sid->bounce_animator_disabled))
1254 if (sid->scrollto.y.animator)
1256 ecore_animator_del(sid->scrollto.y.animator);
1257 sid->scrollto.y.animator = NULL;
1259 sid->down.bounce_y_animator =
1260 ecore_animator_add(_elm_scroll_bounce_y_animator, sid);
1261 sid->down.anim_start3 = ecore_loop_time_get();
1264 sid->down.b2y = b2y;
1265 if (sid->down.momentum_animator)
1266 sid->down.b0y = sid->down.ay;
1267 else sid->down.b0y = 0;
1274 _elm_scroll_content_pos_get(const Evas_Object *obj,
1278 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
1280 if (!sid->pan_obj) return;
1282 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
1284 psd->api->pos_get(sid->pan_obj, x, y);
1288 _elm_scroll_content_pos_set(Evas_Object *obj,
1293 Evas_Coord mx = 0, my = 0, px = 0, py = 0, spx = 0, spy = 0, minx = 0, miny = 0;
1294 Evas_Coord cw =0, ch = 0, ww = 0, wh = 0; //// TIZEN ONLY
1297 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
1299 if (!sid->edje_obj || !sid->pan_obj) return;
1301 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
1303 // FIXME: allow for bounce outside of range
1304 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
1305 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
1306 psd->api->content_size_get(sid->pan_obj, &cw, &ch); //// TIZEN ONLY
1307 _elm_scroll_content_viewport_size_get(obj, &ww, &wh); //// TIZEN ONLY
1309 psd->api->pos_get(sid->pan_obj, &px, &py);
1314 edje_object_signal_emit(sid->edje_obj, "elm,edge,left", "elm");
1315 if ((x - minx) > mx)
1316 edje_object_signal_emit(sid->edje_obj, "elm,edge,right", "elm");
1321 edje_object_signal_emit(sid->edje_obj, "elm,edge,top", "elm");
1322 if ((y - miny) > my)
1323 edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom", "elm");
1326 if (!_elm_config->thumbscroll_bounce_enable)
1328 if (x < minx) x = minx;
1329 if ((x - minx) > mx) x = mx + minx;
1330 if (y < miny) y = miny;
1331 if ((y - miny) > my) y = my + miny;
1334 if (!sid->bounce_horiz)
1336 if (x < minx) x = minx;
1337 if ((x - minx) > mx) x = mx + minx;
1339 if (!sid->bounce_vert)
1341 if (y < miny) y = miny;
1342 if (y - miny > my) y = my + miny;
1345 psd->api->pos_set(sid->pan_obj, x, y);
1346 psd->api->pos_get(sid->pan_obj, &spx, &spy);
1348 if (mx > 0) vx = (double)(spx - minx) / (double)mx;
1351 if (vx < 0.0) vx = 0.0;
1355 if (my > 0) vy = (double)(spy - miny) / (double)my;
1358 if (vy < 0.0) vy = 0.0;
1362 edje_object_part_drag_value_set
1363 (sid->edje_obj, "elm.dragable.vbar", 0.0, vy);
1364 edje_object_part_drag_value_set
1365 (sid->edje_obj, "elm.dragable.hbar", vx, 0.0);
1367 if (sig && ((px != x) || (py != y)))
1368 edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
1369 if (!sid->down.bounce_x_animator)
1371 if (((x < minx) && (0 <= sid->down.dx)) ||
1372 ((x > (mx + minx)) && (0 >= sid->down.dx)))
1374 sid->bouncemex = EINA_TRUE;
1375 _elm_scroll_bounce_eval(sid);
1378 sid->bouncemex = EINA_FALSE;
1380 if (!sid->down.bounce_y_animator)
1382 if (((y < miny) && (0 <= sid->down.dy)) ||
1383 ((y > (my + miny)) && (0 >= sid->down.dy)))
1385 sid->bouncemey = EINA_TRUE;
1386 _elm_scroll_bounce_eval(sid);
1389 sid->bouncemey = EINA_FALSE;
1392 if ((x != px) || (y != py))
1394 if (sid->cb_func.scroll)
1395 sid->cb_func.scroll(obj, NULL);
1403 if (sid->cb_func.edge_left)
1404 sid->cb_func.edge_left(obj, NULL);
1405 edje_object_signal_emit(sid->edje_obj, "elm,edge,left", "elm");
1407 if (x == (mx + minx))
1409 if (sid->cb_func.edge_right)
1410 sid->cb_func.edge_right(obj, NULL);
1411 edje_object_signal_emit(sid->edje_obj, "elm,edge,right", "elm");
1418 if (sid->cb_func.edge_top)
1419 sid->cb_func.edge_top(obj, NULL);
1420 edje_object_signal_emit(sid->edje_obj, "elm,edge,top", "elm");
1424 if (sid->cb_func.edge_bottom)
1425 sid->cb_func.edge_bottom(obj, NULL);
1426 edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom", "elm");
1431 _elm_direction_arrows_eval(sid);
1435 _elm_scroll_mirrored_set(Evas_Object *obj,
1440 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
1442 if (!sid->edje_obj) return;
1444 mirrored = !!mirrored;
1446 if (sid->is_mirrored == mirrored)
1449 sid->is_mirrored = mirrored;
1450 edje_object_mirrored_set(sid->edje_obj, mirrored);
1452 if (sid->is_mirrored)
1453 wx = _elm_scroll_x_mirrored_get(sid->obj, sid->wx);
1457 _elm_scroll_content_pos_set(sid->obj, wx, sid->wy, EINA_FALSE);
1460 /* returns TRUE when we need to move the scroller, FALSE otherwise.
1461 * Updates w and h either way, so save them if you need them. */
1463 _elm_scroll_content_region_show_internal(Evas_Object *obj,
1469 Evas_Coord mx = 0, my = 0, cw = 0, ch = 0, px = 0, py = 0, nx, ny,
1470 minx = 0, miny = 0, pw = 0, ph = 0, x = *_x, y = *_y;
1472 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
1474 if (!sid->pan_obj) return EINA_FALSE;
1476 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
1478 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
1479 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
1480 psd->api->content_size_get(sid->pan_obj, &cw, &ch);
1481 psd->api->pos_get(sid->pan_obj, &px, &py);
1482 evas_object_geometry_get(sid->pan_obj, NULL, NULL, &pw, &ph);
1485 if ((x < px) && ((x + w) < (px + (cw - mx)))) nx = x;
1486 else if ((x > px) && ((x + w) > (px + (cw - mx))))
1487 nx = x + w - (cw - mx);
1489 if ((y < py) && ((y + h) < (py + (ch - my)))) ny = y;
1490 else if ((y > py) && ((y + h) > (py + (ch - my))))
1491 ny = y + h - (ch - my);
1493 if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
1494 (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
1496 _elm_scroll_anim_stop(sid);
1498 if (sid->scrollto.x.animator)
1500 ecore_animator_del(sid->scrollto.x.animator);
1501 sid->scrollto.x.animator = NULL;
1503 if (sid->scrollto.y.animator)
1505 ecore_animator_del(sid->scrollto.y.animator);
1506 sid->scrollto.y.animator = NULL;
1508 if (sid->down.bounce_x_animator)
1510 ecore_animator_del(sid->down.bounce_x_animator);
1511 sid->down.bounce_x_animator = NULL;
1512 sid->bouncemex = EINA_FALSE;
1513 if (sid->content_info.resized)
1514 _elm_scroll_wanted_region_set(sid->obj);
1516 if (sid->down.bounce_y_animator)
1518 ecore_animator_del(sid->down.bounce_y_animator);
1519 sid->down.bounce_y_animator = NULL;
1520 sid->bouncemey = EINA_FALSE;
1521 if (sid->content_info.resized)
1522 _elm_scroll_wanted_region_set(sid->obj);
1524 if (sid->down.hold_animator)
1526 ecore_animator_del(sid->down.hold_animator);
1527 sid->down.hold_animator = NULL;
1528 _elm_scroll_drag_stop(sid);
1529 if (sid->content_info.resized)
1530 _elm_scroll_wanted_region_set(sid->obj);
1532 if (sid->down.momentum_animator)
1534 ecore_animator_del(sid->down.momentum_animator);
1535 sid->down.momentum_animator = NULL;
1536 sid->down.bounce_x_hold = EINA_FALSE;
1537 sid->down.bounce_y_hold = EINA_FALSE;
1542 if (sid->content_info.resized)
1543 _elm_scroll_wanted_region_set(sid->obj);
1547 if ((x + pw) > cw) x = cw - pw;
1548 if (x < minx) x = minx;
1550 if ((y + ph) > ch) y = ch - ph;
1551 if (y < miny) y = miny;
1553 if ((x == px) && (y == py)) return EINA_FALSE;
1559 /* Set should be used for calculated positions, for example, when we move
1560 * because of an animation or because this is the correct position after
1563 _elm_scroll_content_region_set(Evas_Object *obj,
1569 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
1571 if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
1573 _elm_scroll_content_pos_set(obj, x, y, EINA_FALSE);
1576 sid->down.x = sid->down.history[0].x;
1577 sid->down.y = sid->down.history[0].y;
1581 /* Set should be used for setting the wanted position, for example a
1582 * user scroll or moving the cursor in an entry. */
1584 _elm_scroll_content_region_show(Evas_Object *obj,
1590 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
1596 if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
1598 _elm_scroll_content_pos_set(obj, x, y, EINA_TRUE);
1601 sid->down.x = sid->down.history[0].x;
1602 sid->down.y = sid->down.history[0].y;
1607 _elm_scroll_wanted_region_set(Evas_Object *obj)
1609 Evas_Coord ww, wh, wx;
1611 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
1615 if (sid->down.now || sid->down.momentum_animator ||
1616 sid->down.bounce_x_animator || sid->down.bounce_y_animator ||
1617 sid->down.hold_animator || sid->down.onhold_animator ||
1618 sid->scrollto.x.animator || sid->scrollto.y.animator)
1621 sid->content_info.resized = EINA_FALSE;
1623 /* Flip to RTL cords only if init in RTL mode */
1624 if (sid->is_mirrored)
1625 wx = _elm_scroll_x_mirrored_get(obj, sid->wx);
1629 _elm_scroll_content_viewport_size_get(obj, &ww, &wh);
1637 _elm_scroll_content_region_set(obj, wx, sid->wy, ww, wh);
1641 _elm_scroll_wheel_event_cb(void *data,
1643 Evas_Object *obj __UNUSED__,
1646 Elm_Scrollable_Smart_Interface_Data *sid;
1647 Evas_Event_Mouse_Wheel *ev;
1648 Evas_Coord x = 0, y = 0, vw = 0, vh = 0, cw = 0, ch = 0;
1652 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
1654 direction = ev->direction;
1655 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1656 if ((evas_key_modifier_is_set(ev->modifiers, "Control")) ||
1657 (evas_key_modifier_is_set(ev->modifiers, "Alt")) ||
1658 (evas_key_modifier_is_set(ev->modifiers, "Meta")) ||
1659 (evas_key_modifier_is_set(ev->modifiers, "Hyper")) ||
1660 (evas_key_modifier_is_set(ev->modifiers, "Super")))
1662 else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1663 direction = !direction;
1664 _elm_scroll_content_pos_get(sid->obj, &x, &y);
1665 if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
1666 (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
1668 _elm_scroll_anim_stop(sid);
1670 if (sid->scrollto.x.animator)
1672 ecore_animator_del(sid->scrollto.x.animator);
1673 sid->scrollto.x.animator = NULL;
1675 if (sid->scrollto.y.animator)
1677 ecore_animator_del(sid->scrollto.y.animator);
1678 sid->scrollto.y.animator = NULL;
1680 if (sid->down.bounce_x_animator)
1682 ecore_animator_del(sid->down.bounce_x_animator);
1683 sid->down.bounce_x_animator = NULL;
1684 sid->bouncemex = EINA_FALSE;
1685 if (sid->content_info.resized)
1686 _elm_scroll_wanted_region_set(sid->obj);
1688 if (sid->down.bounce_y_animator)
1690 ecore_animator_del(sid->down.bounce_y_animator);
1691 sid->down.bounce_y_animator = NULL;
1692 sid->bouncemey = EINA_FALSE;
1693 if (sid->content_info.resized)
1694 _elm_scroll_wanted_region_set(sid->obj);
1696 _elm_scroll_content_viewport_size_get(sid->obj, &vw, &vh);
1697 psd->api->content_size_get(sid->pan_obj, &cw, &ch);
1700 if (ch > vh || cw <= vw)
1701 y += ev->z * sid->step.y;
1703 x += ev->z * sid->step.x;
1705 else if (direction == 1)
1707 if (cw > vw || ch <= vh)
1708 x += ev->z * sid->step.x;
1710 y += ev->z * sid->step.y;
1713 if ((!sid->hold) && (!sid->freeze))
1715 _elm_scroll_wanted_coordinates_update(sid, x, y);
1716 _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
1721 _elm_scroll_post_event_up(void *data,
1724 Elm_Scrollable_Smart_Interface_Data *sid = data;
1728 if (sid->down.dragged)
1730 elm_widget_drag_lock_x_set(sid->obj, EINA_FALSE);
1731 elm_widget_drag_lock_y_set(sid->obj, EINA_FALSE);
1738 _paging_is_enabled(Elm_Scrollable_Smart_Interface_Data *sid)
1740 if ((sid->pagerel_h == 0.0) && (!sid->pagesize_h) &&
1741 (sid->pagerel_v == 0.0) && (!sid->pagesize_v))
1747 _elm_scroll_momentum_animator(void *data)
1750 Elm_Scrollable_Smart_Interface_Data *sid = data;
1751 Evas_Coord x, y, dx, dy, px, py, maxx, maxy, minx, miny;
1752 Eina_Bool no_bounce_x_end = EINA_FALSE, no_bounce_y_end = EINA_FALSE;
1754 if (!sid->pan_obj) return ECORE_CALLBACK_CANCEL;
1756 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, ECORE_CALLBACK_CANCEL);
1758 t = ecore_loop_time_get();
1759 dt = t - sid->down.anim_start;
1762 dt = dt / (_elm_config->thumbscroll_friction + sid->down.extra_time);
1763 if (dt > 1.0) dt = 1.0;
1764 p = 1.0 - ((1.0 - dt) * (1.0 - dt));
1765 dx = (sid->down.dx * (_elm_config->thumbscroll_friction +
1766 sid->down.extra_time) * p);
1767 dy = (sid->down.dy * (_elm_config->thumbscroll_friction +
1768 sid->down.extra_time) * p);
1771 x = sid->down.sx - dx;
1772 y = sid->down.sy - dy;
1773 _elm_scroll_content_pos_get(sid->obj, &px, &py);
1774 if ((sid->down.bounce_x_animator) ||
1775 (sid->down.bounce_x_hold))
1777 sid->down.bx = sid->down.bx0 - dx + sid->down.b0x;
1780 if ((sid->down.bounce_y_animator) ||
1781 (sid->down.bounce_y_hold))
1783 sid->down.by = sid->down.by0 - dy + sid->down.b0y;
1786 _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
1787 _elm_scroll_wanted_coordinates_update(sid, x, y);
1788 psd->api->pos_max_get(sid->pan_obj, &maxx, &maxy);
1789 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
1790 if (!sid->bounce_horiz)
1792 if (x <= minx) no_bounce_x_end = EINA_TRUE;
1793 if ((x - minx) >= maxx) no_bounce_x_end = EINA_TRUE;
1795 if (!sid->bounce_vert)
1797 if (y <= miny) no_bounce_y_end = EINA_TRUE;
1798 if ((y - miny) >= maxy) no_bounce_y_end = EINA_TRUE;
1801 ((sid->down.bounce_x_hold) && (sid->down.bounce_y_hold)) ||
1802 (no_bounce_x_end && no_bounce_y_end))
1804 _elm_scroll_anim_stop(sid);
1806 sid->down.momentum_animator = NULL;
1807 sid->down.bounce_x_hold = EINA_FALSE;
1808 sid->down.bounce_y_hold = EINA_FALSE;
1813 if (sid->content_info.resized)
1814 _elm_scroll_wanted_region_set(sid->obj);
1816 return ECORE_CALLBACK_CANCEL;
1820 return ECORE_CALLBACK_RENEW;
1824 _elm_scroll_page_x_get(Elm_Scrollable_Smart_Interface_Data *sid,
1827 Evas_Coord x, y, w, h, cw, ch, minx = 0;
1829 if (!sid->pan_obj) return 0;
1831 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
1833 _elm_scroll_content_pos_get(sid->obj, &x, &y);
1834 _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
1835 psd->api->content_size_get(sid->pan_obj, &cw, &ch);
1836 psd->api->pos_min_get(sid->pan_obj, &minx, NULL);
1840 if (sid->pagerel_h > 0.0)
1841 sid->pagesize_h = w * sid->pagerel_h;
1842 if (sid->pagesize_h > 0)
1844 x = x + (sid->pagesize_h * 0.5);
1845 x = x / (sid->pagesize_h);
1846 x = x * (sid->pagesize_h);
1848 if ((x + w) > cw) x = cw - w;
1849 if (x < minx) x = minx;
1855 _elm_scroll_page_y_get(Elm_Scrollable_Smart_Interface_Data *sid,
1858 Evas_Coord x, y, w, h, cw, ch, miny = 0;
1860 if (!sid->pan_obj) return 0;
1862 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
1864 _elm_scroll_content_pos_get(sid->obj, &x, &y);
1865 _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
1866 psd->api->content_size_get(sid->pan_obj, &cw, &ch);
1867 psd->api->pos_min_get(sid->pan_obj, NULL, &miny);
1871 if (sid->pagerel_v > 0.0)
1872 sid->pagesize_v = h * sid->pagerel_v;
1873 if (sid->pagesize_v > 0)
1875 y = y + (sid->pagesize_v * 0.5);
1876 y = y / (sid->pagesize_v);
1877 y = y * (sid->pagesize_v);
1879 if ((y + h) > ch) y = ch - h;
1880 if (y < miny) y = miny;
1886 _elm_scroll_scroll_to_x_animator(void *data)
1888 Elm_Scrollable_Smart_Interface_Data *sid = data;
1892 if (!sid->pan_obj) return ECORE_CALLBACK_CANCEL;
1894 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, ECORE_CALLBACK_CANCEL);
1896 t = ecore_loop_time_get();
1897 tt = (t - sid->scrollto.x.t_start) /
1898 (sid->scrollto.x.t_end - sid->scrollto.x.t_start);
1900 tt = 1.0 - (tt * tt);
1901 psd->api->pos_get(sid->pan_obj, &px, &py);
1902 px = (sid->scrollto.x.start * (1.0 - tt)) +
1903 (sid->scrollto.x.end * tt);
1904 if (t >= sid->scrollto.x.t_end)
1906 px = sid->scrollto.x.end;
1907 _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
1909 sid->down.x = sid->down.history[0].x;
1910 _elm_scroll_wanted_coordinates_update(sid, px, py);
1911 sid->scrollto.x.animator = NULL;
1912 if ((!sid->scrollto.y.animator) && (!sid->down.bounce_y_animator))
1913 _elm_scroll_anim_stop(sid);
1914 return ECORE_CALLBACK_CANCEL;
1916 _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
1917 _elm_scroll_wanted_coordinates_update(sid, px, py);
1918 return ECORE_CALLBACK_RENEW;
1922 _elm_scroll_scroll_to_y_animator(void *data)
1924 Elm_Scrollable_Smart_Interface_Data *sid = data;
1928 if (!sid->pan_obj) return EINA_FALSE;
1930 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
1932 t = ecore_loop_time_get();
1933 tt = (t - sid->scrollto.y.t_start) /
1934 (sid->scrollto.y.t_end - sid->scrollto.y.t_start);
1936 tt = 1.0 - (tt * tt);
1937 psd->api->pos_get(sid->pan_obj, &px, &py);
1938 py = (sid->scrollto.y.start * (1.0 - tt)) +
1939 (sid->scrollto.y.end * tt);
1940 if (t >= sid->scrollto.y.t_end)
1942 py = sid->scrollto.y.end;
1943 _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
1945 sid->down.y = sid->down.history[0].y;
1946 _elm_scroll_wanted_coordinates_update(sid, px, py);
1947 sid->scrollto.y.animator = NULL;
1948 if ((!sid->scrollto.x.animator) && (!sid->down.bounce_x_animator))
1949 _elm_scroll_anim_stop(sid);
1950 return ECORE_CALLBACK_CANCEL;
1952 _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
1953 _elm_scroll_wanted_coordinates_update(sid, px, py);
1955 return ECORE_CALLBACK_RENEW;
1959 _elm_scroll_scroll_to_y(Elm_Scrollable_Smart_Interface_Data *sid,
1963 Evas_Coord px, py, x, y, w, h;
1966 if (!sid->pan_obj) return;
1968 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
1970 if (sid->freeze) return;
1973 _elm_scroll_content_pos_get(sid->obj, &x, &y);
1974 _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
1976 _elm_scroll_content_region_set(sid->obj, x, y, w, h);
1979 t = ecore_loop_time_get();
1980 psd->api->pos_get(sid->pan_obj, &px, &py);
1981 sid->scrollto.y.start = py;
1982 sid->scrollto.y.end = pos_y;
1983 sid->scrollto.y.t_start = t;
1984 sid->scrollto.y.t_end = t + t_in;
1985 if (!sid->scrollto.y.animator)
1987 sid->scrollto.y.animator =
1988 ecore_animator_add(_elm_scroll_scroll_to_y_animator, sid);
1989 if (!sid->scrollto.x.animator)
1990 _elm_scroll_anim_start(sid);
1992 if (sid->down.bounce_y_animator)
1994 ecore_animator_del(sid->down.bounce_y_animator);
1995 sid->down.bounce_y_animator = NULL;
1996 _elm_scroll_momentum_end(sid);
1997 if (sid->content_info.resized)
1998 _elm_scroll_wanted_region_set(sid->obj);
2000 sid->bouncemey = EINA_FALSE;
2004 _elm_scroll_scroll_to_x(Elm_Scrollable_Smart_Interface_Data *sid,
2008 Evas_Coord px, py, x, y, w, h;
2011 if (!sid->pan_obj) return;
2013 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
2015 if (sid->freeze) return;
2018 _elm_scroll_content_pos_get(sid->obj, &x, &y);
2019 _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
2021 _elm_scroll_content_region_set(sid->obj, x, y, w, h);
2024 t = ecore_loop_time_get();
2025 psd->api->pos_get(sid->pan_obj, &px, &py);
2026 sid->scrollto.x.start = px;
2027 sid->scrollto.x.end = pos_x;
2028 sid->scrollto.x.t_start = t;
2029 sid->scrollto.x.t_end = t + t_in;
2030 if (!sid->scrollto.x.animator)
2032 sid->scrollto.x.animator =
2033 ecore_animator_add(_elm_scroll_scroll_to_x_animator, sid);
2034 if (!sid->scrollto.y.animator)
2035 _elm_scroll_anim_start(sid);
2037 if (sid->down.bounce_x_animator)
2039 ecore_animator_del(sid->down.bounce_x_animator);
2040 sid->down.bounce_x_animator = NULL;
2041 _elm_scroll_momentum_end(sid);
2042 if (sid->content_info.resized)
2043 _elm_scroll_wanted_region_set(sid->obj);
2045 sid->bouncemex = EINA_FALSE;
2049 _elm_scroll_mouse_up_event_cb(void *data,
2051 Evas_Object *obj __UNUSED__,
2054 Elm_Scrollable_Smart_Interface_Data *sid = data;
2055 Evas_Coord x = 0, y = 0, ox = 0, oy = 0;
2056 Evas_Event_Mouse_Down *ev;
2058 if (!sid->pan_obj) return;
2060 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
2063 sid->down.hold_parent = EINA_FALSE;
2066 evas_post_event_callback_push(e, _elm_scroll_post_event_up, sid);
2068 // FIXME: respect elm_widget_scroll_hold_get of parent container
2069 if (!_elm_config->thumbscroll_enable) return;
2071 if (ev->button == 1)
2073 if (sid->down.onhold_animator)
2075 ecore_animator_del(sid->down.onhold_animator);
2076 sid->down.onhold_animator = NULL;
2077 if (sid->content_info.resized)
2078 _elm_scroll_wanted_region_set(sid->obj);
2080 x = ev->canvas.x - sid->down.x;
2081 y = ev->canvas.y - sid->down.y;
2082 if (sid->down.dragged)
2084 _elm_scroll_drag_stop(sid);
2085 if ((!sid->hold) && (!sid->freeze))
2089 Evas_Coord ax, ay, dx, dy, vel;
2092 t = ev->timestamp / 1000.0;
2094 t = ecore_loop_time_get();
2097 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2102 DBG("------ %i %i\n", ev->canvas.x, ev->canvas.y);
2104 for (i = 0; i < 60; i++)
2106 dt = t - sid->down.history[i].timestamp;
2107 if (dt > 0.2) break;
2109 DBG("H: %i %i @ %1.3f\n",
2110 sid->down.history[i].x,
2111 sid->down.history[i].y, dt);
2114 ax += sid->down.history[i].x;
2115 ay += sid->down.history[i].y;
2120 at /= _elm_config->thumbscroll_sensitivity_friction;
2121 dx = ev->canvas.x - ax;
2122 dy = ev->canvas.y - ay;
2125 vel = sqrt((dx * dx) + (dy * dy)) / at;
2126 if ((_elm_config->thumbscroll_friction > 0.0) &&
2127 (vel > _elm_config->thumbscroll_momentum_threshold))
2129 sid->down.dx = ((double)dx / at);
2130 sid->down.dy = ((double)dy / at);
2131 sid->down.extra_time = 0.0;
2132 sid->down.pdx = sid->down.dx;
2133 sid->down.pdy = sid->down.dy;
2136 if (!_paging_is_enabled(sid))
2138 if ((!sid->down.momentum_animator) &&
2139 (!sid->momentum_animator_disabled) &&
2141 (!elm_widget_drag_child_locked_y_get
2144 sid->down.momentum_animator =
2146 (_elm_scroll_momentum_animator, sid);
2148 EVAS_EVENT_FLAG_ON_SCROLL;
2149 _elm_scroll_anim_start(sid);
2151 sid->down.anim_start = ecore_loop_time_get();
2152 _elm_scroll_content_pos_get(sid->obj, &x, &y);
2166 evas_event_feed_hold(e, 0, ev->timestamp, ev->data);
2167 if (_paging_is_enabled(sid))
2169 Evas_Coord pgx, pgy;
2171 _elm_scroll_content_pos_get(sid->obj, &x, &y);
2173 (!elm_widget_drag_child_locked_x_get
2176 pgx = _elm_scroll_page_x_get(sid, ox);
2179 ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
2180 _elm_scroll_scroll_to_x
2181 (sid, _elm_config->page_scroll_friction, pgx);
2185 (!elm_widget_drag_child_locked_y_get
2188 pgy = _elm_scroll_page_y_get(sid, oy);
2191 ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
2192 _elm_scroll_scroll_to_y
2193 (sid, _elm_config->page_scroll_friction, pgy);
2202 if (_paging_is_enabled(sid))
2204 Evas_Coord pgx, pgy;
2206 _elm_scroll_content_pos_get(sid->obj, &x, &y);
2208 (!elm_widget_drag_child_locked_x_get
2211 pgx = _elm_scroll_page_x_get(sid, ox);
2213 _elm_scroll_scroll_to_x
2214 (sid, _elm_config->page_scroll_friction, pgx);
2217 (!elm_widget_drag_child_locked_y_get
2220 pgy = _elm_scroll_page_y_get(sid, oy);
2222 _elm_scroll_scroll_to_y
2223 (sid, _elm_config->page_scroll_friction, pgy);
2227 if (sid->down.hold_animator)
2229 ecore_animator_del(sid->down.hold_animator);
2230 sid->down.hold_animator = NULL;
2231 if (sid->content_info.resized)
2232 _elm_scroll_wanted_region_set(sid->obj);
2234 if (sid->down.scroll)
2236 ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
2237 sid->down.scroll = EINA_FALSE;
2241 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2242 sid->down.hold = EINA_FALSE;
2244 sid->down.dragged_began = EINA_FALSE;
2245 sid->down.dir_x = EINA_FALSE;
2246 sid->down.dir_y = EINA_FALSE;
2247 sid->down.want_dragged = EINA_FALSE;
2248 sid->down.dragged = EINA_FALSE;
2249 sid->down.now = EINA_FALSE;
2250 _elm_scroll_content_pos_get(sid->obj, &x, &y);
2251 _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
2252 _elm_scroll_wanted_coordinates_update(sid, x, y);
2254 if (sid->content_info.resized)
2255 _elm_scroll_wanted_region_set(sid->obj);
2257 if (!_paging_is_enabled(sid))
2258 _elm_scroll_bounce_eval(sid);
2263 _elm_scroll_mouse_down_event_cb(void *data,
2265 Evas_Object *obj __UNUSED__,
2268 Elm_Scrollable_Smart_Interface_Data *sid;
2269 Evas_Event_Mouse_Down *ev;
2270 Evas_Coord x = 0, y = 0;
2275 if (_elm_config->thumbscroll_enable)
2277 sid->down.hold = EINA_FALSE;
2278 if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
2279 (sid->down.momentum_animator) || (sid->scrollto.x.animator) ||
2280 (sid->scrollto.y.animator))
2282 ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL |
2283 EVAS_EVENT_FLAG_ON_HOLD;
2284 sid->down.scroll = EINA_TRUE;
2285 sid->down.hold = EINA_TRUE;
2286 _elm_scroll_anim_stop(sid);
2288 if (sid->scrollto.x.animator)
2290 ecore_animator_del(sid->scrollto.x.animator);
2291 sid->scrollto.x.animator = NULL;
2293 if (sid->scrollto.y.animator)
2295 ecore_animator_del(sid->scrollto.y.animator);
2296 sid->scrollto.y.animator = NULL;
2298 if (sid->down.bounce_x_animator)
2300 ecore_animator_del(sid->down.bounce_x_animator);
2301 sid->down.bounce_x_animator = NULL;
2302 sid->bouncemex = EINA_FALSE;
2303 if (sid->content_info.resized)
2304 _elm_scroll_wanted_region_set(sid->obj);
2306 if (sid->down.bounce_y_animator)
2308 ecore_animator_del(sid->down.bounce_y_animator);
2309 sid->down.bounce_y_animator = NULL;
2310 sid->bouncemey = EINA_FALSE;
2311 if (sid->content_info.resized)
2312 _elm_scroll_wanted_region_set(sid->obj);
2314 if (sid->down.hold_animator)
2316 ecore_animator_del(sid->down.hold_animator);
2317 sid->down.hold_animator = NULL;
2318 _elm_scroll_drag_stop(sid);
2319 if (sid->content_info.resized)
2320 _elm_scroll_wanted_region_set(sid->obj);
2322 if (sid->down.momentum_animator)
2324 ecore_animator_del(sid->down.momentum_animator);
2325 sid->down.momentum_animator = NULL;
2326 sid->down.bounce_x_hold = EINA_FALSE;
2327 sid->down.bounce_y_hold = EINA_FALSE;
2330 if (sid->content_info.resized)
2331 _elm_scroll_wanted_region_set(sid->obj);
2333 if (ev->button == 1)
2335 sid->down.hist.est_timestamp_diff =
2336 ecore_loop_time_get() - ((double)ev->timestamp / 1000.0);
2337 sid->down.hist.tadd = 0.0;
2338 sid->down.hist.dxsum = 0.0;
2339 sid->down.hist.dysum = 0.0;
2340 sid->down.now = EINA_TRUE;
2341 sid->down.dragged = EINA_FALSE;
2342 sid->down.dir_x = EINA_FALSE;
2343 sid->down.dir_y = EINA_FALSE;
2344 sid->down.x = ev->canvas.x;
2345 sid->down.y = ev->canvas.y;
2346 _elm_scroll_content_pos_get(sid->obj, &x, &y);
2349 sid->down.locked = EINA_FALSE;
2350 memset(&(sid->down.history[0]), 0,
2351 sizeof(sid->down.history[0]) * 60);
2353 sid->down.history[0].timestamp = ev->timestamp / 1000.0;
2354 sid->down.history[0].localtimestamp = ecore_loop_time_get();
2356 sid->down.history[0].timestamp = ecore_loop_time_get();
2358 sid->down.history[0].x = ev->canvas.x;
2359 sid->down.history[0].y = ev->canvas.y;
2361 sid->down.dragged_began = EINA_FALSE;
2362 sid->down.hold_parent = EINA_FALSE;
2363 sid->down.cancelled = EINA_FALSE;
2364 if (sid->hold || sid->freeze)
2365 sid->down.want_reset = EINA_TRUE;
2367 sid->down.want_reset = EINA_FALSE;
2372 _elm_scroll_can_scroll(Elm_Scrollable_Smart_Interface_Data *sid,
2375 Evas_Coord mx = 0, my = 0, px = 0, py = 0, minx = 0, miny = 0;
2377 if (!sid->pan_obj) return EINA_FALSE;
2379 ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
2381 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
2382 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
2383 psd->api->pos_get(sid->pan_obj, &px, &py);
2387 if (px > minx) return EINA_TRUE;
2391 if ((px - minx) < mx) return EINA_TRUE;
2395 if (py > miny) return EINA_TRUE;
2399 if ((py - miny) < my) return EINA_TRUE;
2409 _elm_scroll_post_event_move(void *data,
2412 Elm_Scrollable_Smart_Interface_Data *sid = data;
2414 if (sid->down.want_dragged)
2418 if (sid->down.hold_parent)
2420 if ((sid->down.dir_x) &&
2421 !_elm_scroll_can_scroll(sid, sid->down.hdir))
2423 sid->down.dir_x = EINA_FALSE;
2425 if ((sid->down.dir_y) &&
2426 !_elm_scroll_can_scroll(sid, sid->down.vdir))
2428 sid->down.dir_y = EINA_FALSE;
2431 if (sid->down.dir_x)
2434 (!elm_widget_drag_child_locked_x_get(sid->obj)))
2436 sid->down.want_dragged = EINA_FALSE;
2437 sid->down.dragged = EINA_TRUE;
2440 elm_widget_drag_lock_x_set(sid->obj, 1);
2445 sid->down.dir_x = EINA_FALSE;
2447 if (sid->down.dir_y)
2450 (!elm_widget_drag_child_locked_y_get(sid->obj)))
2452 sid->down.want_dragged = EINA_FALSE;
2453 sid->down.dragged = EINA_TRUE;
2456 elm_widget_drag_lock_y_set
2457 (sid->obj, EINA_TRUE);
2462 sid->down.dir_y = EINA_FALSE;
2464 if ((!sid->down.dir_x) && (!sid->down.dir_y))
2466 sid->down.cancelled = EINA_TRUE;
2468 if (start) _elm_scroll_drag_start(sid);
2475 _elm_scroll_down_coord_eval(Elm_Scrollable_Smart_Interface_Data *sid,
2479 Evas_Coord minx, miny;
2481 if (!sid->pan_obj) return;
2483 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
2485 if (sid->down.dir_x) *x = sid->down.sx - (*x - sid->down.x);
2486 else *x = sid->down.sx;
2487 if (sid->down.dir_y) *y = sid->down.sy - (*y - sid->down.y);
2488 else *y = sid->down.sy;
2490 if ((sid->down.dir_x) || (sid->down.dir_y))
2492 if (!((sid->down.dir_x) && (sid->down.dir_y)))
2494 if (sid->down.dir_x) *y = sid->down.locked_y;
2495 else *x = sid->down.locked_x;
2499 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
2502 *x += (minx - *x) * _elm_config->thumbscroll_border_friction;
2503 else if (sid->content_info.w <= sid->w)
2504 *x += (sid->down.sx - *x) * _elm_config->thumbscroll_border_friction;
2505 else if ((sid->content_info.w - sid->w + minx) < *x)
2506 *x += (sid->content_info.w - sid->w + minx - *x) *
2507 _elm_config->thumbscroll_border_friction;
2510 *y += (miny - *y) * _elm_config->thumbscroll_border_friction;
2511 else if (sid->content_info.h <= sid->h)
2512 *y += (sid->down.sy - *y) * _elm_config->thumbscroll_border_friction;
2513 else if ((sid->content_info.h - sid->h + miny) < *y)
2514 *y += (sid->content_info.h - sid->h + miny - *y) *
2515 _elm_config->thumbscroll_border_friction;
2519 _elm_scroll_hold_animator(void *data)
2521 Elm_Scrollable_Smart_Interface_Data *sid = data;
2522 Evas_Coord ox = 0, oy = 0, fx = 0, fy = 0;
2524 fx = sid->down.hold_x;
2525 fy = sid->down.hold_y;
2527 _elm_scroll_content_pos_get(sid->obj, &ox, &oy);
2528 if (sid->down.dir_x)
2531 (!elm_widget_drag_child_locked_x_get(sid->obj)))
2534 if (sid->down.dir_y)
2537 (!elm_widget_drag_child_locked_y_get(sid->obj)))
2541 _elm_scroll_content_pos_set(sid->obj, ox, oy, EINA_TRUE);
2543 return ECORE_CALLBACK_RENEW;
2547 _elm_scroll_on_hold_animator(void *data)
2551 Evas_Coord x, y, ox, oy;
2552 Elm_Scrollable_Smart_Interface_Data *sid;
2555 t = ecore_loop_time_get();
2556 if (sid->down.onhold_tlast > 0.0)
2558 td = t - sid->down.onhold_tlast;
2559 vx = sid->down.onhold_vx * td *
2560 (double)_elm_config->thumbscroll_hold_threshold * 2.0;
2561 vy = sid->down.onhold_vy * td *
2562 (double)_elm_config->thumbscroll_hold_threshold * 2.0;
2563 _elm_scroll_content_pos_get(sid->obj, &ox, &oy);
2567 if (sid->down.dir_x)
2570 (!elm_widget_drag_child_locked_x_get(sid->obj)))
2572 sid->down.onhold_vxe += vx;
2573 x = ox + (int)sid->down.onhold_vxe;
2574 sid->down.onhold_vxe -= (int)sid->down.onhold_vxe;
2578 if (sid->down.dir_y)
2581 (!elm_widget_drag_child_locked_y_get(sid->obj)))
2583 sid->down.onhold_vye += vy;
2584 y = oy + (int)sid->down.onhold_vye;
2585 sid->down.onhold_vye -= (int)sid->down.onhold_vye;
2589 _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
2591 sid->down.onhold_tlast = t;
2593 return ECORE_CALLBACK_RENEW;
2597 _elm_scroll_mouse_move_event_cb(void *data,
2599 Evas_Object *obj __UNUSED__,
2602 Elm_Scrollable_Smart_Interface_Data *sid = data;
2603 Evas_Event_Mouse_Move *ev;
2604 Evas_Coord x = 0, y = 0;
2606 if (!sid->pan_obj) return;
2608 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
2611 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
2612 sid->down.hold_parent = EINA_TRUE;
2613 evas_post_event_callback_push(e, _elm_scroll_post_event_move, sid);
2615 // FIXME: respect elm_widget_scroll_hold_get of parent container
2616 if (_elm_config->thumbscroll_enable)
2622 if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze))
2625 ecore_animator_del(sid->scrollto.x.animator);
2626 sid->scrollto.x.animator = NULL;
2627 psd->api->pos_get(sid->pan_obj, &px, NULL);
2629 sid->down.x = sid->down.history[0].x;
2632 if ((sid->scrollto.y.animator) && (!sid->hold) && (!sid->freeze))
2635 ecore_animator_del(sid->scrollto.y.animator);
2636 sid->scrollto.y.animator = NULL;
2637 psd->api->pos_get(sid->pan_obj, NULL, &py);
2639 sid->down.y = sid->down.history[0].y;
2643 DBG("::: %i %i\n", ev->cur.canvas.x, ev->cur.canvas.y);
2645 memmove(&(sid->down.history[1]), &(sid->down.history[0]),
2646 sizeof(sid->down.history[0]) * (60 - 1));
2648 sid->down.history[0].timestamp = ev->timestamp / 1000.0;
2649 sid->down.history[0].localtimestamp = ecore_loop_time_get();
2651 sid->down.history[0].timestamp = ecore_loop_time_get();
2653 sid->down.history[0].x = ev->cur.canvas.x;
2654 sid->down.history[0].y = ev->cur.canvas.y;
2656 if (!sid->down.dragged_began)
2658 x = ev->cur.canvas.x - sid->down.x;
2659 y = ev->cur.canvas.y - sid->down.y;
2661 sid->down.hdir = -1;
2662 sid->down.vdir = -1;
2664 if (x > 0) sid->down.hdir = LEFT;
2666 sid->down.hdir = RIGHT;
2667 if (y > 0) sid->down.vdir = UP;
2669 sid->down.vdir = DOWN;
2674 if ((sid->one_direction_at_a_time) &&
2675 (!((sid->down.dir_x) || (sid->down.dir_y))))
2677 if (x > _elm_config->thumbscroll_threshold)
2681 sid->down.dir_x = EINA_TRUE;
2682 sid->down.dir_y = EINA_FALSE;
2686 if (y > _elm_config->thumbscroll_threshold)
2690 sid->down.dir_x = EINA_FALSE;
2691 sid->down.dir_y = EINA_TRUE;
2697 sid->down.dir_x = EINA_TRUE;
2698 sid->down.dir_y = EINA_TRUE;
2703 sid->down.dir_x = EINA_TRUE;
2704 sid->down.dir_y = EINA_TRUE;
2707 if ((!sid->hold) && (!sid->freeze))
2709 if ((sid->down.dragged) ||
2710 (((x * x) + (y * y)) >
2711 (_elm_config->thumbscroll_threshold *
2712 _elm_config->thumbscroll_threshold)))
2714 sid->down.dragged_began = EINA_TRUE;
2715 if (!sid->down.dragged)
2717 sid->down.want_dragged = EINA_TRUE;
2718 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2720 if (sid->down.dragged)
2722 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2724 if (sid->down.dir_x)
2725 x = sid->down.sx - (ev->cur.canvas.x - sid->down.x);
2728 if (sid->down.dir_y)
2729 y = sid->down.sy - (ev->cur.canvas.y - sid->down.y);
2732 if (sid->down.want_reset)
2734 sid->down.x = ev->cur.canvas.x;
2735 sid->down.y = ev->cur.canvas.y;
2736 sid->down.want_reset = EINA_FALSE;
2738 if ((sid->down.dir_x) || (sid->down.dir_y))
2740 if (!sid->down.locked)
2742 sid->down.locked_x = x;
2743 sid->down.locked_y = y;
2744 sid->down.locked = EINA_TRUE;
2746 if (!((sid->down.dir_x) && (sid->down.dir_y)))
2748 if (sid->down.dir_x) y = sid->down.locked_y;
2749 else x = sid->down.locked_x;
2753 Evas_Coord minx, miny, mx, my;
2755 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
2756 psd->api->pos_max_get(sid->pan_obj, &mx, &my);
2759 _elm_config->thumbscroll_border_friction;
2761 y += (sid->down.sy - y) *
2762 _elm_config->thumbscroll_border_friction;
2763 else if ((my + miny) < y)
2764 y += (my + miny - y) *
2765 _elm_config->thumbscroll_border_friction;
2768 _elm_config->thumbscroll_border_friction;
2770 x += (sid->down.sx - x) *
2771 _elm_config->thumbscroll_border_friction;
2772 else if ((mx + minx) < x)
2773 x += (mx + minx - x) *
2774 _elm_config->thumbscroll_border_friction;
2777 sid->down.hold_x = x;
2778 sid->down.hold_y = y;
2779 if (!sid->down.hold_animator)
2780 sid->down.hold_animator =
2781 ecore_animator_add(_elm_scroll_hold_animator, sid);
2785 if (sid->down.dragged_began)
2787 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2788 if (!sid->down.hold)
2790 sid->down.hold = EINA_TRUE;
2791 evas_event_feed_hold
2792 (e, 1, ev->timestamp, ev->data);
2797 else if (!sid->freeze)
2799 double vx = 0.0, vy = 0.0;
2801 x = ev->cur.canvas.x - sid->x;
2802 y = ev->cur.canvas.y - sid->y;
2803 if (x < _elm_config->thumbscroll_hold_threshold)
2805 if (_elm_config->thumbscroll_hold_threshold > 0.0)
2806 vx = -(double)(_elm_config->thumbscroll_hold_threshold - x)
2807 / _elm_config->thumbscroll_hold_threshold;
2811 else if (x > (sid->w - _elm_config->thumbscroll_hold_threshold))
2813 if (_elm_config->thumbscroll_hold_threshold > 0.0)
2814 vx = (double)(_elm_config->thumbscroll_hold_threshold -
2816 _elm_config->thumbscroll_hold_threshold;
2820 if (y < _elm_config->thumbscroll_hold_threshold)
2822 if (_elm_config->thumbscroll_hold_threshold > 0.0)
2823 vy = -(double)(_elm_config->thumbscroll_hold_threshold - y)
2824 / _elm_config->thumbscroll_hold_threshold;
2828 else if (y > (sid->h - _elm_config->thumbscroll_hold_threshold))
2830 if (_elm_config->thumbscroll_hold_threshold > 0.0)
2831 vy = (double)(_elm_config->thumbscroll_hold_threshold -
2833 _elm_config->thumbscroll_hold_threshold;
2837 if ((vx != 0.0) || (vy != 0.0))
2839 sid->down.onhold_vx = vx;
2840 sid->down.onhold_vy = vy;
2841 if (!sid->down.onhold_animator)
2843 sid->down.onhold_vxe = 0.0;
2844 sid->down.onhold_vye = 0.0;
2845 sid->down.onhold_tlast = 0.0;
2846 sid->down.onhold_animator = ecore_animator_add
2847 (_elm_scroll_on_hold_animator, sid);
2852 if (sid->down.onhold_animator)
2854 ecore_animator_del(sid->down.onhold_animator);
2855 sid->down.onhold_animator = NULL;
2856 if (sid->content_info.resized)
2857 _elm_scroll_wanted_region_set(sid->obj);
2866 _elm_scroll_page_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
2868 Evas_Coord x, y, w, h;
2870 if (!_paging_is_enabled(sid)) return;
2872 _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
2874 x = _elm_scroll_page_x_get(sid, 0);
2875 y = _elm_scroll_page_y_get(sid, 0);
2877 _elm_scroll_content_region_set(sid->obj, x, y, w, h);
2881 _elm_scroll_reconfigure(Elm_Scrollable_Smart_Interface_Data *sid)
2883 _elm_scroll_scroll_bar_size_adjust(sid);
2884 _elm_scroll_page_adjust(sid);
2888 _on_edje_move(void *data,
2890 Evas_Object *edje_obj,
2891 void *event_info __UNUSED__)
2893 Elm_Scrollable_Smart_Interface_Data *sid = data;
2896 evas_object_geometry_get(edje_obj, &x, &y, NULL, NULL);
2901 _elm_scroll_reconfigure(sid);
2905 _on_edje_resize(void *data,
2907 Evas_Object *edje_obj,
2908 void *event_info __UNUSED__)
2910 Elm_Scrollable_Smart_Interface_Data *sid = data;
2913 evas_object_geometry_get(edje_obj, NULL, NULL, &w, &h);
2918 _elm_scroll_reconfigure(sid);
2919 _elm_scroll_wanted_region_set(sid->obj);
2923 _scroll_edje_object_attach(Evas_Object *obj)
2925 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
2927 evas_object_event_callback_add
2928 (sid->edje_obj, EVAS_CALLBACK_RESIZE, _on_edje_resize, sid);
2929 evas_object_event_callback_add
2930 (sid->edje_obj, EVAS_CALLBACK_MOVE, _on_edje_move, sid);
2932 edje_object_signal_callback_add
2933 (sid->edje_obj, "drag", "elm.dragable.vbar", _elm_scroll_vbar_drag_cb,
2935 edje_object_signal_callback_add
2936 (sid->edje_obj, "drag,set", "elm.dragable.vbar",
2937 _elm_scroll_edje_drag_v_cb, sid);
2938 edje_object_signal_callback_add
2939 (sid->edje_obj, "drag,start", "elm.dragable.vbar",
2940 _elm_scroll_edje_drag_v_start_cb, sid);
2941 edje_object_signal_callback_add
2942 (sid->edje_obj, "drag,stop", "elm.dragable.vbar",
2943 _elm_scroll_edje_drag_v_stop_cb, sid);
2944 edje_object_signal_callback_add
2945 (sid->edje_obj, "drag,step", "elm.dragable.vbar",
2946 _elm_scroll_edje_drag_v_cb, sid);
2947 edje_object_signal_callback_add
2948 (sid->edje_obj, "drag,page", "elm.dragable.vbar",
2949 _elm_scroll_edje_drag_v_cb, sid);
2950 edje_object_signal_callback_add
2951 (sid->edje_obj, "elm,vbar,press", "elm",
2952 _elm_scroll_vbar_press_cb, sid);
2953 edje_object_signal_callback_add
2954 (sid->edje_obj, "elm,vbar,unpress", "elm",
2955 _elm_scroll_vbar_unpress_cb, sid);
2956 edje_object_signal_callback_add
2957 (sid->edje_obj, "drag", "elm.dragable.hbar", _elm_scroll_hbar_drag_cb,
2959 edje_object_signal_callback_add
2960 (sid->edje_obj, "drag,set", "elm.dragable.hbar",
2961 _elm_scroll_edje_drag_h_cb, sid);
2962 edje_object_signal_callback_add
2963 (sid->edje_obj, "drag,start", "elm.dragable.hbar",
2964 _elm_scroll_edje_drag_h_start_cb, sid);
2965 edje_object_signal_callback_add
2966 (sid->edje_obj, "drag,stop", "elm.dragable.hbar",
2967 _elm_scroll_edje_drag_h_stop_cb, sid);
2968 edje_object_signal_callback_add
2969 (sid->edje_obj, "drag,step", "elm.dragable.hbar",
2970 _elm_scroll_edje_drag_h_cb, sid);
2971 edje_object_signal_callback_add
2972 (sid->edje_obj, "drag,page", "elm.dragable.hbar",
2973 _elm_scroll_edje_drag_h_cb, sid);
2974 edje_object_signal_callback_add
2975 (sid->edje_obj, "elm,hbar,press", "elm",
2976 _elm_scroll_hbar_press_cb, sid);
2977 edje_object_signal_callback_add
2978 (sid->edje_obj, "elm,hbar,unpress", "elm",
2979 _elm_scroll_hbar_unpress_cb, sid);
2983 _scroll_event_object_attach(Evas_Object *obj)
2985 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
2987 evas_object_event_callback_add
2988 (sid->event_rect, EVAS_CALLBACK_MOUSE_WHEEL, _elm_scroll_wheel_event_cb,
2990 evas_object_event_callback_add
2991 (sid->event_rect, EVAS_CALLBACK_MOUSE_DOWN,
2992 _elm_scroll_mouse_down_event_cb, sid);
2993 evas_object_event_callback_add
2994 (sid->event_rect, EVAS_CALLBACK_MOUSE_UP,
2995 _elm_scroll_mouse_up_event_cb, sid);
2996 evas_object_event_callback_add
2997 (sid->event_rect, EVAS_CALLBACK_MOUSE_MOVE,
2998 _elm_scroll_mouse_move_event_cb, sid);
3002 _scroll_edje_object_detach(Evas_Object *obj)
3004 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3006 evas_object_event_callback_del_full
3007 (sid->edje_obj, EVAS_CALLBACK_RESIZE, _on_edje_resize, sid);
3008 evas_object_event_callback_del_full
3009 (sid->edje_obj, EVAS_CALLBACK_MOVE, _on_edje_move, sid);
3011 edje_object_signal_callback_del_full
3012 (sid->edje_obj, "drag", "elm.dragable.vbar", _elm_scroll_vbar_drag_cb,
3014 edje_object_signal_callback_del_full
3015 (sid->edje_obj, "drag,set", "elm.dragable.vbar",
3016 _elm_scroll_edje_drag_v_cb, sid);
3017 edje_object_signal_callback_del_full
3018 (sid->edje_obj, "drag,start", "elm.dragable.vbar",
3019 _elm_scroll_edje_drag_v_start_cb, sid);
3020 edje_object_signal_callback_del_full
3021 (sid->edje_obj, "drag,stop", "elm.dragable.vbar",
3022 _elm_scroll_edje_drag_v_stop_cb, sid);
3023 edje_object_signal_callback_del_full
3024 (sid->edje_obj, "drag,step", "elm.dragable.vbar",
3025 _elm_scroll_edje_drag_v_cb, sid);
3026 edje_object_signal_callback_del_full
3027 (sid->edje_obj, "drag,page", "elm.dragable.vbar",
3028 _elm_scroll_edje_drag_v_cb, sid);
3029 edje_object_signal_callback_del_full
3030 (sid->edje_obj, "elm,vbar,press", "elm",
3031 _elm_scroll_vbar_press_cb, sid);
3032 edje_object_signal_callback_del_full
3033 (sid->edje_obj, "elm,vbar,unpress", "elm",
3034 _elm_scroll_vbar_unpress_cb, sid);
3035 edje_object_signal_callback_del_full
3036 (sid->edje_obj, "drag", "elm.dragable.hbar", _elm_scroll_hbar_drag_cb,
3038 edje_object_signal_callback_del_full
3039 (sid->edje_obj, "drag,set", "elm.dragable.hbar",
3040 _elm_scroll_edje_drag_h_cb, sid);
3041 edje_object_signal_callback_del_full
3042 (sid->edje_obj, "drag,start", "elm.dragable.hbar",
3043 _elm_scroll_edje_drag_h_start_cb, sid);
3044 edje_object_signal_callback_del_full
3045 (sid->edje_obj, "drag,stop", "elm.dragable.hbar",
3046 _elm_scroll_edje_drag_h_stop_cb, sid);
3047 edje_object_signal_callback_del_full
3048 (sid->edje_obj, "drag,step", "elm.dragable.hbar",
3049 _elm_scroll_edje_drag_h_cb, sid);
3050 edje_object_signal_callback_del_full
3051 (sid->edje_obj, "drag,page", "elm.dragable.hbar",
3052 _elm_scroll_edje_drag_h_cb, sid);
3053 edje_object_signal_callback_del_full
3054 (sid->edje_obj, "elm,hbar,press", "elm",
3055 _elm_scroll_hbar_press_cb, sid);
3056 edje_object_signal_callback_del_full
3057 (sid->edje_obj, "elm,hbar,unpress", "elm",
3058 _elm_scroll_hbar_unpress_cb, sid);
3062 _scroll_event_object_detach(Evas_Object *obj)
3064 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3066 evas_object_event_callback_del_full
3067 (sid->event_rect, EVAS_CALLBACK_MOUSE_WHEEL, _elm_scroll_wheel_event_cb,
3069 evas_object_event_callback_del_full
3070 (sid->event_rect, EVAS_CALLBACK_MOUSE_DOWN,
3071 _elm_scroll_mouse_down_event_cb, sid);
3072 evas_object_event_callback_del_full
3073 (sid->event_rect, EVAS_CALLBACK_MOUSE_UP,
3074 _elm_scroll_mouse_up_event_cb, sid);
3075 evas_object_event_callback_del_full
3076 (sid->event_rect, EVAS_CALLBACK_MOUSE_MOVE,
3077 _elm_scroll_mouse_move_event_cb, sid);
3081 _elm_scroll_objects_set(Evas_Object *obj,
3082 Evas_Object *edje_object,
3083 Evas_Object *hit_rectangle)
3087 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3089 if (!edje_object || !hit_rectangle) return;
3092 _scroll_edje_object_detach(obj);
3094 sid->edje_obj = edje_object;
3096 if (sid->event_rect)
3097 _scroll_event_object_detach(obj);
3099 sid->event_rect = hit_rectangle;
3100 evas_object_repeat_events_set(hit_rectangle, EINA_TRUE);
3102 _scroll_edje_object_attach(obj);
3103 _scroll_event_object_attach(obj);
3106 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
3107 if (edje_object_part_exists(sid->edje_obj, "elm.scrollbar.base"))
3111 base = edje_object_part_swallow_get
3112 (sid->edje_obj, "elm.scrollbar.base");
3115 base = evas_object_rectangle_add
3116 (evas_object_evas_get(sid->edje_obj));
3117 evas_object_color_set(base, 0, 0, 0, 0);
3118 edje_object_part_swallow
3119 (sid->edje_obj, "elm.scrollbar.base", base);
3121 if (!_elm_config->thumbscroll_enable)
3122 evas_object_size_hint_min_set(base, mw, mh);
3125 _elm_scroll_scroll_bar_visibility_adjust(sid);
3129 _elm_scroll_scroll_bar_reset(Elm_Scrollable_Smart_Interface_Data *sid)
3131 Evas_Coord px = 0, py = 0, minx = 0, miny = 0;
3133 if (!sid->edje_obj) return;
3135 edje_object_part_drag_value_set
3136 (sid->edje_obj, "elm.dragable.vbar", 0.0, 0.0);
3137 edje_object_part_drag_value_set
3138 (sid->edje_obj, "elm.dragable.hbar", 0.0, 0.0);
3139 if ((!sid->content) && (!sid->extern_pan))
3141 edje_object_part_drag_size_set
3142 (sid->edje_obj, "elm.dragable.vbar", 1.0, 1.0);
3143 edje_object_part_drag_size_set
3144 (sid->edje_obj, "elm.dragable.hbar", 1.0, 1.0);
3148 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
3150 psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
3151 psd->api->pos_get(sid->pan_obj, &px, &py);
3152 psd->api->pos_set(sid->pan_obj, minx, miny);
3154 if ((px != minx) || (py != miny))
3155 edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
3156 _elm_direction_arrows_eval(sid);
3159 /* even external pan objects get this */
3161 _elm_scroll_pan_changed_cb(void *data,
3162 Evas_Object *obj __UNUSED__,
3163 void *event_info __UNUSED__)
3166 Elm_Scrollable_Smart_Interface_Data *sid = data;
3168 if (!sid->pan_obj) return;
3170 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
3172 psd->api->content_size_get(sid->pan_obj, &w, &h);
3173 if ((w != sid->content_info.w) || (h != sid->content_info.h))
3175 sid->content_info.w = w;
3176 sid->content_info.h = h;
3177 _elm_scroll_scroll_bar_size_adjust(sid);
3179 evas_object_size_hint_min_set
3180 (sid->edje_obj, sid->content_info.w, sid->content_info.h);
3181 sid->content_info.resized = EINA_TRUE;
3182 _elm_scroll_wanted_region_set(sid->obj);
3187 _elm_scroll_content_del_cb(void *data,
3189 Evas_Object *obj __UNUSED__,
3190 void *event_info __UNUSED__)
3192 Elm_Scrollable_Smart_Interface_Data *sid = data;
3194 sid->content = NULL;
3195 _elm_scroll_scroll_bar_size_adjust(sid);
3196 _elm_scroll_scroll_bar_reset(sid);
3200 _elm_scroll_content_set(Evas_Object *obj,
3201 Evas_Object *content)
3206 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3208 if (!sid->edje_obj) return;
3212 /* if we had content, for sure we had a pan object */
3213 _elm_pan_content_set(sid->pan_obj, NULL);
3214 evas_object_event_callback_del_full
3215 (sid->content, EVAS_CALLBACK_DEL, _elm_scroll_content_del_cb, sid);
3218 sid->content = content;
3219 sid->wx = sid->wy = 0;
3220 /* (-1) means want viewports size */
3221 sid->ww = sid->wh = -1;
3222 if (!content) return;
3226 o = _elm_pan_add(evas_object_evas_get(obj));
3228 evas_object_smart_callback_add
3229 (o, SIG_CHANGED, _elm_scroll_pan_changed_cb, sid);
3230 edje_object_part_swallow(sid->edje_obj, "elm.swallow.content", o);
3233 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
3235 evas_object_event_callback_add
3236 (content, EVAS_CALLBACK_DEL, _elm_scroll_content_del_cb, sid);
3238 _elm_pan_content_set(sid->pan_obj, content);
3239 psd->api->content_size_get(sid->pan_obj, &w, &h);
3240 sid->content_info.w = w;
3241 sid->content_info.h = h;
3243 _elm_scroll_scroll_bar_size_adjust(sid);
3244 _elm_scroll_scroll_bar_reset(sid);
3248 _elm_scroll_extern_pan_set(Evas_Object *obj,
3251 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3253 if (!sid->edje_obj) return;
3255 _elm_scroll_content_set(obj, NULL);
3259 evas_object_smart_callback_del
3260 (sid->pan_obj, SIG_CHANGED, _elm_scroll_pan_changed_cb);
3263 if (sid->extern_pan)
3267 /* not owned by scroller, just leave (was external already) */
3268 edje_object_part_unswallow(sid->edje_obj, sid->pan_obj);
3269 sid->pan_obj = NULL;
3276 evas_object_del(sid->pan_obj);
3277 sid->pan_obj = NULL;
3282 sid->extern_pan = EINA_FALSE;
3288 sid->extern_pan = EINA_TRUE;
3289 evas_object_smart_callback_add
3290 (sid->pan_obj, SIG_CHANGED, _elm_scroll_pan_changed_cb, sid);
3291 edje_object_part_swallow
3292 (sid->edje_obj, "elm.swallow.content", sid->pan_obj);
3296 _elm_scroll_drag_start_cb_set(Evas_Object *obj,
3297 void (*drag_start_cb)(Evas_Object *obj,
3300 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3302 sid->cb_func.drag_start = drag_start_cb;
3306 _elm_scroll_drag_stop_cb_set(Evas_Object *obj,
3307 void (*drag_stop_cb)(Evas_Object *obj,
3310 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3312 sid->cb_func.drag_stop = drag_stop_cb;
3316 _elm_scroll_animate_start_cb_set(Evas_Object *obj,
3317 void (*animate_start_cb)(Evas_Object *obj,
3320 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3322 sid->cb_func.animate_start = animate_start_cb;
3326 _elm_scroll_animate_stop_cb_set(Evas_Object *obj,
3327 void (*animate_stop_cb)(Evas_Object *obj,
3330 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3332 sid->cb_func.animate_stop = animate_stop_cb;
3336 _elm_scroll_scroll_cb_set(Evas_Object *obj,
3337 void (*scroll_cb)(Evas_Object *obj,
3340 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3342 sid->cb_func.scroll = scroll_cb;
3346 _elm_scroll_edge_left_cb_set(Evas_Object *obj,
3347 void (*edge_left_cb)(Evas_Object *obj,
3350 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3352 sid->cb_func.edge_left = edge_left_cb;
3356 _elm_scroll_edge_right_cb_set(Evas_Object *obj,
3357 void (*edge_right_cb)(Evas_Object *obj,
3360 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3362 sid->cb_func.edge_right = edge_right_cb;
3366 _elm_scroll_edge_top_cb_set(Evas_Object *obj,
3367 void (*edge_top_cb)(Evas_Object *obj,
3370 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3372 sid->cb_func.edge_top = edge_top_cb;
3376 _elm_scroll_edge_bottom_cb_set(Evas_Object *obj,
3377 void (*edge_bottom_cb)(Evas_Object *obj,
3380 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3382 sid->cb_func.edge_bottom = edge_bottom_cb;
3386 _elm_scroll_vbar_drag_cb_set(Evas_Object *obj,
3387 void (*vbar_drag_cb)(Evas_Object *obj,
3390 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3392 sid->cb_func.vbar_drag = vbar_drag_cb;
3396 _elm_scroll_vbar_press_cb_set(Evas_Object *obj,
3397 void (*vbar_press_cb)(Evas_Object *obj,
3400 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3402 sid->cb_func.vbar_press = vbar_press_cb;
3406 _elm_scroll_vbar_unpress_cb_set(Evas_Object *obj,
3407 void (*vbar_unpress_cb)(Evas_Object *obj,
3410 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3412 sid->cb_func.vbar_unpress = vbar_unpress_cb;
3416 _elm_scroll_hbar_drag_cb_set(Evas_Object *obj,
3417 void (*hbar_drag_cb)(Evas_Object *obj,
3420 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3422 sid->cb_func.hbar_drag = hbar_drag_cb;
3426 _elm_scroll_hbar_press_cb_set(Evas_Object *obj,
3427 void (*hbar_press_cb)(Evas_Object *obj,
3430 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3432 sid->cb_func.hbar_press = hbar_press_cb;
3436 _elm_scroll_hbar_unpress_cb_set(Evas_Object *obj,
3437 void (*hbar_unpress_cb)(Evas_Object *obj,
3440 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3442 sid->cb_func.hbar_unpress = hbar_unpress_cb;
3446 _elm_scroll_content_min_limit_cb_set(Evas_Object *obj,
3447 void (*c_min_limit_cb)(Evas_Object *obj,
3451 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3453 sid->cb_func.content_min_limit = c_min_limit_cb;
3457 _elm_scroll_momentum_animator_disabled_get(const Evas_Object *obj)
3459 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
3461 return sid->momentum_animator_disabled;
3465 _elm_scroll_momentum_animator_disabled_set(Evas_Object *obj,
3468 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3470 sid->momentum_animator_disabled = disabled;
3471 if (sid->momentum_animator_disabled)
3473 if (sid->down.momentum_animator)
3475 ecore_animator_del(sid->down.momentum_animator);
3476 sid->down.momentum_animator = NULL;
3477 if (sid->content_info.resized)
3478 _elm_scroll_wanted_region_set(sid->obj);
3484 _elm_scroll_bounce_animator_disabled_get(const Evas_Object *obj)
3486 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
3488 return sid->bounce_animator_disabled;
3492 _elm_scroll_bounce_animator_disabled_set(Evas_Object *obj,
3495 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3497 sid->bounce_animator_disabled = disabled;
3498 if (sid->bounce_animator_disabled)
3500 if (sid->scrollto.x.animator)
3502 ecore_animator_del(sid->scrollto.x.animator);
3503 sid->scrollto.x.animator = NULL;
3506 if (sid->scrollto.y.animator)
3508 ecore_animator_del(sid->scrollto.y.animator);
3509 sid->scrollto.y.animator = NULL;
3515 _elm_scroll_wheel_disabled_get(const Evas_Object *obj)
3517 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
3519 return sid->wheel_disabled;
3523 _elm_scroll_wheel_disabled_set(Evas_Object *obj,
3526 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3528 if (!sid->event_rect) return;
3530 if ((!sid->wheel_disabled) && (disabled))
3531 evas_object_event_callback_del_full
3532 (sid->event_rect, EVAS_CALLBACK_MOUSE_WHEEL,
3533 _elm_scroll_wheel_event_cb, sid);
3534 else if ((sid->wheel_disabled) && (!disabled))
3535 evas_object_event_callback_add
3536 (sid->event_rect, EVAS_CALLBACK_MOUSE_WHEEL,
3537 _elm_scroll_wheel_event_cb, sid);
3538 sid->wheel_disabled = disabled;
3542 _elm_scroll_step_size_set(Evas_Object *obj,
3546 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3553 _elm_scroll_scroll_bar_size_adjust(sid);
3557 _elm_scroll_step_size_get(const Evas_Object *obj,
3561 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3563 if (x) *x = sid->step.x;
3564 if (y) *y = sid->step.y;
3568 _elm_scroll_page_size_set(Evas_Object *obj,
3572 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3577 _elm_scroll_scroll_bar_size_adjust(sid);
3581 _elm_scroll_page_size_get(const Evas_Object *obj,
3585 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3587 if (x) *x = sid->page.x;
3588 if (y) *y = sid->page.y;
3592 _elm_scroll_policy_set(Evas_Object *obj,
3593 Elm_Scroller_Policy hbar,
3594 Elm_Scroller_Policy vbar)
3596 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3598 if (!sid->edje_obj) return;
3600 if ((sid->hbar_flags == hbar) && (sid->vbar_flags == vbar)) return;
3602 sid->hbar_flags = hbar;
3603 sid->vbar_flags = vbar;
3604 if (sid->hbar_flags == ELM_SCROLLER_POLICY_ON)
3605 edje_object_signal_emit
3606 (sid->edje_obj, "elm,action,show_always,hbar", "elm");
3607 else if (sid->hbar_flags == ELM_SCROLLER_POLICY_OFF)
3608 edje_object_signal_emit
3609 (sid->edje_obj, "elm,action,hide,hbar", "elm");
3611 edje_object_signal_emit
3612 (sid->edje_obj, "elm,action,show_notalways,hbar", "elm");
3613 if (sid->vbar_flags == ELM_SCROLLER_POLICY_ON)
3614 edje_object_signal_emit
3615 (sid->edje_obj, "elm,action,show_always,vbar", "elm");
3616 else if (sid->vbar_flags == ELM_SCROLLER_POLICY_OFF)
3617 edje_object_signal_emit
3618 (sid->edje_obj, "elm,action,hide,vbar", "elm");
3620 edje_object_signal_emit
3621 (sid->edje_obj, "elm,action,show_notalways,vbar", "elm");
3622 edje_object_message_signal_process(sid->edje_obj);
3623 _elm_scroll_scroll_bar_size_adjust(sid);
3624 if (sid->cb_func.content_min_limit)
3625 sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
3626 _elm_direction_arrows_eval(sid);
3630 _elm_scroll_policy_get(const Evas_Object *obj,
3631 Elm_Scroller_Policy *hbar,
3632 Elm_Scroller_Policy *vbar)
3634 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3636 if (hbar) *hbar = sid->hbar_flags;
3637 if (vbar) *vbar = sid->vbar_flags;
3641 _elm_scroll_single_direction_set(Evas_Object *obj,
3642 Eina_Bool single_dir)
3644 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3646 sid->one_direction_at_a_time = single_dir;
3650 _elm_scroll_single_direction_get(const Evas_Object *obj)
3652 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
3654 return sid->one_direction_at_a_time;
3658 _elm_scroll_hold_set(Evas_Object *obj,
3661 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3667 _elm_scroll_freeze_set(Evas_Object *obj,
3670 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3672 sid->freeze = freeze;
3675 if (sid->down.onhold_animator)
3677 ecore_animator_del(sid->down.onhold_animator);
3678 sid->down.onhold_animator = NULL;
3679 if (sid->content_info.resized)
3680 _elm_scroll_wanted_region_set(sid->obj);
3684 _elm_scroll_bounce_eval(sid);
3688 _elm_scroll_bounce_allow_set(Evas_Object *obj,
3692 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3694 sid->bounce_horiz = !!horiz;
3695 sid->bounce_vert = !!vert;
3699 _elm_scroll_bounce_allow_get(const Evas_Object *obj,
3703 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3705 if (horiz) *horiz = sid->bounce_horiz;
3706 if (vert) *vert = sid->bounce_vert;
3710 _elm_scroll_paging_set(Evas_Object *obj,
3713 Evas_Coord pagesize_h,
3714 Evas_Coord pagesize_v)
3716 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3718 sid->pagerel_h = pagerel_h;
3719 sid->pagerel_v = pagerel_v;
3720 sid->pagesize_h = pagesize_h;
3721 sid->pagesize_v = pagesize_v;
3723 _elm_scroll_page_adjust(sid);
3727 _elm_scroll_paging_get(const Evas_Object *obj,
3730 Evas_Coord *pagesize_h,
3731 Evas_Coord *pagesize_v)
3733 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3735 if (pagerel_h) *pagerel_h = sid->pagerel_h;
3736 if (pagerel_v) *pagerel_v = sid->pagerel_v;
3737 if (pagesize_h) *pagesize_h = sid->pagesize_h;
3738 if (pagesize_v) *pagesize_v = sid->pagesize_v;
3742 _elm_scroll_current_page_get(const Evas_Object *obj,
3748 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3750 _elm_scroll_content_pos_get(sid->obj, &x, &y);
3753 if (sid->pagesize_h > 0)
3754 *pagenumber_h = (x + sid->pagesize_h - 1) / sid->pagesize_h;
3760 if (sid->pagesize_v > 0)
3761 *pagenumber_v = (y + sid->pagesize_v - 1) / sid->pagesize_v;
3768 _elm_scroll_last_page_get(const Evas_Object *obj,
3774 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3776 if (!sid->pan_obj) return;
3778 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
3780 psd->api->content_size_get(sid->pan_obj, &cw, &ch);
3783 if (sid->pagesize_h > 0)
3784 *pagenumber_h = cw / sid->pagesize_h + 1;
3790 if (sid->pagesize_v > 0)
3791 *pagenumber_v = ch / sid->pagesize_v + 1;
3798 _elm_scroll_page_show(Evas_Object *obj,
3806 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3808 _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
3809 if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
3810 if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
3811 if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
3812 _elm_scroll_content_pos_set(obj, x, y, EINA_TRUE);
3816 _elm_scroll_page_bring_in(Evas_Object *obj,
3824 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3826 _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
3827 if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
3828 if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
3829 if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
3831 _elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
3832 _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, y);
3837 _elm_scroll_region_bring_in(Evas_Object *obj,
3843 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3845 if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
3847 _elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
3848 _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, y);
3853 _elm_scroll_gravity_set(Evas_Object *obj,
3857 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3859 if (!sid->pan_obj) return;
3861 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
3863 psd->api->gravity_set(sid->pan_obj, x, y);
3867 _elm_scroll_gravity_get(const Evas_Object *obj,
3871 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3873 if (!sid->pan_obj) return;
3875 ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
3877 psd->api->gravity_get(sid->pan_obj, x, y);
3881 _elm_scroll_interface_add(Evas_Object *obj)
3883 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
3885 memset(sid, 0, sizeof(*sid));
3897 sid->hbar_flags = ELM_SCROLLER_POLICY_AUTO;
3898 sid->vbar_flags = ELM_SCROLLER_POLICY_AUTO;
3899 sid->hbar_visible = EINA_TRUE;
3900 sid->vbar_visible = EINA_TRUE;
3902 sid->bounce_horiz = EINA_TRUE;
3903 sid->bounce_vert = EINA_TRUE;
3905 sid->one_direction_at_a_time = EINA_TRUE;
3906 sid->momentum_animator_disabled = EINA_FALSE;
3907 sid->bounce_animator_disabled = EINA_FALSE;
3909 _elm_scroll_scroll_bar_reset(sid);
3915 _elm_scroll_interface_del(Evas_Object *obj)
3917 ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
3919 _elm_scroll_content_set(obj, NULL);
3920 if (!sid->extern_pan) evas_object_del(sid->pan_obj);
3922 if (sid->down.hold_animator)
3923 ecore_animator_del(sid->down.hold_animator);
3924 if (sid->down.onhold_animator)
3925 ecore_animator_del(sid->down.onhold_animator);
3926 if (sid->down.momentum_animator)
3927 ecore_animator_del(sid->down.momentum_animator);
3928 if (sid->down.bounce_x_animator)
3929 ecore_animator_del(sid->down.bounce_x_animator);
3930 if (sid->down.bounce_y_animator)
3931 ecore_animator_del(sid->down.bounce_y_animator);
3932 if (sid->scrollto.x.animator) ecore_animator_del(sid->scrollto.x.animator);
3933 if (sid->scrollto.y.animator) ecore_animator_del(sid->scrollto.y.animator);
3936 EAPI const char ELM_SCROLLABLE_IFACE_NAME[] = "elm_interface_scrollable";
3938 EAPI const Elm_Scrollable_Smart_Interface ELM_SCROLLABLE_IFACE =
3941 ELM_SCROLLABLE_IFACE_NAME,
3942 sizeof(Elm_Scrollable_Smart_Interface_Data),
3943 _elm_scroll_interface_add,
3944 _elm_scroll_interface_del
3947 _elm_scroll_objects_set,
3948 _elm_scroll_content_set,
3949 _elm_scroll_extern_pan_set,
3950 _elm_scroll_drag_start_cb_set,
3951 _elm_scroll_drag_stop_cb_set,
3952 _elm_scroll_animate_start_cb_set,
3953 _elm_scroll_animate_stop_cb_set,
3954 _elm_scroll_scroll_cb_set,
3955 _elm_scroll_edge_left_cb_set,
3956 _elm_scroll_edge_right_cb_set,
3957 _elm_scroll_edge_top_cb_set,
3958 _elm_scroll_edge_bottom_cb_set,
3959 _elm_scroll_vbar_drag_cb_set,
3960 _elm_scroll_vbar_press_cb_set,
3961 _elm_scroll_vbar_unpress_cb_set,
3962 _elm_scroll_hbar_drag_cb_set,
3963 _elm_scroll_hbar_press_cb_set,
3964 _elm_scroll_hbar_unpress_cb_set,
3965 _elm_scroll_content_min_limit_cb_set,
3966 _elm_scroll_content_pos_set,
3967 _elm_scroll_content_pos_get,
3968 _elm_scroll_content_region_show,
3969 _elm_scroll_content_region_set,
3970 _elm_scroll_content_size_get,
3971 _elm_scroll_content_viewport_size_get,
3972 _elm_scroll_content_min_limit,
3973 _elm_scroll_step_size_set,
3974 _elm_scroll_step_size_get,
3975 _elm_scroll_page_size_set,
3976 _elm_scroll_page_size_get,
3977 _elm_scroll_policy_set,
3978 _elm_scroll_policy_get,
3979 _elm_scroll_single_direction_set,
3980 _elm_scroll_single_direction_get,
3981 _elm_scroll_mirrored_set,
3982 _elm_scroll_hold_set,
3983 _elm_scroll_freeze_set,
3984 _elm_scroll_bounce_allow_set,
3985 _elm_scroll_bounce_allow_get,
3986 _elm_scroll_paging_set,
3987 _elm_scroll_paging_get,
3988 _elm_scroll_current_page_get,
3989 _elm_scroll_last_page_get,
3990 _elm_scroll_page_show,
3991 _elm_scroll_page_bring_in,
3992 _elm_scroll_region_bring_in,
3993 _elm_scroll_gravity_set,
3994 _elm_scroll_gravity_get,
3995 _elm_scroll_momentum_animator_disabled_get,
3996 _elm_scroll_momentum_animator_disabled_set,
3997 _elm_scroll_bounce_animator_disabled_set,
3998 _elm_scroll_bounce_animator_disabled_get,
3999 _elm_scroll_wheel_disabled_get,
4000 _elm_scroll_wheel_disabled_set