add page curl test. right now its code in test. will eventually become
[framework/uifw/elementary.git] / src / bin / test_flip_page.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 typedef struct _State State;
8 typedef struct _Slice Slice;
9
10 struct _State
11 {
12    Evas_Object *orig, *win, *base;
13    Evas_Coord down_x, down_y;
14    Eina_Bool  down : 1;
15    Evas_Coord x, y;
16    Eina_List *slices;
17 };
18
19 struct _Slice
20 {
21    Evas_Object *obj;
22 };
23
24 static State state =
25 {
26    NULL, NULL, NULL,
27    0, 0,
28    0,
29    0, 0,
30    NULL,
31 };
32
33 #define RES 8
34
35 static void
36 _slice_update(State *st)
37 {
38    Evas_Coord x1, y1, x2, y2, mx, my, px, rx, ry, prx, pry, dst, dx, dy, pdst;
39    Evas_Coord x, y, w, h;
40    int i;
41    Evas_Map *m;
42    Slice *sl;
43    int rad;
44    
45    evas_object_geometry_get(st->orig, &x, &y, &w, &h);
46    x1 = st->down_x;
47    y1 = st->down_y;
48    x2 = st->x;
49    y2 = st->y;
50    mx = (x1 + x2) / 2;
51    my = (y1 + y2) / 2;
52    
53    if (mx < 0) mx = 0;
54    else if (mx >= w) mx = w - 1;
55    if (my < 0) my = 0;
56    else if (my >= h) my = h - 1;
57    
58    if (!st->base)
59      {
60         st->base = evas_object_image_add(evas_object_evas_get(st->win));
61         evas_object_image_fill_set(st->base, 0, 0, w, h);
62         evas_object_pass_events_set(st->base, 1);
63         evas_object_image_source_set(st->base, st->orig);
64         evas_object_show(st->base);
65      }
66    
67    m = evas_map_new(4);
68    evas_map_smooth_set(m, 0);
69
70    evas_map_point_coord_set(m,    0, x     , y    , 0);
71    evas_map_point_coord_set(m,    1, x + mx, y    , 0);
72    evas_map_point_coord_set(m,    2, x + mx, y + h, 0);
73    evas_map_point_coord_set(m,    3, x     , y + h, 0);
74    
75    evas_map_point_image_uv_set(m, 0, 0 , 0);
76    evas_map_point_image_uv_set(m, 1, mx, 0);
77    evas_map_point_image_uv_set(m, 2, mx, h);
78    evas_map_point_image_uv_set(m, 3, 0 , h);
79
80    evas_map_point_color_set(m, 0, 255, 255, 255, 255);
81    evas_map_point_color_set(m, 1, 255, 255, 255, 255);
82    evas_map_point_color_set(m, 2, 255, 255, 255, 255);
83    evas_map_point_color_set(m, 3, 255, 255, 255, 255);
84    
85 /*
86    // FIXME: lighting should be manual with pt 0 and 3 being white and
87    // 2 and 3 matching the 
88    evas_map_util_3d_lighting(m, 
89                              0  , 0  , -1000,
90                              255, 255, 255,
91                              20 , 20 , 20);
92  */
93    evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 512);
94    
95    evas_object_map_enable_set(st->base, 1);
96    evas_object_map_set(st->base, m);
97    evas_map_free(m);
98    
99    EINA_LIST_FREE(st->slices, sl)
100      {
101         evas_object_del(sl->obj);
102         free(sl);
103      }
104    
105    // cylinder radius is width / 8
106    rad = (w - mx) / 4;
107    if (rad < (w / 16)) rad = (w / 16);
108    if (rad > (w / 8)) rad = w / 8;
109    
110    rad = w / 12;
111    
112    px = mx;
113    prx = 0;
114    pry = rad;
115    for (i = 1; i < RES; i++)
116      {
117         sl = calloc(1, sizeof(Slice));
118         st->slices = eina_list_append(st->slices, sl);
119         sl->obj = evas_object_image_add(evas_object_evas_get(st->win));
120         evas_object_image_fill_set(sl->obj, 0, 0, w, h);
121         evas_object_pass_events_set(sl->obj, 1);
122         evas_object_image_source_set(sl->obj, st->orig);
123         evas_object_show(sl->obj);
124         
125         rx = (double)rad * sin((i * M_PI) / RES);
126         ry = (double)rad * cos((i * M_PI) / RES);
127         dx = rx - prx;
128         dy = ry - pry;
129         dst = sqrt((dx * dx) + (dy * dy));
130         if ((px + dst) > w)
131           {
132              pdst = dst;
133              dst = w - px;
134              rx = prx + (((rx - prx) * dst) / pdst);
135              ry = pry + (((ry - pry) * dst) / pdst);
136           }
137         if (dst <= 0) break;
138         
139         m = evas_map_new(4);
140         evas_map_smooth_set(m, 0);
141
142         evas_map_point_coord_set(m,    0, x + mx + prx, y    , 0 - (rad - pry));
143         evas_map_point_coord_set(m,    1, x + mx + rx , y    , 0 - (rad - ry ));
144         evas_map_point_coord_set(m,    2, x + mx + rx , y + h, 0 - (rad - ry ));
145         evas_map_point_coord_set(m,    3, x + mx + prx, y + h, 0 - (rad - pry));
146         
147         evas_map_point_image_uv_set(m, 0, px , 0);
148         evas_map_point_image_uv_set(m, 1, px + dst, 0);
149         evas_map_point_image_uv_set(m, 2, px + dst, h);
150         evas_map_point_image_uv_set(m, 3, px , h);
151         
152         evas_map_point_color_set(m, 0, 255, 255, 255, 255);
153         evas_map_point_color_set(m, 1, 255, 255, 255, 255);
154         evas_map_point_color_set(m, 2, 255, 255, 255, 255);
155         evas_map_point_color_set(m, 3, 255, 255, 255, 255);
156         
157         evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 512);
158         
159         evas_object_map_enable_set(sl->obj, 1);
160         evas_object_map_set(sl->obj, m);
161         evas_map_free(m);
162         
163         prx = rx;
164         pry = ry;
165         px += dst;
166      }
167    if (px < w)
168      {
169         sl = calloc(1, sizeof(Slice));
170         st->slices = eina_list_append(st->slices, sl);
171         sl->obj = evas_object_image_add(evas_object_evas_get(st->win));
172         evas_object_image_fill_set(sl->obj, 0, 0, w, h);
173         evas_object_pass_events_set(sl->obj, 1);
174         evas_object_image_source_set(sl->obj, st->orig);
175         evas_object_show(sl->obj);
176         
177         m = evas_map_new(4);
178         evas_map_smooth_set(m, 0);
179
180         evas_map_point_coord_set(m,    0, x + mx + prx, y    , 0 - (rad - pry));
181         evas_map_point_coord_set(m,    1, x + mx + (px - w) , y    , 0 - (rad * 2  ));
182         evas_map_point_coord_set(m,    2, x + mx + (px - w) , y + h, 0 - (rad * 2  ));
183         evas_map_point_coord_set(m,    3, x + mx + prx, y + h, 0 - (rad - pry));
184         
185         evas_map_point_image_uv_set(m, 0, px , 0);
186         evas_map_point_image_uv_set(m, 1, w, 0);
187         evas_map_point_image_uv_set(m, 2, w, h);
188         evas_map_point_image_uv_set(m, 3, px , h);
189         
190         evas_map_point_color_set(m, 0, 255, 255, 255, 255);
191         evas_map_point_color_set(m, 1, 255, 255, 255, 255);
192         evas_map_point_color_set(m, 2, 255, 255, 255, 255);
193         evas_map_point_color_set(m, 3, 255, 255, 255, 255);
194         
195         evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 512);
196         
197         evas_object_map_enable_set(sl->obj, 1);
198         evas_object_map_set(sl->obj, m);
199         evas_map_free(m);
200      }
201 }
202
203 static void
204 _slice_end(State *st)
205 {
206    Slice *sl;
207    EINA_LIST_FREE(st->slices, sl)
208      {
209         evas_object_del(sl->obj);
210         free(sl);
211      }
212    if (st->base)
213      {
214         evas_object_del(st->base);
215         st->base = NULL;
216      }
217 }
218
219 static void
220 im_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
221 {
222    Evas_Event_Mouse_Down *ev = event_info;
223    Evas_Object *win = data;
224    Evas_Coord x, y;
225
226    if (ev->button != 1) return;
227    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
228    state.orig = obj;
229    state.win = win;
230    state.down = 1;
231    state.x = ev->canvas.x - x;
232    state.y = ev->canvas.y - y;
233    state.down_x = state.x;
234    state.down_y = state.y;
235    evas_object_lower(obj);
236    printf("v %i %i\n", state.x, state.y);
237    _slice_update(&state);
238 }
239
240 static void
241 im_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
242 {
243    Evas_Event_Mouse_Up *ev = event_info;
244    Evas_Object *win = data;
245    Evas_Coord x, y;
246    
247    if (ev->button != 1) return;
248    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
249    state.down = 0;
250    state.x = ev->canvas.x - x;
251    state.y = ev->canvas.y - y;
252    evas_object_raise(obj);
253    printf("^ %i %i\n", state.x, state.y);
254    _slice_end(&state);
255 }
256
257 static void
258 im_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
259 {
260    Evas_Event_Mouse_Move *ev = event_info;
261    Evas_Object *win = data;
262    Evas_Coord x, y;
263    
264    if (!state.down) return;
265    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
266    state.x = ev->cur.canvas.x - x;
267    state.y = ev->cur.canvas.y - y;
268    printf("@ %i %i\n", state.x, state.y);
269    _slice_update(&state);
270 }
271
272 void
273 test_flip_page(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
274 {
275    Evas_Object *win, *bg, *im;
276    char buf[PATH_MAX];
277
278    win = elm_win_add(NULL, "flip_page", ELM_WIN_BASIC);
279    elm_win_title_set(win, "Flip Page");
280    elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
281    elm_win_autodel_set(win, 1);
282
283    bg = elm_bg_add(win);
284    elm_win_resize_object_add(win, bg);
285    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
286    evas_object_show(bg);
287
288 #if 1
289    im = elm_layout_add(win);
290    snprintf(buf, sizeof(buf), "%s/objects/test.edj", PACKAGE_DATA_DIR);
291    elm_layout_file_set(im, buf, "layout");
292 #else   
293    im = evas_object_image_filled_add(evas_object_evas_get(win));
294    snprintf(buf, sizeof(buf), "%s/images/%s",
295             PACKAGE_DATA_DIR, "twofish.jpg");
296    evas_object_image_file_set(im, buf, NULL);
297 #endif   
298    evas_object_move(im, 40, 40);
299    evas_object_resize(im, 400, 400);
300    evas_object_show(im);
301
302    evas_object_event_callback_add(im, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, win);
303    evas_object_event_callback_add(im, EVAS_CALLBACK_MOUSE_UP,   im_up_cb,   win);
304    evas_object_event_callback_add(im, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, win);
305    
306    evas_object_resize(win, 480, 480);
307    evas_object_show(win);
308 }
309 #endif