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