3 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
7 #include <Elementary.h>
11 * @defgroup Imageslider Imageslider
14 * By flicking images on the screen,
15 * you can see the images in specific path.
18 typedef struct _Widget_Data Widget_Data;
20 #define ANI_STEP (14 * elm_scale_get())
21 #define ANI_TIME (0.005)
22 #define ANI_TIME_MSEC (12)
23 #define CLICK_TIME_MAX (180)
24 #define CLICK_WIDTH_MIN (elm_finger_size_get() >> 1)
25 #define FLICK_TIME_MAX (200)
26 #define FLICK_WIDTH_MIN (elm_finger_size_get() >> 2)
28 #define STEP_WEIGHT_DEF (1)
29 #define STEP_WEIGHT_MAX (2)
30 #define STEP_WEIGHT_MIN (0)
31 #define MOVING_IMAGE_SIZE (128)
32 #define MAX_ZOOM_SIZE (6)
33 #define INTERVAL_WIDTH (15)
34 #define MULTITOUCHDEVICE (11)
36 // Enumeration for layout.
46 struct _Imageslider_Item
49 const char *photo_file;
50 void (*func) (void *data, Evas_Object *obj, void *event_info);
52 Evas_Coord x, y, w, h;
53 Evas_Coord ox, oy, ow, oh;
57 // Image Slider Widget Data.
60 Evas_Object *ly[BLOCK_MAX];
64 Evas_Coord x, y, w, h;
66 Ecore_Idler *queue_idler;
67 Ecore_Timer *anim_timer;
69 Evas_Coord_Point down_pos;
74 unsigned int timestamp;
83 int mdx, mdy, mmx, mmy;
88 // Global value declaration.
89 static const char *widtype = NULL;
91 static const char SIG_CLICKED[] = "clicked";
93 // Internal function declaration.
94 static void _del_hook(Evas_Object *obj);
96 static void _theme_hook(Evas_Object *obj);
98 static void _sizing_eval(Evas_Object *obj);
100 static void _imageslider_move(void *data, Evas * e, Evas_Object *obj, void *event_info);
101 static void _imageslider_resize(void *data, Evas * e, Evas_Object *obj, void *event_info);
102 static void _imageslider_show(void *data, Evas * e, Evas_Object *obj, void *event_info);
103 static void _imageslider_hide(void *data, Evas * e, Evas_Object *obj, void *event_info);
104 static void _imageslider_update(Widget_Data * wd);
106 static void _imageslider_update_pos(Widget_Data * wd, Evas_Coord x, Evas_Coord y, Evas_Coord w);
107 static void _imageslider_update_center_pos(Widget_Data * wd, Evas_Coord x, Evas_Coord my, Evas_Coord y, Evas_Coord w);
109 static void _imageslider_obj_shift(Widget_Data * wd, Eina_Bool left);
111 static void _imageslider_obj_move(Widget_Data * wd, Evas_Coord step);
113 static Eina_Bool _icon_to_image(void *data);
115 static int _check_drag(int state, void *data);
117 static void _check_zoom(void *data);
119 static void _anim(Widget_Data * wd);
121 static Eina_Bool _timer_cb(void *data);
123 //static void _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
124 static void _ev_imageslider_down_cb(void *data, Evas * e, Evas_Object *obj, void *event_info);
125 static void _ev_imageslider_up_cb(void *data, Evas * e, Evas_Object *obj, void *event_info);
126 static void _ev_imageslider_move_cb(void *data, Evas * e, Evas_Object *obj, void *event_info);
128 // Whenever the Image Slider item is deleted, Call this funtion.
130 _del_hook(Evas_Object *obj)
136 wd = elm_widget_data_get(obj);
141 for (i = 0; i < BLOCK_MAX; i++)
143 elm_widget_sub_object_del(wd->obj, wd->ly[i]);
144 evas_object_del(wd->ly[i]);
149 eina_list_free(wd->its);
155 ecore_idler_del(wd->queue_idler);
156 wd->queue_idler = NULL;
161 ecore_timer_del(wd->anim_timer);
162 wd->anim_timer = NULL;
170 // Whenever require processing theme, Call this function
172 _theme_hook(Evas_Object *obj)
175 Widget_Data *wd = elm_widget_data_get(obj);
179 for (i = 0; i < BLOCK_MAX; i++)
182 _elm_theme_object_set(obj, wd->ly[i], "imageslider", "base",
183 elm_object_style_get(obj));
184 evas_object_show(wd->ly[i]);
186 _imageslider_update(wd);
190 // Resize Image Slider item.
192 _sizing_eval(Evas_Object *obj)
196 Widget_Data *wd = elm_widget_data_get(obj);
201 e = evas_object_evas_get(wd->obj);
203 _imageslider_move(obj, e, obj, NULL);
204 _imageslider_resize(obj, e, obj, NULL);
208 // Whenever MOVE event occurs, Call this function.
210 _imageslider_move(void *data, Evas * e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
219 wd = elm_widget_data_get((Evas_Object *) data);
223 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
227 _imageslider_update_pos(wd, wd->x, wd->y, wd->w);
231 // Whenever RESIZE event occurs, Call this fucntion.
233 _imageslider_resize(void *data, Evas * e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
244 wd = elm_widget_data_get((Evas_Object *) data);
248 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
249 fprintf(stderr, "%d %d -resize\n", w, h);
253 for (i = 0; i < BLOCK_MAX; i++)
255 evas_object_resize(wd->ly[i], w, h);
258 _imageslider_update_pos(wd, wd->x, wd->y, wd->w);
262 // Whenever SHOW event occurs, Call this function.
264 _imageslider_show(void *data, Evas * e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
273 wd = elm_widget_data_get((Evas_Object *) data);
276 evas_object_show(wd->clip);
279 // Whenever HIDE event occurs, Call this function.
281 _imageslider_hide(void *data, Evas * e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
287 wd = elm_widget_data_get((Evas_Object *) data);
289 evas_object_hide(wd->clip);
292 // Update Image Slider item position.
294 _imageslider_update_pos(Widget_Data * wd, Evas_Coord x, Evas_Coord y, Evas_Coord w)
297 evas_object_move(wd->ly[BLOCK_LEFT], x - (w + INTERVAL_WIDTH), y);
298 evas_object_move(wd->ly[BLOCK_CENTER], x, y);
299 evas_object_move(wd->ly[BLOCK_RIGHT], x + (w + INTERVAL_WIDTH), y);
300 //making sure that the clipping happens for all three layouts based on clipper's geometry
301 for (i = 0; i < BLOCK_MAX; i++)
302 evas_object_clip_set(wd->ly[i], wd->clip);
303 evas_render_idle_flush(evas_object_evas_get(wd->obj));
306 // Update the center position of Image Slider item.
308 _imageslider_update_center_pos(Widget_Data * wd, Evas_Coord x, Evas_Coord my __UNUSED__, Evas_Coord y, Evas_Coord w)
310 Evas_Coord ix, iy, iw, ih;
311 const Evas_Object *eo = elm_layout_content_get((const Evas_Object*)(wd->ly[BLOCK_CENTER]), "swl.photo");
312 evas_object_geometry_get(eo, &ix, &iy, &iw, &ih);
313 if ((ix > 0) || (ix + iw < wd->w))
315 edje_object_signal_emit(elm_layout_edje_get(wd->ly[BLOCK_CENTER]), "block.on", "block");
316 _imageslider_update_pos(wd, x, y, w);
317 wd->on_zoom = EINA_FALSE;
321 // Shift next/previous Image Slider item in layouts.
323 _imageslider_obj_shift(Widget_Data * wd, Eina_Bool left)
327 Evas_Object *ly_temp;
328 ly_temp = wd->ly[BLOCK_LEFT];
329 wd->ly[BLOCK_LEFT] = wd->ly[BLOCK_CENTER];
330 wd->ly[BLOCK_CENTER] = wd->ly[BLOCK_RIGHT];
331 wd->ly[BLOCK_RIGHT] = ly_temp;
332 elm_layout_content_set(wd->ly[BLOCK_RIGHT], "swl.photo", NULL);
336 Evas_Object *ly_temp;
337 ly_temp = wd->ly[BLOCK_RIGHT];
338 wd->ly[BLOCK_RIGHT] = wd->ly[BLOCK_CENTER];
339 wd->ly[BLOCK_CENTER] = wd->ly[BLOCK_LEFT];
340 wd->ly[BLOCK_LEFT] = ly_temp;
341 elm_layout_content_set(wd->ly[BLOCK_LEFT], "swl.photo", NULL);
345 // Move the current Image Slider item and update.
347 _imageslider_obj_move(Widget_Data * wd, Evas_Coord step)
351 wd->cur = eina_list_next(wd->cur);
354 wd->cur = eina_list_last(wd->its);
359 wd->step = -ANI_STEP;
361 _imageslider_obj_shift(wd, 0);
367 wd->cur = eina_list_prev(wd->cur);
371 wd->step = -ANI_STEP;
377 _imageslider_obj_shift(wd, 1);
386 wd->step = -ANI_STEP;
390 _imageslider_update(wd);
393 // Whenever MOUSE DOWN event occurs, Call this function.
395 _ev_imageslider_down_cb(void *data, Evas * e __UNUSED__, Evas_Object *obj, void *event_info)
397 Widget_Data *wd = data;
398 Evas_Coord ix, iy, iw, ih;
399 Evas_Event_Mouse_Down *ev = event_info;
400 Evas_Object *eo = NULL;
405 wd->down_pos = ev->canvas;
406 wd->timestamp = ev->timestamp;
407 wd->move_cnt = MOVE_STEP;
409 wd->dx = ev->canvas.x;
410 wd->dy = ev->canvas.y;
411 wd->mx = ev->canvas.x;
412 wd->my = ev->canvas.y;
417 eo = (Evas_Object*)elm_layout_content_get((const Evas_Object*)obj, "swl.photo");
419 evas_object_geometry_get(eo, &ix, &iy, &iw, &ih);
423 wd->on_zoom = EINA_TRUE;
424 edje_object_signal_emit(elm_layout_edje_get(obj), "block.off", "block");
429 // Whenever MOUSE UP event occurs, Call this function.
430 // And make Click Event also.
432 _ev_imageslider_up_cb(void *data, Evas * e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
434 Widget_Data *wd = data;
436 Evas_Event_Mouse_Up *ev = event_info;
450 step = wd->down_pos.x - ev->canvas.x;
451 interval = ev->timestamp - wd->timestamp;
452 if (step == 0 || interval == 0)
454 fprintf(stderr, "[[[ DEBUG ]]]: case1: emit CLICK event\n");
455 evas_object_smart_callback_call(wd->obj, SIG_CLICKED, NULL);
458 if (interval < CLICK_TIME_MAX)
460 if (step < CLICK_WIDTH_MIN && step > CLICK_WIDTH_MIN)
462 fprintf(stderr, "[[[ DEBUG ]]]: case2: emit CLICK event\n");
463 evas_object_smart_callback_call(wd->obj, SIG_CLICKED, NULL);
468 if (interval < FLICK_TIME_MAX)
470 if (step < FLICK_WIDTH_MIN && step > FLICK_WIDTH_MIN)
472 fprintf(stderr, "[[[ DEBUG ]]]:_ev_imageslider_up_cb-black zone (1)\n");
474 _imageslider_obj_move(wd, 0);
478 fprintf(stderr, "[[[ DEBUG ]]]:_ev_imageslider_up_cb-black zone (2)\n");
480 _imageslider_obj_move(wd, step);
486 step = (wd->x - wd->move_x) << 1;
487 if (step <= wd->w && step >= -(wd->w))
489 fprintf(stderr, "[[[ DEBUG ]]]:_ev_imageslider_up_cb-white zone (1)\n");
491 _imageslider_obj_move(wd, 0);
495 fprintf(stderr, "[[[ DEBUG ]]]:_ev_imageslider_up_cb-white zone (2)\n");
497 _imageslider_obj_move(wd, step);
504 // Whenever MOUSE MOVE event occurs, Call this API.
506 _ev_imageslider_move_cb(void *data, Evas * e __UNUSED__, Evas_Object *obj, void *event_info)
514 Widget_Data *wd = data;
516 Evas_Event_Mouse_Move *ev = event_info;
518 Elm_Imageslider_Item *it;
523 if (wd->move_cnt == MOVE_STEP)
525 if (wd->on_hold == EINA_FALSE)
531 step = ev->cur.canvas.x - wd->down_pos.x;
537 wd->move_x = wd->x + ((ev->cur.canvas.x - wd->down_pos.x));
538 wd->move_y = wd->y + ((ev->cur.canvas.y - wd->down_pos.y));
542 _imageslider_update_center_pos(wd, wd->move_x, wd->move_y, wd->y, wd->w);
546 _imageslider_update_pos(wd, wd->move_x, wd->y, wd->w);
552 wd->mx = ev->cur.canvas.x;
553 wd->my = ev->cur.canvas.y;
556 sqrt((wd->mx - wd->mmx) * (wd->mx - wd->mmx) + (wd->my - wd->mmy) * (wd->my - wd->mmy));
558 eo = (Evas_Object*)elm_layout_content_get((const Evas_Object*)obj, "swl.photo");
561 it = eina_list_data_get(wd->cur);
562 if (((it->w * wd->ratio / wd->dratio) / it->ow) < MAX_ZOOM_SIZE)
564 edje_object_part_unswallow(elm_layout_edje_get(obj), eo);
565 evas_object_resize(eo, it->w * wd->ratio / wd->dratio, it->h * wd->ratio / wd->dratio);
566 evas_object_size_hint_min_set(eo, it->w * wd->ratio / wd->dratio, it->h * wd->ratio / wd->dratio);
567 elm_layout_content_set(obj, "swl.photo", eo);
577 // Whenever CLICK event occurs, Call this API
578 // But, DONOT emit CLICK event.
579 // DO NOT use this callback function. Remove later.
581 _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
583 fprintf(stderr, "[[[ DEBUG ]]]: Call the callback function about Click event!, But DONOT emit CLICK event in the callback function!\n");
588 time_get(Evas_Coord x, Evas_Coord w)
592 time = (-sin(x / w) + 1) / 500;
601 _icon_to_image(void *data)
603 Widget_Data *wd = data;
606 _imageslider_update(wd);
610 ecore_idler_del(wd->queue_idler);
611 wd->queue_idler = NULL;
613 return ECORE_CALLBACK_CANCEL;
617 _check_drag(int state, void *data)
619 Widget_Data *wd = data;
621 Elm_Imageslider_Item *it;
623 Evas_Coord ix, iy, iw, ih;
627 Eina_List *l[BLOCK_MAX];
629 Evas_Object *eo = NULL;
631 l[BLOCK_LEFT] = eina_list_prev(wd->cur);
632 l[BLOCK_CENTER] = wd->cur;
633 l[BLOCK_RIGHT] = eina_list_next(wd->cur);
635 it = eina_list_data_get(l[state]);
637 eo = (Evas_Object*)elm_layout_content_get(wd->ly[state], "swl.photo");
639 evas_object_geometry_get(eo, &ix, &iy, &iw, &ih);
640 edje_object_part_drag_value_get(elm_layout_edje_get(wd->ly[state]), "swl.photo", &dx, &dy);
642 if ((iw != wd->w) || ((dx != 0) || (dy != 0)))
644 elm_layout_content_set(wd->ly[state], "swl.photo", NULL);
653 _check_zoom(void *data)
655 Widget_Data *wd = data;
657 Elm_Imageslider_Item *it;
659 Evas_Coord ix, iy, iw, ih;
663 Evas_Object *eo = NULL;
665 it = eina_list_data_get(wd->cur);
667 eo = (Evas_Object*)elm_layout_content_get(wd->ly[BLOCK_CENTER], "swl.photo");
669 evas_object_geometry_get(eo, &ix, &iy, &iw, &ih);
670 evas_object_geometry_get(eo, &ix, &iy, &iw, &ih);
671 edje_object_part_drag_value_get(elm_layout_edje_get(wd->ly[BLOCK_CENTER]), "swl.photo", &dx, &dy);
673 if ((iw != wd->w) || ((dx != 0) || (dy != 0)))
675 wd->on_zoom = EINA_TRUE;
676 edje_object_signal_emit(elm_layout_edje_get(wd->ly[BLOCK_CENTER]), "block.off", "block");
680 wd->on_zoom = EINA_FALSE;
681 edje_object_signal_emit(elm_layout_edje_get(wd->ly[BLOCK_CENTER]), "block.on", "block");
686 _timer_cb(void *data)
690 Elm_Imageslider_Item *it;
699 if (wd->ani_lock == 0)
702 gettimeofday(&tv, NULL);
704 t = (tv.tv_sec - wd->tv.tv_sec) * 1000 + (tv.tv_usec - wd->tv.tv_usec) / 1000;
705 gettimeofday(&wd->tv, NULL);
707 t = t / ANI_TIME_MSEC;
708 if (t <= STEP_WEIGHT_MIN)
710 else if (t > STEP_WEIGHT_MAX)
713 wd->move_x += (wd->step) * t;
715 if (wd->step < 0 && wd->move_x < wd->x)
717 else if (wd->step > 0 && wd->move_x > wd->x)
720 _imageslider_update_pos(wd, wd->move_x, wd->y, wd->w);
722 if (wd->move_x == wd->x)
727 it = eina_list_data_get(wd->cur);
729 it->func(it->data, wd->obj, it);
733 it = eina_list_data_get(wd->cur);
734 evas_object_smart_callback_call(wd->obj, "changed", it);
737 ret = _check_drag(BLOCK_LEFT, wd);
738 ret = _check_drag(BLOCK_RIGHT, wd);
741 if (!wd->queue_idler)
742 wd->queue_idler = ecore_idler_add(_icon_to_image, wd);
746 ecore_timer_del(wd->anim_timer);
747 wd->anim_timer = NULL;
750 return ECORE_CALLBACK_CANCEL;
753 return ECORE_CALLBACK_RENEW;
757 _anim(Widget_Data * wd)
761 if (wd->x == wd->move_x)
763 _imageslider_update_pos(wd, wd->move_x, wd->y, wd->w);
770 gettimeofday(&wd->tv, NULL);
773 wd->anim_timer = ecore_timer_add(ANI_TIME, _timer_cb, wd);
776 // Update Image Slider Items.
778 _imageslider_update(Widget_Data * wd)
782 Eina_List *l[BLOCK_MAX];
784 Elm_Imageslider_Item *it;
791 if (!wd->cur) return;
793 l[BLOCK_LEFT] = eina_list_prev(wd->cur);
794 l[BLOCK_CENTER] = wd->cur;
795 l[BLOCK_RIGHT] = eina_list_next(wd->cur);
797 for (i = 0; i < BLOCK_MAX; i++)
799 eo = (Evas_Object*)elm_layout_content_get((const Evas_Object*)wd->ly[i], "swl.photo");
802 elm_layout_content_set(wd->ly[i], "swl.photo", NULL);
806 it = eina_list_data_get(l[i]);
812 eo = elm_image_add(wd->obj);
813 elm_layout_content_set(wd->ly[i], "swl.photo", eo);
814 //elm_image_prescale_set(eo, wd->w);
815 elm_image_file_set(eo, it->photo_file, NULL);
816 elm_image_object_size_get(eo, &it->w, &it->h);
817 evas_object_geometry_get(eo, &it->ox, &it->oy, &it->ow, &it->oh);
820 elm_layout_content_set(wd->ly[i], "swl.photo", eo);
823 if (wd->moving != it->moving)
825 it->moving = wd->moving;
828 //elm_image_prescale_set(eo, MOVING_IMAGE_SIZE);
832 //elm_image_prescale_set(eo, it->w > it->h ? it->w : it->h);
842 * Add an Image Slider widget
844 * @param parent The parent object
845 * @return The new Image slider object or NULL if it cannot be created
847 * @ingroup Imageslider
850 elm_imageslider_add(Evas_Object *parent)
854 Evas_Object *obj = NULL;
856 Widget_Data *wd = NULL;
863 wd = ELM_NEW(Widget_Data);
864 e = evas_object_evas_get(parent);
865 if (e == NULL) return NULL;
867 obj = elm_widget_add(e);
868 ELM_SET_WIDTYPE(widtype, "imageslider");
869 elm_widget_type_set(obj, "imageslider");
870 elm_widget_sub_object_add(parent, obj);
871 elm_widget_data_set(obj, wd);
872 elm_widget_del_hook_set(obj, _del_hook);
873 elm_widget_theme_hook_set(obj, _theme_hook);
875 wd->clip = evas_object_rectangle_add(e);
876 elm_widget_resize_object_set(obj, wd->clip);
878 for (i = 0; i < BLOCK_MAX; i++)
880 wd->ly[i] = elm_layout_add(obj);
881 elm_layout_theme_set(wd->ly[i], "imageslider", "base", "default");
882 elm_widget_sub_object_add(obj, wd->ly[i]);
883 evas_object_smart_member_add(wd->ly[i], obj);
885 //edje_object_signal_callback_add(elm_layout_edje_get(wd->ly[i]), "elm,photo,clicked", "", _signal_clicked, obj);
886 evas_object_event_callback_add(wd->ly[i], EVAS_CALLBACK_MOUSE_DOWN, _ev_imageslider_down_cb, wd);
887 evas_object_event_callback_add(wd->ly[i], EVAS_CALLBACK_MOUSE_UP, _ev_imageslider_up_cb, wd);
888 evas_object_event_callback_add(wd->ly[i], EVAS_CALLBACK_MOUSE_MOVE, _ev_imageslider_move_cb, wd);
889 evas_object_clip_set(wd->ly[i], wd->clip);
890 evas_object_show(wd->ly[i]);
895 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _imageslider_resize, obj);
896 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _imageslider_move, obj);
897 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _imageslider_show, obj);
898 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _imageslider_hide, obj);
906 * Append an Image Slider item
908 * @param obj The Image Slider object
909 * @param photo_file photo file path
910 * @param func callback function
911 * @param data callback data
912 * @return The Image Slider item handle or NULL
914 * @ingroup Imageslider
916 EAPI Elm_Imageslider_Item *
917 elm_imageslider_item_append(Evas_Object *obj, const char *photo_file, Elm_Imageslider_Cb func, void *data)
919 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
922 Elm_Imageslider_Item *it;
924 if (!obj || !(wd = elm_widget_data_get(obj)))
927 it = (Elm_Imageslider_Item *) calloc(1, sizeof(Elm_Imageslider_Item));
930 it->photo_file = eina_stringshare_add(photo_file);
934 wd->its = eina_list_append(wd->its, it);
939 _imageslider_update(wd);
945 * Insert an Image Slider item into the Image Slider Widget by using the given index.
947 * @param obj The Image Slider object
948 * @param photo_file photo file path
949 * @param func callback function
950 * @param index required position
951 * @param data callback data
952 * @return The Image Slider item handle or NULL
954 * @ingroup Imageslider
956 EAPI Elm_Imageslider_Item *
957 elm_imageslider_item_append_relative(Evas_Object *obj, const char *photo_file, Elm_Imageslider_Cb func, unsigned int index, void *data)
959 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
962 Elm_Imageslider_Item *it;
964 fprintf(stderr, "[[[ DEBUG ]]]:: New elm_imageslider_item_append_relative()\n");
966 if (!obj || !(wd = elm_widget_data_get(obj)))
969 it = (Elm_Imageslider_Item *) calloc(1, sizeof(Elm_Imageslider_Item));
974 it->photo_file = eina_stringshare_add(photo_file);
979 eina_list_append_relative(wd->its, it, eina_list_nth(wd->its, index - 2));
984 _imageslider_update(wd);
990 * Prepend Image Slider item
992 * @param obj The Image Slider object
993 * @param photo_file photo file path
994 * @param func callback function
995 * @param data callback data
996 * @return The imageslider item handle or NULL
998 * @ingroup Imageslider
1000 EAPI Elm_Imageslider_Item *
1001 elm_imageslider_item_prepend(Evas_Object *obj, const char *photo_file, Elm_Imageslider_Cb func, void *data)
1003 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1006 Elm_Imageslider_Item *it;
1008 if (!obj || !(wd = elm_widget_data_get(obj)))
1011 it = (Elm_Imageslider_Item *) calloc(1, sizeof(Elm_Imageslider_Item));
1012 it->photo_file = eina_stringshare_add(photo_file);
1016 wd->its = eina_list_prepend(wd->its, it);
1021 _imageslider_update(wd);
1027 * Delete the selected Image Slider item
1029 * @param it The selected Image Slider item handle
1031 * @ingroup Imageslider
1034 elm_imageslider_item_del(Elm_Imageslider_Item * it)
1038 Elm_Imageslider_Item *_it;
1042 if (!it || !(wd = elm_widget_data_get(it->obj)))
1045 EINA_LIST_FOREACH(wd->its, l, _it)
1050 wd->cur = eina_list_prev(wd->cur);
1051 wd->its = eina_list_remove(wd->its, it);
1058 _imageslider_update(wd);
1063 * Get the selected Image Slider item
1065 * @param obj The Image Slider object
1066 * @return The selected Image Slider item or NULL
1068 * @ingroup Imageslider
1070 EAPI Elm_Imageslider_Item *
1071 elm_imageslider_selected_item_get(Evas_Object *obj)
1073 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1076 if (!obj || (!(wd = elm_widget_data_get(obj))))
1082 return eina_list_data_get(wd->cur);
1086 * Get whether an Image Slider item is selected or not
1088 * @param it the selected Image Slider item
1089 * @return EINA_TRUE or EINA_FALSE
1091 * @ingroup Imageslider
1094 elm_imageslider_item_selected_get(Elm_Imageslider_Item * it)
1098 if (!it || !it->obj || (!(wd = elm_widget_data_get(it->obj))))
1104 if (eina_list_data_get(wd->cur) == it)
1112 * Set the selected Image Slider item
1114 * @param it The Imaga Slider item
1116 * @ingroup Imageslider
1119 elm_imageslider_item_selected_set(Elm_Imageslider_Item * it)
1125 Elm_Imageslider_Item *_it;
1131 if (!it || !it->obj || (!(wd = elm_widget_data_get(it->obj))))
1134 EINA_LIST_FOREACH(wd->its, l, _it)
1140 for (i = 0; i < BLOCK_MAX; i++)
1142 eo = (Evas_Object*)elm_layout_content_get(wd->ly[i], "swl.photo");
1145 elm_layout_content_set(wd->ly[i], "swl.photo", NULL);
1149 _imageslider_update(wd);
1154 * Get the photo file path of given Image Slider item
1156 * @param it The Image Slider item
1157 * @return The photo file path or NULL;
1159 * @ingroup Imageslider
1162 elm_imageslider_item_photo_file_get(Elm_Imageslider_Item * it)
1164 if (!it) return NULL;
1166 return it->photo_file;
1170 * Sets the photo file path of given Image Slider item
1172 * @param it The Image Slider item
1173 * @param photo_file The photo file path or NULL;
1175 * @ingroup Imageslider
1178 elm_imageslider_item_photo_file_set(Elm_Imageslider_Item *it, const char *photo_file)
1181 ELM_CHECK_WIDTYPE(it->obj, widtype);
1185 eina_stringshare_replace(&(it->photo_file), photo_file);
1186 elm_imageslider_item_update(it);
1191 * Get the previous Image Slider item
1193 * @param it The Image Slider item
1194 * @return The previous Image Slider item or NULL
1196 * @ingroup Imageslider
1198 EAPI Elm_Imageslider_Item *
1199 elm_imageslider_item_prev(Elm_Imageslider_Item * it)
1203 Elm_Imageslider_Item *_it;
1207 if (!it || (!(wd = elm_widget_data_get(it->obj))))
1210 EINA_LIST_FOREACH(wd->its, l, _it)
1214 l = eina_list_prev(l);
1217 return eina_list_data_get(l);
1225 * Get the next Image Slider item
1227 * @param it The Image Slider item
1228 * @return The next Image Slider item or NULL
1230 * @ingroup Imageslider
1232 EAPI Elm_Imageslider_Item *
1233 elm_imageslider_item_next(Elm_Imageslider_Item * it)
1237 Elm_Imageslider_Item *_it;
1241 if (!it || (!(wd = elm_widget_data_get(it->obj))))
1244 EINA_LIST_FOREACH(wd->its, l, _it)
1248 l = eina_list_next(l);
1251 return eina_list_data_get(l);
1259 * Move to the previous Image Slider item
1261 * @param obj The Image Slider object
1263 * @ingroup Imageslider
1266 elm_imageslider_prev(Evas_Object *obj)
1268 ELM_CHECK_WIDTYPE(obj, widtype);
1271 if (!obj || (!(wd = elm_widget_data_get(obj))))
1277 _imageslider_obj_move(wd, -1);
1281 * Move to the next Image Slider item
1283 * @param obj The Image Slider object
1285 * @ingroup Imageslider
1288 elm_imageslider_next(Evas_Object * obj)
1290 ELM_CHECK_WIDTYPE(obj, widtype);
1293 if (!obj || (!(wd = elm_widget_data_get(obj))))
1299 _imageslider_obj_move(wd, 1);
1304 * Updates an Image Slider item
1306 * @param it The Image Slider item
1308 * @ingroup Imageslider
1311 elm_imageslider_item_update(Elm_Imageslider_Item *it)
1315 if (!it || (!(wd = elm_widget_data_get(it->obj)))) return;
1316 ELM_CHECK_WIDTYPE(it->obj, widtype);
1318 if (it == eina_list_data_get(eina_list_prev(wd->cur)))
1319 elm_layout_content_set(wd->ly[BLOCK_LEFT], "swl.photo", NULL);
1320 else if (it == eina_list_data_get(wd->cur))
1321 elm_layout_content_set(wd->ly[BLOCK_CENTER], "swl.photo", NULL);
1322 else if (it == eina_list_data_get(eina_list_prev(wd->cur)))
1323 elm_layout_content_set(wd->ly[BLOCK_RIGHT], "swl.photo", NULL);
1325 _imageslider_update(wd);