aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/elementary/src/bin/test_gesture_layer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/elementary/src/bin/test_gesture_layer.c')
-rw-r--r--libraries/elementary/src/bin/test_gesture_layer.c406
1 files changed, 0 insertions, 406 deletions
diff --git a/libraries/elementary/src/bin/test_gesture_layer.c b/libraries/elementary/src/bin/test_gesture_layer.c
deleted file mode 100644
index 5df3970..0000000
--- a/libraries/elementary/src/bin/test_gesture_layer.c
+++ /dev/null
@@ -1,406 +0,0 @@
1#ifdef HAVE_CONFIG_H
2# include "elementary_config.h"
3#endif
4#include <Elementary.h>
5#ifndef ELM_LIB_QUICKLAUNCH
6
7/* We zoom out to this value so we'll be able to use map and have a nice
8 * resolution when zooming in. */
9#define BASE_ZOOM 0.5
10/* The amount of zoom to do when "lifting" objects. */
11#define LIFT_FACTOR 1.3
12/* The base size of the shadow image. */
13#define SHADOW_W 118
14#define SHADOW_H 118
15#define RAD2DEG(x) ((x) * 57.295779513)
16
17static double zoom_out_animation_duration = 0.4;
18
19struct _Photo_Object {
20 Evas_Object *ic, *shadow;
21 Evas_Object *hit;
22 Evas_Object *gl;
23 Elm_Transit *zoom_out;
24 /* bx, by - current wanted coordinates of the photo object.
25 * bw, bh - original size of the "ic" object.
26 * dx, dy - Used to indicate the distance between the center point
27 * where we put down our fingers (when started moving the item) to
28 * the coords of the object, so we'll be able to calculate movement
29 * correctly. */
30 Evas_Coord bx, by, bw, bh, dx, dy;
31 /* Because gesture layer only knows the amount of rotation/zoom we do
32 * per gesture, we have to keep the current rotate/zoom factor and the
33 * one that was before we started the gesture. */
34 int base_rotate, rotate;
35 double base_zoom, zoom;
36 double shadow_zoom;
37};
38typedef struct _Photo_Object Photo_Object;
39
40
41/* This function applies the information from the Photo_Object to the actual
42 * evas objects. Zoom/rotate factors and etc. */
43static void
44apply_changes(Photo_Object *po)
45{
46 Evas_Map *map;
47
48 map = evas_map_new(4);
49 evas_map_point_coord_set(map, 0, po->bx, po->by, 0);
50 evas_map_point_coord_set(map, 1, po->bx + po->bw, po->by, 0);
51 evas_map_point_coord_set(map, 2, po->bx + po->bw, po->by + po->bh, 0);
52 evas_map_point_coord_set(map, 3, po->bx, po->by + po->bh, 0);
53 evas_map_point_image_uv_set(map, 0, 0, 0);
54 evas_map_point_image_uv_set(map, 1, po->bw, 0);
55 evas_map_point_image_uv_set(map, 2, po->bw, po->bh);
56 evas_map_point_image_uv_set(map, 3, 0, po->bh);
57 evas_map_util_rotate(map, po->rotate,
58 po->bx + po->bw / 2, po->by + po->bh /2);
59 evas_map_util_zoom(map, po->zoom, po->zoom,
60 po->bx + po->bw / 2, po->by + po->bh /2);
61 evas_object_map_enable_set(po->ic, EINA_TRUE);
62 evas_object_map_set(po->ic, map);
63
64 {
65 Evas_Map *shadow_map = evas_map_new(4);
66 evas_map_point_coord_set(shadow_map, 0, po->bx, po->by, 0);
67 evas_map_point_coord_set(shadow_map, 1, po->bx + po->bw, po->by, 0);
68 evas_map_point_coord_set(shadow_map, 2, po->bx + po->bw, po->by + po->bh, 0);
69 evas_map_point_coord_set(shadow_map, 3, po->bx, po->by + po->bh, 0);
70 evas_map_point_image_uv_set(shadow_map, 0, 0, 0);
71 evas_map_point_image_uv_set(shadow_map, 1, SHADOW_W, 0);
72 evas_map_point_image_uv_set(shadow_map, 2, SHADOW_W, SHADOW_H);
73 evas_map_point_image_uv_set(shadow_map, 3, 0, SHADOW_H);
74 evas_map_util_rotate(shadow_map, po->rotate,
75 po->bx + po->bw / 2, po->by + po->bh /2);
76 evas_map_util_zoom(shadow_map, po->zoom * po->shadow_zoom,
77 po->zoom * po->shadow_zoom,
78 po->bx + (po->bw / 2), po->by + (po->bh / 2));
79 evas_object_map_enable_set(po->shadow, EINA_TRUE);
80 evas_object_map_set(po->shadow, shadow_map);
81 evas_map_free(shadow_map);
82 }
83
84 /* Update the position of the hit box */
85 {
86 Evas_Coord minx, miny, maxx, maxy;
87 int i;
88 evas_object_polygon_points_clear(po->hit);
89 evas_map_point_coord_get(map, 0, &minx, &miny, NULL);
90 maxx = minx;
91 maxy = miny;
92 evas_object_polygon_point_add(po->hit, minx, miny);
93 for (i = 1 ; i <= 3 ; i++)
94 {
95 Evas_Coord x, y;
96 evas_map_point_coord_get(map, i, &x, &y, NULL);
97 evas_object_polygon_point_add(po->hit, x, y);
98 if (x < minx)
99 minx = x;
100 else if (x > maxx)
101 maxx = x;
102
103 if (y < miny)
104 miny = y;
105 else if (y > maxy)
106 maxy = y;
107 }
108 }
109
110 evas_object_raise(po->shadow);
111 evas_object_raise(po->ic);
112 evas_object_raise(po->hit);
113 evas_map_free(map);
114}
115
116/* Zoom out animation */
117static void
118zoom_out_animation_operation(void *_po, Elm_Transit *transit __UNUSED__,
119 double progress)
120{
121 Photo_Object *po = (Photo_Object *) _po;
122 po->zoom = BASE_ZOOM + ((po->base_zoom - BASE_ZOOM) * (1.0 - progress));
123 apply_changes(po);
124}
125
126static void
127zoom_out_animation_end(void *_po, Elm_Transit *transit __UNUSED__)
128{
129 Photo_Object *po = (Photo_Object *) _po;
130
131 po->base_zoom = po->zoom = BASE_ZOOM;
132 apply_changes(po);
133
134 po->zoom_out = NULL;
135}
136
137static Evas_Event_Flags
138rotate_move(void *_po, void *event_info)
139{
140 Photo_Object *po = (Photo_Object *) _po;
141 Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
142 printf("rotate move <%d,%d> base=<%f> <%f>\n", p->x, p->y, RAD2DEG(p->base_angle), RAD2DEG(p->angle));
143 po->rotate = po->base_rotate + (int) RAD2DEG(p->base_angle - p->angle);
144 if (po->rotate < 0)
145 po->rotate += 360;
146 apply_changes(po);
147 return EVAS_EVENT_FLAG_NONE;
148}
149
150static Evas_Event_Flags
151rotate_end(void *_po, void *event_info)
152{
153 Photo_Object *po = (Photo_Object *) _po;
154 Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
155 printf("rotate end/abort <%d,%d> base=<%f> <%f>\n", p->x, p->y, RAD2DEG(p->base_angle), RAD2DEG(p->angle));
156 po->base_rotate += (int) RAD2DEG(p->base_angle - p->angle);
157 if (po->rotate < 0)
158 po->rotate += 360;
159 return EVAS_EVENT_FLAG_NONE;
160}
161
162static Evas_Event_Flags
163zoom_start(void *_po, void *event_info)
164{
165 Photo_Object *po = (Photo_Object *) _po;
166 Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
167 printf("zoom start <%d,%d> <%f>\n", p->x, p->y, p->zoom);
168
169 /* If there's an active animator, stop it */
170 if (po->zoom_out)
171 {
172 elm_transit_del(po->zoom_out);
173 po->zoom_out = NULL;
174 }
175
176 /* Give it a "lift" effect right from the start */
177 po->base_zoom = BASE_ZOOM * LIFT_FACTOR;
178 po->zoom = po->base_zoom;
179 po->shadow_zoom = 1.7;
180
181 apply_changes(po);
182 return EVAS_EVENT_FLAG_NONE;
183}
184
185static Evas_Event_Flags
186zoom_move(void *_po, void *event_info)
187{
188 Photo_Object *po = (Photo_Object *) _po;
189 Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
190 printf("zoom move <%d,%d> <%f>\n", p->x, p->y, p->zoom);
191 po->zoom = po->base_zoom * p->zoom;
192 apply_changes(po);
193 return EVAS_EVENT_FLAG_NONE;
194}
195
196static Evas_Event_Flags
197zoom_end(void *_po, void *event_info)
198{
199 Photo_Object *po = (Photo_Object *) _po;
200 Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
201 printf("zoom end/abort <%d,%d> <%f>\n", p->x, p->y, p->zoom);
202
203 /* Apply the zoom out animator */
204 po->shadow_zoom = 1.3;
205 po->base_zoom = po->zoom;
206 po->zoom_out = elm_transit_add();
207 elm_transit_duration_set(po->zoom_out, zoom_out_animation_duration);
208 elm_transit_effect_add(po->zoom_out, zoom_out_animation_operation, po, zoom_out_animation_end);
209 elm_transit_go(po->zoom_out);
210 return EVAS_EVENT_FLAG_NONE;
211}
212
213static Evas_Event_Flags
214momentum_start(void *_po, void *event_info)
215{
216 Photo_Object *po = (Photo_Object *) _po;
217 Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
218 printf("momentum_start <%d,%d>\n", p->x2, p->y2);
219
220 po->dx = p->x2 - po->bx;
221 po->dy = p->y2 - po->by;
222 apply_changes(po);
223
224 return EVAS_EVENT_FLAG_NONE;
225}
226
227static Evas_Event_Flags
228momentum_move(void *_po, void *event_info)
229{
230 Photo_Object *po = (Photo_Object *) _po;
231 Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
232 printf("momentum move <%d,%d>\n", p->x2, p->y2);
233
234 po->bx = p->x2 - po->dx;
235 po->by = p->y2 - po->dy;
236 apply_changes(po);
237
238 return EVAS_EVENT_FLAG_NONE;
239}
240
241static Evas_Event_Flags
242momentum_end(void *_po, void *event_info)
243{
244 Photo_Object *po = (Photo_Object *) _po;
245 Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
246 printf("momentum end/abort <%d,%d> <%d,%d>\n", p->x2, p->y2, p->mx, p->my);
247 (void) po;
248 (void) p;
249 /* Make sure middle is in the screen, if not, fix it. */
250 {
251 /* FIXME: Use actual window sizes instead of the hardcoded
252 * values */
253 Evas_Coord mx, my;
254 mx = po->bx + (po->bw / 2);
255 my = po->by + (po->bh / 2);
256 if (mx < 0)
257 po->bx = 0 - (po->bw / 2);
258 else if (mx > 480)
259 po->bx = 480 - (po->bw / 2);
260
261 if (my < 0)
262 po->by = 0 - (po->bw / 2);
263 else if (my > 800)
264 po->by = 800 - (po->bh / 2);
265 }
266 apply_changes(po);
267
268 return EVAS_EVENT_FLAG_NONE;
269}
270
271static void
272_win_del_req(void *data, Evas_Object *obj __UNUSED__,
273 void *event_info __UNUSED__)
274{
275 Photo_Object **photo_array = (Photo_Object **) data;
276
277 if (!photo_array)
278 return;
279
280 /* The content of the photo object is automatically deleted when the win
281 * is deleted. */
282 for ( ; *photo_array ; photo_array++)
283 free(*photo_array);
284
285 free(data);
286}
287
288
289Photo_Object *
290photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon, Evas_Coord x,
291 Evas_Coord y, Evas_Coord w, Evas_Coord h, int angle)
292{
293 char buf[PATH_MAX];
294 Photo_Object *po;
295 po = calloc(1, sizeof(*po));
296 po->base_zoom = po->zoom = BASE_ZOOM;
297
298 if (ic)
299 {
300 po->ic = ic;
301 }
302 else
303 {
304 po->ic = elm_icon_add(parent);
305 elm_icon_file_set(po->ic, icon, NULL);
306 }
307
308 po->bx = x;
309 po->by = y;
310 po->bw = w;
311 po->bh = h;
312
313 /* Add shadow */
314 {
315 po->shadow = elm_icon_add(po->ic);
316 snprintf(buf, sizeof(buf), "%s/images/pol_shadow.png", elm_app_data_dir_get());
317 elm_icon_file_set(po->shadow, buf, NULL);
318 evas_object_resize(po->shadow, SHADOW_W, SHADOW_H);
319 evas_object_show(po->shadow);
320 }
321
322 po->hit = evas_object_polygon_add(evas_object_evas_get(parent));
323 evas_object_precise_is_inside_set(po->hit, EINA_TRUE);
324 evas_object_repeat_events_set(po->hit, EINA_TRUE);
325 evas_object_color_set(po->hit, 0, 0, 0, 0);
326
327 evas_object_resize(po->ic, po->bw, po->bh);
328 evas_object_show(po->ic);
329
330 evas_object_show(po->hit);
331
332 po->gl = elm_gesture_layer_add(po->ic);
333 elm_gesture_layer_hold_events_set(po->gl, EINA_TRUE);
334 elm_gesture_layer_attach(po->gl, po->hit);
335
336 /* FIXME: Add a po->rotate start so we take the first angle!!!! */
337 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_MOVE, rotate_move, po);
338 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_END, rotate_end, po);
339 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_ABORT, rotate_end, po);
340 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_START, zoom_start, po);
341 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_MOVE, zoom_move, po);
342 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_END, zoom_end, po);
343 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_ABORT, zoom_end, po);
344 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_START, momentum_start, po);
345 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_MOVE, momentum_move, po);
346 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_END, momentum_end, po);
347 elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_ABORT, momentum_end, po);
348
349 po->rotate = po->base_rotate = angle;
350 po->shadow_zoom = 1.3;
351
352 apply_changes(po);
353 return po;
354}
355
356void
357test_gesture_layer(void *data __UNUSED__, Evas_Object *obj __UNUSED__,
358 void *event_info __UNUSED__)
359{
360 Evas_Coord w, h;
361 Evas_Object *win, *bg;
362 char buf[PATH_MAX];
363 int ind = 0;
364 Photo_Object **photo_array;
365 photo_array = calloc(sizeof(*photo_array), 4);
366
367 w = 480;
368 h = 800;
369
370 win = elm_win_add(NULL, "gesture-layer", ELM_WIN_BASIC);
371 elm_win_title_set(win, "Gesture Layer");
372 elm_win_autodel_set(win, EINA_TRUE);
373 evas_object_resize(win, w, h);
374
375 bg = elm_bg_add(win);
376 snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get());
377 elm_bg_file_set(bg, buf, NULL);
378 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
379 elm_win_resize_object_add(win, bg);
380 evas_object_show(bg);
381
382 snprintf(buf, sizeof(buf), "%s/images/pol_sky.png", elm_app_data_dir_get());
383 photo_array[ind++] = photo_object_add(win, NULL, buf, 200, 200, 365, 400, 0);
384 snprintf(buf, sizeof(buf), "%s/images/pol_twofish.png", elm_app_data_dir_get());
385 photo_array[ind++] = photo_object_add(win, NULL, buf, 40, 300, 365, 400, 45);
386
387 Evas_Object *en = elm_entry_add(win);
388 elm_object_text_set(en, "You can use whatever object you want, "
389 "even entries like this.");
390 elm_entry_line_wrap_set(en, ELM_WRAP_MIXED);
391
392 Evas_Object *postit = elm_layout_add(win);
393 snprintf(buf, sizeof(buf), "%s/objects/postit_ent.edj", elm_app_data_dir_get());
394 elm_layout_file_set(postit, buf, "main");
395 elm_object_part_content_set(postit, "ent", en);
396
397 photo_array[ind++] = photo_object_add(win, postit, NULL, 50, 50, 382, 400, 355);
398
399 photo_array[ind] = NULL;
400 evas_object_smart_callback_add(win, "delete,request", _win_del_req,
401 photo_array);
402 evas_object_show(win);
403}
404
405#endif
406