1 #ifndef ELM_INTEFARCE_SCROLLER_H
2 #define ELM_INTEFARCE_SCROLLER_H
8 * @section elm-scrollable-interface The Elementary Scrollable Interface
10 * This is a common interface for widgets having @b scrollable views.
11 * Widgets using/implementing this must use the
12 * @c EVAS_SMART_SUBCLASS_IFACE_NEW macro (instead of the
13 * @c EVAS_SMART_SUBCLASS_NEW one) when declaring its smart class,
14 * so an interface is also declared.
16 * The scrollable interface comes built with Elementary and is exposed
17 * as #ELM_SCROLLABLE_IFACE.
19 * The interface API is explained in details at
20 * #Elm_Scrollable_Smart_Interface.
22 * An Elementary scrollable interface will handle an internal @b
23 * panning object. It has the function of clipping and moving the
24 * actual scrollable content around, by the command of the scrollable
25 * interface calls. Though it's not the common case, one might
26 * want/have to change some aspects of the internal panning object
27 * behavior. For that, we have it also exposed here --
28 * #Elm_Pan_Smart_Class. Use elm_pan_smart_class_get() to build your
29 * custom panning object, when creating a scrollable widget (again,
30 * only if you need a custom panning object) and set it with
31 * Elm_Scrollable_Smart_Interface::extern_pan_set.
37 * Use this macro to cast whichever subclass of
38 * #Elm_Pan_Smart_Class into it, so to access its fields.
42 #define ELM_PAN_CLASS(x) ((Elm_Pan_Smart_Class *)x)
45 * @def ELM_PAN_SMART_CLASS_VERSION
47 * Current version for Elementary pan @b base smart class, a value
48 * which goes to _Elm_Pan_Smart_Class::version.
52 #define ELM_PAN_SMART_CLASS_VERSION 1
55 * @def ELM_PAN_SMART_CLASS_INIT
57 * Initializer for a whole #Elm_Pan_Smart_Class structure, with
58 * @c NULL values on its specific fields.
60 * @param smart_class_init initializer to use for the "base" field
61 * (#Evas_Smart_Class).
63 * @see EVAS_SMART_CLASS_INIT_NULL
64 * @see EVAS_SMART_CLASS_INIT_NAME_VERSION
65 * @see ELM_PAN_SMART_CLASS_INIT_NULL
66 * @see ELM_PAN_SMART_CLASS_INIT_NAME_VERSION
70 #define ELM_PAN_SMART_CLASS_INIT(smart_class_init) \
71 {smart_class_init, ELM_PAN_SMART_CLASS_VERSION, NULL, NULL, NULL, NULL, \
75 * @def ELM_PAN_SMART_CLASS_INIT_NULL
77 * Initializer to zero out a whole #Elm_Pan_Smart_Class structure.
79 * @see ELM_PAN_SMART_CLASS_INIT_NAME_VERSION
80 * @see ELM_PAN_SMART_CLASS_INIT
84 #define ELM_PAN_SMART_CLASS_INIT_NULL \
85 ELM_PAN_SMART_CLASS_INIT(EVAS_SMART_CLASS_INIT_NULL)
88 * @def ELM_PAN_SMART_CLASS_INIT_NAME_VERSION
90 * Initializer to zero out a whole #Elm_Pan_Smart_Class structure and
91 * set its name and version.
93 * This is similar to #ELM_PAN_SMART_CLASS_INIT_NULL, but it will
94 * also set the version field of #Elm_Pan_Smart_Class (base field)
95 * to the latest #ELM_PAN_SMART_CLASS_VERSION and name it to the
98 * It will keep a reference to the name field as a <c>"const char *"</c>,
99 * i.e., the name must be available while the structure is
100 * used (hint: static or global variable!) and must not be modified.
102 * @see ELM_PAN_SMART_CLASS_INIT_NULL
103 * @see ELM_PAN_SMART_CLASS_INIT
107 #define ELM_PAN_SMART_CLASS_INIT_NAME_VERSION(name) \
108 ELM_PAN_SMART_CLASS_INIT(EVAS_SMART_CLASS_INIT_NAME_VERSION(name))
111 * Elementary scroller panning base smart class. This inherits
112 * directly from the Evas smart clipped class (an object clipping
113 * children to its viewport/size). It is exposed here only to build
114 * widgets needing a custom panning behavior.
116 typedef struct _Elm_Pan_Smart_Class Elm_Pan_Smart_Class;
117 struct _Elm_Pan_Smart_Class
119 Evas_Smart_Class base; /* it's a clipped smart object */
121 int version; /**< Version of this smart class definition */
123 void (*pos_set)(Evas_Object *obj,
126 void (*pos_get)(const Evas_Object *obj,
129 void (*pos_max_get)(const Evas_Object *obj,
132 void (*pos_min_get)(const Evas_Object *obj,
135 void (*content_size_get)(const Evas_Object *obj,
138 void (*gravity_set)(Evas_Object *obj,
141 void (*gravity_get)(const Evas_Object *obj,
147 * Elementary scroller panning base smart data.
149 typedef struct _Elm_Pan_Smart_Data Elm_Pan_Smart_Data;
150 struct _Elm_Pan_Smart_Data
152 Evas_Object_Smart_Clipped_Data base;
154 const Elm_Pan_Smart_Class *api; /**< This is the pointer to the object's class, from where we can reach/call its class functions */
157 Evas_Object *content;
158 Evas_Coord x, y, w, h;
159 Evas_Coord content_w, content_h, px, py;
160 double gravity_x, gravity_y;
161 Evas_Coord prev_cw, prev_ch, delta_posx, delta_posy;
165 * Elementary scrollable interface base data.
167 typedef struct _Elm_Scrollable_Smart_Interface_Data
168 Elm_Scrollable_Smart_Interface_Data;
169 struct _Elm_Scrollable_Smart_Interface_Data
171 Evas_Coord x, y, w, h;
172 Evas_Coord wx, wy, ww, wh; /**< Last "wanted" geometry */
175 Evas_Object *content;
176 Evas_Object *pan_obj;
177 Evas_Object *edje_obj;
178 Evas_Object *event_rect;
180 Evas_Object *parent_widget;
182 Elm_Scroller_Policy hbar_flags, vbar_flags;
183 Elm_Scroller_Single_Direction one_direction_at_a_time;
200 double timestamp, localtimestamp;
205 double tadd, dxsum, dysum;
206 double est_timestamp_diff;
212 double onhold_vx, onhold_vy, onhold_tlast,
213 onhold_vxe, onhold_vye;
216 Evas_Coord hold_x, hold_y;
217 Evas_Coord locked_x, locked_y;
220 Ecore_Animator *hold_animator;
221 Ecore_Animator *onhold_animator;
222 Ecore_Animator *momentum_animator;
223 Ecore_Animator *bounce_x_animator;
224 Ecore_Animator *bounce_y_animator;
226 Eina_Bool bounce_x_hold : 1;
227 Eina_Bool bounce_y_hold : 1;
228 Eina_Bool dragged_began : 1;
229 Eina_Bool want_dragged : 1;
230 Eina_Bool hold_parent : 1;
231 Eina_Bool want_reset : 1;
232 Eina_Bool cancelled : 1;
233 Eina_Bool dragged : 1;
234 Eina_Bool locked : 1;
235 Eina_Bool scroll : 1;
245 Eina_Bool resized : 1;
255 void (*drag_start)(Evas_Object *obj,
257 void (*drag_stop)(Evas_Object *obj,
259 void (*animate_start)(Evas_Object *obj,
261 void (*animate_stop)(Evas_Object *obj,
263 void (*scroll)(Evas_Object *obj,
265 void (*scroll_left)(Evas_Object *obj,
267 void (*scroll_right)(Evas_Object *obj,
269 void (*scroll_up)(Evas_Object *obj,
271 void (*scroll_down)(Evas_Object *obj,
273 void (*edge_left)(Evas_Object *obj,
275 void (*edge_right)(Evas_Object *obj,
277 void (*edge_top)(Evas_Object *obj,
279 void (*edge_bottom)(Evas_Object *obj,
281 void (*vbar_drag)(Evas_Object *obj,
283 void (*vbar_press)(Evas_Object *obj,
285 void (*vbar_unpress)(Evas_Object *obj,
287 void (*hbar_drag)(Evas_Object *obj,
289 void (*hbar_press)(Evas_Object *obj,
291 void (*hbar_unpress)(Evas_Object *obj,
293 void (*content_min_limit)(Evas_Object *obj,
302 Evas_Coord start, end;
303 double t_start, t_end;
304 Ecore_Animator *animator;
308 double pagerel_h, pagerel_v;
309 Evas_Coord pagesize_h, pagesize_v;
310 int page_limit_h, page_limit_v;
312 Eina_Bool momentum_animator_disabled : 1;
313 Eina_Bool bounce_animator_disabled : 1;
314 Eina_Bool wheel_disabled : 1;
315 Eina_Bool hbar_visible : 1;
316 Eina_Bool vbar_visible : 1;
317 Eina_Bool bounce_horiz : 1;
318 Eina_Bool bounce_vert : 1;
319 Eina_Bool is_mirrored : 1;
320 Eina_Bool extern_pan : 1;
321 Eina_Bool bouncemey : 1;
322 Eina_Bool bouncemex : 1;
323 Eina_Bool freeze : 1;
327 Eina_Bool go_left : 1;
328 Eina_Bool go_right : 1;
330 Eina_Bool go_down : 1;
333 typedef struct _Elm_Scrollable_Smart_Interface Elm_Scrollable_Smart_Interface;
334 struct _Elm_Scrollable_Smart_Interface
336 Evas_Smart_Interface base;
338 void (*objects_set)(Evas_Object *obj,
339 Evas_Object *edje_obj,
340 Evas_Object *hit_rectangle);
341 void (*content_set)(Evas_Object *obj,
342 Evas_Object *content);
344 void (*extern_pan_set)(Evas_Object *obj,
347 void (*drag_start_cb_set)(Evas_Object *obj,
348 void (*d_start_cb)(Evas_Object *obj,
350 void (*drag_stop_cb_set)(Evas_Object *obj,
351 void (*d_stop_cb)(Evas_Object *obj,
353 void (*animate_start_cb_set)(Evas_Object *obj,
354 void (*a_start_cb)(Evas_Object *obj,
356 void (*animate_stop_cb_set)(Evas_Object *obj,
357 void (*a_stop_cb)(Evas_Object *obj,
359 void (*scroll_cb_set)(Evas_Object *obj,
360 void (*s_cb)(Evas_Object *obj,
362 void (*scroll_left_cb_set)(Evas_Object *obj,
363 void (*s_left_cb)(Evas_Object *obj,
365 void (*scroll_right_cb_set)(Evas_Object *obj,
366 void (*s_right_cb)(Evas_Object *obj,
368 void (*scroll_up_cb_set)(Evas_Object *obj,
369 void (*s_up_cb)(Evas_Object *obj,
371 void (*scroll_down_cb_set)(Evas_Object *obj,
372 void (*s_down_cb)(Evas_Object *obj,
374 void (*edge_left_cb_set)(Evas_Object *obj,
375 void (*e_left_cb)(Evas_Object *obj,
377 void (*edge_right_cb_set)(Evas_Object *obj,
378 void (*e_right_cb)(Evas_Object *obj,
380 void (*edge_top_cb_set)(Evas_Object *obj,
381 void (*e_top_cb)(Evas_Object *obj,
383 void (*edge_bottom_cb_set)(Evas_Object *obj,
384 void (*e_bottom_cb)(Evas_Object *obj,
386 void (*vbar_drag_cb_set)(Evas_Object *obj,
387 void (*v_drag_cb)(Evas_Object *obj,
389 void (*vbar_press_cb_set)(Evas_Object *obj,
390 void (*v_press_cb)(Evas_Object *obj,
392 void (*vbar_unpress_cb_set)(Evas_Object *obj,
393 void (*v_unpress_cb)(Evas_Object *obj,
395 void (*hbar_drag_cb_set)(Evas_Object *obj,
396 void (*h_drag_cb)(Evas_Object *obj,
398 void (*hbar_press_cb_set)(Evas_Object *obj,
399 void (*h_press_cb)(Evas_Object *obj,
401 void (*hbar_unpress_cb_set)(Evas_Object *obj,
402 void (*h_unpress_cb)(Evas_Object *obj,
405 void (*content_min_limit_cb_set)(Evas_Object *obj,
406 void (*c_limit_cb)(Evas_Object *obj,
410 /* set the position of content object inside the scrolling region,
412 void (*content_pos_set)(Evas_Object *obj,
416 void (*content_pos_get)(const Evas_Object *obj,
420 void (*content_region_show)(Evas_Object *obj,
425 void (*content_region_set)(Evas_Object *obj,
431 void (*content_size_get)(const Evas_Object *obj,
435 /* get the size of the actual viewport area (swallowed into
436 * scroller Edje object) */
437 void (*content_viewport_size_get)(const Evas_Object *obj,
441 /* this one issues the respective callback, only */
442 void (*content_min_limit)(Evas_Object *obj,
446 void (*step_size_set)(Evas_Object *obj,
449 void (*step_size_get)(const Evas_Object *obj,
452 void (*page_size_set)(Evas_Object *obj,
455 void (*page_size_get)(const Evas_Object *obj,
458 void (*policy_set)(Evas_Object *obj,
459 Elm_Scroller_Policy hbar,
460 Elm_Scroller_Policy vbar);
461 void (*policy_get)(const Evas_Object *obj,
462 Elm_Scroller_Policy *hbar,
463 Elm_Scroller_Policy *vbar);
465 void (*single_direction_set)(Evas_Object *obj,
466 Elm_Scroller_Single_Direction single_dir);
467 Elm_Scroller_Single_Direction (*single_direction_get)(const Evas_Object *obj);
469 void (*repeat_events_set)(Evas_Object *obj,
470 Eina_Bool repeat_events);
471 Eina_Bool (*repeat_events_get)(const Evas_Object *obj);
473 void (*mirrored_set)(Evas_Object *obj,
476 void (*hold_set)(Evas_Object *obj,
478 void (*freeze_set)(Evas_Object *obj,
481 void (*bounce_allow_set)(Evas_Object *obj,
484 void (*bounce_allow_get)(const Evas_Object *obj,
488 void (*paging_set)(Evas_Object *obj,
491 Evas_Coord pagesize_h,
492 Evas_Coord pagesize_v);
493 void (*paging_get)(const Evas_Object *obj,
496 Evas_Coord *pagesize_h,
497 Evas_Coord *pagesize_v);
498 void (*page_scroll_limit_set)(const Evas_Object *obj,
501 void (*page_scroll_limit_get)(const Evas_Object *obj,
504 void (*current_page_get)(const Evas_Object *obj,
507 void (*last_page_get)(const Evas_Object *obj,
510 void (*page_show)(Evas_Object *obj,
513 void (*page_bring_in)(Evas_Object *obj,
517 void (*region_bring_in)(Evas_Object *obj,
523 void (*gravity_set)(Evas_Object *obj,
526 void (*gravity_get)(const Evas_Object *obj,
530 Eina_Bool (*momentum_animator_disabled_get)(const Evas_Object *obj);
531 void (*momentum_animator_disabled_set)(Evas_Object *obj,
534 void (*bounce_animator_disabled_set)(Evas_Object *obj,
536 Eina_Bool (*bounce_animator_disabled_get)(const Evas_Object *obj);
538 Eina_Bool (*wheel_disabled_get)(const Evas_Object *obj);
539 void (*wheel_disabled_set)(Evas_Object *obj,
543 EAPI extern const char ELM_SCROLLABLE_IFACE_NAME[];
544 EAPI extern const Elm_Scrollable_Smart_Interface ELM_SCROLLABLE_IFACE;
546 EAPI const Elm_Pan_Smart_Class *elm_pan_smart_class_get(void);
548 #define ELM_SCROLLABLE_IFACE_GET(obj, iface) \
549 const Elm_Scrollable_Smart_Interface * iface; \
550 iface = evas_object_smart_interface_get(obj, ELM_SCROLLABLE_IFACE_NAME);
552 #define ELM_SCROLLABLE_CHECK(obj, ...) \
553 const Elm_Scrollable_Smart_Interface * s_iface = \
554 evas_object_smart_interface_get(obj, ELM_SCROLLABLE_IFACE_NAME); \
558 ERR("Passing object (%p) of type '%s' in function %s, but it doesn't" \
559 " implement the Elementary scrollable interface.", obj, \
560 elm_widget_type_get(obj), __func__); \
561 if (getenv("ELM_ERROR_ABORT")) abort(); \
562 return __VA_ARGS__; \