1 #include <Elementary.h>
4 typedef struct _Smart_Data Smart_Data;
12 Eina_Bool fill_inside : 1;
13 Eina_Bool scale_up : 1;
14 Eina_Bool scale_down : 1;
15 Eina_Bool preloading : 1;
19 Elm_Image_Orient orient;
22 /* local subsystem functions */
23 static void _smart_reconfigure(Smart_Data *sd);
24 static void _smart_init(void);
25 static void _smart_add(Evas_Object *obj);
26 static void _smart_del(Evas_Object *obj);
27 static void _smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
28 static void _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
29 static void _smart_show(Evas_Object *obj);
30 static void _smart_hide(Evas_Object *obj);
31 static void _smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
32 static void _smart_clip_set(Evas_Object *obj, Evas_Object * clip);
33 static void _smart_clip_unset(Evas_Object *obj);
35 static void _els_smart_icon_flip_horizontal(Smart_Data *sd);
36 static void _els_smart_icon_flip_vertical(Smart_Data *sd);
37 static void _els_smart_icon_rotate_180(Smart_Data *sd);
38 static Eina_Bool _els_smart_icon_dropcb(void *,Evas_Object *, Elm_Selection_Data *);
40 /* local subsystem globals */
41 static Evas_Smart *_e_smart = NULL;
43 /* externally accessible functions */
45 _els_smart_icon_add(Evas *evas)
48 return evas_object_smart_add(evas, _e_smart);
52 _preloaded(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
54 Smart_Data *sd = data;
56 sd->preloading = EINA_FALSE;
58 evas_object_show(sd->obj);
62 _els_smart_icon_file_key_set(Evas_Object *obj, const char *file, const char *key)
67 sd = evas_object_smart_data_get(obj);
68 if (!sd) return EINA_FALSE;
72 pclip = evas_object_clip_get(sd->obj);
73 if (sd->obj) evas_object_del(sd->obj);
74 sd->obj = evas_object_image_add(evas_object_evas_get(obj));
75 evas_object_image_scale_hint_set(sd->obj, EVAS_IMAGE_SCALE_HINT_STATIC);
76 evas_object_smart_member_add(sd->obj, obj);
77 evas_object_event_callback_add(sd->obj, EVAS_CALLBACK_IMAGE_PRELOADED,
79 evas_object_clip_set(sd->obj, pclip);
80 sd->edje = EINA_FALSE;
83 evas_object_image_load_size_set(sd->obj, sd->size, sd->size);
84 evas_object_image_file_set(sd->obj, file, key);
85 sd->preloading = EINA_TRUE;
87 evas_object_hide(sd->obj);
88 evas_object_image_preload(sd->obj, EINA_FALSE);
89 if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
91 _smart_reconfigure(sd);
96 _els_smart_icon_file_edje_set(Evas_Object *obj, const char *file, const char *part)
101 sd = evas_object_smart_data_get(obj);
102 if (!sd) return EINA_FALSE;
103 /* smart code here */
106 pclip = evas_object_clip_get(sd->obj);
107 if (sd->obj) evas_object_del(sd->obj);
108 sd->obj = edje_object_add(evas_object_evas_get(obj));
109 evas_object_smart_member_add(sd->obj, obj);
110 if (sd->show) evas_object_show(sd->obj);
111 evas_object_clip_set(sd->obj, pclip);
113 sd->edje = EINA_TRUE;
114 if (!edje_object_file_set(sd->obj, file, part))
116 _smart_reconfigure(sd);
121 _els_smart_icon_file_get(const Evas_Object *obj, const char **file, const char **key)
123 Smart_Data *sd = evas_object_smart_data_get(obj);
126 edje_object_file_get(sd->obj, file, key);
128 evas_object_image_file_get(sd->obj, file, key);
132 _els_smart_icon_smooth_scale_set(Evas_Object *obj, Eina_Bool smooth)
134 Smart_Data *sd = evas_object_smart_data_get(obj);
138 evas_object_image_smooth_scale_set(sd->obj, smooth);
142 _els_smart_icon_smooth_scale_get(const Evas_Object *obj)
144 Smart_Data *sd = evas_object_smart_data_get(obj);
145 if (!sd) return EINA_FALSE;
148 return evas_object_image_smooth_scale_get(sd->obj);
152 _els_smart_icon_object_get(const Evas_Object *obj)
154 Smart_Data *sd = evas_object_smart_data_get(obj);
155 if (!sd) return NULL;
160 _els_smart_icon_size_get(const Evas_Object *obj, int *w, int *h)
166 sd = evas_object_smart_data_get(obj);
168 if (!strcmp(evas_object_type_get(sd->obj), "edje"))
169 edje_object_size_min_get(sd->obj, &tw, &th);
171 evas_object_image_size_get(sd->obj, &tw, &th);
172 evas_object_geometry_get(sd->obj, NULL, NULL, &cw, &ch);
173 tw = tw > cw ? tw : cw;
174 th = th > ch ? th : ch;
175 tw = ((double)tw) * sd->scale;
176 th = ((double)th) * sd->scale;
182 _els_smart_icon_fill_inside_set(Evas_Object *obj, Eina_Bool fill_inside)
186 sd = evas_object_smart_data_get(obj);
188 if (((sd->fill_inside) && (fill_inside)) ||
189 ((!sd->fill_inside) && (!fill_inside))) return;
190 sd->fill_inside = fill_inside;
191 _smart_reconfigure(sd);
195 _els_smart_icon_fill_inside_get(const Evas_Object *obj)
197 Smart_Data *sd = evas_object_smart_data_get(obj);
198 if (!sd) return EINA_FALSE;
199 return sd->fill_inside;
203 _els_smart_icon_scale_up_set(Evas_Object *obj, Eina_Bool scale_up)
207 sd = evas_object_smart_data_get(obj);
209 if (((sd->scale_up) && (scale_up)) ||
210 ((!sd->scale_up) && (!scale_up))) return;
211 sd->scale_up = scale_up;
212 _smart_reconfigure(sd);
216 _els_smart_icon_scale_up_get(const Evas_Object *obj)
218 Smart_Data *sd; sd = evas_object_smart_data_get(obj);
219 if (!sd) return EINA_FALSE;
224 _els_smart_icon_scale_down_set(Evas_Object *obj, Eina_Bool scale_down)
228 sd = evas_object_smart_data_get(obj);
230 if (((sd->scale_down) && (scale_down)) ||
231 ((!sd->scale_down) && (!scale_down))) return;
232 sd->scale_down = scale_down;
233 _smart_reconfigure(sd);
237 _els_smart_icon_scale_down_get(const Evas_Object *obj)
239 Smart_Data *sd; sd = evas_object_smart_data_get(obj);
240 if (!sd) return EINA_FALSE;
245 _els_smart_icon_scale_size_set(Evas_Object *obj, int size)
249 sd = evas_object_smart_data_get(obj);
252 if (!sd->obj) return;
255 evas_object_image_load_size_set(sd->obj, sd->size, sd->size);
259 _els_smart_icon_scale_size_get(const Evas_Object *obj)
261 Smart_Data *sd; sd = evas_object_smart_data_get(obj);
267 _els_smart_icon_scale_set(Evas_Object *obj, double scale)
269 Smart_Data *sd = evas_object_smart_data_get(obj);
272 _smart_reconfigure(sd);
276 _els_smart_icon_scale_get(const Evas_Object *obj)
278 Smart_Data *sd; sd = evas_object_smart_data_get(obj);
284 _els_smart_icon_orient_set(Evas_Object *obj, Elm_Image_Orient orient)
288 unsigned int *data, *data2, *to, *from;
289 int x, y, w, hw, iw, ih;
290 const char *file, *key;
292 sd = evas_object_smart_data_get(obj);
299 case ELM_IMAGE_FLIP_HORIZONTAL:
300 _els_smart_icon_flip_horizontal(sd);
302 case ELM_IMAGE_FLIP_VERTICAL:
303 _els_smart_icon_flip_vertical(sd);
305 case ELM_IMAGE_ROTATE_180_CW:
306 _els_smart_icon_rotate_180(sd);
312 evas_object_image_size_get(sd->obj, &iw, &ih);
313 evas_object_image_file_get(sd->obj, &file, &key);
314 tmp = evas_object_image_add(evas_object_evas_get(sd->obj));
315 evas_object_image_file_set(tmp, file, key);
316 data2 = evas_object_image_data_get(tmp, EINA_FALSE);
323 evas_object_image_size_set(sd->obj, iw, ih);
324 data = evas_object_image_data_get(sd->obj, EINA_TRUE);
327 case ELM_IMAGE_FLIP_TRANSPOSE:
331 case ELM_IMAGE_FLIP_TRANSVERSE:
336 case ELM_IMAGE_ROTATE_90_CW:
340 case ELM_IMAGE_ROTATE_90_CCW:
346 ERR("unknown orient %d", orient);
347 evas_object_del(tmp);
348 evas_object_image_data_set(sd->obj, data); // give it back
352 for (x = iw; --x >= 0;)
354 for (y = ih; --y >= 0;)
363 evas_object_del(tmp);
364 evas_object_image_data_set(sd->obj, data);
365 evas_object_image_data_update_add(sd->obj, 0, 0, iw, ih);
366 _smart_reconfigure(sd);
370 _els_smart_icon_orient_get(const Evas_Object *obj)
372 Smart_Data *sd; sd = evas_object_smart_data_get(obj);
378 * Turns on editing through drag and drop and copy and paste.
381 _els_smart_icon_edit_set(Evas_Object *obj, Eina_Bool edit, Evas_Object *parent)
383 Smart_Data *sd = evas_object_smart_data_get(obj);
388 printf("No editing edje objects yet (ever)\n");
392 /* Unfortunately eina bool is not a bool, but a char */
393 if (edit == sd->edit) return;
398 elm_drop_target_add(obj, ELM_SEL_FORMAT_IMAGE, _els_smart_icon_dropcb,
401 elm_drop_target_del(obj);
405 _els_smart_icon_edit_get(const Evas_Object *obj)
407 Smart_Data *sd; sd = evas_object_smart_data_get(obj);
408 if (!sd) return EINA_FALSE;
413 _els_smart_icon_edje_get(Evas_Object *obj)
415 Smart_Data *sd = evas_object_smart_data_get(obj);
416 if (!sd) return NULL;
417 if (!sd->edje) return NULL;
421 /* local subsystem globals */
423 _smart_reconfigure(Smart_Data *sd)
425 Evas_Coord x, y, w, h;
427 if (!sd->obj) return;
428 if (!strcmp(evas_object_type_get(sd->obj), "edje"))
434 evas_object_move(sd->obj, x, y);
435 evas_object_resize(sd->obj, w, h);
441 evas_object_image_size_get(sd->obj, &iw, &ih);
443 iw = ((double)iw) * sd->scale;
444 ih = ((double)ih) * sd->scale;
450 h = ((double)ih * w) / (double)iw;
457 w = ((double)iw * h) / (double)ih;
465 w = ((double)iw * h) / (double)ih;
470 if ((w > iw) || (h > ih))
478 if ((w < iw) || (h < ih))
484 x = sd->x + ((sd->w - w) / 2);
485 y = sd->y + ((sd->h - h) / 2);
486 evas_object_move(sd->obj, x, y);
487 evas_object_image_fill_set(sd->obj, 0, 0, w, h);
488 evas_object_resize(sd->obj, w, h);
495 if (_e_smart) return;
497 static const Evas_Smart_Class sc =
500 EVAS_SMART_CLASS_VERSION,
518 _e_smart = evas_smart_class_new(&sc);
523 _smart_add(Evas_Object *obj)
527 sd = calloc(1, sizeof(Smart_Data));
529 sd->obj = evas_object_image_add(evas_object_evas_get(obj));
530 evas_object_image_scale_hint_set(sd->obj, EVAS_IMAGE_SCALE_HINT_STATIC);
535 sd->fill_inside = EINA_TRUE;
536 sd->scale_up = EINA_TRUE;
537 sd->scale_down = EINA_TRUE;
540 evas_object_smart_member_add(sd->obj, obj);
541 evas_object_smart_data_set(obj, sd);
542 evas_object_event_callback_add(sd->obj, EVAS_CALLBACK_IMAGE_PRELOADED,
547 _smart_del(Evas_Object *obj)
551 sd = evas_object_smart_data_get(obj);
553 evas_object_del(sd->obj);
558 _smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
562 sd = evas_object_smart_data_get(obj);
564 if ((sd->x == x) && (sd->y == y)) return;
567 _smart_reconfigure(sd);
571 _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
575 sd = evas_object_smart_data_get(obj);
577 if ((sd->w == w) && (sd->h == h)) return;
580 _smart_reconfigure(sd);
584 _smart_show(Evas_Object *obj)
588 sd = evas_object_smart_data_get(obj);
590 sd->show = EINA_TRUE;
592 evas_object_show(sd->obj);
596 _smart_hide(Evas_Object *obj)
600 sd = evas_object_smart_data_get(obj);
602 sd->show = EINA_FALSE;
603 evas_object_hide(sd->obj);
607 _smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
611 sd = evas_object_smart_data_get(obj);
613 evas_object_color_set(sd->obj, r, g, b, a);
617 _smart_clip_set(Evas_Object *obj, Evas_Object * clip)
621 sd = evas_object_smart_data_get(obj);
623 evas_object_clip_set(sd->obj, clip);
627 _smart_clip_unset(Evas_Object *obj)
631 sd = evas_object_smart_data_get(obj);
633 evas_object_clip_unset(sd->obj);
637 _els_smart_icon_flip_horizontal(Smart_Data *sd)
640 unsigned int *p1, *p2, tmp;
643 evas_object_image_size_get(sd->obj, &iw, &ih);
644 data = evas_object_image_data_get(sd->obj, EINA_TRUE);
646 for (y = 0; y < ih; y++)
648 p1 = data + (y * iw);
649 p2 = data + ((y + 1) * iw) - 1;
650 for (x = 0; x < (iw >> 1); x++)
660 evas_object_image_data_set(sd->obj, data);
661 evas_object_image_data_update_add(sd->obj, 0, 0, iw, ih);
662 _smart_reconfigure(sd);
666 _els_smart_icon_flip_vertical(Smart_Data *sd)
669 unsigned int *p1, *p2, tmp;
672 evas_object_image_size_get(sd->obj, &iw, &ih);
673 data = evas_object_image_data_get(sd->obj, EINA_TRUE);
675 for (y = 0; y < (ih >> 1); y++)
677 p1 = data + (y * iw);
678 p2 = data + ((ih - 1 - y) * iw);
679 for (x = 0; x < iw; x++)
689 evas_object_image_data_set(sd->obj, data);
690 evas_object_image_data_update_add(sd->obj, 0, 0, iw, ih);
691 _smart_reconfigure(sd);
695 _els_smart_icon_rotate_180(Smart_Data *sd)
698 unsigned int *p1, *p2, tmp;
701 evas_object_image_size_get(sd->obj, &iw, &ih);
702 data = evas_object_image_data_get(sd->obj, 1);
716 evas_object_image_data_set(sd->obj, data);
717 evas_object_image_data_update_add(sd->obj, 0, 0, iw, ih);
718 _smart_reconfigure(sd);
722 _els_smart_icon_dropcb(void *elmobj,Evas_Object *obj, Elm_Selection_Data *drop)
724 _els_smart_icon_file_key_set(obj, drop->data, NULL);
725 evas_object_smart_callback_call(elmobj, "drop", drop->data);
729 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-3f0^-2{2(0W1st0 :*/