Merge "[Password]: New design based changes, a new style removed password mode contro...
[framework/uifw/elementary.git] / src / lib / elm_slideshow.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3
4 /**
5  * @defgroup Slideshow Slideshow
6  * @ingroup Elementary
7  *
8  * This object display a list of object (generally a list of images) and some actions like
9  * next/previous are used to navigate. The animations are defined in the theme,
10  * consequently new animations can be added without having to update the
11  * applications.
12  *
13  * The slideshow use 2 callbacks to create and delete the objects displayed. When an item
14  * is displayed the function itc->func.get() is called. This function should create the object,
15  * for example the object can be an evas_object_image or a photocam. When a object is no more
16  * displayed the function itc->func.del() is called, the user can delete the dana associated to the item.
17  *
18  * Signals that you can add callbacks for are:
19  *
20  * "changed" - when the slideshow switch to another item
21  */
22
23 typedef struct _Widget_Data Widget_Data;
24
25 struct _Elm_Slideshow_Item
26 {
27    Elm_Widget_Item base;
28
29    Eina_List *l, *l_built;
30
31    const Elm_Slideshow_Item_Class *itc;
32 };
33
34 struct _Widget_Data
35 {
36    Evas_Object *slideshow;
37
38    // list of Elm_Slideshow_Item*
39    Eina_List *items;
40    Eina_List *items_built;
41
42    Elm_Slideshow_Item *current;
43    Elm_Slideshow_Item *previous;
44
45    Eina_List *transitions;
46    const char *transition;
47
48    Ecore_Timer *timer;
49    double timeout;
50    Eina_Bool loop:1;
51
52    struct {
53         const char *current;
54         Eina_List *list; //list of const char *
55    } layout;
56 };
57
58 static const char *widtype = NULL;
59 static void _del_hook(Evas_Object *obj);
60 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
61 static void _theme_hook(Evas_Object *obj);
62 static void _sizing_eval(Evas_Object *obj);
63 static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
64 static Eina_Bool _timer_cb(void *data);
65 static void _on_focus_hook(void *data, Evas_Object *obj);
66 static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src,
67                              Evas_Callback_Type type, void *event_info);
68
69 static Eina_Bool
70 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
71 {
72    if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
73    Evas_Event_Key_Down *ev = event_info;
74    Widget_Data *wd = elm_widget_data_get(obj);
75    if (!wd) return EINA_FALSE;
76    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
77    if (elm_widget_disabled_get(obj)) return EINA_FALSE;
78    if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
79      {
80         elm_slideshow_previous(obj);
81         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
82         return EINA_TRUE;
83      }
84    if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
85      {
86         elm_slideshow_next(obj);
87         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
88         return EINA_TRUE;
89      }
90    if ((!strcmp(ev->keyname, "Return")) ||
91        (!strcmp(ev->keyname, "KP_Enter")) ||
92        (!strcmp(ev->keyname, "space")))
93      {
94         if (wd->timeout)
95           {
96              if (wd->timer)
97                {
98                   ecore_timer_del(wd->timer);
99                   wd->timer = NULL;
100                }
101              else
102                elm_slideshow_timeout_set(obj, wd->timeout);
103           }
104         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
105         return EINA_TRUE;
106      }
107    return EINA_FALSE;
108 }
109
110 static void
111 _del_hook(Evas_Object *obj)
112 {
113    const char *layout;
114    Widget_Data *wd = elm_widget_data_get(obj);
115    if (!wd) return;
116    elm_slideshow_clear(obj);
117    elm_widget_stringlist_free(wd->transitions);
118    if (wd->timer) ecore_timer_del(wd->timer);
119    EINA_LIST_FREE(wd->layout.list, layout)
120       eina_stringshare_del(layout);
121    free(wd);
122 }
123
124 static void
125 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
126 {
127    Widget_Data *wd = elm_widget_data_get(obj);
128    if (!wd) return;
129    if (elm_widget_focus_get(obj))
130      {
131         edje_object_signal_emit(wd->slideshow, "elm,action,focus", "elm");
132         evas_object_focus_set(wd->slideshow, EINA_TRUE);
133      }
134    else
135      {
136         edje_object_signal_emit(wd->slideshow, "elm,action,unfocus", "elm");
137         evas_object_focus_set(wd->slideshow, EINA_FALSE);
138      }
139 }
140
141 static void
142 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
143 {
144    Widget_Data *wd = elm_widget_data_get(obj);
145    if (!wd) return;
146    edje_object_mirrored_set(wd->slideshow, rtl);
147 }
148
149 static void
150 _theme_hook(Evas_Object *obj)
151 {
152    Widget_Data *wd = elm_widget_data_get(obj);
153    if (!wd) return;
154    _elm_widget_mirrored_reload(obj);
155    _mirrored_set(obj, elm_widget_mirrored_get(obj));
156    _elm_theme_object_set(obj, wd->slideshow, "slideshow", "base", elm_widget_style_get(obj));
157    edje_object_scale_set(wd->slideshow, elm_widget_scale_get(obj) *
158                          _elm_config->scale);
159    _sizing_eval(obj);
160 }
161
162 static void
163 _sizing_eval(Evas_Object *obj)
164 {
165    Widget_Data *wd = elm_widget_data_get(obj);
166    Evas_Coord minw = -1, minh = -1;
167    if (!wd) return;
168    edje_object_size_min_calc(wd->slideshow, &minw, &minh);
169    evas_object_size_hint_min_set(obj, minw, minh);
170    evas_object_size_hint_max_set(obj, minw, minh);
171 }
172
173
174 static Elm_Slideshow_Item* _item_prev_get(Elm_Slideshow_Item* item)
175 {
176    Widget_Data *wd = elm_widget_data_get(item->base.widget);
177    Elm_Slideshow_Item* prev = eina_list_data_get(eina_list_prev(item->l));
178    if((!prev) && (wd->loop))
179      prev = eina_list_data_get(eina_list_last(item->l));
180    return prev;
181 }
182
183 static Elm_Slideshow_Item* _item_next_get(Elm_Slideshow_Item* item)
184 {
185    Widget_Data *wd = elm_widget_data_get(item->base.widget);
186    Elm_Slideshow_Item* next = eina_list_data_get(eina_list_next(item->l));
187    if((!next) && (wd->loop))
188      next = eina_list_data_get(wd->items);
189    return next;
190 }
191
192
193 static void
194 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
195 {
196    _sizing_eval(data);
197 }
198
199 static void
200 _sub_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
201 {
202    ;
203 }
204
205 static void
206 _item_realize(Elm_Slideshow_Item *item)
207 {
208    Elm_Slideshow_Item *_item;
209    Evas_Object *obj = item->base.widget;
210    Widget_Data *wd = elm_widget_data_get(obj);
211
212    if (!wd) return;
213    if ((!item->base.view) && (item->itc->func.get))
214      {
215         item->base.view = item->itc->func.get((void*)item->base.data, obj);
216         evas_object_smart_member_add(item->base.view, obj);
217         item->l_built = eina_list_append(NULL, item);
218         wd->items_built = eina_list_merge(wd->items_built, item->l_built);
219         evas_object_hide(item->base.view);
220      }
221    else if (item->l_built)
222      wd->items_built = eina_list_demote_list(wd->items_built, item->l_built);
223
224    //pre-create previous and next item
225    _item = _item_next_get(item);
226    if ((_item) && (!_item->base.view) && (_item->itc->func.get))
227      {
228         _item->base.view = _item->itc->func.get((void*)_item->base.data, obj);
229         evas_object_smart_member_add(_item->base.view, obj);
230         _item->l_built = eina_list_append(NULL, _item);
231         wd->items_built = eina_list_merge(wd->items_built, _item->l_built);
232         evas_object_hide(_item->base.view);
233      }
234    else if ((_item) && (_item->l_built))
235      wd->items_built = eina_list_demote_list(wd->items_built, _item->l_built);
236
237    _item = _item_prev_get(item);
238    if ((_item) && (!_item->base.view) && (_item->itc->func.get))
239      {
240         _item->base.view = _item->itc->func.get((void*)_item->base.data, obj);
241         evas_object_smart_member_add(_item->base.view, obj);
242         _item->l_built = eina_list_append(NULL, _item);
243         wd->items_built = eina_list_merge(wd->items_built, _item->l_built);
244         evas_object_hide(_item->base.view);
245      }
246    else if ((_item) && (_item->l_built))
247      wd->items_built = eina_list_demote_list(wd->items_built, _item->l_built);
248
249    //delete unused items
250    while (eina_list_count(wd->items_built) > 3)
251      {
252         _item = eina_list_data_get(wd->items_built);
253         wd->items_built = eina_list_remove_list(wd->items_built, wd->items_built);
254         if(item->itc->func.del)
255           item->itc->func.del((void*)item->base.data, _item->base.view);
256         evas_object_del(_item->base.view);
257         _item->base.view = NULL;
258      }
259 }
260
261 static void
262 _end(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
263 {
264    Elm_Slideshow_Item *item;
265    Widget_Data *wd = elm_widget_data_get(data);
266    if (!wd) return;
267
268    item = wd->previous;
269    if(item)
270      {
271         edje_object_part_unswallow(NULL, item->base.view);
272         evas_object_hide(item->base.view);
273         wd->previous = NULL;
274      }
275
276
277    item = wd->current;
278    if ((!item) || (!item->base.view)) return;
279
280    _item_realize(item);
281    edje_object_part_unswallow(NULL, item->base.view);
282    evas_object_show(item->base.view);
283
284    edje_object_signal_emit(wd->slideshow, "anim,end", "slideshow");
285    edje_object_part_swallow(wd->slideshow, "elm.swallow.1", item->base.view);
286 }
287
288
289 static Eina_Bool
290 _timer_cb(void *data)
291 {
292    Evas_Object *obj = data;
293    Widget_Data *wd = elm_widget_data_get(obj);
294    if (!wd) return ECORE_CALLBACK_CANCEL;
295    wd->timer = NULL;
296    elm_slideshow_next(obj);
297    return ECORE_CALLBACK_CANCEL;
298 }
299
300
301
302 /**
303  * Add a new slideshow to the parent
304  *
305  * @param parent The parent object
306  * @return The new object or NULL if it cannot be created
307  *
308  * @ingroup Slideshow
309  */
310 EAPI Evas_Object *
311 elm_slideshow_add(Evas_Object *parent)
312 {
313    Evas_Object *obj;
314    Evas *e;
315    Widget_Data *wd;
316
317    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
318
319    ELM_SET_WIDTYPE(widtype, "slideshow");
320    elm_widget_type_set(obj, "slideshow");
321    elm_widget_sub_object_add(parent, obj);
322    elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
323    elm_widget_data_set(obj, wd);
324    elm_widget_del_hook_set(obj, _del_hook);
325    elm_widget_theme_hook_set(obj, _theme_hook);
326    elm_widget_can_focus_set(obj, EINA_TRUE);
327    elm_widget_event_hook_set(obj, _event_hook);
328
329    wd->current = NULL;
330    wd->previous = NULL;
331
332    wd->slideshow = edje_object_add(e);
333    _elm_theme_object_set(obj, wd->slideshow, "slideshow", "base", "default");
334    evas_object_smart_member_add(wd->slideshow, obj);
335    elm_widget_resize_object_set(obj, wd->slideshow);
336    evas_object_show(wd->slideshow);
337
338    wd->transitions = elm_widget_stringlist_get(edje_object_data_get(wd->slideshow, "transitions"));
339    if (eina_list_count(wd->transitions) > 0)
340      wd->transition = eina_stringshare_add(eina_list_data_get(wd->transitions));
341
342    wd->layout.list = elm_widget_stringlist_get(edje_object_data_get(wd->slideshow, "layouts"));
343    if (eina_list_count(wd->layout.list) > 0)
344      wd->layout.current = eina_list_data_get(wd->layout.list);
345
346    edje_object_signal_callback_add(wd->slideshow, "end", "slideshow", _end, obj);
347
348    evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
349    evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
350
351    _mirrored_set(obj, elm_widget_mirrored_get(obj));
352    _sizing_eval(obj);
353    return obj;
354 }
355
356 /**
357  * Add a object in the list. The object can be a evas object image or a elm photo for example.
358  *
359  * @param obj The slideshow object
360  * @aram itc Callbacks used to create the object and delete the data associated when the item is deleted.
361  * @param data Data used by the user to identified the item
362  * @return Returns The slideshow item
363  *
364  * @ingroup Slideshow
365  */
366 EAPI Elm_Slideshow_Item*
367 elm_slideshow_item_add(Evas_Object *obj, const Elm_Slideshow_Item_Class *itc, const void *data)
368 {
369    Elm_Slideshow_Item *item;
370    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
371    Widget_Data *wd = elm_widget_data_get(obj);
372
373    if (!wd) return NULL;
374    item = elm_widget_item_new(obj, Elm_Slideshow_Item);
375    item->base.data = data;
376    item->itc = itc;
377    item->l = eina_list_append(item->l, item);
378
379    wd->items = eina_list_merge(wd->items, item->l);
380
381    if (!wd->current) elm_slideshow_show(item);
382
383    return item;
384 }
385
386 /**
387  * Go to the item
388  *
389  * @param obj The slideshow object
390  * @param item The item
391  *
392  * @ingroup Slideshow
393  */
394 EAPI void
395 elm_slideshow_show(Elm_Slideshow_Item *item)
396 {
397    char buf[1024];
398    Elm_Slideshow_Item *next = NULL;
399    Widget_Data *wd;
400    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
401    wd = elm_widget_data_get(item->base.widget);
402    if (!wd)
403      return;
404    if (item == wd->current)
405      return;
406
407    next = item;
408    _end(item->base.widget, item->base.widget, NULL, NULL);
409
410    if (wd->timer) ecore_timer_del(wd->timer);
411    if (wd->timeout > 0.0)
412      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, item->base.widget);
413    _item_realize(next);
414    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->base.view);
415    evas_object_show(next->base.view);
416    snprintf(buf, sizeof(buf), "%s,next", wd->transition);
417    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
418    wd->previous = wd->current;
419    wd->current = next;
420    evas_object_smart_callback_call(item->base.widget, "changed", wd->current);
421 }
422
423 /**
424  * Go to the next item
425  *
426  * @param obj The slideshow object
427  *
428  * @ingroup Slideshow
429  */
430 EAPI void
431 elm_slideshow_next(Evas_Object *obj)
432 {
433    char buf[1024];
434    Elm_Slideshow_Item *next = NULL;
435    ELM_CHECK_WIDTYPE(obj, widtype);
436    Widget_Data *wd = elm_widget_data_get(obj);
437
438    if (!wd) return;
439
440    if (wd->current)
441      next = _item_next_get(wd->current);
442
443    if ((!next) || (next == wd->current)) return;
444
445    _end(obj, obj, NULL, NULL);
446
447    if (wd->timer) ecore_timer_del(wd->timer);
448    if (wd->timeout > 0.0)
449      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, obj);
450
451    _item_realize(next);
452
453    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->base.view);
454    evas_object_show(next->base.view);
455
456    snprintf(buf, sizeof(buf), "%s,next", wd->transition);
457    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
458
459    wd->previous = wd->current;
460    wd->current = next;
461    evas_object_smart_callback_call(obj, "changed", wd->current);
462 }
463
464 /**
465  * Go to the previous item
466  *
467  * @param obj The slideshow object
468  *
469  * @ingroup Slideshow
470  */
471 EAPI void
472 elm_slideshow_previous(Evas_Object *obj)
473 {
474    char buf[1024];
475    Elm_Slideshow_Item *prev = NULL;
476    ELM_CHECK_WIDTYPE(obj, widtype);
477    Widget_Data *wd = elm_widget_data_get(obj);
478
479    if (!wd) return;
480
481    if (wd->current)
482      prev = _item_prev_get(wd->current);
483
484    if ((!prev) ||  (prev == wd->current)) return;
485
486    _end(obj, obj, NULL, NULL);
487
488    if (wd->timer) ecore_timer_del(wd->timer);
489    if (wd->timeout > 0.0)
490      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, obj);
491
492    _item_realize(prev);
493
494    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", prev->base.view);
495    evas_object_show(prev->base.view);
496
497    snprintf(buf, 1024, "%s,previous", wd->transition);
498    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
499
500    wd->previous = wd->current;
501    wd->current = prev;
502    evas_object_smart_callback_call(obj, "changed", wd->current);
503 }
504
505 /**
506  * Returns the list of transitions available.
507  *
508  * @param obj The slideshow object
509  * @return Returns the list of transitions (list of const char*)
510  *
511  * @ingroup Slideshow
512  */
513 EAPI const Eina_List *
514 elm_slideshow_transitions_get(const Evas_Object *obj)
515 {
516    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
517    Widget_Data *wd = elm_widget_data_get(obj);
518    if (!wd) return NULL;
519    return wd->transitions;
520 }
521
522 /**
523  * Returns the list of layouts available.
524  *
525  * @param obj The slideshow object
526  * @return Returns the list of layout (list of const char*)
527  *
528  * @ingroup Slideshow
529  */
530 EAPI const Eina_List *
531 elm_slideshow_layouts_get(const Evas_Object *obj)
532 {
533    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
534    Widget_Data *wd = elm_widget_data_get(obj);
535    if (!wd) return NULL;
536    return wd->layout.list;
537 }
538
539 /**
540  * Set the transition to use
541  *
542  * @param obj The slideshow object
543  * @param transition the new transition
544  *
545  * @ingroup Slideshow
546  */
547 EAPI void
548 elm_slideshow_transition_set(Evas_Object *obj, const char *transition)
549 {
550    ELM_CHECK_WIDTYPE(obj, widtype);
551    Widget_Data *wd = elm_widget_data_get(obj);
552    if (!wd) return;
553    eina_stringshare_replace(&wd->transition, transition);
554 }
555
556 /**
557  * Returns the transition to use
558  *
559  * @param obj The slideshow object
560  * @return the transition set
561  *
562  * @ingroup Slideshow
563  */
564 EAPI const char *
565 elm_slideshow_transition_get(const Evas_Object *obj)
566 {
567    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
568    Widget_Data *wd = elm_widget_data_get(obj);
569    if (!wd) return NULL;
570    return wd->transition;
571 }
572
573 /**
574  * The slideshow can go to the next item automatically after a few seconds.
575  * This method set the timeout to use. A timeout <=0 disable the timer.
576  *
577  * @param obj The slideshow object
578  * @param timeout The new timeout
579  *
580  * @ingroup Slideshow
581  */
582 EAPI void
583 elm_slideshow_timeout_set(Evas_Object *obj, double timeout)
584 {
585    ELM_CHECK_WIDTYPE(obj, widtype);
586    Widget_Data *wd = elm_widget_data_get(obj);
587    if (!wd) return;
588    wd->timeout = timeout;
589    if (wd->timer) ecore_timer_del(wd->timer);
590    wd->timer = NULL;
591    if (timeout > 0.0)
592      wd->timer = ecore_timer_add(timeout, _timer_cb, obj);
593 }
594
595 /**
596  * Returns the timeout value
597  *
598  * @param obj The slideshow object
599  * @return Returns the timeout
600  *
601  * @ingroup Slideshow
602  */
603 EAPI double
604 elm_slideshow_timeout_get(const Evas_Object *obj)
605 {
606    ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
607    Widget_Data *wd = elm_widget_data_get(obj);
608    if (!wd) return -1.0;
609    return wd->timeout;
610 }
611
612 /**
613  * Set if the first item should follow the last and vice versa
614  *
615  * @param obj The slideshow object
616  * @param loop if EINA_TRUE, the first item will follow the last and vice versa
617  *
618  * @ingroup Slideshow
619  */
620 EAPI void
621 elm_slideshow_loop_set(Evas_Object *obj, Eina_Bool loop)
622 {
623    ELM_CHECK_WIDTYPE(obj, widtype);
624    Widget_Data *wd = elm_widget_data_get(obj);
625    if (!wd) return;
626    wd->loop = loop;
627 }
628
629 /**
630  * Returns the current layout name
631  *
632  * @param obj The slideshow object
633  * @returns Returns the layout name
634  *
635  * @ingroup Slideshow
636  */
637 EAPI const char *
638 elm_slideshow_layout_get(const Evas_Object *obj)
639 {
640    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
641    Widget_Data *wd = elm_widget_data_get(obj);
642    if (!wd) return EINA_FALSE;
643    return wd->layout.current;
644 }
645
646 /**
647  * Set the layout
648  *
649  * @param obj The slideshow object
650  * @param layout the new layout
651  *
652  * @ingroup Slideshow
653  */
654 EAPI void
655 elm_slideshow_layout_set(Evas_Object *obj, const char *layout)
656 {
657    char buf[PATH_MAX];
658    ELM_CHECK_WIDTYPE(obj, widtype);
659    Widget_Data *wd = elm_widget_data_get(obj);
660    if (!wd) return;
661
662    wd->layout.current = layout;
663    snprintf(buf, sizeof(buf), "layout,%s", layout);
664    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
665 }
666
667 /**
668  * Return if the first item should follow the last and vice versa
669  *
670  * @param obj The slideshow object
671  * @returns Returns the loop flag
672  *
673  * @ingroup Slideshow
674  */
675 EAPI Eina_Bool
676 elm_slideshow_loop_get(const Evas_Object *obj)
677 {
678    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
679    Widget_Data *wd = elm_widget_data_get(obj);
680    if (!wd) return EINA_FALSE;
681    return wd->loop;
682 }
683
684 /**
685  * Delete all the items
686  *
687  * @param obj The slideshow object
688  *
689  * @ingroup Slideshow
690  */
691 EAPI void
692 elm_slideshow_clear(Evas_Object *obj)
693 {
694    Elm_Slideshow_Item *item;
695    ELM_CHECK_WIDTYPE(obj, widtype);
696    Widget_Data *wd = elm_widget_data_get(obj);
697    if (!wd) return;
698    wd->previous = NULL;
699    wd->current = NULL;
700    EINA_LIST_FREE(wd->items_built, item)
701      {
702         if (item->itc->func.del)
703           item->itc->func.del((void*)item->base.data, item->base.view);
704         evas_object_del(item->base.view);
705         item->base.view = NULL;
706      }
707
708    EINA_LIST_FREE(wd->items, item)
709      {
710         elm_widget_item_del(item);
711      }
712 }
713
714
715 /**
716  * Delete the item
717  *
718  * @param item The slideshow item
719  *
720  * @ingroup Slideshow
721  */
722 EAPI void
723 elm_slideshow_item_del(Elm_Slideshow_Item *item)
724 {
725    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
726    Widget_Data *wd = elm_widget_data_get(item->base.widget);
727    if (!wd) return;
728    if (wd->previous == item) wd->previous = NULL;
729    if (wd->current == item)
730      {
731         Eina_List *l = eina_list_data_find_list(wd->items, item);
732         Eina_List *l2 = eina_list_next(l);
733         wd->current = NULL;
734         if (!l2)
735           l2 = eina_list_nth_list(wd->items, eina_list_count(wd->items) - 1);
736         if (l2)
737           elm_slideshow_show(eina_list_data_get(l2));
738      }
739
740    wd->items = eina_list_remove_list(wd->items, item->l);
741    wd->items_built = eina_list_remove_list(wd->items_built, item->l_built);
742
743    if ((item->base.view) && (item->itc->func.del))
744      item->itc->func.del((void*)item->base.data, item->base.view);
745    if (item->base.view)
746      evas_object_del(item->base.view);
747    free(item);
748 }
749
750 /**
751  * Returns the list of items
752  * @param obj The slideshow object
753  * @return Returns the list of items (list of Elm_Slideshow_Item).
754  *
755  * @ingroup Slideshow
756  */
757 EAPI const Eina_List *
758 elm_slideshow_items_get(const Evas_Object *obj)
759 {
760    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
761    Widget_Data *wd = elm_widget_data_get(obj);
762    if (!wd) return NULL;
763    return wd->items;
764 }
765
766
767 /**
768  * Returns the current item displayed
769  *
770  * @param obj The slideshow object
771  * @return Returns the current item displayed
772  *
773  * @ingroup Slideshow
774  */
775 EAPI Elm_Slideshow_Item *
776 elm_slideshow_item_current_get(const Evas_Object *obj)
777 {
778    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
779    Widget_Data *wd = elm_widget_data_get(obj);
780    if (!wd) return NULL;
781    return wd->current;
782 }
783
784 /**
785  * Returns the evas object associated to an item
786  *
787  * @param item The slideshow item
788  * @return Returns the evas object associated to this item
789  *
790  * @ingroup Slideshow
791  */
792 EAPI Evas_Object *
793 elm_slideshow_item_object_get(const Elm_Slideshow_Item * item)
794 {
795    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
796    return item->base.view;
797 }
798
799 /**
800  * Returns the data associated to an item
801  *
802  * @param item The slideshow item
803  * @return Returns the data associated to this item
804  *
805  * @ingroup Slideshow
806  */
807 EAPI void *
808 elm_slideshow_item_data_get(const Elm_Slideshow_Item * item)
809 {
810    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
811    return elm_widget_item_data_get(item);
812 }