1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
|
#ifndef ELM_INTEFARCE_SCROLLER_H
#define ELM_INTEFARCE_SCROLLER_H
/**
* @addtogroup Widget
* @{
*
* @section elm-scrollable-interface The Elementary Scrollable Interface
*
* This is a common interface for widgets having @b scrollable views.
* Widgets using/implementing this must use the
* @c EVAS_SMART_SUBCLASS_IFACE_NEW macro (instead of the
* @c EVAS_SMART_SUBCLASS_NEW one) when declaring its smart class,
* so an interface is also declared.
*
* The scrollable interface comes built with Elementary and is exposed
* as #ELM_SCROLLABLE_IFACE.
*
* The interface API is explained in details at
* #Elm_Scrollable_Smart_Interface.
*
* An Elementary scrollable interface will handle an internal @b
* panning object. It has the function of clipping and moving the
* actual scrollable content around, by the command of the scrollable
* interface calls. Though it's not the common case, one might
* want/have to change some aspects of the internal panning object
* behavior. For that, we have it also exposed here --
* #Elm_Pan_Smart_Class. Use elm_pan_smart_class_get() to build your
* custom panning object, when creating a scrollable widget (again,
* only if you need a custom panning object) and set it with
* Elm_Scrollable_Smart_Interface::extern_pan_set.
*/
#include "elm_pan.eo.h"
/**
* Elementary scroller panning base smart data.
*/
typedef struct _Elm_Pan_Smart_Data Elm_Pan_Smart_Data;
struct _Elm_Pan_Smart_Data
{
Evas_Object *self;
Evas_Object *content;
Evas_Coord x, y, w, h;
Evas_Coord content_w, content_h, px, py;
double gravity_x, gravity_y;
Evas_Coord prev_cw, prev_ch, delta_posx, delta_posy;
};
/**
* Elementary scrollable interface base data.
*/
typedef void (*Elm_Interface_Scrollable_Cb)(Evas_Object *, void *data);
typedef void (*Elm_Interface_Scrollable_Min_Limit_Cb)(Evas_Object *obj, Eina_Bool w, Eina_Bool h);
typedef void (*Elm_Interface_Scrollable_Resize_Cb)(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
typedef struct _Elm_Scrollable_Smart_Interface_Data
Elm_Scrollable_Smart_Interface_Data;
struct _Elm_Scrollable_Smart_Interface_Data
{
Evas_Coord x, y, w, h;
Evas_Coord wx, wy, ww, wh; /**< Last "wanted" geometry */
Evas_Object *obj;
Evas_Object *content;
Evas_Object *pan_obj;
Evas_Object *edje_obj;
Evas_Object *event_rect;
Evas_Object *parent_widget;
Elm_Scroller_Policy hbar_flags, vbar_flags;
Elm_Scroller_Single_Direction one_direction_at_a_time;
Elm_Scroller_Movement_Block block;
struct
{
Evas_Coord x, y;
Evas_Coord sx, sy;
Evas_Coord dx, dy;
Evas_Coord pdx, pdy;
Evas_Coord bx, by;
Evas_Coord ax, ay;
Evas_Coord bx0, by0;
Evas_Coord b0x, b0y;
Evas_Coord b2x, b2y;
struct
{
Evas_Coord x, y;
double timestamp, localtimestamp;
} history[60];
struct
{
double tadd, dxsum, dysum;
double est_timestamp_diff;
} hist;
double dragged_began_timestamp;
double anim_start;
double anim_start2;
double anim_start3;
double onhold_vx, onhold_vy, onhold_tlast,
onhold_vxe, onhold_vye;
double extra_time;
double last_time_x_wheel;
double last_time_y_wheel;
Evas_Coord hold_x, hold_y;
Evas_Coord locked_x, locked_y;
int hdir, vdir;
Ecore_Idle_Enterer *hold_enterer;
Eina_Bool hold_animator : 1;
Eina_Bool onhold_animator : 1;
Eina_Bool momentum_animator : 1; /**< an animator which is called whenever a scroller is moving due to a flick action(mouse down, move, up) */
Eina_Bool bounce_x_animator : 1; /**< an animator to express the bouncing animation on x axis. */
Eina_Bool bounce_y_animator : 1; /**< an animator to express the bouncing animation on y axis. */
Eina_Bool last_hold_x_wheel : 1;
Eina_Bool last_hold_y_wheel : 1;
Eina_Bool bounce_x_hold : 1;
Eina_Bool bounce_y_hold : 1;
Eina_Bool dragged_began : 1;
Eina_Bool want_dragged : 1;
Eina_Bool hold_parent : 1;
Eina_Bool want_reset : 1;
Eina_Bool cancelled : 1;
Eina_Bool dragged : 1;
Eina_Bool locked : 1;
Eina_Bool scroll : 1;
Eina_Bool dir_x : 1;
Eina_Bool dir_y : 1;
Eina_Bool hold : 1;
Eina_Bool now : 1;
} down;
struct
{
Evas_Coord w, h;
Eina_Bool resized : 1;
} content_info;
struct
{
Evas_Coord x, y;
} step, page, current_page;
struct
{
Elm_Interface_Scrollable_Cb drag_start;
Elm_Interface_Scrollable_Cb drag_stop;
Elm_Interface_Scrollable_Cb animate_start;
Elm_Interface_Scrollable_Cb animate_stop;
Elm_Interface_Scrollable_Cb scroll;
Elm_Interface_Scrollable_Cb scroll_left;
Elm_Interface_Scrollable_Cb scroll_right;
Elm_Interface_Scrollable_Cb scroll_up;
Elm_Interface_Scrollable_Cb scroll_down;
Elm_Interface_Scrollable_Cb edge_left;
Elm_Interface_Scrollable_Cb edge_right;
Elm_Interface_Scrollable_Cb edge_top;
Elm_Interface_Scrollable_Cb edge_bottom;
Elm_Interface_Scrollable_Cb vbar_drag;
Elm_Interface_Scrollable_Cb vbar_press;
Elm_Interface_Scrollable_Cb vbar_unpress;
Elm_Interface_Scrollable_Cb hbar_drag;
Elm_Interface_Scrollable_Cb hbar_press;
Elm_Interface_Scrollable_Cb hbar_unpress;
Elm_Interface_Scrollable_Cb page_change;
Elm_Interface_Scrollable_Min_Limit_Cb content_min_limit;
Elm_Interface_Scrollable_Resize_Cb content_viewport_resize;
} cb_func;
struct
{
struct
{
Evas_Coord start, end;
double t_start, t_end;
Eina_Bool animator;
} x, y;
} scrollto;
double pagerel_h, pagerel_v;
Evas_Coord pagesize_h, pagesize_v;
int page_limit_h, page_limit_v;
int current_calc;
unsigned int last_wheel;
unsigned char size_adjust_recurse;
unsigned char size_count;
void *event_info;
Eina_Bool size_adjust_recurse_abort : 1;
Eina_Bool momentum_animator_disabled : 1;
Eina_Bool bounce_animator_disabled : 1;
Eina_Bool page_snap_horiz : 1;
Eina_Bool page_snap_vert : 1;
Eina_Bool wheel_disabled : 1;
Eina_Bool hbar_visible : 1;
Eina_Bool vbar_visible : 1;
Eina_Bool bounce_horiz : 1;
Eina_Bool bounce_vert : 1;
Eina_Bool is_mirrored : 1;
Eina_Bool extern_pan : 1;
Eina_Bool bouncemey : 1;
Eina_Bool bouncemex : 1;
Eina_Bool freeze : 1;
Eina_Bool hold : 1;
Eina_Bool min_w : 1;
Eina_Bool min_h : 1;
Eina_Bool go_left : 1;
Eina_Bool go_right : 1;
Eina_Bool go_up : 1;
Eina_Bool go_down : 1;
Eina_Bool loop_h : 1;
Eina_Bool loop_v : 1;
};
#define ELM_SCROLLABLE_CHECK(obj, ...) \
\
if (!eo_isa(obj, ELM_INTERFACE_SCROLLABLE_MIXIN)) \
{ \
ERR("The object (%p) doesn't implement the Elementary scrollable" \
" interface", obj); \
if (getenv("ELM_ERROR_ABORT")) abort(); \
return __VA_ARGS__; \
}
#include "elm_interface_scrollable.eo.h"
/**
* @}
*/
#endif
|